From 4299c1d780a37ad242948fabab8675d74952c5f9 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Wed, 11 Jul 2018 16:18:06 +0200
Subject: Restored a minimal graph view system.

---
 src/glibext/Makefile.am          |   3 +
 src/glibext/gbinarycursor.c      | 204 +++++++++++++++++++++++++++++++++++++++
 src/glibext/gbinarycursor.h      |  65 +++++++++++++
 src/glibext/glinecursor-int.h    |  48 +++++++++
 src/glibext/glinecursor.c        | 126 ++++++++++++++++++++++++
 src/glibext/glinecursor.h        |  52 ++++++++++
 src/glibext/gloadedpanel-int.h   |   9 ++
 src/glibext/gloadedpanel.c       |  50 ++++++++++
 src/glibext/gloadedpanel.h       |   7 ++
 src/gtkext/gtkblockdisplay.c     |  54 +++++++++++
 src/gtkext/gtkdisplaypanel-int.h |  12 +++
 src/gtkext/gtkdisplaypanel.c     |  52 ++++++++++
 src/gtkext/gtkgraphdisplay.c     |  98 +++++++++++++++----
 src/gui/menus/view.c             |  13 ++-
 14 files changed, 773 insertions(+), 20 deletions(-)
 create mode 100644 src/glibext/gbinarycursor.c
 create mode 100644 src/glibext/gbinarycursor.h
 create mode 100644 src/glibext/glinecursor-int.h
 create mode 100644 src/glibext/glinecursor.c
 create mode 100644 src/glibext/glinecursor.h

diff --git a/src/glibext/Makefile.am b/src/glibext/Makefile.am
index 9a7c49f..9efc138 100644
--- a/src/glibext/Makefile.am
+++ b/src/glibext/Makefile.am
@@ -8,10 +8,13 @@ libglibext_la_SOURCES =					\
 	configuration.h configuration.c		\
 	delayed-int.h						\
 	delayed.h delayed.c					\
+	gbinarycursor.h gbinarycursor.c		\
 	gbinportion.h gbinportion.c			\
 	gbuffercache.h gbuffercache.c		\
 	gbufferline.h gbufferline.c			\
 	gbufferview.h gbufferview.c			\
+	glinecursor-int.h					\
+	glinecursor.h glinecursor.c			\
 	gloadedpanel-int.h					\
 	gloadedpanel.h gloadedpanel.c		\
 	gnhash.h gnhash.c					\
