summaryrefslogtreecommitdiff
path: root/src/glibext/bufferview.c
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/bufferview.c
parentdfe76faf21e254c02c86a1b0b1f8ca8fc07fe027 (diff)
Defined lock mechanism for buffer caches.
Diffstat (limited to 'src/glibext/bufferview.c')
-rw-r--r--src/glibext/bufferview.c110
1 files changed, 69 insertions, 41 deletions
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;
}