summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/analysis/db/items/move.c3
-rw-r--r--src/analysis/loaded.c6
-rw-r--r--src/analysis/loaded.h5
-rw-r--r--src/glibext/gbinarycursor.c60
-rw-r--r--src/glibext/gbinarycursor.h4
-rw-r--r--src/glibext/glinecursor-int.h7
-rw-r--r--src/glibext/glinecursor.c23
-rw-r--r--src/glibext/glinecursor.h11
-rw-r--r--src/glibext/gloadedpanel-int.h7
-rw-r--r--src/glibext/gloadedpanel.c34
-rw-r--r--src/glibext/gloadedpanel.h14
-rw-r--r--src/gtkext/gtkbufferdisplay.c5
-rw-r--r--src/gtkext/gtkdisplaypanel-int.h4
-rw-r--r--src/gtkext/gtkdisplaypanel.c213
-rw-r--r--src/gtkext/gtkdisplaypanel.h22
-rw-r--r--src/gtkext/gtkgraphdisplay.c2
-rw-r--r--src/gui/core/global.c103
-rw-r--r--src/gui/core/global.h22
-rw-r--r--src/gui/core/items.c158
-rw-r--r--src/gui/core/items.h10
-rw-r--r--src/gui/editem-int.h28
-rw-r--r--src/gui/editem.c116
-rw-r--r--src/gui/editem.h29
-rw-r--r--src/gui/editor.c25
-rw-r--r--src/gui/menus/binary.c32
-rw-r--r--src/gui/menus/binary.h6
-rw-r--r--src/gui/menus/edition.c289
-rw-r--r--src/gui/menus/edition.h7
-rw-r--r--src/gui/menus/menubar.c69
-rw-r--r--src/gui/menus/view.c14
-rw-r--r--src/gui/menus/view.h6
-rw-r--r--src/gui/panels/bintree.c18
-rw-r--r--src/gui/panels/bookmarks.c35
-rw-r--r--src/gui/panels/errors.c18
-rw-r--r--src/gui/panels/glance.c50
-rw-r--r--src/gui/panels/history.c19
-rw-r--r--src/gui/panels/panel-int.h1
-rw-r--r--src/gui/panels/strings.c25
-rw-r--r--src/gui/panels/symbols.c38
-rw-r--r--src/gui/status.c52
-rw-r--r--src/gui/tb/portions.c33
41 files changed, 928 insertions, 695 deletions
diff --git a/src/analysis/db/items/move.c b/src/analysis/db/items/move.c
index 5653649..1b1d5d2 100644
--- a/src/analysis/db/items/move.c
+++ b/src/analysis/db/items/move.c
@@ -38,7 +38,6 @@
#include "../../../gui/core/global.h"
#include "../../../glibext/gbinarycursor.h"
#include "../../../glibext/gloadedpanel.h"
-#include "../../../gtkext/gtkdisplaypanel.h" // REMME
@@ -444,7 +443,7 @@ static bool g_db_move_run(const GDbMove *move, GLineCursor *cursor)
gboolean do_move_in_main_loop(move_params *p)
{
- gtk_display_panel_scroll_to_cursor(p->panel, p->cursor, SPT_CENTER);
+ g_loaded_panel_scroll_to_cursor(p->panel, p->cursor, SPT_CENTER, true);
return G_SOURCE_REMOVE;
diff --git a/src/analysis/loaded.c b/src/analysis/loaded.c
index 5dd96a8..e65cb38 100644
--- a/src/analysis/loaded.c
+++ b/src/analysis/loaded.c
@@ -369,6 +369,12 @@ const char *g_loaded_content_describe(const GLoadedContent *content, bool full)
}
+
+/* ---------------------------------------------------------------------------------- */
+/* GESTION DYNAMIQUE DES VUES */
+/* ---------------------------------------------------------------------------------- */
+
+
/******************************************************************************
* *
* Paramètres : content = contenu chargé à consulter. *
diff --git a/src/analysis/loaded.h b/src/analysis/loaded.h
index 643e170..344d102 100644
--- a/src/analysis/loaded.h
+++ b/src/analysis/loaded.h
@@ -78,6 +78,11 @@ bool g_loaded_content_analyze_and_wait(GLoadedContent *);
/* Fournit le désignation associée à l'élément chargé. */
const char *g_loaded_content_describe(const GLoadedContent *, bool);
+
+
+/* --------------------------- GESTION DYNAMIQUE DES VUES --------------------------- */
+
+
/* Détermine le nombre de vues disponibles pour un contenu. */
unsigned int g_loaded_content_count_views(const GLoadedContent *);
diff --git a/src/glibext/gbinarycursor.c b/src/glibext/gbinarycursor.c
index 0c2a197..ee9eb5f 100644
--- a/src/glibext/gbinarycursor.c
+++ b/src/glibext/gbinarycursor.c
@@ -24,6 +24,9 @@
#include "gbinarycursor.h"
+#include <assert.h>
+
+
#include "glinecursor-int.h"
@@ -66,12 +69,15 @@ static GLineCursor *g_binary_cursor_duplicate(const GBinaryCursor *);
/* Compare deux suivis d'emplacements. */
static int g_binary_cursor_compare(const GBinaryCursor *, const GBinaryCursor *);
-/* Détermine si un suivi d'emplacement est valide ou non. */
+/* Détermine si la position de suivi est pertinente ou non. */
static bool g_binary_cursor_is_valid(const GBinaryCursor *);
/* Construit une étiquette de représentation d'un suivi. */
static char *g_binary_cursor_build_label(const GBinaryCursor *);
+/* Affiche une position dans une barre de statut. */
+static void g_binary_cursor_show_status(const GBinaryCursor *, GtkStatusStack *, GLoadedContent *);
+
/* ---------------------- ENCADREMENT DES TRANSFERTS DE DONEES ---------------------- */
@@ -133,6 +139,7 @@ static void g_binary_cursor_class_init(GBinaryCursorClass *class)
line->compare = (compare_cursor_fc)g_binary_cursor_compare;
line->is_valid = (is_cursor_valid_fc)g_binary_cursor_is_valid;
line->build_label = (build_cursor_label_fc)g_binary_cursor_build_label;
+ line->show_status = (show_cursor_status_fc)g_binary_cursor_show_status;
line->serialize = (serialize_cursor_fc)g_binary_cursor_serialize;
line->unserialize = (unserialize_cursor_fc)g_binary_cursor_unserialize;
@@ -278,7 +285,7 @@ static int g_binary_cursor_compare(const GBinaryCursor *cursor, const GBinaryCur
* *
* Paramètres : cursor = suivi d'emplacement à consulter. *
* *
-* Description : Détermine si un suivi d'emplacement est valide ou non. *
+* Description : Détermine si la position de suivi est pertinente ou non. *
* *
* Retour : Bilan de validité. *
* *
@@ -325,6 +332,51 @@ static char *g_binary_cursor_build_label(const GBinaryCursor *cursor)
/******************************************************************************
* *
+* Paramètres : cursor = emplacement du curseur à afficher. *
+* stack = pile de statuts à mettre à jour. *
+* content = contenu contenant le curseur à représenter. *
+* *
+* Description : Affiche une position dans une barre de statut. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_binary_cursor_show_status(const GBinaryCursor *cursor, GtkStatusStack *stack, GLoadedContent *content)
+{
+ GLoadedBinary *binary; /* Binaire chargé et analysé */
+ GArchProcessor *proc; /* Architecture du binaire */
+ GArchInstruction *instr; /* Instruction présente */
+
+ if (g_binary_cursor_is_valid(cursor))
+ {
+ assert(G_IS_LOADED_BINARY(content));
+
+ binary = G_LOADED_BINARY(content);
+
+ proc = g_loaded_binary_get_processor(binary);
+
+ instr = _g_arch_processor_find_instr_by_address(proc, &cursor->addr, true);
+ assert(instr != NULL);
+
+ gtk_status_stack_update_current_instruction(stack, binary, instr);
+
+ g_object_unref(G_OBJECT(instr));
+
+ g_object_unref(G_OBJECT(proc));
+
+ }
+
+ else
+ gtk_status_stack_reset_current_instruction(stack);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : cursor = suivi de positions à mettre à jour. *
* addr = emplacement dans le binaire visé. *
* *
@@ -348,7 +400,7 @@ void g_binary_cursor_update(GBinaryCursor *cursor, const vmpa2t *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. *
+* Description : Transmet la position de suivi dans un panneau de chargement. *
* *
* Retour : - *
* *
@@ -356,7 +408,7 @@ void g_binary_cursor_update(GBinaryCursor *cursor, const vmpa2t *addr)
* *
******************************************************************************/
-void g_binary_cursor_get_info(GBinaryCursor *cursor, vmpa2t *addr)
+void g_binary_cursor_get_info(const GBinaryCursor *cursor, vmpa2t *addr)
{
copy_vmpa(addr, &cursor->addr);
diff --git a/src/glibext/gbinarycursor.h b/src/glibext/gbinarycursor.h
index 9846c59..63a6f1b 100644
--- a/src/glibext/gbinarycursor.h
+++ b/src/glibext/gbinarycursor.h
@@ -60,8 +60,8 @@ 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 *);
+/* Transmet la position de suivi dans un panneau de chargement. */
+void g_binary_cursor_get_info(const GBinaryCursor *, vmpa2t *);
diff --git a/src/glibext/glinecursor-int.h b/src/glibext/glinecursor-int.h
index b38e22e..18ec147 100644
--- a/src/glibext/glinecursor-int.h
+++ b/src/glibext/glinecursor-int.h
@@ -26,6 +26,7 @@
#include "glinecursor.h"
+#include "../gtkext/gtkstatusstack.h"
@@ -35,12 +36,15 @@ typedef GLineCursor * (* duplicate_cursor_fc) (const GLineCursor *);
/* Compare deux suivis d'emplacements. */
typedef int (* compare_cursor_fc) (const GLineCursor *, const GLineCursor *);
-/* Détermine si un suivi d'emplacement est valide ou non. */
+/* Détermine si la position de suivi est pertinente ou non. */
typedef bool (* is_cursor_valid_fc) (const GLineCursor *);
/* Construit une étiquette de représentation d'un suivi. */
typedef char * (* build_cursor_label_fc) (const GLineCursor *);
+/* Affiche une position dans une barre de statut. */
+typedef void (* show_cursor_status_fc) (const GLineCursor *, GtkStatusStack *, GLoadedContent *);
+
/* Exporte la définition d'un emplacement dans un flux réseau. */
typedef bool (* serialize_cursor_fc) (const GLineCursor *, packed_buffer *);
@@ -76,6 +80,7 @@ struct _GLineCursorClass
compare_cursor_fc compare; /* Comparaison d'emplacements */
is_cursor_valid_fc is_valid; /* Certificat de validité */
build_cursor_label_fc build_label; /* Obtention d'une étiquette */
+ show_cursor_status_fc show_status; /* Affichage dans une barre */
serialize_cursor_fc serialize; /* Sauvegarde d'un emplacement */
unserialize_cursor_fc unserialize; /* Chargement d'un emplacement */
diff --git a/src/glibext/glinecursor.c b/src/glibext/glinecursor.c
index 0245ebd..64521f4 100644
--- a/src/glibext/glinecursor.c
+++ b/src/glibext/glinecursor.c
@@ -190,7 +190,7 @@ int g_line_cursor_compare(const GLineCursor *cursor, const GLineCursor *other)
* *
* Paramètres : cursor = suivi d'emplacement à consulter. *
* *
-* Description : Détermine si un suivi d'emplacement est valide ou non. *
+* Description : Détermine si la position de suivi est pertinente ou non. *
* *
* Retour : Bilan de validité. *
* *
@@ -232,6 +232,27 @@ char *g_line_cursor_build_label(const GLineCursor *cursor)
}
+/******************************************************************************
+* *
+* Paramètres : cursor = emplacement du curseur à afficher. *
+* stack = pile de statuts à mettre à jour. *
+* content = contenu contenant le curseur à représenter. *
+* *
+* Description : Affiche une position dans une barre de statut. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_line_cursor_show_status(const GLineCursor *cursor, GtkStatusStack *stack, GLoadedContent *content)
+{
+ G_LINE_CURSOR_GET_CLASS(cursor)->show_status(cursor, stack, content);
+
+}
+
+
/* ---------------------------------------------------------------------------------- */
/* ENCADREMENT DES TRANSFERTS DE DONEES */
diff --git a/src/glibext/glinecursor.h b/src/glibext/glinecursor.h
index d9c16c4..1cf8d47 100644
--- a/src/glibext/glinecursor.h
+++ b/src/glibext/glinecursor.h
@@ -29,11 +29,17 @@
#include <stdbool.h>
+#include "../analysis/loaded.h"
#include "../common/packed.h"
#include "../common/sqlite.h"
+/* Depuis ../gtkext/gtkstatusstack.h : abstration d'une gestion de barre de statut (instance) */
+typedef struct _GtkStatusStack GtkStatusStack;
+
+
+
/* ----------------------- FONCTIONNALITES D'UN SUIVI DE BASE ----------------------- */
@@ -61,12 +67,15 @@ GLineCursor *g_line_cursor_duplicate(const GLineCursor *);
/* Compare deux suivis d'emplacements. */
int g_line_cursor_compare(const GLineCursor *, const GLineCursor *);
-/* Détermine si un suivi d'emplacement est valide ou non. */
+/* Détermine si la position de suivi est pertinente ou non. */
bool g_line_cursor_is_valid(const GLineCursor *);
/* Construit une étiquette de représentation d'un suivi. */
char *g_line_cursor_build_label(const GLineCursor *);
+/* Affiche une position dans une barre de statut. */
+void g_line_cursor_show_status(const GLineCursor *, GtkStatusStack *, GLoadedContent *);
+
/* ---------------------- ENCADREMENT DES TRANSFERTS DE DONEES ---------------------- */
diff --git a/src/glibext/gloadedpanel-int.h b/src/glibext/gloadedpanel-int.h
index dbe9c0c..36a1437 100644
--- a/src/glibext/gloadedpanel-int.h
+++ b/src/glibext/gloadedpanel-int.h
@@ -41,6 +41,9 @@ 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 *);
+/* S'assure qu'un emplacement donné est visible à l'écran. */
+typedef void (* scroll_loaded_to_cursor_fc) (GLoadedPanel *, const GLineCursor *, ScrollPositionTweak, bool);
+
/* Place en cache un rendu destiné à l'aperçu graphique rapide. */
typedef void (* cache_loaded_glance_fc) (GLoadedPanel *, cairo_t *, const GtkAllocation *, double);
@@ -50,17 +53,21 @@ struct _GLoadedPanelIface
{
GTypeInterface base_iface; /* A laisser en premier */
+ /* Méthodes virtuelles */
+
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 */
+ scroll_loaded_to_cursor_fc scroll; /* Défilement de la vue */
cache_loaded_glance_fc cache_glance; /* Cache de la mignature */
/* Signaux */
void (* move_request) (GLoadedPanel *, const GLineCursor *, gboolean);
+ void (* cursor_moved) (GLoadedPanel *, const GLineCursor *);
};
diff --git a/src/glibext/gloadedpanel.c b/src/glibext/gloadedpanel.c
index 8bf750a..ead34b7 100644
--- a/src/glibext/gloadedpanel.c
+++ b/src/glibext/gloadedpanel.c
@@ -60,6 +60,14 @@ static void g_loaded_panel_default_init(GLoadedPanelInterface *iface)
g_cclosure_user_marshal_VOID__OBJECT_BOOLEAN,
G_TYPE_NONE, 2, G_TYPE_LINE_CURSOR, G_TYPE_BOOLEAN);
+ g_signal_new("cursor-moved",
+ G_TYPE_LOADED_PANEL,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(GLoadedPanelIface, cursor_moved),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, G_TYPE_LINE_CURSOR);
+
}
@@ -188,6 +196,32 @@ void g_loaded_panel_request_move(GLoadedPanel *panel, const GLineCursor *cursor,
/******************************************************************************
* *
+* Paramètres : panel = composant GTK à manipuler. *
+* cursor = emplacement à présenter à l'écran. *
+* tweak = adaptation finale à effectuer. *
+* move = doit-on déplacer le curseur à l'adresse indiquée ? *
+* *
+* Description : S'assure qu'un emplacement donné est visible à l'écran. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_loaded_panel_scroll_to_cursor(GLoadedPanel *panel, const GLineCursor *cursor, ScrollPositionTweak tweak, bool move)
+{
+ GLoadedPanelIface *iface; /* Interface utilisée */
+
+ iface = G_LOADED_PANEL_GET_IFACE(panel);
+
+ iface->scroll(panel, cursor, tweak, move);
+
+}
+
+
+/******************************************************************************
+* *
* 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 ffdb35b..50ea058 100644
--- a/src/glibext/gloadedpanel.h
+++ b/src/glibext/gloadedpanel.h
@@ -26,6 +26,7 @@
#include <glib-object.h>
+#include <stdbool.h>
#include <gtk/gtk.h>
@@ -67,6 +68,19 @@ void g_loaded_panel_set_cursor(GLoadedPanel *, const GLineCursor *);
/* Demande à qui veut répondre un déplacement du curseur. */
void g_loaded_panel_request_move(GLoadedPanel *, const GLineCursor *, gboolean);
+/* Adaptation d'une position sur une surface */
+typedef enum _ScrollPositionTweak
+{
+ SPT_RAW, /* Aucun ajustement */
+ SPT_TOP, /* Le plus haut possible */
+ SPT_CENTER, /* Au centre de la surface */
+ SPT_BOTTOM /* Le plus bas possible */
+
+} ScrollPositionTweak;
+
+/* S'assure qu'un emplacement donné est visible à l'écran. */
+void g_loaded_panel_scroll_to_cursor(GLoadedPanel *, const GLineCursor *, ScrollPositionTweak, bool);
+
/* 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/gtkbufferdisplay.c b/src/gtkext/gtkbufferdisplay.c
index ff651c8..4a2c814 100644
--- a/src/gtkext/gtkbufferdisplay.c
+++ b/src/gtkext/gtkbufferdisplay.c
@@ -521,7 +521,7 @@ static gboolean gtk_buffer_display_key_press(GtkWidget *widget, GdkEventKey *eve
if (status)
{
gtk_buffer_display_relocate_caret(display, &area, cursor);
- _gtk_display_panel_scroll_to_cursor(panel, cursor, SPT_RAW, false);
+ g_loaded_panel_scroll_to_cursor(G_LOADED_PANEL(panel), cursor, SPT_RAW, false);
}
else
g_signal_emit_by_name(display, "reach-limit", dir);
@@ -1038,7 +1038,8 @@ static void gtk_buffer_display_restart_caret_blinking(GtkBufferDisplay *display)
}
- g_signal_emit_by_name(display, "caret-moved", &display->caret_addr);
+ if (display->cursor != NULL)
+ g_signal_emit_by_name(display, "cursor-moved", display->cursor);
}
diff --git a/src/gtkext/gtkdisplaypanel-int.h b/src/gtkext/gtkdisplaypanel-int.h
index fa67dbd..cf0335a 100644
--- a/src/gtkext/gtkdisplaypanel-int.h
+++ b/src/gtkext/gtkdisplaypanel-int.h
@@ -114,10 +114,6 @@ struct _GtkDisplayPanelClass
set_cursor_fc set_cursor; /* Application d'une position */
cache_glance_fc cache_glance; /* Cache de la mignature */
- /* Signaux */
-
- void (* caret_moved) (GtkDisplayPanel *, const vmpa2t *);
-
};
/* Propriétés propres au composant d'affichage */
diff --git a/src/gtkext/gtkdisplaypanel.c b/src/gtkext/gtkdisplaypanel.c
index 15d257f..24436ca 100644
--- a/src/gtkext/gtkdisplaypanel.c
+++ b/src/gtkext/gtkdisplaypanel.c
@@ -105,6 +105,9 @@ 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 *);
+/* S'assure qu'un emplacement donné est visible à l'écran. */
+static void gtk_display_panel_scroll_to_cursor(GtkDisplayPanel *, const GLineCursor *, ScrollPositionTweak, bool);
+
/* Place en cache un rendu destiné à l'aperçu graphique rapide. */
static void gtk_display_panel_cache_glance(GtkDisplayPanel *, cairo_t *, const GtkAllocation *, double);
@@ -155,14 +158,6 @@ static void gtk_display_panel_class_init(GtkDisplayPanelClass *class)
panel_class->compute_inc = gtk_display_panel_compute_scroll_inc;
- g_signal_new("caret-moved",
- GTK_TYPE_DISPLAY_PANEL,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(GtkDisplayPanelClass, caret_moved),
- NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
-
}
@@ -205,6 +200,7 @@ static void gtk_display_panel_loaded_interface_init(GLoadedPanelInterface *iface
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->scroll = (scroll_loaded_to_cursor_fc)gtk_display_panel_scroll_to_cursor;
iface->cache_glance = (cache_loaded_glance_fc)gtk_display_panel_cache_glance;
@@ -843,36 +839,6 @@ static void on_view_panel_binary_display_change(GLoadedBinary *binary, BinaryVie
* *
* Paramètres : panel = composant GTK à consulter. *
* *
-* Description : Fournit le binaire associé à la représentation. *
-* *
-* Retour : Représentation de contenu binaire. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-GLoadedBinary *gtk_display_panel_get_binary(const GtkDisplayPanel *panel)
-{
- g_object_ref(G_OBJECT(panel->binary));
-
- return panel->binary;
-
-}
-
-
-
-
-
-
-
-
-
-
-
-/******************************************************************************
-* *
-* Paramètres : panel = composant GTK à consulter. *
-* *
* Description : Indique la position courante du curseur. *
* *
* Retour : Emplacement courant du curseur ou NULL si aucun. *
@@ -924,90 +890,6 @@ GObject *gtk_display_panel_get_active_object(const GtkDisplayPanel *panel)
/******************************************************************************
* *
-* Paramètres : panel = composant GTK à manipuler. *
-* cursor = emplacement à présenter à l'écran. *
-* tweak = adaptation finale à effectuer. *
-* move = doit-on déplacer le curseur à l'adresse indiquée ? *
-* *
-* Description : S'assure qu'une adresse donnée est visible à l'écran. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void _gtk_display_panel_scroll_to_cursor(GtkDisplayPanel *panel, const GLineCursor *cursor, ScrollPositionTweak tweak, bool move)
-{
- GtkWidget *parent; /* Support parent à valider */
- gint x; /* Abscisse à garantir */
- gint y; /* Ordonnée à garantir */
- GtkWidget *viewport; /* Parent avec défilement */
- GtkAdjustment *adj; /* Défilement à mettre à jour */
- gdouble step_inc; /* Valeur d'un petit pas */
- gdouble page_size; /* Taille de l'affichage */
- double value; /* Valeur courante */
-
- /**
- * Si une vue partielle se déplace via cette fonction, il faut potentiellement
- * rediriger l'appel vers la vue en graphiques parente.
- */
-
- parent = gtk_widget_get_parent(GTK_WIDGET(panel));
- parent = gtk_widget_get_parent(GTK_WIDGET(parent));
-
- if (GTK_IS_DISPLAY_PANEL(parent))
- panel = GTK_DISPLAY_PANEL(parent);
-
- /*
- if (GTK_DISPLAY_PANEL_GET_CLASS(panel)->define != NULL)
- GTK_DISPLAY_PANEL_GET_CLASS(panel)->define(panel, addr);
- */
-
- if (GTK_DISPLAY_PANEL_GET_CLASS(panel)->get_coordinates(panel, cursor, &x, &y, tweak))
- {
- viewport = gtk_widget_get_parent(GTK_WIDGET(panel));
-
- /* Eventuel défilement horizontal */
-
- g_object_get(G_OBJECT(viewport), "hadjustment", &adj, NULL);
-
- step_inc = gtk_adjustment_get_step_increment(adj);
- page_size = gtk_adjustment_get_page_size(adj);
- value = gtk_adjustment_get_value(adj);
-
- if (x < value)
- gtk_adjustment_set_value(adj, x);
-
- else if ((x + step_inc) > (value + page_size))
- gtk_adjustment_set_value(adj, x + step_inc - page_size);
-
- /* Eventuel défilement vertical */
-
- g_object_get(G_OBJECT(viewport), "vadjustment", &adj, NULL);
-
- step_inc = gtk_adjustment_get_step_increment(adj);
- page_size = gtk_adjustment_get_page_size(adj);
- value = gtk_adjustment_get_value(adj);
-
- if (y < value || tweak != SPT_RAW)
- gtk_adjustment_set_value(adj, y);
-
- else if ((y + step_inc) > (value + page_size))
- gtk_adjustment_set_value(adj, y + step_inc - page_size);
-
- /* Déplacement du curseur */
-
- if (move && GTK_DISPLAY_PANEL_GET_CLASS(panel)->get_coordinates(panel, cursor, &x, &y, SPT_RAW))
- GTK_DISPLAY_PANEL_GET_CLASS(panel)->move_caret_to(panel, x, y);
-
- }
-
-}
-
-
-/******************************************************************************
-* *
* Paramètres : panel = composant GTK à manipuler. *
* addr = adresse à présenter à l'écran. *
* *
@@ -1159,6 +1041,9 @@ static GLoadedContent *gtk_display_panel_get_content(const GtkDisplayPanel *pane
result = G_LOADED_CONTENT(panel->binary);
+ if (result != NULL)
+ g_object_ref(G_OBJECT(result));
+
return result;
}
@@ -1209,6 +1094,90 @@ static void gtk_display_panel_set_cursor(GtkDisplayPanel *panel, const GLineCurs
/******************************************************************************
* *
+* Paramètres : panel = composant GTK à manipuler. *
+* cursor = emplacement à présenter à l'écran. *
+* tweak = adaptation finale à effectuer. *
+* move = doit-on déplacer le curseur à l'adresse indiquée ? *
+* *
+* Description : S'assure qu'un emplacement donné est visible à l'écran. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_display_panel_scroll_to_cursor(GtkDisplayPanel *panel, const GLineCursor *cursor, ScrollPositionTweak tweak, bool move)
+{
+ GtkWidget *parent; /* Support parent à valider */
+ gint x; /* Abscisse à garantir */
+ gint y; /* Ordonnée à garantir */
+ GtkWidget *viewport; /* Parent avec défilement */
+ GtkAdjustment *adj; /* Défilement à mettre à jour */
+ gdouble step_inc; /* Valeur d'un petit pas */
+ gdouble page_size; /* Taille de l'affichage */
+ double value; /* Valeur courante */
+
+ /**
+ * Si une vue partielle se déplace via cette fonction, il faut potentiellement
+ * rediriger l'appel vers la vue en graphiques parente.
+ */
+
+ parent = gtk_widget_get_parent(GTK_WIDGET(panel));
+ parent = gtk_widget_get_parent(GTK_WIDGET(parent));
+
+ if (GTK_IS_DISPLAY_PANEL(parent))
+ panel = GTK_DISPLAY_PANEL(parent);
+
+ /*
+ if (GTK_DISPLAY_PANEL_GET_CLASS(panel)->define != NULL)
+ GTK_DISPLAY_PANEL_GET_CLASS(panel)->define(panel, addr);
+ */
+
+ if (GTK_DISPLAY_PANEL_GET_CLASS(panel)->get_coordinates(panel, cursor, &x, &y, tweak))
+ {
+ viewport = gtk_widget_get_parent(GTK_WIDGET(panel));
+
+ /* Eventuel défilement horizontal */
+
+ g_object_get(G_OBJECT(viewport), "hadjustment", &adj, NULL);
+
+ step_inc = gtk_adjustment_get_step_increment(adj);
+ page_size = gtk_adjustment_get_page_size(adj);
+ value = gtk_adjustment_get_value(adj);
+
+ if (x < value)
+ gtk_adjustment_set_value(adj, x);
+
+ else if ((x + step_inc) > (value + page_size))
+ gtk_adjustment_set_value(adj, x + step_inc - page_size);
+
+ /* Eventuel défilement vertical */
+
+ g_object_get(G_OBJECT(viewport), "vadjustment", &adj, NULL);
+
+ step_inc = gtk_adjustment_get_step_increment(adj);
+ page_size = gtk_adjustment_get_page_size(adj);
+ value = gtk_adjustment_get_value(adj);
+
+ if (y < value || tweak != SPT_RAW)
+ gtk_adjustment_set_value(adj, y);
+
+ else if ((y + step_inc) > (value + page_size))
+ gtk_adjustment_set_value(adj, y + step_inc - page_size);
+
+ /* Déplacement du curseur */
+
+ if (move && GTK_DISPLAY_PANEL_GET_CLASS(panel)->get_coordinates(panel, cursor, &x, &y, SPT_RAW))
+ GTK_DISPLAY_PANEL_GET_CLASS(panel)->move_caret_to(panel, x, y);
+
+ }
+
+}
+
+
+/******************************************************************************
+* *
* 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/gtkdisplaypanel.h b/src/gtkext/gtkdisplaypanel.h
index c060c39..b336799 100644
--- a/src/gtkext/gtkdisplaypanel.h
+++ b/src/gtkext/gtkdisplaypanel.h
@@ -30,6 +30,7 @@
#include "../analysis/binary.h"
#include "../glibext/glinecursor.h"
+#include "../glibext/gloadedpanel.h"
@@ -60,33 +61,12 @@ void gtk_display_panel_set_addresses_display(GtkDisplayPanel *, bool);
/* Définit si le code doit apparaître dans le rendu. */
void gtk_display_panel_set_code_display(GtkDisplayPanel *, bool);
-/* Fournit le binaire associé à la représentation. */
-GLoadedBinary *gtk_display_panel_get_binary(const GtkDisplayPanel *);
-
-
-
-
-/* Adaptation d'une position sur une surface */
-typedef enum _ScrollPositionTweak
-{
- SPT_RAW, /* Aucun ajustement */
- SPT_TOP, /* Le plus haut possible */
- SPT_CENTER, /* Au centre de la surface */
- SPT_BOTTOM /* Le plus bas possible */
-
-} ScrollPositionTweak;
-
/* Indique la position courante du curseur. */
const vmpa2t *gtk_display_panel_get_caret_location(const GtkDisplayPanel *);
/* Fournit l'élément actif lié à la position courante. */
GObject *gtk_display_panel_get_active_object(const GtkDisplayPanel *);
-/* S'assure qu'une adresse donnée est visible à l'écran. */
-void _gtk_display_panel_scroll_to_cursor(GtkDisplayPanel *, const GLineCursor *, ScrollPositionTweak, bool);
-
-#define gtk_display_panel_scroll_to_cursor(p, c, t) _gtk_display_panel_scroll_to_cursor(p, c, t, true)
-
/* Demande à qui veut répondre un déplacement du curseur. */
void gtk_display_panel_request_move(GtkDisplayPanel *, const vmpa2t *);
diff --git a/src/gtkext/gtkgraphdisplay.c b/src/gtkext/gtkgraphdisplay.c
index 0fe86ef..7721a44 100644
--- a/src/gtkext/gtkgraphdisplay.c
+++ b/src/gtkext/gtkgraphdisplay.c
@@ -698,7 +698,7 @@ static void gtk_graph_display_define_main_address(GtkGraphDisplay *display, cons
ggddma_done:
- change_editor_items_current_view_content(G_LOADED_PANEL(display));
+ update_editor_items_current_view(G_LOADED_PANEL(display));
g_object_unref(G_OBJECT(format));
diff --git a/src/gui/core/global.c b/src/gui/core/global.c
index 89a2d90..30dc174 100644
--- a/src/gui/core/global.c
+++ b/src/gui/core/global.c
@@ -31,21 +31,16 @@ static GtkWindow *_editor = NULL;
/* Barre de statut principale */
static GtkStatusStack *_status = NULL;
-/* Binaire en cours d'étude ou NULL */
-static GLoadedBinary *_current_binary = NULL;
+/* Contenu en cours d'étude ou NULL */
+static GLoadedContent *_current_content = NULL;
-G_LOCK_DEFINE_STATIC(_cb_mutex);
+G_LOCK_DEFINE_STATIC(_cc_mutex);
/* Suivi du panneau d'affichage courant ou NULL */
static GLoadedPanel *_current_view = NULL;
G_LOCK_DEFINE_STATIC(_cv_mutex);
-/* Suivi des changements de position ou NULL */
-static GObject *_caret_instance = NULL;
-
-G_LOCK_DEFINE_STATIC(_ci_mutex);
-
/******************************************************************************
@@ -145,9 +140,9 @@ GtkStatusStack *get_global_status(void)
/******************************************************************************
* *
-* Paramètres : binary = instance de binaire chargé. *
+* Paramètres : content = instance de contenu chargé. *
* *
-* Description : Définit le binaire actif en cours d'étude. *
+* Description : Définit le contenu actif en cours d'étude. *
* *
* Retour : - *
* *
@@ -155,16 +150,16 @@ GtkStatusStack *get_global_status(void)
* *
******************************************************************************/
-void set_current_binary(GLoadedBinary *binary)
+void set_current_content(GLoadedContent *content)
{
- G_LOCK(_cb_mutex);
+ G_LOCK(_cc_mutex);
- if (_current_binary != NULL)
- g_object_unref(G_OBJECT(_current_binary));
+ if (_current_content != NULL)
+ g_object_unref(G_OBJECT(_current_content));
- _current_binary = binary;
+ _current_content = content;
- G_UNLOCK(_cb_mutex);
+ G_UNLOCK(_cc_mutex);
}
@@ -173,26 +168,26 @@ void set_current_binary(GLoadedBinary *binary)
* *
* Paramètres : - *
* *
-* Description : Fournit le binaire actif en cours d'étude. *
+* Description : Fournit le contenu actif en cours d'étude. *
* *
-* Retour : Instance courante de binaire étudié ou NULL. *
+* Retour : Instance courante de contenu étudié ou NULL. *
* *
* Remarques : - *
* *
******************************************************************************/
-GLoadedBinary *get_current_binary(void)
+GLoadedContent *get_current_content(void)
{
- GLoadedBinary *result; /* Instance à retourner */
+ GLoadedContent *result; /* Instance à retourner */
- G_LOCK(_cb_mutex);
+ G_LOCK(_cc_mutex);
- result = _current_binary;
+ result = _current_content;
if (result != NULL)
g_object_ref(G_OBJECT(result));
- G_UNLOCK(_cb_mutex);
+ G_UNLOCK(_cc_mutex);
return result;
@@ -201,9 +196,9 @@ GLoadedBinary *get_current_binary(void)
/******************************************************************************
* *
-* Paramètres : view = représentation courante de binaire. *
+* Paramètres : view = représentation courante de contenu. *
* *
-* Description : Définit l'affichage de binaire courant. *
+* Description : Définit l'affichage de contenu courant. *
* *
* Retour : - *
* *
@@ -229,7 +224,7 @@ void set_current_view(GLoadedPanel *view)
* *
* Paramètres : - *
* *
-* Description : Fournit l'affichage de binaire courant. *
+* Description : Fournit l'affichage de contenu courant. *
* *
* Retour : Instance en place ou NULL si aucune. *
* *
@@ -253,59 +248,3 @@ GLoadedPanel *get_current_view(void)
return result;
}
-
-
-/******************************************************************************
-* *
-* Paramètres : caret = instance graphique à mémoriser. *
-* *
-* Description : Définit le support contenant la position active. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void set_caret_instance(GObject *caret)
-{
- G_LOCK(_ci_mutex);
-
- if (_caret_instance != NULL)
- g_object_unref(_caret_instance);
-
- _caret_instance = caret;
-
- G_UNLOCK(_ci_mutex);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : - *
-* *
-* Description : Fournit le support contenant la position active. *
-* *
-* Retour : Instance en place ou NULL si aucune. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-GObject *get_caret_instance(void)
-{
- GObject *result; /* Instance à retourner */
-
- G_LOCK(_ci_mutex);
-
- result = _caret_instance;
-
- if (result != NULL)
- g_object_ref(result);
-
- G_UNLOCK(_ci_mutex);
-
- return result;
-
-}
diff --git a/src/gui/core/global.h b/src/gui/core/global.h
index 5e9d902..ee66399 100644
--- a/src/gui/core/global.h
+++ b/src/gui/core/global.h
@@ -1,5 +1,5 @@
-/* Chrysalide - Outil d'analyse de fichiers binaires
+/* Chrysalide - Outil d'analyse de fichiers contenus
* global.h - prototypes pour la conservation de variables globales à vocation graphique
*
* Copyright (C) 2016-2017 Cyrille Bagard
@@ -25,7 +25,7 @@
#define _GUI_CORE_GLOBAL_H
-#include "../../analysis/binary.h"
+#include "../../analysis/loaded.h"
#include "../../glibext/gloadedpanel.h"
#include "../../gtkext/gtkstatusstack.h"
@@ -46,24 +46,18 @@ void set_global_status(GtkStatusStack *);
/* Fournit l'adresse de la barre de statut principale. */
GtkStatusStack *get_global_status(void);
-/* Définit le binaire actif en cours d'étude. */
-void set_current_binary(GLoadedBinary *);
+/* Définit le contenu actif en cours d'étude. */
+void set_current_content(GLoadedContent *);
-/* Fournit le binaire actif en cours d'étude. */
-GLoadedBinary *get_current_binary(void);
+/* Fournit le contenu actif en cours d'étude. */
+GLoadedContent *get_current_content(void);
-/* Définit l'affichage de binaire courant. */
+/* Définit l'affichage de contenu courant. */
void set_current_view(GLoadedPanel *);
-/* Fournit l'affichage de binaire courant. */
+/* Fournit l'affichage de contenu courant. */
GLoadedPanel *get_current_view(void);
-/* Définit le support contenant la position active. */
-void set_caret_instance(GObject *);
-
-/* Fournit le support contenant la position active. */
-GObject *get_caret_instance(void);
-
#endif /* _GUI_CORE_GLOBAL_H */
diff --git a/src/gui/core/items.c b/src/gui/core/items.c
index a25d1b9..ad2de2c 100644
--- a/src/gui/core/items.c
+++ b/src/gui/core/items.c
@@ -34,14 +34,11 @@
static GEditorItem *_editem_list = NULL;
-/* Suit les changements de focus des panneaux d'affichage. */
-static gboolean notify_view_panel_focus_change(GLoadedPanel *, GdkEventFocus *, gpointer);
-
/* Lance une procédure de déplacement de la position courante. */
static void start_moving_to_cursor_in_loaded_panel(GLoadedPanel *, const GLineCursor *, gboolean, gpointer);
/* Suit les changements de position dans du code d'assembleur. */
-static void track_caret_address_on_view_panel(GtkDisplayPanel *, const vmpa2t *, gpointer);
+static void track_cursor_on_view_panel(GLoadedPanel *, const GLineCursor *, gpointer);
@@ -66,9 +63,9 @@ void register_editor_item(GEditorItem *item)
/******************************************************************************
* *
-* Paramètres : binary = nouvelle instance de binaire analysé. *
+* Paramètres : content = nouvelle instance de contenu analysé. *
* *
-* Description : Lance une actualisation du fait d'un changement de binaire. *
+* Description : Lance une actualisation du fait d'un changement de contenu. *
* *
* Retour : - *
* *
@@ -76,49 +73,26 @@ void register_editor_item(GEditorItem *item)
* *
******************************************************************************/
-void change_editor_items_current_binary(GLoadedBinary *binary)
+void change_editor_items_current_content(GLoadedContent *content)
{
+ GLoadedContent *old; /* Ancien contenu */
GEditorItem *iter; /* Boucle de parcours */
- GEditorItemClass *klass; /* Classe correspondante */
- set_current_binary(binary);
+ old = get_current_content();
- editem_list_for_each(iter, _editem_list)
+ if (content != old)
{
- klass = G_EDITOR_ITEM_GET_CLASS(iter);
-
- if (klass->update_binary != NULL)
- klass->update_binary(iter, binary);
-
- }
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : panel = composant d'affichage concerné par l'opération. *
-* event = informations liées à l'événement. *
-* unused = adresse non utilisée ici. *
-* *
-* Description : Suit les changements de focus des panneaux d'affichage. *
-* *
-* Retour : FALSE pour continuer la propagation. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
+ set_current_content(content);
-static gboolean notify_view_panel_focus_change(GLoadedPanel *panel, GdkEventFocus *event, gpointer unused)
-{
- GEditorItem *iter; /* Boucle de parcours */
+ editem_list_for_each(iter, _editem_list)
+ {
+ g_editor_item_change_content(iter, old, content);
+ }
- editem_list_for_each(iter, _editem_list)
- {
- notify_focus_change_for_editor_item(iter, event->in ? panel : NULL);
}
- return FALSE;
+ if (old != NULL)
+ g_object_unref(G_OBJECT(old));
}
@@ -157,7 +131,7 @@ static void start_moving_to_cursor_in_loaded_panel(GLoadedPanel *panel, const GL
}
else
- gtk_display_panel_scroll_to_cursor(panel, cursor, SPT_CENTER);
+ g_loaded_panel_scroll_to_cursor(panel, cursor, SPT_CENTER, true);
if (src != NULL)
g_object_unref(G_OBJECT(src));
@@ -168,7 +142,7 @@ static void start_moving_to_cursor_in_loaded_panel(GLoadedPanel *panel, const GL
/******************************************************************************
* *
* Paramètres : panel = composant d'affichage parcouru. *
-* addr = nouvelle adresse du curseur courant. *
+* cursor = nouvel emplacement du curseur courant. *
* unused = adresse non utilisée ici. *
* *
* Description : Suit les changements de position dans du code d'assembleur. *
@@ -179,18 +153,13 @@ static void start_moving_to_cursor_in_loaded_panel(GLoadedPanel *panel, const GL
* *
******************************************************************************/
-static void track_caret_address_on_view_panel(GtkDisplayPanel *panel, const vmpa2t *addr, gpointer unused)
+static void track_cursor_on_view_panel(GLoadedPanel *panel, const GLineCursor *cursor, gpointer unused)
{
GEditorItem *iter; /* Boucle de parcours */
- GEditorItemClass *klass; /* Classe correspondante */
editem_list_for_each(iter, _editem_list)
{
- klass = G_EDITOR_ITEM_GET_CLASS(iter);
-
- if (klass->track_caret != NULL)
- klass->track_caret(iter, panel, addr);
-
+ g_editor_item_track_cursor(iter, panel, cursor);
}
}
@@ -210,59 +179,32 @@ static void track_caret_address_on_view_panel(GtkDisplayPanel *panel, const vmpa
void change_editor_items_current_view(GLoadedPanel *panel)
{
- GLoadedPanel *view; /* Affichage actif */
+ GLoadedPanel *old; /* Ancien affichage */
GEditorItem *iter; /* Boucle de parcours */
- GEditorItemClass *klass; /* Classe correspondante */
- GObject *caret; /* Support du curseur actif */
/* Suivi des affichages */
- view = get_current_view();
+ old = get_current_view();
- if (view != NULL)
+ if (panel != old)
{
- g_signal_handlers_disconnect_by_func(view, G_CALLBACK(notify_view_panel_focus_change), NULL);
- g_signal_handlers_disconnect_by_func(view, G_CALLBACK(notify_view_panel_focus_change), NULL);
+ set_current_view(panel);
- g_object_unref(view);
-
- }
-
- set_current_view(panel);
-
- editem_list_for_each(iter, _editem_list)
- {
- klass = G_EDITOR_ITEM_GET_CLASS(iter);
-
- if (klass->update_view != NULL)
- klass->update_view(iter, panel);
-
- }
-
- if (panel != NULL)
- {
- g_signal_connect(panel, "focus-in-event", G_CALLBACK(notify_view_panel_focus_change), NULL);
- g_signal_connect(panel, "focus-out-event", G_CALLBACK(notify_view_panel_focus_change), NULL);
- }
+ editem_list_for_each(iter, _editem_list)
+ {
+ g_editor_item_change_view(iter, old, panel);
+ }
- /* Suivi du curseur */
+ /* Suivi du curseur */
- if (GTK_IS_DISPLAY_PANEL(panel))
- {
- caret = get_caret_instance();
-
- if (caret != NULL)
+ if (old != NULL)
{
- g_signal_handlers_disconnect_by_func(caret,
+ g_signal_handlers_disconnect_by_func(old,
G_CALLBACK(start_moving_to_cursor_in_loaded_panel),
NULL);
- g_signal_handlers_disconnect_by_func(caret,
- G_CALLBACK(track_caret_address_on_view_panel),
+ g_signal_handlers_disconnect_by_func(old,
+ G_CALLBACK(track_cursor_on_view_panel),
NULL);
-
- set_caret_instance(NULL);
- g_object_unref(caret);
-
}
if (panel != NULL)
@@ -271,19 +213,16 @@ void change_editor_items_current_view(GLoadedPanel *panel)
G_CALLBACK(start_moving_to_cursor_in_loaded_panel),
NULL);
- g_signal_connect(panel, "caret-moved",
- G_CALLBACK(track_caret_address_on_view_panel),
+ g_signal_connect(panel, "cursor-moved",
+ G_CALLBACK(track_cursor_on_view_panel),
NULL);
-
- caret = G_OBJECT(panel);
-
- g_object_ref(caret);
- set_caret_instance(caret);
-
}
}
+ if (old != NULL)
+ g_object_unref(G_OBJECT(old));
+
}
@@ -299,18 +238,13 @@ void change_editor_items_current_view(GLoadedPanel *panel)
* *
******************************************************************************/
-void change_editor_items_current_view_content(GLoadedPanel *panel)
+void update_editor_items_current_view(GLoadedPanel *panel)
{
GEditorItem *iter; /* Boucle de parcours */
- GEditorItemClass *klass; /* Classe correspondante */
editem_list_for_each(iter, _editem_list)
{
- klass = G_EDITOR_ITEM_GET_CLASS(iter);
-
- if (klass->update_content != NULL)
- klass->update_content(iter, panel);
-
+ g_editor_item_update_view(iter, panel);
}
}
@@ -318,9 +252,9 @@ void change_editor_items_current_view_content(GLoadedPanel *panel)
/******************************************************************************
* *
-* Paramètres : binary = binaire contenant l'adresse à représenter. *
-* addr = adresse mémoire à mettre en avant. *
-* source = composant à l'origine du changement. *
+* Paramètres : content = contenu contenant le curseur à représenter. *
+* cursor = nouvel emplacement du curseur courant. *
+* source = composant à l'origine du changement. *
* *
* Description : Concentre l'attention de l'ensemble sur une adresse donnée. *
* *
@@ -330,18 +264,14 @@ void change_editor_items_current_view_content(GLoadedPanel *panel)
* *
******************************************************************************/
-void focus_address_in_editor_items(GLoadedBinary *binary, const vmpa2t *addr, GEditorItem *source)
+void focus_cursor_in_editor_items(GLoadedContent *content, const GLineCursor *cursor, GEditorItem *source)
{
GEditorItem *iter; /* Boucle de parcours */
- GEditorItemClass *klass; /* Classe correspondante */
editem_list_for_each(iter, _editem_list)
{
- klass = G_EDITOR_ITEM_GET_CLASS(iter);
-
- if (klass->focus_addr != NULL && iter != source)
- klass->focus_addr(iter, binary, addr);
-
+ if (iter != source)
+ g_editor_item_focus_cursor(iter, content, cursor);
}
}
diff --git a/src/gui/core/items.h b/src/gui/core/items.h
index a738ac9..86350c7 100644
--- a/src/gui/core/items.h
+++ b/src/gui/core/items.h
@@ -26,7 +26,7 @@
#include "../editem.h"
-#include "../../analysis/binary.h"
+#include "../../analysis/loaded.h"
#include "../../analysis/project.h"
#include "../../glibext/gloadedpanel.h"
@@ -35,17 +35,17 @@
/* Procède à l'enregistrement d'un élément reactif de l'éditeur. */
void register_editor_item(GEditorItem *);
-/* Lance une actualisation du fait d'un changement de binaire. */
-void change_editor_items_current_binary(GLoadedBinary *);
+/* Lance une actualisation du fait d'un changement de contenu. */
+void change_editor_items_current_content(GLoadedContent *);
/* Lance une actualisation du fait d'un changement de vue. */
void change_editor_items_current_view(GLoadedPanel *);
/* Lance une actualisation du fait d'un changement de contenu. */
-void change_editor_items_current_view_content(GLoadedPanel *);
+void update_editor_items_current_view(GLoadedPanel *);
/* Concentre l'attention de l'ensemble sur une adresse donnée. */
-void focus_address_in_editor_items(GLoadedBinary *, const vmpa2t *, GEditorItem *);
+void focus_cursor_in_editor_items(GLoadedContent *, const GLineCursor *, GEditorItem *);
/* Lance une actualisation relative à l'étendue du projet. */
void update_project_area(GStudyProject *);
diff --git a/src/gui/editem-int.h b/src/gui/editem-int.h
index 801e54c..744a55f 100644
--- a/src/gui/editem-int.h
+++ b/src/gui/editem-int.h
@@ -34,24 +34,23 @@
#include "../analysis/project.h"
#include "../common/dllist.h"
-#include "../gtkext/gtkdisplaypanel.h"
-/* Réagit à un changement du binaire courant. */
-typedef void (* update_item_binary_fc) (GEditorItem *, GLoadedBinary *);
+/* Réagit à un changement de contenu chargé en cours d'analyse. */
+typedef void (* change_item_content_fc) (GEditorItem *, GLoadedContent *, GLoadedContent *);
-/* Réagit à un changement d'affichage principal de contenu. */
-typedef void (* update_item_view_fc) (GEditorItem *, GLoadedPanel *);
+/* Réagit à un changement de vue du contenu en cours d'analyse. */
+typedef void (* change_item_view_fc) (GEditorItem *, GLoadedPanel *, GLoadedPanel *);
-/* Réagit à un changement de focus des panneaux d'affichage. */
-typedef void (* notify_focus_change_fc) (GEditorItem *, GLoadedPanel *);
+/* Réagit à une modification de la vue du contenu analysé. */
+typedef void (* update_item_view_fc) (GEditorItem *, GLoadedPanel *);
/* Suit les changements de position dans du code d'assembleur. */
-typedef void (* track_caret_in_view_fc) (GEditorItem *, GtkDisplayPanel *, const vmpa2t *);
+typedef void (* track_cursor_in_view_fc) (GEditorItem *, GLoadedPanel *, const GLineCursor *);
/* Concentre l'attention de l'ensemble sur une adresse donnée. */
-typedef void (* focus_addr_fc) (GEditorItem *, GLoadedBinary *, const vmpa2t *);
+typedef void (* focus_cursor_fc) (GEditorItem *, GLoadedContent *, const GLineCursor *);
/* Lance une actualisation relative à l'étendue du projet. */
typedef void (* update_project_fc) (GEditorItem *, GStudyProject *);
@@ -77,12 +76,11 @@ struct _GEditorItemClass
{
GObjectClass parent; /* A laisser en premier */
- update_item_binary_fc update_binary; /* Changement de binaire */
- update_item_view_fc update_view; /* Rechargement dû à une vue */
- update_item_view_fc update_content; /* Rechargement dû à un contenu*/
- notify_focus_change_fc notify_focus; /* Gain ou perte de focus */
- track_caret_in_view_fc track_caret; /* Suivi des positions */
- focus_addr_fc focus_addr; /* Prête attention à une addr. */
+ change_item_content_fc change_content; /* Changement de contenu */
+ change_item_view_fc change_view; /* Rechargement dû à une vue */
+ update_item_view_fc update_view; /* Rechargement dû à évolutions*/
+ track_cursor_in_view_fc track_cursor; /* Suivi des positions */
+ focus_cursor_fc focus_cursor; /* Prête attention à une addr. */
update_project_fc update_project; /* Actualisation des binaires */
};
diff --git a/src/gui/editem.c b/src/gui/editem.c
index bf3dfa6..ef7cb30 100644
--- a/src/gui/editem.c
+++ b/src/gui/editem.c
@@ -136,10 +136,114 @@ GtkWidget *g_editor_item_get_widget(const GEditorItem *item)
/******************************************************************************
* *
-* Paramètres : bar = instance à actualiser. *
-* panel = composant d'affichage concerné par l'opération. *
+* Paramètres : item = instance à consulter. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
+* *
+* Description : Réagit à un changement de contenu chargé en cours d'analyse. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_editor_item_change_content(GEditorItem *item, GLoadedContent *old, GLoadedContent *new)
+{
+ GEditorItemClass *klass; /* Classe correspondante */
+
+ klass = G_EDITOR_ITEM_GET_CLASS(item);
+
+ if (klass->change_content != NULL)
+ klass->change_content(item, old, new);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : item = instance à consulter. *
+* old = ancienne vue du contenu chargé analysé. *
+* new = nouvelle vue du contenu chargé analysé. *
+* *
+* Description : Réagit à un changement de vue du contenu en cours d'analyse. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_editor_item_change_view(GEditorItem *item, GLoadedPanel *old, GLoadedPanel *new)
+{
+ GEditorItemClass *klass; /* Classe correspondante */
+
+ klass = G_EDITOR_ITEM_GET_CLASS(item);
+
+ if (klass->change_view != NULL)
+ klass->change_view(item, old, new);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : item = instance à consulter. *
+* panel = vue du contenu chargé analysé modifiée. *
+* *
+* Description : Réagit à une modification de la vue du contenu analysé. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_editor_item_update_view(GEditorItem *item, GLoadedPanel *panel)
+{
+ GEditorItemClass *klass; /* Classe correspondante */
+
+ klass = G_EDITOR_ITEM_GET_CLASS(item);
+
+ if (klass->update_view != NULL)
+ klass->update_view(item, panel);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : item = instance à consulter. *
+* panel = composant d'affichage parcouru. *
+* cursor = nouvel emplacement du curseur courant. *
+* *
+* Description : Réagit à une modification de la vue du contenu analysé. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_editor_item_track_cursor(GEditorItem *item, GLoadedPanel *panel, const GLineCursor *cursor)
+{
+ GEditorItemClass *klass; /* Classe correspondante */
+
+ klass = G_EDITOR_ITEM_GET_CLASS(item);
+
+ if (klass->track_cursor != NULL)
+ klass->track_cursor(item, panel, cursor);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : item = instance à consulter. *
+* content = contenu contenant le curseur à représenter. *
+* cursor = nouvel emplacement du curseur courant. *
* *
-* Description : Réagit à un changement de focus des panneaux d'affichage. *
+* Description : Réagit à une modification de la vue du contenu analysé. *
* *
* Retour : - *
* *
@@ -147,13 +251,13 @@ GtkWidget *g_editor_item_get_widget(const GEditorItem *item)
* *
******************************************************************************/
-void notify_focus_change_for_editor_item(GEditorItem *item, GLoadedPanel *panel)
+void g_editor_item_focus_cursor(GEditorItem *item, GLoadedContent *content, const GLineCursor *cursor)
{
GEditorItemClass *klass; /* Classe correspondante */
klass = G_EDITOR_ITEM_GET_CLASS(item);
- if (klass->notify_focus != NULL)
- klass->notify_focus(item, panel);
+ if (klass->focus_cursor != NULL)
+ klass->focus_cursor(item, content, cursor);
}
diff --git a/src/gui/editem.h b/src/gui/editem.h
index f102d5c..5adc288 100644
--- a/src/gui/editem.h
+++ b/src/gui/editem.h
@@ -30,16 +30,17 @@
#include <gtk/gtk.h>
+#include "../analysis/loaded.h"
#include "../glibext/gloadedpanel.h"
-#define G_TYPE_EDITOR_ITEM g_editor_item_get_type()
-#define G_EDITOR_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_editor_item_get_type(), GEditorItem))
-#define G_IS_EDITOR_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_editor_item_get_type()))
-#define G_EDITOR_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_EDITOR_ITEM, GEditorItemClass))
-#define G_IS_EDITOR_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_EDITOR_ITEM))
-#define G_EDITOR_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_EDITOR_ITEM, GEditorItemClass))
+#define G_TYPE_EDITOR_ITEM g_editor_item_get_type()
+#define G_EDITOR_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_editor_item_get_type(), GEditorItem))
+#define G_IS_EDITOR_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_editor_item_get_type()))
+#define G_EDITOR_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), g_editor_item_get_type(), GEditorItemClass))
+#define G_IS_EDITOR_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), g_editor_item_get_type()))
+#define G_EDITOR_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), g_editor_item_get_type(), GEditorItemClass))
/* Elément réactif quelconque de l'éditeur (instance) */
@@ -61,8 +62,20 @@ const char *g_editor_item_get_name(const GEditorItem *);
/* Fournit le composant GTK associé à l'élément réactif. */
GtkWidget *g_editor_item_get_widget(const GEditorItem *);
-/* Réagit à un changement de focus des panneaux d'affichage. */
-void notify_focus_change_for_editor_item(GEditorItem *, GLoadedPanel *);
+/* Réagit à un changement de contenu chargé en cours d'analyse. */
+void g_editor_item_change_content(GEditorItem *, GLoadedContent *, GLoadedContent *);
+
+/* Réagit à un changement de vue du contenu en cours d'analyse. */
+void g_editor_item_change_view(GEditorItem *, GLoadedPanel *, GLoadedPanel *);
+
+/* Réagit à une modification de la vue du contenu analysé. */
+void g_editor_item_update_view(GEditorItem *, GLoadedPanel *);
+
+/* Réagit à une modification de la vue du contenu analysé. */
+void g_editor_item_track_cursor(GEditorItem *, GLoadedPanel *, const GLineCursor *);
+
+/* Réagit à une modification de la vue du contenu analysé. */
+void g_editor_item_focus_cursor(GEditorItem *, GLoadedContent *, const GLineCursor *);
diff --git a/src/gui/editor.c b/src/gui/editor.c
index d63b3a9..3b8497c 100644
--- a/src/gui/editor.c
+++ b/src/gui/editor.c
@@ -389,7 +389,8 @@ GtkWidget *create_editor(void)
register_project_change_notification(notify_editor_project_change);
- change_editor_items_current_binary(NULL);
+ change_editor_items_current_content(NULL);
+ change_editor_items_current_view(NULL);
@@ -1374,8 +1375,8 @@ void on_panel_item_undock_request(GPanelItem *panel, gpointer unused)
static void on_dock_item_switch(GtkDockStation *station, GtkWidget *widget, gpointer unused)
{
- GLoadedBinary *old_binary; /* Ancien binaire édité */
- GLoadedBinary *binary; /* Binaire en cours d'édition */
+ GLoadedPanel *panel; /* Vue du contenu chargé */
+ GLoadedContent *content; /* Contenu en cours d'édition */
if (GTK_IS_SCROLLED_WINDOW(widget))
widget = gtk_bin_get_child(GTK_BIN(widget));
@@ -1383,23 +1384,17 @@ static void on_dock_item_switch(GtkDockStation *station, GtkWidget *widget, gpoi
if (GTK_IS_VIEWPORT(widget))
widget = gtk_bin_get_child(GTK_BIN(widget));
- if (GTK_IS_DISPLAY_PANEL(widget))
+ if (G_IS_LOADED_PANEL(widget))
{
- /* Changement de binaire ? */
+ panel = G_LOADED_PANEL(widget);
- old_binary = get_current_binary();
- binary = gtk_display_panel_get_binary(GTK_DISPLAY_PANEL(widget));
+ content = g_loaded_panel_get_content(panel);
- if (old_binary != binary)
- change_editor_items_current_binary(binary);
- else
- g_object_unref(G_OBJECT(binary));
+ change_editor_items_current_content(content);
- if (old_binary != NULL)
- g_object_unref(G_OBJECT(old_binary));
+ g_object_unref(G_OBJECT(content));
- g_object_ref(G_OBJECT(widget));
- change_editor_items_current_view(G_LOADED_PANEL(widget));
+ change_editor_items_current_view(panel);
}
diff --git a/src/gui/menus/binary.c b/src/gui/menus/binary.c
index b7be1b9..1360011 100644
--- a/src/gui/menus/binary.c
+++ b/src/gui/menus/binary.c
@@ -34,6 +34,7 @@
#include "../dialogs/gotox.h"
#include "../dialogs/storage.h"
#include "../../gtkext/easygtk.h"
+#include "../../gtkext/gtkdisplaypanel.h"
@@ -106,10 +107,9 @@ GtkWidget *build_menu_binary(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *ba
/******************************************************************************
* *
-* Paramètres : ref = espace de référencements à consulter. *
-* panel = panneau d'affichage actif ou NULL si aucun. *
+* Paramètres : new = nouveau contenu chargé à analyser. *
* *
-* Description : Met à jour les accès du menu "Binaire" selon le contenu. *
+* Description : Réagit à un changement d'affichage principal de contenu. *
* *
* Retour : - *
* *
@@ -117,14 +117,17 @@ GtkWidget *build_menu_binary(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *ba
* *
******************************************************************************/
-void update_access_in_menu_binary(GObject *ref, GtkDisplayPanel *panel)
+void update_access_for_content_in_menu_binary(GLoadedContent *new)
{
+ GObject *ref; /* Espace de référencements */
gboolean access; /* Accès à déterminer */
GtkWidget *item; /* Elément de menu à traiter */
/* Préliminaire */
- access = (panel != NULL);
+ ref = get_global_ref();
+
+ access = G_IS_LOADED_BINARY(new);
/* Menus */
@@ -155,19 +158,14 @@ void update_access_in_menu_binary(GObject *ref, GtkDisplayPanel *panel)
static void mcb_binary_entry_points(GtkMenuItem *menuitem, GMenuBar *bar)
{
- GEditorItem *item; /* Elément d'éditeur graphique */
- GObject *ref; /* Espace de référencements */
GLoadedBinary *binary; /* Binaire présenté à l'écran */
GtkWidget *dialog; /* Boîte de dialogue à montrer */
vmpa2t *addr; /* Adresse de destination */
GLoadedPanel *panel; /* Afficheur effectif de code */
- item = G_EDITOR_ITEM(bar);
+ binary = G_LOADED_BINARY(get_current_content());
- ref = g_editor_item_get_global_ref(item);
- binary = get_current_binary();
-
- dialog = create_gotox_dialog_for_entry_points(GTK_WINDOW(ref), binary);
+ dialog = create_gotox_dialog_for_entry_points(get_editor_window(), binary);
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
{
@@ -226,14 +224,12 @@ static void mcb_binary_attach_debugger(GtkMenuItem *menuitem, GMenuBar *bar)
static void mcb_binary_storage(GtkMenuItem *menuitem, GMenuBar *bar)
{
GLoadedBinary *binary; /* Edition courante */
- GObject *ref; /* Espace de référencements */
GtkBuilder *builder; /* Constructeur utilisé */
GtkWidget *dialog; /* Boîte de dialogue à montrer */
- binary = get_current_binary();
- ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar));
+ binary = G_LOADED_BINARY(get_current_content());
- dialog = create_storage_dialog(binary, GTK_WINDOW(ref), &builder);
+ dialog = create_storage_dialog(binary, get_editor_window(), &builder);
gtk_dialog_run(GTK_DIALOG(dialog));
@@ -263,9 +259,9 @@ static void mcb_binary_export(GtkMenuItem *menuitem, GMenuBar *bar)
{
GLoadedBinary *binary; /* Edition courante */
- binary = get_current_binary();
+ binary = G_LOADED_BINARY(get_current_content());
- run_export_assistant(binary, GTK_WINDOW(G_EDITOR_ITEM(bar)->ref));
+ run_export_assistant(binary, get_editor_window());
g_object_unref(G_OBJECT(binary));
diff --git a/src/gui/menus/binary.h b/src/gui/menus/binary.h
index a66fe26..45140b6 100644
--- a/src/gui/menus/binary.h
+++ b/src/gui/menus/binary.h
@@ -30,15 +30,15 @@
#include "menubar.h"
-#include "../../gtkext/gtkdisplaypanel.h"
+#include "../../analysis/loaded.h"
/* Construit le menu "Binaire". */
GtkWidget *build_menu_binary(GObject *, GtkAccelGroup *, GMenuBar *);
-/* Met à jour les accès du menu "Binaire" selon le contenu. */
-void update_access_in_menu_binary(GObject *, GtkDisplayPanel *);
+/* Réagit à un changement d'affichage principal de contenu. */
+void update_access_for_content_in_menu_binary(GLoadedContent *);
diff --git a/src/gui/menus/edition.c b/src/gui/menus/edition.c
index 08745b6..4a24d33 100644
--- a/src/gui/menus/edition.c
+++ b/src/gui/menus/edition.c
@@ -37,7 +37,11 @@
#include "../dialogs/gotox.h"
#include "../../analysis/db/items/switcher.h"
#include "../../arch/target.h"
+#include "../../glibext/gbinarycursor.h"
#include "../../gtkext/easygtk.h"
+#include "../../gtkext/gtkblockdisplay.h"
+#include "../../gtkext/gtkdisplaypanel.h"
+#include "../../gtkext/gtkgraphdisplay.h"
@@ -103,14 +107,20 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
menubar = qck_create_menu(GTK_MENU_ITEM(result));
- submenuitem = qck_create_menu_item(NULL, NULL, _("Go to address..."),
+ /* Déplacements ciblés */
+
+ submenuitem = qck_create_menu_item(ref, "mnu_edit_goto", _("Go to address..."),
G_CALLBACK(mcb_edition_goto), bar);
add_accelerator_to_menu_item(submenuitem, "<Ctrl>G", accgroup);
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+ /* Séparation */
+
submenuitem = qck_create_menu_separator();
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+ /* Bascule des opérandes numériques */
+
submenuitem = qck_create_menu_item(NULL, NULL, _("Numeric operand"), NULL, NULL);
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
@@ -153,7 +163,7 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
submenuitem = qck_create_menu_separator();
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
- /* Déplacements */
+ /* Suivi de cibles */
submenuitem = qck_create_menu_item(ref, "mnu_edit_go_back", _("Go back"),
G_CALLBACK(mcb_edition_go_back), bar);
@@ -182,12 +192,12 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
deepmenubar = qck_create_menu(GTK_MENU_ITEM(submenuitem));
- deepmenuitem = qck_create_menu_item(NULL, NULL, _("Toggle at current location"),
+ deepmenuitem = qck_create_menu_item(ref, "mnu_edit_toggle_bmark", _("Toggle at current location"),
G_CALLBACK(mcb_edition_bookmarks_toggle), bar);
add_accelerator_to_menu_item(deepmenuitem, "<Ctrl>D", accgroup);
gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem);
- deepmenuitem = qck_create_menu_item(NULL, NULL, _("Delete all bookmarks"),
+ deepmenuitem = qck_create_menu_item(ref, "mnu_edit_delete_bmarks", _("Delete all bookmarks"),
G_CALLBACK(mcb_edition_bookmarks_delete_all), bar);
gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem);
@@ -198,22 +208,22 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
deepmenubar = qck_create_menu(GTK_MENU_ITEM(submenuitem));
- deepmenuitem = qck_create_menu_item(NULL, NULL, _("Enter a comment..."),
+ deepmenuitem = qck_create_menu_item(ref, "mnu_edit_enter_comment", _("Enter a comment..."),
G_CALLBACK(mcb_edition_comment_enter), bar);
add_accelerator_to_menu_item(deepmenuitem, "semicolon", accgroup);
gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem);
- deepmenuitem = qck_create_menu_item(NULL, NULL, _("Enter a repeatable comment..."),
+ deepmenuitem = qck_create_menu_item(ref, "mnu_edit_enter_rep_comment", _("Enter a repeatable comment..."),
G_CALLBACK(mcb_edition_comment_enter_repeatable), bar);
add_accelerator_to_menu_item(deepmenuitem, "colon", accgroup);
gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem);
- deepmenuitem = qck_create_menu_item(NULL, NULL, _("Enter a comment in the previous line..."),
+ deepmenuitem = qck_create_menu_item(ref, "mnu_edit_enter_prev", _("Enter a comment in the previous line..."),
G_CALLBACK(mcb_edition_comment_enter_previous), bar);
add_accelerator_to_menu_item(deepmenuitem, "Insert", accgroup);
gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem);
- deepmenuitem = qck_create_menu_item(NULL, NULL, _("Enter a comment in the next line..."),
+ deepmenuitem = qck_create_menu_item(ref, "mnu_edit_enter_next", _("Enter a comment in the next line..."),
G_CALLBACK(mcb_edition_comment_enter_next), bar);
add_accelerator_to_menu_item(deepmenuitem, "<Shift>Insert", accgroup);
gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem);
@@ -225,9 +235,96 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
/******************************************************************************
* *
-* Paramètres : ref = espace de référencements à consulter. *
-* panel = panneau d'affichage actif ou NULL si aucun. *
-* addr = nouvelle adresse du curseur courant. *
+* Paramètres : new = nouvelle vue du contenu chargé analysé. *
+* *
+* Description : Lance une actualisation du fait d'un changement de support. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void update_access_for_view_in_menu_edition(GLoadedPanel *new)
+{
+ GObject *ref; /* Espace de référencements */
+ gboolean access; /* Accès à déterminer */
+ GtkWidget *item; /* Elément de menu à traiter */
+
+ ref = get_global_ref();
+
+ /* Déplacements ciblés */
+
+ access = GTK_IS_BLOCK_DISPLAY(new) || GTK_IS_GRAPH_DISPLAY(new);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_goto"));
+ gtk_widget_set_sensitive(item, access);
+
+ /* Bascule des opérandes numériques */
+
+ access = GTK_IS_BLOCK_DISPLAY(new) || GTK_IS_GRAPH_DISPLAY(new);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_switch_hex"));
+ gtk_widget_set_sensitive(item, access);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_switch_dec"));
+ gtk_widget_set_sensitive(item, access);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_switch_oct"));
+ gtk_widget_set_sensitive(item, access);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_switch_bin"));
+ gtk_widget_set_sensitive(item, access);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_switch_def"));
+ gtk_widget_set_sensitive(item, access);
+
+ /* Suivi de cibles */
+
+ access = GTK_IS_BLOCK_DISPLAY(new) || GTK_IS_GRAPH_DISPLAY(new);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_go_back"));
+ gtk_widget_set_sensitive(item, access);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_follow_ref"));
+ gtk_widget_set_sensitive(item, access);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_list_xrefs"));
+ gtk_widget_set_sensitive(item, access);
+
+ /* Signets */
+
+ access = GTK_IS_BLOCK_DISPLAY(new) || GTK_IS_GRAPH_DISPLAY(new);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_toggle_bmark"));
+ gtk_widget_set_sensitive(item, access);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_delete_bmarks"));
+ gtk_widget_set_sensitive(item, access);
+
+ /* Commentaires */
+
+ access = GTK_IS_BLOCK_DISPLAY(new) || GTK_IS_GRAPH_DISPLAY(new);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_enter_comment"));
+ gtk_widget_set_sensitive(item, access);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_enter_rep_comment"));
+ gtk_widget_set_sensitive(item, access);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_enter_prev"));
+ gtk_widget_set_sensitive(item, access);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_enter_next"));
+ gtk_widget_set_sensitive(item, access);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : panel = vue d'affichage active ou NULL si aucune. *
+* cursor = suivi des positions à consulter. *
* *
* Description : Met à jour les accès du menu "Edition" selon une position. *
* *
@@ -237,19 +334,35 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
* *
******************************************************************************/
-void update_access_in_menu_edition(GObject *ref, GtkDisplayPanel *panel, const vmpa2t *addr)
+void update_access_for_cursor_in_menu_edition(GLoadedPanel *panel, const GLineCursor *cursor)
{
+ GObject *ref; /* Espace de référencements */
GObject *creator; /* Créateur à l'orgine du seg. */
gboolean access; /* Accès à déterminer */
GtkWidget *item; /* Elément de menu à traiter */
+ ref = get_global_ref();
+
/* Préliminaire */
- if (panel == NULL || addr == NULL)
- creator = NULL;
+ /**
+ * Seuls les affichages de blocs (en graphique ou non) distribuent ce
+ * genre de curseur. Donc on valide dans le même temps la nature de la vue.
+ */
+
+ if (G_IS_BINARY_CURSOR(cursor))
+ {
+ assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel));
+
+ if (g_line_cursor_is_valid(cursor))
+ creator = gtk_display_panel_get_active_object(GTK_DISPLAY_PANEL(panel));
+ else
+ cursor = NULL;
+
+ }
else
- creator = gtk_display_panel_get_active_object(panel);
+ creator = NULL;
/* Bascule des opérandes numériques */
@@ -277,14 +390,15 @@ void update_access_in_menu_edition(GObject *ref, GtkDisplayPanel *panel, const v
item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_follow_ref"));
gtk_widget_set_sensitive(item, access);
- access = (addr != NULL);;
+ access = g_line_cursor_is_valid(cursor);
item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_list_xrefs"));
gtk_widget_set_sensitive(item, access);
/* Nettoyage et sortie finale */
- if (creator != NULL) g_object_unref(G_OBJECT(creator));
+ if (creator != NULL)
+ g_object_unref(G_OBJECT(creator));
}
@@ -317,9 +431,9 @@ static void mcb_edition_goto(GtkMenuItem *menuitem, GMenuBar *bar)
addr = get_address_from_goto_dialog(dialog);
panel = get_current_view();
+ assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel));
- if (GTK_IS_DISPLAY_PANEL(panel))
- gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), addr);
+ gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), addr);
g_object_unref(G_OBJECT(panel));
@@ -359,32 +473,29 @@ static void mcb_edition_switch_numeric_operand(GtkMenuItem *menuitem, gpointer u
display = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(menuitem), "kind_of_switch"));
panel = get_current_view();
+ assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel));
- if (GTK_IS_DISPLAY_PANEL(panel))
- {
- creator = gtk_display_panel_get_active_object(GTK_DISPLAY_PANEL(panel));
- assert(G_IS_IMM_OPERAND(creator));
+ creator = gtk_display_panel_get_active_object(GTK_DISPLAY_PANEL(panel));
+ assert(G_IS_IMM_OPERAND(creator));
- addr = gtk_display_panel_get_caret_location(GTK_DISPLAY_PANEL(panel));
+ addr = gtk_display_panel_get_caret_location(GTK_DISPLAY_PANEL(panel));
- binary = get_current_binary();
- proc = g_loaded_binary_get_processor(binary);
+ binary = G_LOADED_BINARY(get_current_content());
+ proc = g_loaded_binary_get_processor(binary);
- instr = g_arch_processor_find_instr_by_address(proc, addr);
- assert(instr != NULL);
+ instr = g_arch_processor_find_instr_by_address(proc, addr);
+ assert(instr != NULL);
- switcher = g_db_switcher_new(instr, G_IMM_OPERAND(creator), display);
+ switcher = g_db_switcher_new(instr, G_IMM_OPERAND(creator), display);
- g_object_unref(G_OBJECT(instr));
+ g_object_unref(G_OBJECT(instr));
- g_loaded_binary_add_to_collection(binary, G_DB_ITEM(switcher));
+ g_loaded_binary_add_to_collection(binary, G_DB_ITEM(switcher));
- g_object_unref(G_OBJECT(proc));
- g_object_unref(G_OBJECT(binary));
-
- g_object_unref(creator);
+ g_object_unref(G_OBJECT(proc));
+ g_object_unref(G_OBJECT(binary));
- }
+ g_object_unref(creator);
g_object_unref(G_OBJECT(panel));
@@ -432,35 +543,32 @@ static void mcb_edition_follow_ref(GtkMenuItem *menuitem, gpointer unused)
virt_t virt; /* Adresse virtuelle */
panel = get_current_view();
+ assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel));
- if (GTK_IS_DISPLAY_PANEL(panel))
- {
- creator = gtk_display_panel_get_active_object(GTK_DISPLAY_PANEL(panel));
- assert(creator != NULL);
+ creator = gtk_display_panel_get_active_object(GTK_DISPLAY_PANEL(panel));
+ assert(creator != NULL);
- defined = false;
+ defined = false;
- if (G_IS_TARGET_OPERAND(creator))
- {
- g_target_operand_get_addr(G_TARGET_OPERAND(creator), &addr);
- defined = true;
- }
+ if (G_IS_TARGET_OPERAND(creator))
+ {
+ g_target_operand_get_addr(G_TARGET_OPERAND(creator), &addr);
+ defined = true;
+ }
- else if (G_IS_IMM_OPERAND(creator))
+ else if (G_IS_IMM_OPERAND(creator))
+ {
+ if (g_imm_operand_to_virt_t(G_IMM_OPERAND(creator), &virt))
{
- if (g_imm_operand_to_virt_t(G_IMM_OPERAND(creator), &virt))
- {
- init_vmpa(&addr, VMPA_NO_PHYSICAL, virt);
- defined = true;
- }
+ init_vmpa(&addr, VMPA_NO_PHYSICAL, virt);
+ defined = true;
}
+ }
- if (defined)
- gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), &addr);
+ if (defined)
+ gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), &addr);
- g_object_unref(creator);
-
- }
+ g_object_unref(creator);
g_object_unref(G_OBJECT(panel));
@@ -492,51 +600,48 @@ static void mcb_edition_list_xrefs(GtkMenuItem *menuitem, GMenuBar *bar)
vmpa2t *dest; /* Adresse de destination */
panel = get_current_view();
+ assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel));
- if (GTK_IS_DISPLAY_PANEL(panel))
- {
- addr = gtk_display_panel_get_caret_location(GTK_DISPLAY_PANEL(panel));
-
- binary = get_current_binary();
- proc = g_loaded_binary_get_processor(binary);
-
- /**
- * On ne peut pas se reposer sur l'espace couvert par une ligne, car il peut
- * être de taille nulle (cas d'une étiquette, par exemple), à la différence
- * de la taille d'une instruction.
- *
- * Il faut ainsi être plus souple, et se baser sur l'espace couvert par
- * une ligne mais sur l'adresse uniquement.
- */
- instr = g_arch_processor_find_instr_by_address(proc, addr);
-
- if (instr != NULL)
- {
- ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar));
+ addr = gtk_display_panel_get_caret_location(GTK_DISPLAY_PANEL(panel));
- dialog = create_gotox_dialog_for_cross_references(GTK_WINDOW(ref), binary, instr, true);
+ binary = G_LOADED_BINARY(get_current_content());
+ proc = g_loaded_binary_get_processor(binary);
- if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
- {
- dest = get_address_from_gotox_dialog(dialog);
+ /**
+ * On ne peut pas se reposer sur l'espace couvert par une ligne, car il peut
+ * être de taille nulle (cas d'une étiquette, par exemple), à la différence
+ * de la taille d'une instruction.
+ *
+ * Il faut ainsi être plus souple, et se baser sur l'espace couvert par
+ * une ligne mais sur l'adresse uniquement.
+ */
+ instr = g_arch_processor_find_instr_by_address(proc, addr);
- gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), dest);
+ if (instr != NULL)
+ {
+ ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar));
- delete_vmpa(dest);
+ dialog = create_gotox_dialog_for_cross_references(GTK_WINDOW(ref), binary, instr, true);
- }
+ if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
+ {
+ dest = get_address_from_gotox_dialog(dialog);
- gtk_widget_destroy(dialog);
+ gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), dest);
- g_object_unref(G_OBJECT(instr));
+ delete_vmpa(dest);
}
- g_object_unref(G_OBJECT(proc));
- g_object_unref(G_OBJECT(binary));
+ gtk_widget_destroy(dialog);
+
+ g_object_unref(G_OBJECT(instr));
}
+ g_object_unref(G_OBJECT(proc));
+ g_object_unref(G_OBJECT(binary));
+
g_object_unref(G_OBJECT(panel));
}
@@ -570,15 +675,13 @@ static void mcb_edition_bookmarks_toggle(GtkMenuItem *menuitem, GMenuBar *bar)
/* Détermination de l'adresse visée */
panel = get_current_view();
-
- if (!GTK_IS_DISPLAY_PANEL(panel))
- goto done_with_panel;
+ assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel));
curloc = gtk_display_panel_get_caret_location(GTK_DISPLAY_PANEL(panel));
/* Accès à la collection */
- binary = get_current_binary();
+ binary = G_LOADED_BINARY(get_current_content());
collec = g_loaded_binary_find_collection(binary, DBF_BOOKMARKS);
/**
@@ -636,8 +739,6 @@ static void mcb_edition_bookmarks_toggle(GtkMenuItem *menuitem, GMenuBar *bar)
g_object_unref(G_OBJECT(collec));
g_object_unref(G_OBJECT(binary));
- done_with_panel:
-
g_object_unref(G_OBJECT(panel));
}
diff --git a/src/gui/menus/edition.h b/src/gui/menus/edition.h
index f863568..a49e320 100644
--- a/src/gui/menus/edition.h
+++ b/src/gui/menus/edition.h
@@ -30,15 +30,18 @@
#include "menubar.h"
-#include "../../gtkext/gtkdisplaypanel.h"
+#include "../../glibext/gloadedpanel.h"
/* Construit le menu "Edition". */
GtkWidget *build_menu_edition(GObject *, GtkAccelGroup *, GMenuBar *);
+/* Lance une actualisation du fait d'un changement de support. */
+void update_access_for_view_in_menu_edition(GLoadedPanel *);
+
/* Met à jour les accès du menu "Edition" selon une position. */
-void update_access_in_menu_edition(GObject *, GtkDisplayPanel *, const vmpa2t *);
+void update_access_for_cursor_in_menu_edition(GLoadedPanel *, const GLineCursor *);
diff --git a/src/gui/menus/menubar.c b/src/gui/menus/menubar.c
index 989d964..7bc7e85 100644
--- a/src/gui/menus/menubar.c
+++ b/src/gui/menus/menubar.c
@@ -76,14 +76,14 @@ static void g_menu_bar_dispose(GMenuBar *);
/* Procède à la libération totale de la mémoire. */
static void g_menu_bar_finalize(GMenuBar *);
-/* Lance une actualisation du fait d'un changement de vue. */
-static void update_menu_bar_for_view(GMenuBar *, GtkDisplayPanel *);
+/* Réagit à un changement d'affichage principal de contenu. */
+static void change_menubar_current_content(GMenuBar *, GLoadedContent *, GLoadedContent *);
-/* Réagit à un changement de focus des panneaux d'affichage. */
-static void notify_focus_change_for_menu_bar(GMenuBar *, GtkDisplayPanel *);
+/* Lance une actualisation du fait d'un changement de support. */
+static void change_menubar_current_view(GMenuBar *, GLoadedPanel *, GLoadedPanel *);
/* Met à jour les accès aux menus en fonction de la position. */
-static void track_caret_address_for_menu_bar(GMenuBar *, GtkDisplayPanel *, const vmpa2t *);
+static void track_caret_address_for_menu_bar(GMenuBar *, GLoadedPanel *, const GLineCursor *);
/* Lance une actualisation relative à l'étendue du projet. */
static void update_menu_bar_for_project(GMenuBar *, GStudyProject *);
@@ -118,9 +118,9 @@ static void g_menu_bar_class_init(GMenuBarClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->update_view = (update_item_view_fc)update_menu_bar_for_view;
- editem->notify_focus = (notify_focus_change_fc)notify_focus_change_for_menu_bar;
- editem->track_caret = (track_caret_in_view_fc)track_caret_address_for_menu_bar;
+ editem->change_content = (change_item_content_fc)change_menubar_current_content;
+ editem->change_view = (change_item_view_fc)change_menubar_current_view;
+ editem->track_cursor = (track_cursor_in_view_fc)track_caret_address_for_menu_bar;
editem->update_project = (update_project_fc)update_menu_bar_for_project;
}
@@ -264,10 +264,6 @@ GEditorItem *g_menu_bar_new(GObject *ref, GtkAccelGroup *accgroup)
result->help = build_menu_help(ref, accgroup);
gtk_container_add(GTK_CONTAINER(item->widget), result->help);
- /* Finalisation générique */
-
- notify_focus_change_for_menu_bar(result, NULL);
-
return G_EDITOR_ITEM(result);
}
@@ -275,10 +271,11 @@ GEditorItem *g_menu_bar_new(GObject *ref, GtkAccelGroup *accgroup)
/******************************************************************************
* *
-* Paramètres : bar = barre de menus à actualiser. *
-* panel = nouveau panneau d'affichage actif. *
+* Paramètres : bar = barre de menus à mettre à jour. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
* *
-* Description : Lance une actualisation du fait d'un changement de vue. *
+* Description : Réagit à un changement d'affichage principal de contenu. *
* *
* Retour : - *
* *
@@ -286,19 +283,20 @@ GEditorItem *g_menu_bar_new(GObject *ref, GtkAccelGroup *accgroup)
* *
******************************************************************************/
-static void update_menu_bar_for_view(GMenuBar *bar, GtkDisplayPanel *panel)
+static void change_menubar_current_content(GMenuBar *bar, GLoadedContent *old, GLoadedContent *new)
{
- update_menu_view_for_view(bar->view, panel, bar);
+ update_access_for_content_in_menu_binary(new);
}
/******************************************************************************
* *
-* Paramètres : bar = barre de menus à actualiser. *
-* panel = composant d'affichage concerné par l'opération. *
+* Paramètres : bar = barre de menus à mettre à jour. *
+* old = ancienne vue du contenu chargé analysé. *
+* new = nouvelle vue du contenu chargé analysé. *
* *
-* Description : Réagit à un changement de focus des panneaux d'affichage. *
+* Description : Lance une actualisation du fait d'un changement de support. *
* *
* Retour : - *
* *
@@ -306,23 +304,12 @@ static void update_menu_bar_for_view(GMenuBar *bar, GtkDisplayPanel *panel)
* *
******************************************************************************/
-static void notify_focus_change_for_menu_bar(GMenuBar *bar, GtkDisplayPanel *panel)
+static void change_menubar_current_view(GMenuBar *bar, GLoadedPanel *old, GLoadedPanel *new)
{
- const vmpa2t *addr; /* Position courante */
- GEditorItem *item; /* Autre version de l'élément */
-
- if (panel != NULL)
- addr = gtk_display_panel_get_caret_location(panel);
- else
- addr = NULL;
-
- item = G_EDITOR_ITEM(bar);
-
- update_access_in_menu_edition(item->ref, panel, addr);
+ update_access_for_view_in_menu_edition(new);
- update_access_in_menu_view(item->ref, panel);
-
- update_access_in_menu_binary(item->ref, panel);
+ rebuild_menu_view(bar->view, new, bar);
+ update_access_for_view_in_menu_view(G_EDITOR_ITEM(bar)->ref, new);
}
@@ -330,8 +317,8 @@ static void notify_focus_change_for_menu_bar(GMenuBar *bar, GtkDisplayPanel *pan
/******************************************************************************
* *
* Paramètres : bar = barre de menus à actualiser. *
-* panel = panneau d'affichage actif ou NULL si aucun. *
-* addr = nouvelle adresse du curseur courant. *
+* panel = composant d'affichage parcouru. *
+* cursor = nouvel emplacement du curseur courant. *
* *
* Description : Met à jour les accès aux menus en fonction de la position. *
* *
@@ -341,13 +328,9 @@ static void notify_focus_change_for_menu_bar(GMenuBar *bar, GtkDisplayPanel *pan
* *
******************************************************************************/
-static void track_caret_address_for_menu_bar(GMenuBar *bar, GtkDisplayPanel *panel, const vmpa2t *addr)
+static void track_caret_address_for_menu_bar(GMenuBar *bar, GLoadedPanel *panel, const GLineCursor *cursor)
{
- GEditorItem *item; /* Autre version de l'élément */
-
- item = G_EDITOR_ITEM(bar);
-
- update_access_in_menu_edition(item->ref, panel, addr);
+ update_access_for_cursor_in_menu_edition(panel, cursor);
}
diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c
index dfbf152..f0e7450 100644
--- a/src/gui/menus/view.c
+++ b/src/gui/menus/view.c
@@ -105,7 +105,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
qck_create_menu(GTK_MENU_ITEM(submenuitem));
- /* - */
+ /* Séparation */
submenuitem = qck_create_menu_separator();
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
@@ -138,7 +138,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
add_accelerator_to_menu_item(submenuitem, "<Shift>Tab", accgroup);
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
- /* - */
+ /* Séparation */
submenuitem = qck_create_menu_separator();
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
@@ -160,7 +160,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
g_object_set_data(G_OBJECT(submenuitem), "kind_of_opt", GUINT_TO_POINTER(BLC_BINARY));
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
- /* - */
+ /* Séparation */
submenuitem = qck_create_menu_separator();
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
@@ -191,7 +191,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
* *
******************************************************************************/
-void update_menu_view_for_view(GtkWidget *widget, GtkDisplayPanel *panel, GMenuBar *bar)
+void rebuild_menu_view(GtkWidget *widget, GLoadedPanel *panel, GMenuBar *bar)
{
GObject *ref; /* Espace de référencements */
GtkRadioMenuItem *item; /* Elément de menu arbitraire */
@@ -246,9 +246,9 @@ void update_menu_view_for_view(GtkWidget *widget, GtkDisplayPanel *panel, GMenuB
g_slist_foreach(radios, (GFunc)reconnect_display_radio, NULL);
- /* - */
+ /* Séparation */
- content = g_loaded_panel_get_content(G_LOADED_PANEL(panel));
+ content = g_loaded_panel_get_content(panel);
view_index = g_loaded_content_get_view_index(content, GTK_WIDGET(panel));
@@ -305,7 +305,7 @@ void update_menu_view_for_view(GtkWidget *widget, GtkDisplayPanel *panel, GMenuB
* *
******************************************************************************/
-void update_access_in_menu_view(GObject *ref, GtkDisplayPanel *panel)
+void update_access_for_view_in_menu_view(GObject *ref, GLoadedPanel *panel)
{
gboolean access; /* Accès à déterminer */
GtkWidget *item; /* Elément de menu à traiter */
diff --git a/src/gui/menus/view.h b/src/gui/menus/view.h
index d42bbc6..5216bcb 100644
--- a/src/gui/menus/view.h
+++ b/src/gui/menus/view.h
@@ -30,7 +30,7 @@
#include "menubar.h"
-#include "../../gtkext/gtkdisplaypanel.h"
+#include "../../glibext/gloadedpanel.h"
@@ -38,10 +38,10 @@
GtkWidget *build_menu_view(GObject *, GtkAccelGroup *, GMenuBar *);
/* Lance une actualisation du fait d'un changement de vue. */
-void update_menu_view_for_view(GtkWidget *, GtkDisplayPanel *, GMenuBar *);
+void rebuild_menu_view(GtkWidget *, GLoadedPanel *, GMenuBar *);
/* Met à jour les accès du menu "Affichage" selon le contenu. */
-void update_access_in_menu_view(GObject *, GtkDisplayPanel *);
+void update_access_for_view_in_menu_view(GObject *, GLoadedPanel *);
diff --git a/src/gui/panels/bintree.c b/src/gui/panels/bintree.c
index ecb18fe..5c8a19e 100644
--- a/src/gui/panels/bintree.c
+++ b/src/gui/panels/bintree.c
@@ -37,6 +37,7 @@
#include "updating-int.h"
#include "../core/global.h"
#include "../../core/queue.h"
+#include "../../gtkext/gtkdisplaypanel.h"
#include "../../gtkext/tmgt.h"
@@ -118,7 +119,7 @@ static void on_depth_spin_value_changed(GtkSpinButton *, const GBintreePanel *);
static void on_bintree_selection_changed(GtkTreeSelection *, gpointer);
/* Réagit à un changement d'affichage principal de contenu. */
-static void change_bintree_panel_current_binary(GBintreePanel *, GLoadedBinary *);
+static void change_bintree_panel_current_content(GBintreePanel *, GLoadedContent *, GLoadedContent *);
@@ -230,7 +231,7 @@ static void g_bintree_panel_class_init(GBintreePanelClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->update_binary = (update_item_binary_fc)change_bintree_panel_current_binary;
+ editem->change_content = (change_item_content_fc)change_bintree_panel_current_content;
panel = G_PANEL_ITEM_CLASS(klass);
@@ -520,8 +521,9 @@ static void on_bintree_selection_changed(GtkTreeSelection *selection, gpointer u
/******************************************************************************
* *
-* Paramètres : panel = panneau à mettre à jour. *
-* binary = nouvelle instance de binaire analysé. *
+* Paramètres : panel = panneau à mettre à jour. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
* *
* Description : Réagit à un changement d'affichage principal de contenu. *
* *
@@ -531,11 +533,17 @@ static void on_bintree_selection_changed(GtkTreeSelection *selection, gpointer u
* *
******************************************************************************/
-static void change_bintree_panel_current_binary(GBintreePanel *panel, GLoadedBinary *binary)
+static void change_bintree_panel_current_content(GBintreePanel *panel, GLoadedContent *old, GLoadedContent *new)
{
+ GLoadedBinary *binary; /* Autre version de l'instance */
GtkBuilder *builder; /* Constructeur utilisé */
GtkTreeStore *store; /* Modèle de gestion */
+ if (G_IS_LOADED_BINARY(new))
+ binary = G_LOADED_BINARY(new);
+ else
+ binary = NULL;
+
/* Basculement du binaire utilisé */
if (panel->binary != NULL)
diff --git a/src/gui/panels/bookmarks.c b/src/gui/panels/bookmarks.c
index fd8af25..3c1e719 100644
--- a/src/gui/panels/bookmarks.c
+++ b/src/gui/panels/bookmarks.c
@@ -46,6 +46,7 @@
#include "../../glibext/chrysamarshal.h"
#include "../../glibext/signal.h"
#include "../../gtkext/easygtk.h"
+#include "../../gtkext/gtkdisplaypanel.h"
#include "../../gtkext/gtkdockable-int.h"
@@ -106,6 +107,8 @@ static void g_bookmarks_panel_dispose(GBookmarksPanel *);
/* Procède à la libération totale de la mémoire. */
static void g_bookmarks_panel_finalize(GBookmarksPanel *);
+/* Réagit à un changement d'affichage principal de contenu. */
+static void change_bookmarks_panel_current_content(GBookmarksPanel *, GLoadedContent *, GLoadedContent *);
/* ------------------------- AFFICHAGE A L'AIDE D'UNE LISTE ------------------------- */
@@ -208,7 +211,7 @@ static void g_bookmarks_panel_class_init(GBookmarksPanelClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->update_binary = (update_item_binary_fc)reload_bookmarks_into_treeview;
+ editem->change_content = (change_item_content_fc)change_bookmarks_panel_current_content;
panel = G_PANEL_ITEM_CLASS(klass);
@@ -426,6 +429,34 @@ GPanelItem *g_bookmarks_panel_new(void)
}
+/******************************************************************************
+* *
+* Paramètres : panel = panneau à mettre à jour. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
+* *
+* Description : Réagit à un changement d'affichage principal de contenu. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void change_bookmarks_panel_current_content(GBookmarksPanel *panel, GLoadedContent *old, GLoadedContent *new)
+{
+ GLoadedBinary *binary; /* Autre version de l'instance */
+
+ if (G_IS_LOADED_BINARY(new))
+ binary = G_LOADED_BINARY(new);
+ else
+ binary = NULL;
+
+ reload_bookmarks_into_treeview(panel, binary);
+
+}
+
+
/* ---------------------------------------------------------------------------------- */
/* AFFICHAGE A L'AIDE D'UNE LISTE */
@@ -955,7 +986,7 @@ static void on_param_value_edited(GtkCellRendererText *renderer, gchar *path, gc
static void update_filtered_bookmarks(GBookmarksPanel *panel)
{
- //reload_bookmarks_into_treeview(panel, panel->binary);
+ reload_bookmarks_into_treeview(panel, panel->binary);
}
diff --git a/src/gui/panels/errors.c b/src/gui/panels/errors.c
index 5873ad5..fa86a84 100644
--- a/src/gui/panels/errors.c
+++ b/src/gui/panels/errors.c
@@ -41,6 +41,7 @@
#include "../../core/queue.h"
#include "../../format/format.h"
#include "../../glibext/signal.h"
+#include "../../gtkext/gtkdisplaypanel.h"
@@ -137,7 +138,7 @@ static void g_error_panel_finalize(GErrorPanel *);
static gint sort_errors_in_panel(GtkTreeModel *, GtkTreeIter *, GtkTreeIter *, gpointer);
/* Réagit à un changement d'affichage principal de contenu. */
-static void update_panel_with_binary_errors(GErrorPanel *, GLoadedBinary *);
+static void change_error_panel_current_content(GErrorPanel *, GLoadedContent *, GLoadedContent *);
/* Effectue la mise à jour du contenu du panneau d'erreurs. */
static void update_error_panel(const GErrorPanel *, GtkStatusStack *, activity_id_t, error_update_data *);
@@ -218,7 +219,7 @@ static void g_error_panel_class_init(GErrorPanelClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->update_binary = (update_item_binary_fc)update_panel_with_binary_errors;
+ editem->change_content = (change_item_content_fc)change_error_panel_current_content;
filename = find_pixmap_file("error_file.png");
assert(filename != NULL);
@@ -465,8 +466,9 @@ static gint sort_errors_in_panel(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIte
/******************************************************************************
* *
-* Paramètres : panel = panneau à mettre à jour. *
-* binary = nouvelle instance de binaire analysé. *
+* Paramètres : panel = panneau à mettre à jour. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
* *
* Description : Réagit à un changement d'affichage principal de contenu. *
* *
@@ -476,11 +478,17 @@ static gint sort_errors_in_panel(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIte
* *
******************************************************************************/
-static void update_panel_with_binary_errors(GErrorPanel *panel, GLoadedBinary *binary)
+static void change_error_panel_current_content(GErrorPanel *panel, GLoadedContent *old, GLoadedContent *new)
{
+ GLoadedBinary *binary; /* Autre version de l'instance */
GtkBuilder *builder; /* Constructeur utilisé */
GtkListStore *store; /* Modèle de gestion */
+ if (G_IS_LOADED_BINARY(new))
+ binary = G_LOADED_BINARY(new);
+ else
+ binary = NULL;
+
/* Réinitialisation */
if (panel->binary != NULL)
diff --git a/src/gui/panels/glance.c b/src/gui/panels/glance.c
index c58f3b6..0fb8f43 100644
--- a/src/gui/panels/glance.c
+++ b/src/gui/panels/glance.c
@@ -87,7 +87,7 @@ static void g_glance_panel_dispose(GGlancePanel *);
static void g_glance_panel_finalize(GGlancePanel *);
/* Lance une actualisation du fait d'un changement de support. */
-static void update_glance_panel_for_view(GGlancePanel *, GLoadedPanel *);
+static void change_glance_panel_current_view(GGlancePanel *, GLoadedPanel *, GLoadedPanel *);
/* Réagit à la préparation du défilement du support original. */
static void on_view_scroll_setup(GtkAdjustment *, GGlancePanel *);
@@ -102,7 +102,7 @@ static void on_glance_resize(GtkWidget *, GdkRectangle *, GGlancePanel *);
static void compute_glance_scale(GGlancePanel *);
/* Lance une actualisation du fait d'un changement de vue. */
-static void update_glance_panel_for_view_content(GGlancePanel *, GLoadedPanel *);
+static void update_glance_panel_view(GGlancePanel *, GLoadedPanel *);
/* Met à jour l'affichage de l'aperçu rapide à présenter. */
static gboolean redraw_glance_area(GtkWidget *, cairo_t *, GGlancePanel *);
@@ -147,8 +147,8 @@ static void g_glance_panel_class_init(GGlancePanelClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->update_view = (update_item_view_fc)update_glance_panel_for_view;
- editem->update_content = (update_item_view_fc)update_glance_panel_for_view_content;
+ editem->change_view = (change_item_view_fc)change_glance_panel_current_view;
+ editem->update_view = (update_item_view_fc)update_glance_panel_view;
theme = gtk_icon_theme_get_default();
@@ -282,7 +282,8 @@ GPanelItem *g_glance_panel_new(void)
/******************************************************************************
* *
* Paramètres : panel = panneau à actualiser. *
-* view = nouveau panneau d'affichage actif. *
+* old = ancienne vue du contenu chargé analysé. *
+* new = nouvelle vue du contenu chargé analysé. *
* *
* Description : Lance une actualisation du fait d'un changement de support. *
* *
@@ -292,17 +293,17 @@ GPanelItem *g_glance_panel_new(void)
* *
******************************************************************************/
-static void update_glance_panel_for_view(GGlancePanel *panel, GLoadedPanel *view)
+static void change_glance_panel_current_view(GGlancePanel *panel, GLoadedPanel *old, GLoadedPanel *new)
{
GtkWidget *parent; /* Support défilant de la vue */
GtkAdjustment *adj; /* Gestionnaire du défilement */
if (panel->view != NULL)
{
- g_object_unref(panel->view);
+ g_object_unref(G_OBJECT(panel->view));
panel->view = NULL;
- g_object_unref(panel->support);
+ g_object_unref(G_OBJECT(panel->support));
panel->support = NULL;
if (panel->cache != NULL)
@@ -318,22 +319,27 @@ static void update_glance_panel_for_view(GGlancePanel *panel, GLoadedPanel *view
* de la fonction mcb_view_change_support().
*/
- parent = gtk_widget_get_parent(GTK_WIDGET(view));
+ parent = gtk_widget_get_parent(GTK_WIDGET(new));
if (!GTK_IS_SCROLLED_WINDOW(parent)) return;
- panel->view = view;
- g_object_ref(panel->view);
+ panel->view = new;
+
+ if (panel->view != NULL)
+ {
+ g_object_ref(G_OBJECT(panel->view));
+
+ panel->support = GTK_SCROLLED_WINDOW(parent);
+ g_object_ref(G_OBJECT(panel->support));
- panel->support = GTK_SCROLLED_WINDOW(parent);
- g_object_ref(panel->support);
+ adj = gtk_scrolled_window_get_hadjustment(panel->support);
+ g_signal_connect(G_OBJECT(adj), "changed", G_CALLBACK(on_view_scroll_setup), panel);
+ g_signal_connect(G_OBJECT(adj), "value-changed", G_CALLBACK(on_view_scrolled), panel);
- adj = gtk_scrolled_window_get_hadjustment(panel->support);
- g_signal_connect(G_OBJECT(adj), "changed", G_CALLBACK(on_view_scroll_setup), panel);
- g_signal_connect(G_OBJECT(adj), "value-changed", G_CALLBACK(on_view_scrolled), panel);
+ adj = gtk_scrolled_window_get_vadjustment(panel->support);
+ g_signal_connect(G_OBJECT(adj), "changed", G_CALLBACK(on_view_scroll_setup), panel);
+ g_signal_connect(G_OBJECT(adj), "value-changed", G_CALLBACK(on_view_scrolled), panel);
- adj = gtk_scrolled_window_get_vadjustment(panel->support);
- g_signal_connect(G_OBJECT(adj), "changed", G_CALLBACK(on_view_scroll_setup), panel);
- g_signal_connect(G_OBJECT(adj), "value-changed", G_CALLBACK(on_view_scrolled), panel);
+ }
}
@@ -368,7 +374,7 @@ static void on_view_scroll_setup(GtkAdjustment *adj, GGlancePanel *panel)
on_view_scrolled(adj, panel);
- update_glance_panel_for_view_content(panel, panel->view);
+ update_glance_panel_view(panel, panel->view);
}
@@ -426,7 +432,7 @@ static void on_glance_resize(GtkWidget *widget, GdkRectangle *allocation, GGlanc
if (panel->view != NULL)
{
on_view_scroll_setup(NULL, panel);
- update_glance_panel_for_view_content(panel, panel->view);
+ update_glance_panel_view(panel, panel->view);
}
}
@@ -519,7 +525,7 @@ static void compute_glance_scale(GGlancePanel *panel)
* *
******************************************************************************/
-static void update_glance_panel_for_view_content(GGlancePanel *panel, GLoadedPanel *view)
+static void update_glance_panel_view(GGlancePanel *panel, GLoadedPanel *view)
{
cairo_t *cairo; /* Assistant pour le dessin */
GtkAllocation area; /* Dimension de la surface */
diff --git a/src/gui/panels/history.c b/src/gui/panels/history.c
index c43534b..50e72da 100644
--- a/src/gui/panels/history.c
+++ b/src/gui/panels/history.c
@@ -33,7 +33,7 @@
#include "panel-int.h"
-#include "../../analysis/db/collection.h"
+#include "../../analysis/binary.h"
#include "../../glibext/chrysamarshal.h"
#include "../../glibext/signal.h"
#include "../../gtkext/easygtk.h"
@@ -87,7 +87,7 @@ static void g_history_panel_dispose(GHistoryPanel *);
static void g_history_panel_finalize(GHistoryPanel *);
/* Réagit à un changement d'affichage principal de contenu. */
-static void change_history_panel_current_binary(GHistoryPanel *, GLoadedBinary *);
+static void change_history_panel_current_content(GHistoryPanel *, GLoadedContent *, GLoadedContent *);
/* Réagit à une modification au sein d'une collection donnée. */
static void on_history_changed(GDbCollection *, DBAction, GDbItem *, GHistoryPanel *);
@@ -137,7 +137,7 @@ static void g_history_panel_class_init(GHistoryPanelClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->update_binary = (update_item_binary_fc)change_history_panel_current_binary;
+ editem->change_content = (change_item_content_fc)change_history_panel_current_content;
}
@@ -326,8 +326,9 @@ GPanelItem *g_history_panel_new(void)
/******************************************************************************
* *
-* Paramètres : panel = panneau à mettre à jour. *
-* binary = nouvelle instance de binaire analysé. *
+* Paramètres : panel = panneau à mettre à jour. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
* *
* Description : Réagit à un changement d'affichage principal de contenu. *
* *
@@ -337,8 +338,9 @@ GPanelItem *g_history_panel_new(void)
* *
******************************************************************************/
-static void change_history_panel_current_binary(GHistoryPanel *panel, GLoadedBinary *binary)
+static void change_history_panel_current_content(GHistoryPanel *panel, GLoadedContent *old, GLoadedContent *new)
{
+ GLoadedBinary *binary; /* Autre version de l'instance */
GList *collections; /* Ensemble de collections */
GList *c; /* Boucle de parcours #1 */
GDbCollection *collec; /* Collection visée manipulée */
@@ -348,6 +350,11 @@ static void change_history_panel_current_binary(GHistoryPanel *panel, GLoadedBin
GDbItem *item; /* Elément à intégrer */
GtkTreeIter iter; /* Point d'insertion */
+ if (G_IS_LOADED_BINARY(new))
+ binary = G_LOADED_BINARY(new);
+ else
+ binary = NULL;
+
/* Basculement du binaire utilisé */
if (panel->binary != NULL)
diff --git a/src/gui/panels/panel-int.h b/src/gui/panels/panel-int.h
index 3f5213d..4ea9182 100644
--- a/src/gui/panels/panel-int.h
+++ b/src/gui/panels/panel-int.h
@@ -34,6 +34,7 @@
#include "../editem-int.h"
#include "../../common/dllist.h"
+#include "../../glibext/delayed.h"
diff --git a/src/gui/panels/strings.c b/src/gui/panels/strings.c
index dacd14c..6e9324f 100644
--- a/src/gui/panels/strings.c
+++ b/src/gui/panels/strings.c
@@ -41,6 +41,7 @@
#include "../../format/format.h"
#include "../../format/symiter.h"
#include "../../gtkext/easygtk.h"
+#include "../../gtkext/gtkdisplaypanel.h"
#include "../../gtkext/gtkdockable-int.h"
#include "../../gtkext/tmgt.h"
@@ -121,7 +122,7 @@ static gboolean on_key_pressed_over_strings(GtkTreeView *, GdkEventKey *, GStrin
static void on_string_name_edited(GtkCellRendererText *, gchar *, gchar *, GtkTreeModel *);
/* Réagit à un changement d'affichage principal de contenu. */
-static void change_strings_panel_current_binary(GStringsPanel *, GLoadedBinary *);
+static void change_strings_panel_current_content(GStringsPanel *, GLoadedContent *, GLoadedContent *);
@@ -249,7 +250,7 @@ static void g_strings_panel_class_init(GStringsPanelClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->update_binary = (update_item_binary_fc)change_strings_panel_current_binary;
+ editem->change_content = (change_item_content_fc)change_strings_panel_current_content;
panel = G_PANEL_ITEM_CLASS(klass);
@@ -641,8 +642,9 @@ static void on_string_name_edited(GtkCellRendererText *renderer, gchar *path, gc
/******************************************************************************
* *
-* Paramètres : panel = panneau à mettre à jour. *
-* binary = nouvelle instance de binaire analysé. *
+* Paramètres : panel = panneau à mettre à jour. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
* *
* Description : Réagit à un changement d'affichage principal de contenu. *
* *
@@ -652,14 +654,20 @@ static void on_string_name_edited(GtkCellRendererText *renderer, gchar *path, gc
* *
******************************************************************************/
-static void change_strings_panel_current_binary(GStringsPanel *panel, GLoadedBinary *binary)
+static void change_strings_panel_current_content(GStringsPanel *panel, GLoadedContent *old, GLoadedContent *new)
{
+ GLoadedBinary *binary; /* Autre version de l'instance */
GtkBuilder *builder; /* Constructeur utilisé */
GtkListStore *store; /* Modèle de gestion */
GtkTreeView *treeview; /* Affichage de la liste */
GtkTreeViewColumn *column; /* Colonne de la liste */
GArchProcessor *proc; /* Architecture du binaire */
+ if (G_IS_LOADED_BINARY(new))
+ binary = G_LOADED_BINARY(new);
+ else
+ binary = NULL;
+
/* Basculement du binaire utilisé */
if (panel->binary != NULL)
@@ -1266,7 +1274,6 @@ static void mcb_strings_panel_find_refs(GtkMenuItem *menuitem, GStringsPanel *pa
{
GBinSymbol *symbol; /* Symbole sélectionné */
const mrange_t *range; /* Couverture en mémoire */
- GLoadedBinary *binary; /* Représentation binaire */
GArchProcessor *proc; /* Processeur de l'architecture*/
GArchInstruction *instr; /* Point de croisements */
GObject *ref; /* Espace de référencements */
@@ -1279,8 +1286,7 @@ static void mcb_strings_panel_find_refs(GtkMenuItem *menuitem, GStringsPanel *pa
range = g_binary_symbol_get_range(symbol);
- binary = get_current_binary();
- proc = g_loaded_binary_get_processor(binary);
+ proc = g_loaded_binary_get_processor(panel->binary);
/**
* Se rapporter aux commentaires de mcb_edition_list_xrefs() pour les questions
@@ -1290,7 +1296,7 @@ static void mcb_strings_panel_find_refs(GtkMenuItem *menuitem, GStringsPanel *pa
ref = G_OBJECT(get_editor_window());//g_editor_item_get_global_ref(G_EDITOR_ITEM(panel));
- dialog = create_gotox_dialog_for_cross_references(GTK_WINDOW(ref), binary, instr, true);
+ dialog = create_gotox_dialog_for_cross_references(GTK_WINDOW(ref), panel->binary, instr, true);
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
{
@@ -1313,7 +1319,6 @@ static void mcb_strings_panel_find_refs(GtkMenuItem *menuitem, GStringsPanel *pa
g_object_unref(G_OBJECT(instr));
g_object_unref(G_OBJECT(proc));
- g_object_unref(G_OBJECT(binary));
g_object_unref(G_OBJECT(symbol));
diff --git a/src/gui/panels/symbols.c b/src/gui/panels/symbols.c
index 0c88bce..414c4c7 100644
--- a/src/gui/panels/symbols.c
+++ b/src/gui/panels/symbols.c
@@ -45,6 +45,7 @@
#include "../../format/format.h"
#include "../../format/symiter.h"
#include "../../gtkext/easygtk.h"
+#include "../../gtkext/gtkdisplaypanel.h"
#include "../../gtkext/tmgt.h"
@@ -126,7 +127,7 @@ static void on_symbols_tree_display_toggle(GtkToggleToolButton *, GSymbolsPanel
static void on_symbols_selection_change(GtkTreeSelection *, gpointer);
/* Réagit à un changement d'affichage principal de contenu. */
-static void change_symbols_panel_current_binary(GSymbolsPanel *, GLoadedBinary *);
+static void change_symbols_panel_current_content(GSymbolsPanel *, GLoadedContent *, GLoadedContent *);
/* Réagit à un changement d'affichage principal de contenu. */
static void reload_symbols_panel_content(const GSymbolsPanel *, GtkStatusStack *, activity_id_t, symbols_update_data *);
@@ -256,7 +257,7 @@ static void g_symbols_panel_class_init(GSymbolsPanelClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->update_binary = (update_item_binary_fc)change_symbols_panel_current_binary;
+ editem->change_content = (change_item_content_fc)change_symbols_panel_current_content;
panel = G_PANEL_ITEM_CLASS(klass);
@@ -490,6 +491,7 @@ static void on_symbols_list_display_toggle(GtkToggleToolButton *button, GSymbols
{
GtkBuilder *builder; /* Constructeur utilisé */
GtkWidget *other; /* Autre bouton de la barre */
+ GLoadedContent *content; /* Autre version du binaire */
if (gtk_toggle_tool_button_get_active(button))
{
@@ -510,9 +512,12 @@ static void on_symbols_list_display_toggle(GtkToggleToolButton *button, GSymbols
if (panel->binary != NULL)
{
- g_object_ref(G_OBJECT(panel->binary));
- change_symbols_panel_current_binary(panel, panel->binary);
- g_object_unref(G_OBJECT(panel->binary));
+ content = G_LOADED_CONTENT(panel->binary);
+
+ g_object_ref(G_OBJECT(content));
+ change_symbols_panel_current_content(panel, content, content);
+ g_object_unref(G_OBJECT(content));
+
}
}
@@ -537,6 +542,7 @@ static void on_symbols_tree_display_toggle(GtkToggleToolButton *button, GSymbols
{
GtkBuilder *builder; /* Constructeur utilisé */
GtkWidget *other; /* Autre bouton de la barre */
+ GLoadedContent *content; /* Autre version du binaire */
if (gtk_toggle_tool_button_get_active(button))
{
@@ -557,9 +563,12 @@ static void on_symbols_tree_display_toggle(GtkToggleToolButton *button, GSymbols
if (panel->binary != NULL)
{
- g_object_ref(G_OBJECT(panel->binary));
- change_symbols_panel_current_binary(panel, panel->binary);
- g_object_unref(G_OBJECT(panel->binary));
+ content = G_LOADED_CONTENT(panel->binary);
+
+ g_object_ref(G_OBJECT(content));
+ change_symbols_panel_current_content(panel, content, content);
+ g_object_unref(G_OBJECT(content));
+
}
}
@@ -614,8 +623,9 @@ static void on_symbols_selection_change(GtkTreeSelection *selection, gpointer un
/******************************************************************************
* *
-* Paramètres : panel = panneau à mettre à jour. *
-* binary = nouvelle instance de binaire analysé. *
+* Paramètres : panel = panneau à mettre à jour. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
* *
* Description : Réagit à un changement d'affichage principal de contenu. *
* *
@@ -625,11 +635,17 @@ static void on_symbols_selection_change(GtkTreeSelection *selection, gpointer un
* *
******************************************************************************/
-static void change_symbols_panel_current_binary(GSymbolsPanel *panel, GLoadedBinary *binary)
+static void change_symbols_panel_current_content(GSymbolsPanel *panel, GLoadedContent *old, GLoadedContent *new)
{
+ GLoadedBinary *binary; /* Autre version de l'instance */
GtkBuilder *builder; /* Constructeur utilisé */
GtkTreeStore *store; /* Modèle de gestion */
+ if (G_IS_LOADED_BINARY(new))
+ binary = G_LOADED_BINARY(new);
+ else
+ binary = NULL;
+
/* Basculement du binaire utilisé */
if (panel->binary != NULL)
diff --git a/src/gui/status.c b/src/gui/status.c
index bd52310..645028e 100644
--- a/src/gui/status.c
+++ b/src/gui/status.c
@@ -70,10 +70,10 @@ static void g_status_info_dispose(GStatusInfo *);
static void g_status_info_finalize(GStatusInfo *);
/* Imprime la position du parcours courant dans le statut. */
-static void track_caret_address_for_status_info(GStatusInfo *, GtkBufferDisplay *, const vmpa2t *);
+static void track_cursor_for_status_info(GStatusInfo *, GLoadedPanel *, const GLineCursor *);
/* Concentre l'attention de l'ensemble sur une adresse donnée. */
-static void focus_address_in_status_info(GStatusInfo *, GLoadedBinary *, const vmpa2t *);
+static void focus_cursor_in_status_info(GStatusInfo *, GLoadedContent *, const GLineCursor *);
@@ -105,8 +105,8 @@ static void g_status_info_class_init(GStatusInfoClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->track_caret = (track_caret_in_view_fc)track_caret_address_for_status_info;
- editem->focus_addr = (focus_addr_fc)focus_address_in_status_info;
+ editem->track_cursor = (track_cursor_in_view_fc)track_cursor_for_status_info;
+ editem->focus_cursor = (focus_cursor_fc)focus_cursor_in_status_info;
}
@@ -208,9 +208,9 @@ GEditorItem *g_status_info_new(GObject *ref)
/******************************************************************************
* *
-* Paramètres : info = barre de statut présentant les informations. *
-* display = composant d'affichage parcouru. *
-* addr = nouvelle adresse du curseur courant. *
+* Paramètres : info = barre de statut présentant les informations. *
+* panel = composant d'affichage parcouru. *
+* cursor = nouvel emplacement du curseur courant. *
* *
* Description : Imprime la position du parcours courant dans le statut. *
* *
@@ -220,24 +220,24 @@ GEditorItem *g_status_info_new(GObject *ref)
* *
******************************************************************************/
-static void track_caret_address_for_status_info(GStatusInfo *info, GtkBufferDisplay *display, const vmpa2t *addr)
+static void track_cursor_for_status_info(GStatusInfo *info, GLoadedPanel *panel, const GLineCursor *cursor)
{
- GLoadedBinary *binary; /* Binaire courant */
+ GLoadedContent *content; /* Contenu courant */
- binary = get_current_binary();
+ content = g_loaded_panel_get_content(panel);
- focus_address_in_status_info(info, binary, addr);
+ focus_cursor_in_status_info(info, content, cursor);
- g_object_unref(G_OBJECT(binary));
+ g_object_unref(G_OBJECT(content));
}
/******************************************************************************
* *
-* Paramètres : info = composant réactif à mettre à jour. *
-* binary = binaire contenant l'adresse à représenter. *
-* addr = adresse mémoire à mettre en avant. *
+* Paramètres : info = composant réactif à mettre à jour. *
+* content = contenu contenant le curseur à représenter. *
+* cursor = nouvel emplacement du curseur courant. *
* *
* Description : Concentre l'attention de l'ensemble sur une adresse donnée. *
* *
@@ -247,30 +247,12 @@ static void track_caret_address_for_status_info(GStatusInfo *info, GtkBufferDisp
* *
******************************************************************************/
-static void focus_address_in_status_info(GStatusInfo *info, GLoadedBinary *binary, const vmpa2t *addr)
+static void focus_cursor_in_status_info(GStatusInfo *info, GLoadedContent *content, const GLineCursor *cursor)
{
GEditorItem *item; /* Autre version de l'élément */
- GArchProcessor *proc; /* Architecture du binaire */
- GArchInstruction *instr; /* Instruction présente */
item = G_EDITOR_ITEM(info);
- if (is_invalid_vmpa(addr))
- gtk_status_stack_reset_current_instruction(GTK_STATUS_STACK(item->widget));
-
- else
- {
- proc = g_loaded_binary_get_processor(binary);
-
- instr = _g_arch_processor_find_instr_by_address(proc, addr, true);
- assert(instr != NULL);
-
- gtk_status_stack_update_current_instruction(GTK_STATUS_STACK(item->widget), binary, instr);
-
- g_object_unref(G_OBJECT(instr));
-
- g_object_unref(G_OBJECT(proc));
-
- }
+ g_line_cursor_show_status(cursor, GTK_STATUS_STACK(item->widget), content);
}
diff --git a/src/gui/tb/portions.c b/src/gui/tb/portions.c
index f60f83c..202cd43 100644
--- a/src/gui/tb/portions.c
+++ b/src/gui/tb/portions.c
@@ -32,7 +32,9 @@
#include "../core/global.h"
#include "../core/items.h"
#include "../../format/format.h"
+#include "../../glibext/gbinarycursor.h"
#include "../../gtkext/gtkbinarystrip.h"
+#include "../../gtkext/gtkdisplaypanel.h"
@@ -66,7 +68,7 @@ static void g_portions_tbitem_dispose(GPortionsTbItem *);
static void g_portions_tbitem_finalize(GPortionsTbItem *);
/* Réagit à un changement du binaire courant. */
-static void update_portions_item_binary(GEditorItem *, GLoadedBinary *);
+static void change_portions_tbitem_current_content(GEditorItem *, GLoadedContent *, GLoadedContent *);
/* Fait suivre un changement d'adresse dans la barre. */
static void track_address_on_binary_strip(GtkBinaryStrip *, GEditorItem *);
@@ -100,7 +102,7 @@ static void g_portions_tbitem_class_init(GPortionsTbItemClass *klass)
object->dispose = (GObjectFinalizeFunc/* ! */)g_portions_tbitem_dispose;
object->finalize = (GObjectFinalizeFunc)g_portions_tbitem_finalize;
- item->update_binary = update_portions_item_binary;
+ item->change_content = change_portions_tbitem_current_content;
}
@@ -204,8 +206,9 @@ GEditorItem *create_portions_tb_item(GObject *ref)
/******************************************************************************
* *
-* Paramètres : item = élément réactif sollicité. *
-* binary = binaire chargé nouvellement affiché. *
+* Paramètres : item = élément réactif sollicité. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
* *
* Description : Réagit à un changement du binaire courant. *
* *
@@ -215,10 +218,16 @@ GEditorItem *create_portions_tb_item(GObject *ref)
* *
******************************************************************************/
-static void update_portions_item_binary(GEditorItem *item, GLoadedBinary *binary)
+static void change_portions_tbitem_current_content(GEditorItem *item, GLoadedContent *old, GLoadedContent *new)
{
+ GLoadedBinary *binary; /* Autre version de l'instance */
GtkBinaryStrip *strip; /* Bande pour binaire */
+ if (G_IS_LOADED_BINARY(new))
+ binary = G_LOADED_BINARY(new);
+ else
+ binary = NULL;
+
strip = GTK_BINARY_STRIP(g_object_get_data(G_OBJECT(item->widget), "strip"));
gtk_binary_strip_attach(strip, binary);
@@ -244,19 +253,25 @@ static void track_address_on_binary_strip(GtkBinaryStrip *strip, GEditorItem *it
{
const vmpa2t *addr; /* Nouvelle destination */
GLoadedPanel *panel; /* Afficheur effectif de code */
- GLoadedBinary *binary; /* Binaire chargé et actif */
+ GLoadedContent *content; /* Contenu chargé et actif */
+ GLineCursor *cursor; /* Emplacement à afficher */
addr = gtk_binary_strip_get_location(strip);
panel = get_current_view();
- binary = get_current_binary();
+ content = get_current_content();
if (GTK_IS_DISPLAY_PANEL(panel))
gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), addr);
- focus_address_in_editor_items(binary, addr, item);
+ cursor = g_binary_cursor_new();
+ g_binary_cursor_update(G_BINARY_CURSOR(cursor), addr);
+
+ focus_cursor_in_editor_items(content, cursor, item);
+
+ g_object_unref(G_OBJECT(cursor));
- g_object_unref(G_OBJECT(binary));
+ g_object_unref(G_OBJECT(content));
g_object_unref(G_OBJECT(panel));
}