summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/glibext/Makefile.am3
-rw-r--r--src/glibext/gbinarycursor.c204
-rw-r--r--src/glibext/gbinarycursor.h65
-rw-r--r--src/glibext/glinecursor-int.h48
-rw-r--r--src/glibext/glinecursor.c126
-rw-r--r--src/glibext/glinecursor.h52
-rw-r--r--src/glibext/gloadedpanel-int.h9
-rw-r--r--src/glibext/gloadedpanel.c50
-rw-r--r--src/glibext/gloadedpanel.h7
-rw-r--r--src/gtkext/gtkblockdisplay.c54
-rw-r--r--src/gtkext/gtkdisplaypanel-int.h12
-rw-r--r--src/gtkext/gtkdisplaypanel.c52
-rw-r--r--src/gtkext/gtkgraphdisplay.c98
-rw-r--r--src/gui/menus/view.c13
14 files changed, 773 insertions, 20 deletions
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));