summaryrefslogtreecommitdiff
path: root/src/glibext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2020-09-21 22:23:47 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2020-09-21 22:23:47 (GMT)
commit76fb13178cf6be94b8e01675b37f7cb1b92f7709 (patch)
treea6e6bbc6dde169add608097ceb5658fcb904bd08 /src/glibext
parentdfe76faf21e254c02c86a1b0b1f8ca8fc07fe027 (diff)
Defined lock mechanism for buffer caches.
Diffstat (limited to 'src/glibext')
-rw-r--r--src/glibext/buffercache-int.h5
-rw-r--r--src/glibext/buffercache.c139
-rw-r--r--src/glibext/buffercache.h34
-rw-r--r--src/glibext/bufferview.c110
4 files changed, 192 insertions, 96 deletions
diff --git a/src/glibext/buffercache-int.h b/src/glibext/buffercache-int.h
index 2ffa8ec..36e4369 100644
--- a/src/glibext/buffercache-int.h
+++ b/src/glibext/buffercache-int.h
@@ -68,11 +68,12 @@ struct _GBufferCache
GBinContent *content; /* Contenu binaire global */
+ GWidthTracker *tracker; /* Suivi des largeurs */
+
cache_info *lines; /* Liste des lignes intégrées */
size_t count; /* Quantité en cache */
size_t used; /* Quantité utilisée */
-
- GWidthTracker *tracker; /* Suivi des largeurs */
+ GRWLock access; /* Verrou de protection */
};
diff --git a/src/glibext/buffercache.c b/src/glibext/buffercache.c
index 2913409..ebe8a7f 100644
--- a/src/glibext/buffercache.c
+++ b/src/glibext/buffercache.c
@@ -547,6 +547,7 @@ static void g_buffer_cache_init(GBufferCache *cache)
cache->lines = NULL;
cache->count = 0;
cache->used = 0;
+ g_rw_lock_init(&cache->access);
cache->tracker = NULL;
@@ -624,6 +625,8 @@ static void g_buffer_cache_finalize(GBufferCache *cache)
if (cache->lines != NULL)
free(cache->lines);
+ g_rw_lock_clear(&cache->access);
+
G_OBJECT_CLASS(g_buffer_cache_parent_class)->finalize(G_OBJECT(cache));
}
@@ -666,21 +669,24 @@ GBufferCache *g_buffer_cache_new(GBinContent *content, size_t col_count, size_t
* *
* Paramètres : cache = tampon de lignes à consulter. *
* *
-* Description : Fournit la hauteur d'impression d'une ligne visualisée. *
+* Description : Indique l'éventuel contenu binaire associé au cache. *
* *
-* Retour : Hauteur de ligne en pixels. *
+* Retour : Eventuel contenu renseigné ou NULL. *
* *
* Remarques : - *
* *
******************************************************************************/
-gint g_buffer_cache_get_line_height(const GBufferCache *cache)
+GBinContent *g_buffer_cache_get_content(const GBufferCache *cache)
{
- GBufferCacheClass *class; /* Classe des tampons */
+ GBinContent *result; /* Contenu à retourner */
- class = G_BUFFER_CACHE_GET_CLASS(cache);
+ result = cache->content;
- return class->line_height;
+ if (result != NULL)
+ g_object_ref(G_OBJECT(result));
+
+ return result;
}
@@ -689,24 +695,21 @@ gint g_buffer_cache_get_line_height(const GBufferCache *cache)
* *
* Paramètres : cache = tampon de lignes à consulter. *
* *
-* Description : Indique l'éventuel contenu binaire associé au cache. *
+* Description : Fournit la hauteur d'impression d'une ligne visualisée. *
* *
-* Retour : Eventuel contenu renseigné ou NULL. *
+* Retour : Hauteur de ligne en pixels. *
* *
* Remarques : - *
* *
******************************************************************************/
-GBinContent *g_buffer_cache_get_content(const GBufferCache *cache)
+gint g_buffer_cache_get_line_height(const GBufferCache *cache)
{
- GBinContent *result; /* Contenu à retourner */
-
- result = cache->content;
+ GBufferCacheClass *class; /* Classe des tampons */
- if (result != NULL)
- g_object_ref(G_OBJECT(result));
+ class = G_BUFFER_CACHE_GET_CLASS(cache);
- return result;
+ return class->line_height;
}
@@ -759,44 +762,78 @@ gint g_buffer_cache_get_text_position(const GBufferCache *cache)
/******************************************************************************
* *
-* Paramètres : cache = instance GLib à consulter. *
+* Paramètres : cache = composant GLib à consulter. *
* *
-* Description : Compte le nombre de lignes rassemblées dans un tampon. *
+* Description : Fournit un lien vers la structure de suivi de largeurs. *
* *
-* Retour : Nombre de lignes constituant le tampon. *
+* Retour : Gestionnaire de largeurs de lignes. *
* *
* Remarques : - *
* *
******************************************************************************/
-size_t g_buffer_cache_count_lines(const GBufferCache *cache)
+GWidthTracker *g_buffer_cache_get_width_tracker(const GBufferCache *cache)
{
- // TODO check lock
+ GWidthTracker *result; /* Instance à retourner * */
- return cache->used;
+ result = cache->tracker;
+
+ g_object_ref(G_OBJECT(result));
+
+ return result;
}
/******************************************************************************
* *
-* Paramètres : cache = composant GLib à consulter. *
+* Paramètres : cache = cache de lignes à mettre à jour. *
+* write = précise le type d'accès prévu (lecture/écriture). *
+* lock = indique le sens du verrouillage à mener. *
* *
-* Description : Fournit un lien vers la structure de suivi de largeurs. *
+* Description : Met à disposition un encadrement des accès aux lignes. *
* *
-* Retour : Gestionnaire de largeurs de lignes. *
+* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
-GWidthTracker *g_buffer_cache_get_width_tracker(const GBufferCache *cache)
+void g_buffer_cache_lock_unlock(GBufferCache *cache, bool write, bool lock)
{
- GWidthTracker *result; /* Instance à retourner * */
+ if (write)
+ {
+ if (lock) g_rw_lock_writer_lock(&cache->access);
+ else g_rw_lock_writer_unlock(&cache->access);
+ }
+ else
+ {
+ if (lock) g_rw_lock_reader_lock(&cache->access);
+ else g_rw_lock_reader_unlock(&cache->access);
+ }
- result = cache->tracker;
+}
- g_object_ref(G_OBJECT(result));
+
+/******************************************************************************
+* *
+* Paramètres : cache = instance GLib à consulter. *
+* *
+* Description : Compte le nombre de lignes rassemblées dans un tampon. *
+* *
+* Retour : Nombre de lignes constituant le tampon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+size_t g_buffer_cache_count_lines(GBufferCache *cache)
+{
+ size_t result; /* Quantité à retourner */
+
+ assert(!g_rw_lock_writer_trylock(&cache->access));
+
+ result = cache->used;
return result;
@@ -878,6 +915,8 @@ void g_buffer_cache_insert_at(GBufferCache *cache, size_t index, GLineGenerator
size_t needed; /* Emplacements nécessaires */
size_t i; /* Boucle de parcours */
+ assert(!g_rw_lock_writer_trylock(&cache->access));
+
assert(index < cache->used);
assert(!(before && after));
@@ -1000,6 +1039,8 @@ void g_buffer_cache_delete_at(GBufferCache *cache, size_t index)
{
cache_info *info; /* Accès direct à une ligne */
+ assert(!g_rw_lock_writer_trylock(&cache->access));
+
assert(index < cache->used);
info = &cache->lines[index];
@@ -1044,6 +1085,8 @@ GLineGenerator *g_buffer_cache_delete_type_at(GBufferCache *cache, size_t index,
size_t count; /* Emplacements occupés */
size_t delete; /* Indice de suppression */
+ assert(!g_rw_lock_writer_trylock(&cache->access));
+
assert(index < cache->used);
assert(!(before && after));
@@ -1165,6 +1208,8 @@ void g_buffer_cache_append(GBufferCache *cache, GLineGenerator *generator, Buffe
size_t i; /* Boucle de parcours */
cache_info *info; /* Accès direct à une ligne */
+ assert(!g_rw_lock_writer_trylock(&cache->access));
+
count = g_line_generator_count_lines(generator);
assert(count > 0);
@@ -1226,6 +1271,8 @@ void g_buffer_cache_extend_with(GBufferCache *cache, size_t count, GLineGenerato
cache_info *info; /* Accès direct à une ligne */
size_t added; /* Nombre d'ajouts effectués */
+ assert(!g_rw_lock_writer_trylock(&cache->access));
+
assert(count >= cache->used);
if (count > cache->count)
@@ -1286,6 +1333,8 @@ void g_buffer_cache_truncate(GBufferCache *cache, size_t max)
size_t j; /* Boucle de parcours #2 */
size_t removed; /* Nombre de retraits effectués*/
+ assert(!g_rw_lock_writer_trylock(&cache->access));
+
for (i = max; i < cache->used; i++)
{
info = &cache->lines[i];
@@ -1336,8 +1385,10 @@ void g_buffer_cache_truncate(GBufferCache *cache, size_t max)
* *
******************************************************************************/
-void g_buffer_cache_get_line_cursor(const GBufferCache *cache, size_t index, gint x, GLineCursor **cursor)
+void g_buffer_cache_get_line_cursor(GBufferCache *cache, size_t index, gint x, GLineCursor **cursor)
{
+ assert(!g_rw_lock_writer_trylock(&cache->access));
+
assert(index < cache->used);
get_cache_info_cursor(&cache->lines[index], index, x, cursor);
@@ -1363,7 +1414,7 @@ void g_buffer_cache_add_line_flag(GBufferCache *cache, size_t index, BufferLineF
{
cache_info *info; /* Accès direct à une ligne */
- // TODO : check lock
+ assert(!g_rw_lock_writer_trylock(&cache->access));
assert(index < cache->used);
@@ -1396,14 +1447,14 @@ void g_buffer_cache_add_line_flag(GBufferCache *cache, size_t index, BufferLineF
* *
******************************************************************************/
-BufferLineFlags g_buffer_cache_get_line_flags(const GBufferCache *cache, size_t index)
+BufferLineFlags g_buffer_cache_get_line_flags(GBufferCache *cache, size_t index)
{
BufferLineFlags result; /* Somme à renvoyer */
cache_info *info; /* Accès direct à une ligne */
const generator_link *generator; /* Générateur retenu */
size_t i; /* Boucle de parcours */
- // TODO : check lock
+ assert(!g_rw_lock_writer_trylock(&cache->access));
assert(index < cache->used);
@@ -1447,7 +1498,7 @@ void g_buffer_cache_remove_line_flag(GBufferCache *cache, size_t index, BufferLi
{
cache_info *info; /* Accès direct à une ligne */
- // TODO : check lock
+ assert(!g_rw_lock_writer_trylock(&cache->access));
assert(index < cache->used);
@@ -1484,7 +1535,7 @@ void g_buffer_cache_refresh_line(GBufferCache *cache, size_t index)
{
cache_info *info; /* Accès direct à une ligne */
- // TODO : check lock
+ assert(!g_rw_lock_writer_trylock(&cache->access));
assert(index < cache->used);
@@ -1510,10 +1561,12 @@ void g_buffer_cache_refresh_line(GBufferCache *cache, size_t index)
* *
******************************************************************************/
-GBufferLine *g_buffer_cache_find_line_by_index(const GBufferCache *cache, size_t index)
+GBufferLine *g_buffer_cache_find_line_by_index(GBufferCache *cache, size_t index)
{
GBufferLine *result; /* Ligne trouvée à retourner */
+ assert(!g_rw_lock_writer_trylock(&cache->access));
+
if (index < cache->used)
result = get_cache_info_line(&cache->lines[index], cache->tracker, index, cache->content);
else
@@ -1634,11 +1687,13 @@ void g_buffer_cache_draw(const GBufferCache *cache, cairo_t *cr, size_t first, s
* *
******************************************************************************/
-size_t _g_buffer_cache_find_index_by_cursor(const GBufferCache *cache, const GLineCursor *cursor, bool first, size_t start, size_t end)
+size_t _g_buffer_cache_find_index_by_cursor(GBufferCache *cache, const GLineCursor *cursor, bool first, size_t start, size_t end)
{
size_t result; /* Indice à retourner */
cache_info *found; /* Eventuel élément trouvé */
+ assert(!g_rw_lock_writer_trylock(&cache->access));
+
int find_containing_generator(const GLineCursor *c, const cache_info *i)
{
const generator_link *generator; /* Générateur retenu */
@@ -1707,10 +1762,12 @@ size_t _g_buffer_cache_find_index_by_cursor(const GBufferCache *cache, const GLi
* *
******************************************************************************/
-size_t g_buffer_cache_find_index_by_cursor(const GBufferCache *cache, const GLineCursor *cursor, bool first)
+size_t g_buffer_cache_find_index_by_cursor(GBufferCache *cache, const GLineCursor *cursor, bool first)
{
size_t result; /* Indice à retourner */
+ assert(!g_rw_lock_writer_trylock(&cache->access));
+
if (cache->used == 0)
result = 0;
else
@@ -1735,7 +1792,7 @@ size_t g_buffer_cache_find_index_by_cursor(const GBufferCache *cache, const GLin
* *
******************************************************************************/
-size_t g_buffer_cache_look_for_flag(const GBufferCache *cache, size_t start, BufferLineFlags flag)
+size_t g_buffer_cache_look_for_flag(GBufferCache *cache, size_t start, BufferLineFlags flag)
{
size_t result; /* Indice de ligne à retourner */
GLineCursor *init; /* Localisation de départ */
@@ -1743,7 +1800,7 @@ size_t g_buffer_cache_look_for_flag(const GBufferCache *cache, size_t start, Buf
GLineCursor *next; /* Localisation suivante */
int ret; /* Bilan de comparaison */
- // TODO : check lock
+ assert(!g_rw_lock_writer_trylock(&cache->access));
assert(start < cache->used);
@@ -1795,7 +1852,7 @@ size_t g_buffer_cache_look_for_flag(const GBufferCache *cache, size_t start, Buf
* *
******************************************************************************/
-bool g_buffer_cache_get_cursor_coordinates(const GBufferCache *cache, const GLineCursor *cursor, size_t first, size_t last, bool code, gint *x, gint *y)
+bool g_buffer_cache_get_cursor_coordinates(GBufferCache *cache, const GLineCursor *cursor, size_t first, size_t last, bool code, gint *x, gint *y)
{
bool result; /* Bilan à retourner */
size_t index; /* Indice de correspondance */
@@ -1803,6 +1860,8 @@ bool g_buffer_cache_get_cursor_coordinates(const GBufferCache *cache, const GLin
const cache_info *info; /* Infos sur une ligne donnée */
const generator_link *generator; /* Générateur retenu */
+ assert(!g_rw_lock_writer_trylock(&cache->access));
+
index = _g_buffer_cache_find_index_by_cursor(cache, cursor, true, first, last);
result = (index < cache->used);
diff --git a/src/glibext/buffercache.h b/src/glibext/buffercache.h
index f0f54b0..e657fff 100644
--- a/src/glibext/buffercache.h
+++ b/src/glibext/buffercache.h
@@ -72,12 +72,23 @@ gint g_buffer_cache_get_left_margin(const GBufferCache *);
/* Fournit la position de départ pour l'impression de texte. */
gint g_buffer_cache_get_text_position(const GBufferCache *);
-/* Compte le nombre de lignes rassemblées dans un tampon. */
-size_t g_buffer_cache_count_lines(const GBufferCache *);
-
/* Fournit un lien vers la structure de suivi de largeurs. */
GWidthTracker *g_buffer_cache_get_width_tracker(const GBufferCache *);
+/* Met à disposition un encadrement des accès aux lignes. */
+void g_buffer_cache_lock_unlock(GBufferCache *, bool, bool);
+
+
+#define g_buffer_cache_wlock(cache) g_buffer_cache_lock_unlock(cache, true, true);
+#define g_buffer_cache_wunlock(cache) g_buffer_cache_lock_unlock(cache, true, false);
+
+#define g_buffer_cache_rlock(cache) g_buffer_cache_lock_unlock(cache, false, true);
+#define g_buffer_cache_runlock(cache) g_buffer_cache_lock_unlock(cache, false, false);
+
+
+/* Compte le nombre de lignes rassemblées dans un tampon. */
+size_t g_buffer_cache_count_lines(GBufferCache *);
+
/* Insère un générateur dans des lignes à une position donnée. */
void g_buffer_cache_insert_at(GBufferCache *, size_t, GLineGenerator *, BufferLineFlags, bool, bool);
@@ -97,13 +108,13 @@ void g_buffer_cache_extend_with(GBufferCache *, size_t, GLineGenerator *);
void g_buffer_cache_truncate(GBufferCache *, size_t);
/* Retrouve l'emplacement correspondant à une position de ligne. */
-void g_buffer_cache_get_line_cursor(const GBufferCache *, size_t, gint, GLineCursor **);
+void g_buffer_cache_get_line_cursor(GBufferCache *, size_t, gint, GLineCursor **);
/* Ajoute une propriété particulière à une ligne. */
void g_buffer_cache_add_line_flag(GBufferCache *, size_t, BufferLineFlags);
/* Détermine l'ensemble des propriétés attachées à une ligne. */
-BufferLineFlags g_buffer_cache_get_line_flags(const GBufferCache *, size_t);
+BufferLineFlags g_buffer_cache_get_line_flags(GBufferCache *, size_t);
/* Retire une propriété particulière attachée à une ligne. */
void g_buffer_cache_remove_line_flag(GBufferCache *, size_t, BufferLineFlags);
@@ -111,11 +122,8 @@ void g_buffer_cache_remove_line_flag(GBufferCache *, size_t, BufferLineFlags);
/* Force la mise à jour du contenu d'une ligne donnée. */
void g_buffer_cache_refresh_line(GBufferCache *, size_t);
-#define g_buffer_cache_lock(c)
-#define g_buffer_cache_unlock(c)
-
/* Retrouve une ligne au sein d'un tampon avec un indice. */
-GBufferLine *g_buffer_cache_find_line_by_index(const GBufferCache *, size_t);
+GBufferLine *g_buffer_cache_find_line_by_index(GBufferCache *, size_t);
/* Fait remonter les largeurs requises par une ligne donnée. */
void g_buffer_cache_collect_widths(GBufferCache *, size_t, size_t, size_t, gint *, gint *);
@@ -124,16 +132,16 @@ void g_buffer_cache_collect_widths(GBufferCache *, size_t, size_t, size_t, gint
void g_buffer_cache_draw(const GBufferCache *, cairo_t *, size_t, size_t, const cairo_rectangle_int_t *, const GDisplayOptions *, const gint *, const segcnt_list *);
/* Indique l'indice correspondant à une adresse donnée. */
-size_t _g_buffer_cache_find_index_by_cursor(const GBufferCache *, const GLineCursor *, bool, size_t, size_t);
+size_t _g_buffer_cache_find_index_by_cursor(GBufferCache *, const GLineCursor *, bool, size_t, size_t);
/* Indique l'indice correspondant à une adresse donnée. */
-size_t g_buffer_cache_find_index_by_cursor(const GBufferCache *, const GLineCursor *, bool);
+size_t g_buffer_cache_find_index_by_cursor(GBufferCache *, const GLineCursor *, bool);
/* Avance autant que possible vers une ligne idéale. */
-size_t g_buffer_cache_look_for_flag(const GBufferCache *, size_t, BufferLineFlags);
+size_t g_buffer_cache_look_for_flag(GBufferCache *, size_t, BufferLineFlags);
/* Indique la position d'affichage d'une adresse donnée. */
-bool g_buffer_cache_get_cursor_coordinates(const GBufferCache *, const GLineCursor *, size_t, size_t, bool, gint *, gint *);
+bool g_buffer_cache_get_cursor_coordinates(GBufferCache *, const GLineCursor *, size_t, size_t, bool, gint *, gint *);
diff --git a/src/glibext/bufferview.c b/src/glibext/bufferview.c
index 7ac6718..72740b1 100644
--- a/src/glibext/bufferview.c
+++ b/src/glibext/bufferview.c
@@ -81,13 +81,13 @@ static void on_buffer_cache_line_updated(const GBufferCache *, size_t, GBufferVi
/* Calcule la position idéale de curseur pour un point donné. */
static bool _g_buffer_view_compute_caret_full(GBufferView *, gint, GBufferLine *, size_t, const GDisplayOptions *, cairo_rectangle_int_t *, GLineCursor **);
+/* Fournit la ligne présente à une ordonnée donnée. */
+static GBufferLine *g_buffer_view_find_line_at(GBufferView *, gint, size_t *);
+
/* Déplace le curseur au sein d'une vue de tampon. */
static bool _g_buffer_view_move_caret(GBufferView *, const GBufferLine *, size_t, cairo_rectangle_int_t *, bool, GdkScrollDirection, const GDisplayOptions *);
-/* Fournit la ligne présente à une ordonnée donnée. */
-static GBufferLine *g_buffer_view_find_line_at(GBufferView *, gint, size_t *);
-
@@ -449,6 +449,8 @@ void g_buffer_view_restrict(GBufferView *view, GLineCursor *start, GLineCursor *
if (view->tracker != NULL)
g_object_unref(G_OBJECT(view->tracker));
+ g_buffer_cache_rlock(view->cache);
+
if (view->unrestricted)
{
view->first = 0;
@@ -475,6 +477,8 @@ void g_buffer_view_restrict(GBufferView *view, GLineCursor *start, GLineCursor *
}
+ g_buffer_cache_runlock(view->cache);
+
}
}
@@ -643,6 +647,8 @@ bool g_buffer_view_compute_caret_full(GBufferView *view, gint x, gint y, const G
result = false;
+ g_buffer_cache_rlock(view->cache);
+
/* Détermination de la ligne courante */
lheight = g_buffer_cache_get_line_height(view->cache);
@@ -665,6 +671,8 @@ bool g_buffer_view_compute_caret_full(GBufferView *view, gint x, gint y, const G
gbvccf_done:
+ g_buffer_cache_runlock(view->cache);
+
return result;
}
@@ -814,6 +822,48 @@ static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line
/******************************************************************************
* *
+* Paramètres : view = visualisation à consulter. *
+* y = ordonnée comprise dans la ligne recherchée. *
+* idx = indice de la ligne trouvée ou NULL. [OUT] *
+* *
+* Description : Fournit la ligne présente à une ordonnée donnée. *
+* *
+* Retour : Ligne retrouvée ou NULL si aucune. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static GBufferLine *g_buffer_view_find_line_at(GBufferView *view, gint y, size_t *idx)
+{
+ GBufferLine *result; /* Ligne trouvée à retourner */
+ gint lheight; /* Hauteur d'une ligne */
+ size_t index; /* Indice attendu */
+
+ /**
+ * Le verrou sur le tampon est déjà posé.
+ */
+
+ lheight = g_buffer_cache_get_line_height(view->cache);
+ index = y / lheight;
+
+ index += view->first;
+
+ if (index <= view->last)
+ result = g_buffer_cache_find_line_by_index(view->cache, index);
+ else
+ result = NULL;
+
+ if (result != NULL && idx != NULL)
+ *idx = index;
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : view = vue de tampon à mettre à jour. *
* ctrl = indique la demande d'un parcours rapide. *
* dir = direction du parcours. *
@@ -842,6 +892,8 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d
result = false;
+ g_buffer_cache_rlock(view->cache);
+
line = g_buffer_view_find_line_at(view, caret->y, &index);
if (line == NULL) goto gbvmc_done;
@@ -945,6 +997,8 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d
gbvmc_done:
+ g_buffer_cache_runlock(view->cache);
+
return result;
}
@@ -981,6 +1035,8 @@ GObject *g_buffer_view_find_creator(GBufferView *view, gint x, gint y, const GDi
result = NULL;
+ g_buffer_cache_rlock(view->cache);
+
/* Zone d'intervention bornée ! */
text_pos = g_buffer_cache_get_text_position(view->cache);
@@ -1013,6 +1069,8 @@ GObject *g_buffer_view_find_creator(GBufferView *view, gint x, gint y, const GDi
gbvfc_done:
+ g_buffer_cache_runlock(view->cache);
+
return result;
}
@@ -1080,6 +1138,8 @@ bool g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y, const G
/* Zone d'intervention bornée ! */
+ g_buffer_cache_rlock(view->cache);
+
text_pos = g_buffer_cache_get_text_position(view->cache);
if (x < text_pos)
@@ -1121,6 +1181,8 @@ bool g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y, const G
gbvhs_done:
+ g_buffer_cache_runlock(view->cache);
+
return result;
}
@@ -1209,44 +1271,6 @@ void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint virt_y, const
-/******************************************************************************
-* *
-* Paramètres : view = visualisation à consulter. *
-* y = ordonnée comprise dans la ligne recherchée. *
-* idx = indice de la ligne trouvée ou NULL. [OUT] *
-* *
-* Description : Fournit la ligne présente à une ordonnée donnée. *
-* *
-* Retour : Ligne retrouvée ou NULL si aucune. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static GBufferLine *g_buffer_view_find_line_at(GBufferView *view, gint y, size_t *idx)
-{
- GBufferLine *result; /* Ligne trouvée à retourner */
- gint lheight; /* Hauteur d'une ligne */
- size_t index; /* Indice attendu */
-
- lheight = g_buffer_cache_get_line_height(view->cache);
- index = y / lheight;
-
- index += view->first;
-
- if (index <= view->last)
- result = g_buffer_cache_find_line_by_index(view->cache, index);
- else
- result = NULL;
-
- if (result != NULL && idx != NULL)
- *idx = index;
-
- return result;
-
-}
-
-
@@ -1280,8 +1304,12 @@ bool g_buffer_view_get_cursor_coordinates(GBufferView *view, const GLineCursor *
{
bool result; /* Bilan à retourner */
+ g_buffer_cache_rlock(view->cache);
+
result = g_buffer_cache_get_cursor_coordinates(view->cache, cursor, view->first, view->last, code, x, y);
+ g_buffer_cache_runlock(view->cache);
+
return result;
}