summaryrefslogtreecommitdiff
path: root/src/glibext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2020-08-18 20:08:39 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2020-08-18 20:08:39 (GMT)
commitc5631dd09fa9981e914ec9082c6270b69a719ca4 (patch)
tree0d50b3a82f466d2b8587ad20cfb0c93b180897ee /src/glibext
parente5185bf4b4b6f76f15d3ff460a9cea40a8753284 (diff)
Refreshed the rendering for newly added bookmarks.
Diffstat (limited to 'src/glibext')
-rw-r--r--src/glibext/buffercache-int.h2
-rw-r--r--src/glibext/buffercache.c88
-rw-r--r--src/glibext/buffercache.h8
-rw-r--r--src/glibext/bufferline.c2
-rw-r--r--src/glibext/bufferview.c25
5 files changed, 122 insertions, 3 deletions
diff --git a/src/glibext/buffercache-int.h b/src/glibext/buffercache-int.h
index 3dfd5e2..2ffa8ec 100644
--- a/src/glibext/buffercache-int.h
+++ b/src/glibext/buffercache-int.h
@@ -89,6 +89,8 @@ struct _GBufferCacheClass
void (* size_changed) (GBufferCache *, bool, size_t, size_t);
+ void (* line_updated) (GBufferCache *, size_t);
+
};
diff --git a/src/glibext/buffercache.c b/src/glibext/buffercache.c
index 6f52956..169c75e 100644
--- a/src/glibext/buffercache.c
+++ b/src/glibext/buffercache.c
@@ -397,6 +397,8 @@ static GBufferLine *get_cache_info_line(cache_info *info, const GWidthTracker *t
{
result = g_buffer_line_new(g_width_tracker_count_columns(tracker));
+ g_buffer_line_add_flag(result, info->extra_flags);
+
g_object_add_toggle_ref(G_OBJECT(result), (GToggleNotify)on_line_ref_toggle, info);
if (info->count == 1)
@@ -515,6 +517,14 @@ static void g_buffer_cache_class_init(GBufferCacheClass *class)
g_cclosure_user_marshal_VOID__BOOLEAN_ULONG_ULONG,
G_TYPE_NONE, 3, G_TYPE_BOOLEAN, G_TYPE_ULONG, G_TYPE_ULONG);
+ g_signal_new("line-updated",
+ G_TYPE_BUFFER_CACHE,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(GBufferCacheClass, line_updated),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__ULONG,
+ G_TYPE_NONE, 1, G_TYPE_ULONG);
+
}
@@ -761,6 +771,8 @@ gint g_buffer_cache_get_text_position(const GBufferCache *cache)
size_t g_buffer_cache_count_lines(const GBufferCache *cache)
{
+ // TODO check lock
+
return cache->used;
}
@@ -1337,6 +1349,44 @@ void g_buffer_cache_get_line_cursor(const GBufferCache *cache, size_t index, gin
* *
* Paramètres : cache = tampon de lignes à venir consulter. *
* index = indice de la ligne visée par la consultation. *
+* flag = propriété à intégrer. *
+* *
+* Description : Ajoute une propriété particulière à une ligne. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_buffer_cache_add_line_flag(GBufferCache *cache, size_t index, BufferLineFlags flag)
+{
+ cache_info *info; /* Accès direct à une ligne */
+
+ // TODO : check lock
+
+ assert(index < cache->used);
+
+ info = &cache->lines[index];
+
+ if ((info->extra_flags & flag) == 0)
+ {
+ info->extra_flags |= flag;
+
+ if (info->line != NULL)
+ g_buffer_line_add_flag(info->line, flag);
+
+ g_signal_emit_by_name(cache, "line-updated", index);
+
+ }
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : cache = tampon de lignes à venir consulter. *
+* index = indice de la ligne visée par la consultation. *
* *
* Description : Détermine l'ensemble des propriétés attachées à une ligne. *
* *
@@ -1381,6 +1431,44 @@ BufferLineFlags g_buffer_cache_get_line_flags(const GBufferCache *cache, size_t
/******************************************************************************
* *
+* Paramètres : cache = tampon de lignes à venir consulter. *
+* index = indice de la ligne visée par la consultation. *
+* flag = propriété à supprimer. *
+* *
+* Description : Retire une propriété particulière attachée à une ligne. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_buffer_cache_remove_line_flag(GBufferCache *cache, size_t index, BufferLineFlags flag)
+{
+ cache_info *info; /* Accès direct à une ligne */
+
+ // TODO : check lock
+
+ assert(index < cache->used);
+
+ info = &cache->lines[index];
+
+ if ((info->extra_flags & flag) != 0)
+ {
+ info->extra_flags &= ~flag;
+
+ if (info->line != NULL)
+ g_buffer_line_remove_flag(info->line, flag);
+
+ g_signal_emit_by_name(cache, "line-updated", index);
+
+ }
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : cache = tampon de lignes à consulter. *
* index = indice de la ligne recherchée. *
* *
diff --git a/src/glibext/buffercache.h b/src/glibext/buffercache.h
index 61114b0..7422c76 100644
--- a/src/glibext/buffercache.h
+++ b/src/glibext/buffercache.h
@@ -99,14 +99,18 @@ 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 **);
+/* 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);
+/* Retire une propriété particulière attachée à une ligne. */
+void g_buffer_cache_remove_line_flag(GBufferCache *, size_t, BufferLineFlags);
+
#define g_buffer_cache_lock(c)
#define g_buffer_cache_unlock(c)
-#define g_buffer_cache_throw_update_at_index(c, i) // check locked
-
/* Retrouve une ligne au sein d'un tampon avec un indice. */
GBufferLine *g_buffer_cache_find_line_by_index(const GBufferCache *, size_t);
diff --git a/src/glibext/bufferline.c b/src/glibext/bufferline.c
index dd6bc19..85fe027 100644
--- a/src/glibext/bufferline.c
+++ b/src/glibext/bufferline.c
@@ -1430,7 +1430,7 @@ void g_buffer_line_draw(GBufferLine *line, size_t index, cairo_t *cairo, gint x_
size_t i; /* Boucle de parcours */
gint max_width; /* Largeur maximale de colonne */
- if (line->flags != BLF_NONE && line->flags != BLF_HAS_CODE)
+ if (line->flags != BLF_NONE)
{
class = G_BUFFER_LINE_GET_CLASS(line);
diff --git a/src/glibext/bufferview.c b/src/glibext/bufferview.c
index 769cd8b..7ac6718 100644
--- a/src/glibext/bufferview.c
+++ b/src/glibext/bufferview.c
@@ -75,6 +75,9 @@ static void g_buffer_view_finalize(GBufferView *);
/* Accompagne une variation de la quantité de lignes du tampon. */
static void on_buffer_cache_size_changed(const GBufferCache *, bool, size_t, size_t, GBufferView *);
+/* Réagit à la modification d'une ligne du tampon. */
+static void on_buffer_cache_line_updated(const GBufferCache *, size_t, GBufferView *);
+
/* 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 **);
@@ -236,6 +239,7 @@ GBufferView *g_buffer_view_new(GBufferCache *cache, segcnt_list *highlighted)
g_buffer_view_restrict(result, NULL, NULL);
g_signal_connect(cache, "size-changed", G_CALLBACK(on_buffer_cache_size_changed), result);
+ g_signal_connect(cache, "line-updated", G_CALLBACK(on_buffer_cache_line_updated), result);
if (highlighted != NULL)
{
@@ -253,6 +257,27 @@ GBufferView *g_buffer_view_new(GBufferCache *cache, segcnt_list *highlighted)
/******************************************************************************
* *
* Paramètres : cache = tampon de lignes cohérentes à manipuler. *
+* index = indice de la première ligne actualisée. *
+* *
+* Description : Réagit à la modification d'une ligne du tampon. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void on_buffer_cache_line_updated(const GBufferCache *cache, size_t index, GBufferView *view)
+{
+ if (view->first <= index && index <= view->last)
+ g_signal_emit_by_name(view, "need-redraw");
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : cache = tampon de lignes cohérentes à manipuler. *
* added = indication sur la variation de la taille du tampon. *
* index = indice de la première ligne à traiter. *
* count = nombre de lignes à traiter. *