From 7baab38a0e9717110f7b4fb54efeb2d864040ecd Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Wed, 13 May 2015 23:45:33 +0000 Subject: Fixed a bug by searching lines in the whole code buffer instead of using the local one. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@536 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 10 ++++++++++ src/glibext/gcodebuffer.c | 27 +++++++++++++++++++++++++++ src/glibext/gcodebuffer.h | 3 +++ src/gtkext/gtkbufferview.c | 15 +++++++++++---- 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 40a562b..046a4f2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +15-05-14 Cyrille Bagard + + * src/glibext/gcodebuffer.c: + * src/glibext/gcodebuffer.h: + Give access to buffer lines with an index. + + * src/gtkext/gtkbufferview.c: + Fix a bug by searching lines in the whole code buffer instead of using + the local one. + 15-05-12 Cyrille Bagard * src/gtkext/gtkgraphview.c: diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index c9abf4e..9b13875 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -797,6 +797,33 @@ GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *buffer, const vm /****************************************************************************** * * +* Paramètres : buffer = tampon de lignes à consulter. * +* index = indice de la ligne recherchée. * +* * +* Description : Retrouve une ligne au sein d'un tampon avec un indice. * +* * +* Retour : Line retrouvée ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GBufferLine *g_code_buffer_find_line_by_index(const GCodeBuffer *buffer, size_t index) +{ + GBufferLine *result; /* Ligne trouvée à retourner */ + + if (index < buffer->used) + result = buffer->lines[index]; + else + result = NULL; + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : buffer = composant GTK à mettre à jour. * * * * Description : Augmente l'indentation des prochaines lignes. * diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h index 652ea23..52c74ed 100644 --- a/src/glibext/gcodebuffer.h +++ b/src/glibext/gcodebuffer.h @@ -72,6 +72,9 @@ GBufferLine *g_code_buffer_insert_after(GCodeBuffer *, GBufferLine *); /* Retrouve une ligne au sein d'un tampon avec une adresse. */ GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *, const vmpa2t *, BufferLineFlags, size_t *); +/* Retrouve une ligne au sein d'un tampon avec un indice. */ +GBufferLine *g_code_buffer_find_line_by_index(const GCodeBuffer *, size_t); + /* Augmente l'indentation des prochaines lignes. */ void g_code_buffer_inc_indentation(GCodeBuffer *); diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c index 1b57341..7f62963 100644 --- a/src/gtkext/gtkbufferview.c +++ b/src/gtkext/gtkbufferview.c @@ -525,6 +525,7 @@ static gboolean gtk_buffer_view_query_tooltip(GtkWidget *widget, gint x, gint y, GBinFormat *format; /* Format du fichier binaire */ GBinSymbol *target_sym; /* Symbole présent à l'adresse */ GBinSymbol *next_sym; /* Symbole suivant l'adresse */ + GCodeBuffer *buffer; /* Tampon où lire les lignes */ const vmpa2t *stop_addr; /* Adresse associée, pour fin */ const mrange_t *lrange; /* Couverture d'une ligne */ size_t count; /* Nbre de lignes max à traiter*/ @@ -543,7 +544,6 @@ static gboolean gtk_buffer_view_query_tooltip(GtkWidget *widget, gint x, gint y, real_y = y; gtk_view_panel_compute_real_coord(GTK_VIEW_PANEL(view), &real_x, &real_y); - line = g_buffer_view_find_line_and_segment_at(view->buffer_view, &real_x, real_y, NULL, GTK_VIEW_PANEL(view)->display, &segment); @@ -584,6 +584,14 @@ static gboolean gtk_buffer_view_query_tooltip(GtkWidget *widget, gint x, gint y, /* Construction du contenu textuel */ + /** + * Dans le cas des vues de blocs basiques, il est impératif + * de chercher les lignes dans le tampon global, et non uniquement dans + * celui propre au bloc basique courant. + */ + + buffer = g_loaded_binary_get_disassembled_buffer(GTK_VIEW_PANEL(view)->binary); + if (g_binary_format_find_next_symbol_at(format, &addr, &next_sym)) stop_addr = get_mrange_addr(g_binary_symbol_get_range(next_sym)); @@ -591,11 +599,10 @@ static gboolean gtk_buffer_view_query_tooltip(GtkWidget *widget, gint x, gint y, markup = NULL; - for (i = 0, line = g_buffer_view_find_line_by_addr(view->buffer_view, &addr, BLF_NONE, &index); + for (i = 0, line = g_code_buffer_find_line_by_addr(buffer, &addr, BLF_NONE, &index); i < count && line != NULL; - i++, line = g_buffer_view_find_line_by_index(view->buffer_view, index + i)) + i++, line = g_code_buffer_find_line_by_index(buffer, index + i)) { - /* Si on commence à marcher sur les plates-bandes du symbole suivant... */ if (next_sym != NULL) { -- cgit v0.11.2-87-g4458