diff options
Diffstat (limited to 'src')
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)); } |