diff --git a/src/glibext/gbinarycursor.c b/src/glibext/gbinarycursor.c
new file mode 100644
index 0000000..3bd7199
--- /dev/null
+++ b/src/glibext/gbinarycursor.c
@@ -0,0 +1,204 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * gbinarycursor.c - suivi de positions dans des panneaux de chargement
+ *
+ * Copyright (C) 2018 Cyrille Bagard
+ *
+ *  This file is part of Chrysalide.
+ *
+ *  Chrysalide is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  Chrysalide is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with Chrysalide.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "gbinarycursor.h"
+
+
+
+/* Suivi de positions dans un panneau de chargement (instance) */
+struct _GBinaryCursor
+{
+    GObject parent;                         /* A laisser en premier        */
+
+    vmpa2t addr;                            /* Position mémoire du curseur */
+
+};
+
+/* Suivi de positions dans un panneau de chargement (classe) */
+struct _GBinaryCursorClass
+{
+    GObjectClass parent;                    /* A laisser en premier        */
+
+};
+
+
+/* Procède à l'initialisation d'une classe de suivi de position. */
+static void g_binary_cursor_class_init(GBinaryCursorClass *);
+
+/* Procède à l'initialisation d'un suivi de positions. */
+static void g_binary_cursor_init(GBinaryCursor *);
+
+/* Supprime toutes les références externes. */
+static void g_binary_cursor_dispose(GBinaryCursor *);
+
+/* Procède à la libération totale de la mémoire. */
+static void g_binary_cursor_finalize(GBinaryCursor *);
+
+
+
+/* Détermine le type du gestionnaire de largeurs associées aux lignes. */
+G_DEFINE_TYPE(GBinaryCursor, g_binary_cursor, G_TYPE_OBJECT);
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : class = classe de composant GTK à initialiser.               *
+*                                                                             *
+*  Description : Procède à l'initialisation d'une classe de suivi de position.*
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void g_binary_cursor_class_init(GBinaryCursorClass *class)
+{
+    GObjectClass *object;                   /* Autre version de la classe  */
+
+    object = G_OBJECT_CLASS(class);
+
+    object->dispose = (GObjectFinalizeFunc/* ! */)g_binary_cursor_dispose;
+    object->finalize = (GObjectFinalizeFunc)g_binary_cursor_finalize;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : cursor = composant GLib à initialiser.                       *
+*                                                                             *
+*  Description : Procède à l'initialisation d'un suivi de positions.          *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void g_binary_cursor_init(GBinaryCursor *cursor)
+{
+    init_vmpa(&cursor->addr, VMPA_NO_PHYSICAL, VMPA_NO_VIRTUAL);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : cursor = instance d'objet GLib à traiter.                    *
+*                                                                             *
+*  Description : Supprime toutes les références externes.                     *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void g_binary_cursor_dispose(GBinaryCursor *cursor)
+{
+    G_OBJECT_CLASS(g_binary_cursor_parent_class)->dispose(G_OBJECT(cursor));
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : cursor = instance d'objet GLib à traiter.                    *
+*                                                                             *
+*  Description : Procède à la libération totale de la mémoire.                *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void g_binary_cursor_finalize(GBinaryCursor *cursor)
+{
+    G_OBJECT_CLASS(g_binary_cursor_parent_class)->finalize(G_OBJECT(cursor));
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : -                                                            *
+*                                                                             *
+*  Description : Crée un nouveau suivi de positions dans un panneau.          *
+*                                                                             *
+*  Retour      : Instance de suivi en place.                                  *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+GLineCursor *g_binary_cursor_new(void)
+{
+    GLineCursor *result;                    /* Instance à retourner        */
+
+    result = g_object_new(G_TYPE_BINARY_CURSOR, NULL);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : cursor = suivi de positions à mettre à jour.                 *
+*                addr   = emplacement dans le binaire visé.                   *
+*                                                                             *
+*  Description : Met à jour la position suivi dans un panneau de chargement.  *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+void g_binary_cursor_update(GBinaryCursor *cursor, const vmpa2t *addr)
+{
+    copy_vmpa(&cursor->addr, addr);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : cursor = suivi de positions à consulter.                     *
+*                addr   = emplacement dans le binaire visé. [OUT]             *
+*                                                                             *
+*  Description : Transmet la position suivi dans un panneau de chargement.    *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+void g_binary_cursor_get_info(GBinaryCursor *cursor, vmpa2t *addr)
+{
+    copy_vmpa(addr, &cursor->addr);
+
+}
diff --git a/src/glibext/gbinarycursor.h b/src/glibext/gbinarycursor.h
new file mode 100644
index 0000000..e6617b6
--- /dev/null
+++ b/src/glibext/gbinarycursor.h
@@ -0,0 +1,65 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * gbinarycursor.h - prototypes pour le suivi de positions dans des panneaux de chargement
+ *
+ * Copyright (C) 2018 Cyrille Bagard
+ *
+ *  This file is part of Chrysalide.
+ *
+ *  Chrysalide is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  Chrysalide is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with Chrysalide.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _GLIBEXT_BINARYCURSOR_H
+#define _GLIBEXT_BINARYCURSOR_H
+
+
+#include <glib-object.h>
+
+
+#include "glinecursor.h"
+#include "../arch/vmpa.h"
+
+
+
+#define G_TYPE_BINARY_CURSOR            (g_binary_cursor_get_type())
+#define G_BINARY_CURSOR(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_BINARY_CURSOR, GBinaryCursor))
+#define G_BINARY_CURSOR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_BINARY_CURSOR, GBinaryCursorClass))
+#define G_IS_BINARY_CURSOR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_BINARY_CURSOR))
+#define G_IS_BINARY_CURSOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_BINARY_CURSOR))
+#define G_BINARY_CURSOR_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BINARY_CURSOR, GBinaryCursorClass))
+
+
+/* Suivi de positions dans un panneau de chargement (instance) */
+typedef struct _GBinaryCursor GBinaryCursor;
+
+/* Suivi de positions dans un panneau de chargement (classe) */
+typedef struct _GBinaryCursorClass GBinaryCursorClass;
+
+
+/* Détermine le type du suivi de positions dans un panneau de chargement. */
+GType g_binary_cursor_get_type(void);
+
+/* Crée un nouveau suivi de positions dans un panneau. */
+GLineCursor *g_binary_cursor_new(void);
+
+/* Met à jour la position suivi dans un panneau de chargement. */
+void g_binary_cursor_update(GBinaryCursor *, const vmpa2t *);
+
+/* Transmet la position suivi dans un panneau de chargement. */
+void g_binary_cursor_get_info(GBinaryCursor *, vmpa2t *);
+
+
+
+#endif  /* _GLIBEXT_BINARYCURSOR_H */
diff --git a/src/glibext/glinecursor-int.h b/src/glibext/glinecursor-int.h
new file mode 100644
index 0000000..411b072
--- /dev/null
+++ b/src/glibext/glinecursor-int.h
@@ -0,0 +1,48 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * glinecursor-int.h - définitions internes propres au suivi de positions
+ *
+ * Copyright (C) 2018 Cyrille Bagard
+ *
+ *  This file is part of Chrysalide.
+ *
+ *  Chrysalide is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  Chrysalide is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with Chrysalide.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _GLIBEXT_GLINECURSOR_INT_H
+#define _GLIBEXT_GLINECURSOR_INT_H
+
+
+#include "glinecursor.h"
+
+
+
+/* Suivi de positions dans un panneau de chargement (instance) */
+struct _GLineCursor
+{
+    GObject parent;                         /* A laisser en premier        */
+
+};
+
+/* Suivi de positions dans un panneau de chargement (classe) */
+struct _GLineCursorClass
+{
+    GObjectClass parent;                    /* A laisser en premier        */
+
+};
+
+
+
+#endif  /* _GLIBEXT_GLINECURSOR_INT_H */
diff --git a/src/glibext/glinecursor.c b/src/glibext/glinecursor.c
new file mode 100644
index 0000000..8ad24bd
--- /dev/null
+++ b/src/glibext/glinecursor.c
@@ -0,0 +1,126 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * glinecursor.c - suivi de positions dans des panneaux de chargement
+ *
+ * Copyright (C) 2018 Cyrille Bagard
+ *
+ *  This file is part of Chrysalide.
+ *
+ *  Chrysalide is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  Chrysalide is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with Chrysalide.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "glinecursor.h"
+
+
+#include "glinecursor-int.h"
+
+
+
+/* Procède à l'initialisation d'une classe de suivi de position. */
+static void g_line_cursor_class_init(GLineCursorClass *);
+
+/* Procède à l'initialisation d'un suivi de positions. */
+static void g_line_cursor_init(GLineCursor *);
+
+/* Supprime toutes les références externes. */
+static void g_line_cursor_dispose(GLineCursor *);
+
+/* Procède à la libération totale de la mémoire. */
+static void g_line_cursor_finalize(GLineCursor *);
+
+
+
+/* Détermine le type du gestionnaire de largeurs associées aux lignes. */
+G_DEFINE_TYPE(GLineCursor, g_line_cursor, G_TYPE_OBJECT);
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : class = classe de composant GTK à initialiser.               *
+*                                                                             *
+*  Description : Procède à l'initialisation d'une classe de suivi de position.*
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void g_line_cursor_class_init(GLineCursorClass *class)
+{
+    GObjectClass *object;                   /* Autre version de la classe  */
+
+    object = G_OBJECT_CLASS(class);
+
+    object->dispose = (GObjectFinalizeFunc/* ! */)g_line_cursor_dispose;
+    object->finalize = (GObjectFinalizeFunc)g_line_cursor_finalize;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : cursor = composant GLib à initialiser.                       *
+*                                                                             *
+*  Description : Procède à l'initialisation d'un suivi de positions.          *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void g_line_cursor_init(GLineCursor *cursor)
+{
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : cursor = instance d'objet GLib à traiter.                    *
+*                                                                             *
+*  Description : Supprime toutes les références externes.                     *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void g_line_cursor_dispose(GLineCursor *cursor)
+{
+    G_OBJECT_CLASS(g_line_cursor_parent_class)->dispose(G_OBJECT(cursor));
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : cursor = instance d'objet GLib à traiter.                    *
+*                                                                             *
+*  Description : Procède à la libération totale de la mémoire.                *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void g_line_cursor_finalize(GLineCursor *cursor)
+{
+    G_OBJECT_CLASS(g_line_cursor_parent_class)->finalize(G_OBJECT(cursor));
+
+}
diff --git a/src/glibext/glinecursor.h b/src/glibext/glinecursor.h
new file mode 100644
index 0000000..e541e66
--- /dev/null
+++ b/src/glibext/glinecursor.h
@@ -0,0 +1,52 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * glinecursor.h - prototypes pour le suivi de positions dans des panneaux de chargement
+ *
+ * Copyright (C) 2018 Cyrille Bagard
+ *
+ *  This file is part of Chrysalide.
+ *
+ *  Chrysalide is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  Chrysalide is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with Chrysalide.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _GLIBEXT_LINECURSOR_H
+#define _GLIBEXT_LINECURSOR_H
+
+
+#include <glib-object.h>
+
+
+
+#define G_TYPE_LINE_CURSOR            (g_line_cursor_get_type())
+#define G_LINE_CURSOR(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_LINE_CURSOR, GLineCursor))
+#define G_LINE_CURSOR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_LINE_CURSOR, GLineCursorClass))
+#define G_IS_LINE_CURSOR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_LINE_CURSOR))
+#define G_IS_LINE_CURSOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_LINE_CURSOR))
+#define G_LINE_CURSOR_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_LINE_CURSOR, GLineCursorClass))
+
+
+/* Suivi de positions dans un panneau de chargement (instance) */
+typedef struct _GLineCursor GLineCursor;
+
+/* Suivi de positions dans un panneau de chargement (classe) */
+typedef struct _GLineCursorClass GLineCursorClass;
+
+
+/* Détermine le type du suivi de positions dans un panneau de chargement. */
+GType g_line_cursor_get_type(void);
+
+
+
+#endif  /* _GLIBEXT_LINECURSOR_H */
diff --git a/src/glibext/gloadedpanel-int.h b/src/glibext/gloadedpanel-int.h
index 3059912..b26ca06 100644
--- a/src/glibext/gloadedpanel-int.h
+++ b/src/glibext/gloadedpanel-int.h
@@ -35,6 +35,12 @@ typedef void (* set_loaded_panel_content_fc) (GLoadedPanel *, GLoadedContent *);
 /* Fournit le contenu associé à un panneau de chargement. */
 typedef GLoadedContent * (* get_loaded_panel_content_fc) (const GLoadedPanel *);
 
+/* Fournit le position courante dans un panneau de chargement. */
+typedef GLineCursor * (* get_loaded_cursor_fc) (const GLoadedPanel *);
+
+/* Définit le position courante dans un panneau de chargement. */
+typedef void (* set_loaded_cursor_fc) (GLoadedPanel *, const GLineCursor *);
+
 /* Place en cache un rendu destiné à l'aperçu graphique rapide. */
 typedef void (* cache_loaded_glance_fc) (GLoadedPanel *, cairo_t *, const GtkAllocation *, double);
 
@@ -47,6 +53,9 @@ struct _GLoadedPanelIface
     set_loaded_panel_content_fc set_content;/* Définition du contenu       */
     get_loaded_panel_content_fc get_content;/* Récupération du contenu     */
 
+    get_loaded_cursor_fc get_cursor;        /* Fourniture d'une position   */
+    set_loaded_cursor_fc set_cursor;        /* Application d'une position  */
+
     cache_loaded_glance_fc cache_glance;    /* Cache de la mignature       */
 
 };
diff --git a/src/glibext/gloadedpanel.c b/src/glibext/gloadedpanel.c
index 341c207..5f43821 100644
--- a/src/glibext/gloadedpanel.c
+++ b/src/glibext/gloadedpanel.c
@@ -109,6 +109,56 @@ GLoadedContent *g_loaded_panel_get_content(const GLoadedPanel *panel)
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : panel = composant GTK à consulter.                           *
+*                                                                             *
+*  Description : Fournit le position courante dans un panneau de chargement.  *
+*                                                                             *
+*  Retour      : Informations relatives à la position du curseur.             *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+GLineCursor *g_loaded_panel_get_cursor(const GLoadedPanel *panel)
+{
+    GLineCursor *result;                    /* Contenu à retourner         */
+    GLoadedPanelIface *iface;               /* Interface utilisée          */
+
+    iface = G_LOADED_PANEL_GET_IFACE(panel);
+
+    result = iface->get_cursor(panel);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : panel  = composant GTK à mettre à jour.                      *
+*                cursor = informations relatives à la position du curseur.    *
+*                                                                             *
+*  Description : Définit le position courante dans un panneau de chargement.  *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+void g_loaded_panel_set_cursor(GLoadedPanel *panel, const GLineCursor *cursor)
+{
+    GLoadedPanelIface *iface;               /* Interface utilisée          */
+
+    iface = G_LOADED_PANEL_GET_IFACE(panel);
+
+    iface->set_cursor(panel, cursor);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : panel = composant GTK à manipuler.                           *
 *                cairo = assistant pour la création de rendus.                *
 *                area  = taille de la surface réduite à disposition.          *
diff --git a/src/glibext/gloadedpanel.h b/src/glibext/gloadedpanel.h
index 545760b..5d22cdb 100644
--- a/src/glibext/gloadedpanel.h
+++ b/src/glibext/gloadedpanel.h
@@ -29,6 +29,7 @@
 #include <gtk/gtk.h>
 
 
+#include "glinecursor.h"
 #include "../analysis/loaded.h"
 
 
@@ -57,6 +58,12 @@ void g_loaded_panel_set_content(GLoadedPanel *, GLoadedContent *);
 /* Fournit le contenu associé à un panneau de chargement. */
 GLoadedContent *g_loaded_panel_get_content(const GLoadedPanel *);
 
+/* Fournit le position courante dans un panneau de chargement. */
+GLineCursor *g_loaded_panel_get_cursor(const GLoadedPanel *);
+
+/* Définit le position courante dans un panneau de chargement. */
+void g_loaded_panel_set_cursor(GLoadedPanel *, const GLineCursor *);
+
 /* Place en cache un rendu destiné à l'aperçu graphique rapide. */
 void g_loaded_panel_cache_glance(GLoadedPanel *, cairo_t *, const GtkAllocation *, double);
 
diff --git a/src/gtkext/gtkblockdisplay.c b/src/gtkext/gtkblockdisplay.c
index 7fde317..48ca2b8 100644
--- a/src/gtkext/gtkblockdisplay.c
+++ b/src/gtkext/gtkblockdisplay.c
@@ -28,6 +28,7 @@
 #include "../arch/instruction.h"
 #include "../arch/operand.h"
 #include "../analysis/loaded.h"
+#include "../glibext/gbinarycursor.h"
 
 
 
@@ -74,6 +75,12 @@ static gboolean gtk_block_display_need_redraw(GtkBlockDisplay *, GBufferView *);
 /* Prend acte de l'association d'un binaire chargé. */
 static void gtk_block_display_attach_binary(GtkBlockDisplay *, GLoadedBinary *);
 
+/* Fournit le position courante dans un panneau de chargement. */
+static GLineCursor *gtk_block_display_get_cursor(const GtkBlockDisplay *);
+
+/* Définit le position courante dans un panneau de chargement. */
+static void gtk_block_display_set_cursor(GtkBlockDisplay *, const GLineCursor *);
+
 /* Réagit à un déplacement de curseur. */
 static bool gtk_block_display_notify_caret_relocation(GtkBlockDisplay *, const GdkRectangle *, const vmpa2t *);
 
@@ -115,6 +122,8 @@ static void gtk_block_display_class_init(GtkBlockDisplayClass *class)
     panel_class = GTK_DISPLAY_PANEL_CLASS(class);
 
     panel_class->attach = (attach_binary_fc)gtk_block_display_attach_binary;
+    panel_class->get_cursor = (get_cursor_fc)gtk_block_display_get_cursor;
+    panel_class->set_cursor = (set_cursor_fc)gtk_block_display_set_cursor;
 
     buffer_class = GTK_BUFFER_DISPLAY_CLASS(class);
 
@@ -386,6 +395,51 @@ static void gtk_block_display_attach_binary(GtkBlockDisplay *display, GLoadedBin
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : display = composant GTK à consulter.                         *
+*                                                                             *
+*  Description : Fournit le position courante dans un panneau de chargement.  *
+*                                                                             *
+*  Retour      : Informations relatives à la position du curseur.             *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static GLineCursor *gtk_block_display_get_cursor(const GtkBlockDisplay *display)
+{
+    GLineCursor *result;                    /* Contenu à retourner         */
+
+    result = g_binary_cursor_new();
+
+    g_binary_cursor_update(G_BINARY_CURSOR(result), &GTK_BUFFER_DISPLAY(display)->caret_addr);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : display = composant GTK à mettre à jour.                     *
+*                cursor  = informations relatives à la position du curseur.   *
+*                                                                             *
+*  Description : Définit le position courante dans un panneau de chargement.  *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void gtk_block_display_set_cursor(GtkBlockDisplay *display, const GLineCursor *cursor)
+{
+
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : display = composant GTK à manipuler.                         *
 *                area    = emplacement pour le dessin d'un curseur.           *
 *                addr    = position dans la mémoire représentée du curseur.   *
diff --git a/src/gtkext/gtkdisplaypanel-int.h b/src/gtkext/gtkdisplaypanel-int.h
index 72638c0..7a60152 100644
--- a/src/gtkext/gtkdisplaypanel-int.h
+++ b/src/gtkext/gtkdisplaypanel-int.h
@@ -32,6 +32,9 @@
 #include <gtk/gtk.h>
 
 
+#include "../glibext/glinecursor.h"
+
+
 
 /* Prend acte de l'association d'un binaire chargé. */
 typedef void (* attach_binary_fc) (GtkDisplayPanel *, GLoadedBinary *);
@@ -63,6 +66,12 @@ typedef bool (* get_view_position_fc) (const GtkDisplayPanel *, GBufferLine **,
 /* Déplace le curseur à un emplacement défini. */
 typedef bool (* move_caret_to_fc) (GtkDisplayPanel *, gint, gint);
 
+/* Fournit le position courante dans un panneau de chargement. */
+typedef GLineCursor * (* get_cursor_fc) (const GtkDisplayPanel *);
+
+/* Définit le position courante dans un panneau de chargement. */
+typedef void (* set_cursor_fc) (GtkDisplayPanel *, const GLineCursor *);
+
 /* Place en cache un rendu destiné à l'aperçu graphique rapide. */
 typedef void (* cache_glance_fc) (GtkDisplayPanel *, cairo_t *, const GtkAllocation *, double);
 
@@ -100,6 +109,9 @@ struct _GtkDisplayPanelClass
     get_addr_coordinates_fc get_coordinates;/* Conversion adresse <-> pos. */
     get_active_object_fc get_active;        /* Infos sur l'objet actif     */
     move_caret_to_fc move_caret_to;         /* Déplacement du curseur      */
+
+    get_cursor_fc get_cursor;               /* Fourniture d'une position   */
+    set_cursor_fc set_cursor;               /* Application d'une position  */
     cache_glance_fc cache_glance;           /* Cache de la mignature       */
 
     /* Signaux */
diff --git a/src/gtkext/gtkdisplaypanel.c b/src/gtkext/gtkdisplaypanel.c
index 08c9838..2cb05ea 100644
--- a/src/gtkext/gtkdisplaypanel.c
+++ b/src/gtkext/gtkdisplaypanel.c
@@ -98,6 +98,12 @@ static void gtk_display_panel_set_content(GtkDisplayPanel *, GLoadedContent *);
 /* Fournit le contenu associé à un panneau de chargement. */
 static GLoadedContent *gtk_display_panel_get_content(const GtkDisplayPanel *);
 
+/* Fournit le position courante dans un panneau de chargement. */
+static GLineCursor *gtk_display_panel_get_cursor(const GtkDisplayPanel *);
+
+/* Définit le position courante dans un panneau de chargement. */
+static void gtk_display_panel_set_cursor(GtkDisplayPanel *, const GLineCursor *);
+
 /* Place en cache un rendu destiné à l'aperçu graphique rapide. */
 static void gtk_display_panel_cache_glance(GtkDisplayPanel *, cairo_t *, const GtkAllocation *, double);
 
@@ -204,6 +210,9 @@ static void gtk_display_panel_loaded_interface_init(GLoadedPanelInterface *iface
     iface->set_content = (set_loaded_panel_content_fc)gtk_display_panel_set_content;
     iface->get_content = (get_loaded_panel_content_fc)gtk_display_panel_get_content;
 
+    iface->get_cursor = (get_loaded_cursor_fc)gtk_display_panel_get_cursor;
+    iface->set_cursor = (set_loaded_cursor_fc)gtk_display_panel_set_cursor;
+
     iface->cache_glance = (cache_loaded_glance_fc)gtk_display_panel_cache_glance;
 
 }
@@ -1155,6 +1164,49 @@ static GLoadedContent *gtk_display_panel_get_content(const GtkDisplayPanel *pane
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : panel = composant GTK à consulter.                           *
+*                                                                             *
+*  Description : Fournit le position courante dans un panneau de chargement.  *
+*                                                                             *
+*  Retour      : Informations relatives à la position du curseur.             *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static GLineCursor *gtk_display_panel_get_cursor(const GtkDisplayPanel *panel)
+{
+    GLineCursor *result;                    /* Contenu à retourner         */
+
+    result = GTK_DISPLAY_PANEL_GET_CLASS(panel)->get_cursor(panel);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : panel  = composant GTK à mettre à jour.                      *
+*                cursor = informations relatives à la position du curseur.    *
+*                                                                             *
+*  Description : Définit le position courante dans un panneau de chargement.  *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void gtk_display_panel_set_cursor(GtkDisplayPanel *panel, const GLineCursor *cursor)
+{
+    GTK_DISPLAY_PANEL_GET_CLASS(panel)->set_cursor(panel, cursor);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : panel = composant GTK à manipuler.                           *
 *                cairo = assistant pour la création de rendus.                *
 *                area  = taille de la surface réduite à disposition.          *
diff --git a/src/gtkext/gtkgraphdisplay.c b/src/gtkext/gtkgraphdisplay.c
index c74d203..ce882f9 100644
--- a/src/gtkext/gtkgraphdisplay.c
+++ b/src/gtkext/gtkgraphdisplay.c
@@ -33,6 +33,7 @@
 #include "graph/cluster.h"
 #include "../analysis/routine.h"
 #include "../format/format.h"
+#include "../glibext/gbinarycursor.h"
 #include "../glibext/gloadedpanel.h"
 #include "../gui/core/items.h"
 
@@ -125,11 +126,17 @@ static bool gtk_graph_display_get_address_coordinates(const GtkGraphDisplay *, c
 /* Déplace le curseur à un emplacement défini. */
 static bool gtk_graph_display_move_caret_to(GtkGraphDisplay *, gint, gint);
 
+/* Fournit le position courante dans un panneau de chargement. */
+static GLineCursor *gtk_graph_display_get_cursor(const GtkGraphDisplay *);
+
+/* Définit le position courante dans un panneau de chargement. */
+static void gtk_graph_display_set_cursor(GtkGraphDisplay *, const GLineCursor *);
+
 /* Place en cache un rendu destiné à l'aperçu graphique rapide. */
 static void gtk_graph_display_cache_glance(GtkGraphDisplay *, cairo_t *, const GtkAllocation *, double);
 
 /* Supprime tout contenu de l'afficheur de code en graphique. */
-static void gtk_graph_display_reset(GtkGraphDisplay *);
+static void gtk_graph_display_reset(GtkGraphDisplay *, bool);
 
 /* Notifie un changement de surbrillance au sein d'un noeud. */
 static void gtk_graph_display_changed_highlights(GtkBlockDisplay *, GtkGraphDisplay *);
@@ -179,6 +186,8 @@ static void gtk_graph_display_class_init(GtkGraphDisplayClass *class)
     panel_class->get_caret_loc = (get_caret_location_fc)gtk_graph_display_get_caret_location;
     panel_class->get_coordinates = (get_addr_coordinates_fc)gtk_graph_display_get_address_coordinates;
     panel_class->move_caret_to = (move_caret_to_fc)gtk_graph_display_move_caret_to;
+    panel_class->get_cursor = (get_cursor_fc)gtk_graph_display_get_cursor;
+    panel_class->set_cursor = (set_cursor_fc)gtk_graph_display_set_cursor;
     panel_class->cache_glance = (cache_glance_fc)gtk_graph_display_cache_glance;
 
 }
@@ -225,6 +234,7 @@ static void gtk_graph_display_init(GtkGraphDisplay *display)
     gtk_widget_set_margin_top(display->extender, 1);
 
     gtk_widget_show(display->extender);
+    gtk_fixed_put(GTK_FIXED(display->support), display->extender, 0, 0);
 
 }
 
@@ -243,9 +253,14 @@ static void gtk_graph_display_init(GtkGraphDisplay *display)
 
 static void gtk_graph_display_dispose(GtkGraphDisplay *display)
 {
-    g_object_unref(G_OBJECT(display->extender));
+    /**
+     * display->support est traité par la version amont du conteneur, propriétaire
+     * du composant GTK.
+     *
+     * Pareil pour display->extender.
+     */
 
-    gtk_graph_display_reset(display);
+    gtk_graph_display_reset(display, true);
 
     G_OBJECT_CLASS(gtk_graph_display_parent_class)->dispose(G_OBJECT(display));
 
@@ -633,7 +648,7 @@ static void gtk_graph_display_define_main_address(GtkGraphDisplay *display, cons
 
     if (need_update)
     {
-        gtk_graph_display_reset(display);
+        gtk_graph_display_reset(display, false);
 
         format = g_loaded_binary_get_format(GTK_DISPLAY_PANEL(display)->binary);
 
@@ -667,8 +682,7 @@ static void gtk_graph_display_define_main_address(GtkGraphDisplay *display, cons
 
         gtk_graph_display_compute_requested_size(display, &right, &bottom);
 
-        g_object_ref(G_OBJECT(display->extender));
-        gtk_fixed_put(GTK_FIXED(display->support), display->extender, right - 1, bottom - 1);
+        gtk_fixed_move(GTK_FIXED(display->support), display->extender, right - 1, bottom - 1);
 
         /**
          * Si possible, on centre le contenu obtenu.
@@ -793,6 +807,55 @@ static bool gtk_graph_display_move_caret_to(GtkGraphDisplay *display, gint x, gi
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : display = composant GTK à consulter.                         *
+*                                                                             *
+*  Description : Fournit le position courante dans un panneau de chargement.  *
+*                                                                             *
+*  Retour      : Informations relatives à la position du curseur.             *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static GLineCursor *gtk_graph_display_get_cursor(const GtkGraphDisplay *display)
+{
+    GLineCursor *result;                    /* Contenu à retourner         */
+
+    result = NULL;
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : display = composant GTK à mettre à jour.                     *
+*                cursor  = informations relatives à la position du curseur.   *
+*                                                                             *
+*  Description : Définit le position courante dans un panneau de chargement.  *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void gtk_graph_display_set_cursor(GtkGraphDisplay *display, const GLineCursor *cursor)
+{
+    vmpa2t addr;                            /* Adresse ciblée              */
+
+    assert(G_IS_BINARY_CURSOR(cursor));
+
+    g_binary_cursor_get_info(G_BINARY_CURSOR(cursor), &addr);
+
+    gtk_graph_display_define_main_address(display, &addr);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : display = composant GTK à manipuler.                         *
 *                cr      = assistant pour la création de rendus.              *
 *                area    = taille de la surface réduite à disposition.        *
@@ -912,6 +975,7 @@ void gtk_graph_display_add_edge(GtkGraphDisplay *display, GGraphEdge *edge)
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : display = instance GTK à réinitialiser.                      *
+*                dispose = indique l'origine de l'appel.                      *
 *                                                                             *
 *  Description : Supprime tout contenu de l'afficheur de code en graphique.   *
 *                                                                             *
@@ -921,26 +985,23 @@ void gtk_graph_display_add_edge(GtkGraphDisplay *display, GGraphEdge *edge)
 *                                                                             *
 ******************************************************************************/
 
-static void gtk_graph_display_reset(GtkGraphDisplay *display)
+static void gtk_graph_display_reset(GtkGraphDisplay *display, bool dispose)
 {
     size_t i;                               /* Boucle de parcours          */
 
-
-    void detach_all_blocks(GtkWidget *widget, GtkContainer *container)
+    if (!dispose)
     {
+        void detach_all_blocks(GtkWidget *widget, GtkContainer *container)
+        {
+            if (widget != display->extender)
+                gtk_container_remove(container, widget);
 
+        }
 
-
-        gtk_container_remove(container, widget);
-
+        gtk_container_foreach(GTK_CONTAINER(display->support), (GtkCallback)detach_all_blocks, display->support);
 
     }
 
-
-    gtk_container_foreach(GTK_CONTAINER(display->support), (GtkCallback)detach_all_blocks, display->support);
-
-
-
     if (display->routine != NULL)
     {
         g_object_unref(G_OBJECT(display->routine));
@@ -948,7 +1009,10 @@ static void gtk_graph_display_reset(GtkGraphDisplay *display)
     }
 
     if (display->highlighted != NULL)
+    {
         exit_segment_content_list(display->highlighted);
+        display->highlighted = NULL;
+    }
 
     if (display->cluster != NULL)
     {
diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c
index 81b06d6..70247a9 100644
--- a/src/gui/menus/view.c
+++ b/src/gui/menus/view.c
@@ -470,7 +470,8 @@ static void mcb_view_change_support(GtkRadioMenuItem *menuitem, gpointer unused)
     GtkDockStation *station;                /* Base du remplacement        */
     GLoadedContent *content;                /* Contenu représenté          */
     GtkWidget *support;                     /* Nouvel afficheur généraliste*/
-    GtkWidget *new;                         /* Panneau encapsulé           */
+    GLineCursor *cursor;                    /* Position à transmettre      */
+    GLoadedPanel *new;                      /* Panneau encapsulé           */
 
     /* On ne traite qu'une seule fois ! */
     if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) return;
@@ -492,11 +493,17 @@ static void mcb_view_change_support(GtkRadioMenuItem *menuitem, gpointer unused)
 
         g_object_unref(G_OBJECT(content));
 
+        cursor = g_loaded_panel_get_cursor(panel);
+
         gtk_dock_panel_change_active_widget(station, support);
 
-        new = get_loaded_panel_from_built_view(support);
+        new = G_LOADED_PANEL(get_loaded_panel_from_built_view(support));
+
+        g_loaded_panel_set_cursor(new, cursor);
+
+        change_editor_items_current_view(new);
 
-        change_editor_items_current_view(G_LOADED_PANEL(new));
+        g_object_unref(G_OBJECT(cursor));
 
         g_object_unref(G_OBJECT(panel));
 
-- 
cgit v0.11.2-87-g4458