From 7baab38a0e9717110f7b4fb54efeb2d864040ecd Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
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 <nocbos@gmail.com>
+
+	* 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 <nocbos@gmail.com>
 
 	* 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