diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/db/collection.c | 2 | ||||
-rw-r--r-- | src/analysis/db/items/bookmark.c | 13 | ||||
-rw-r--r-- | src/glibext/buffercache-int.h | 2 | ||||
-rw-r--r-- | src/glibext/buffercache.c | 88 | ||||
-rw-r--r-- | src/glibext/buffercache.h | 8 | ||||
-rw-r--r-- | src/glibext/bufferline.c | 2 | ||||
-rw-r--r-- | src/glibext/bufferview.c | 25 |
7 files changed, 127 insertions, 13 deletions
diff --git a/src/analysis/db/collection.c b/src/analysis/db/collection.c index 57e675b..4c7a496 100644 --- a/src/analysis/db/collection.c +++ b/src/analysis/db/collection.c @@ -652,7 +652,7 @@ static void g_db_collection_set_last_item(GDbCollection *collec, GDbItem *item, else { - if (g_db_item_get_flags(item) & DIF_ERASER) + if ((g_db_item_get_flags(item) & DIF_ERASER) == 0) { g_object_ref(G_OBJECT(item)); g_object_ref(G_OBJECT(item)); diff --git a/src/analysis/db/items/bookmark.c b/src/analysis/db/items/bookmark.c index f493559..2afbbc0 100644 --- a/src/analysis/db/items/bookmark.c +++ b/src/analysis/db/items/bookmark.c @@ -526,7 +526,6 @@ static bool g_db_bookmark_run(GDbBookmark *bookmark, GLoadedBinary *binary, bool GBufferCache *cache; /* Tampon d'impression colorée */ GLineCursor *cursor; /* Emplacement dans un tampon */ size_t index; /* Indice de ligne à traiter */ - GBufferLine *line; /* Ligne de tampon à marquer */ result = false; @@ -544,22 +543,18 @@ static bool g_db_bookmark_run(GDbBookmark *bookmark, GLoadedBinary *binary, bool g_object_unref(G_OBJECT(cursor)); - line = g_buffer_cache_find_line_by_index(cache, index); + index = g_buffer_cache_look_for_flag(cache, index, BLF_HAS_CODE); /* Application du changement */ - result = (line != NULL); + result = (index < g_buffer_cache_count_lines(cache)); if (result) { if (set) - g_buffer_line_add_flag(line, BLF_BOOKMARK); + g_buffer_cache_add_line_flag(cache, index, BLF_BOOKMARK); else - g_buffer_line_remove_flag(line, BLF_BOOKMARK); - - g_object_unref(G_OBJECT(line)); - - g_buffer_cache_throw_update_at_index(cache, index); + g_buffer_cache_remove_line_flag(cache, index, BLF_BOOKMARK); } 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. * |