diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2018-07-16 20:11:21 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2018-07-16 20:11:21 (GMT) |
commit | f6e56cebfa878dd32a2405fd0c916a40140a1ff0 (patch) | |
tree | 3e364d2e2b2de19b85ab6d14f856d4b8db11737a /src/gui | |
parent | e0d03e3eddb9d240cc21ac1b7a7ade915fd17942 (diff) |
Applied a new GUI update with the new loaded panels features.
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/core/global.c | 103 | ||||
-rw-r--r-- | src/gui/core/global.h | 22 | ||||
-rw-r--r-- | src/gui/core/items.c | 158 | ||||
-rw-r--r-- | src/gui/core/items.h | 10 | ||||
-rw-r--r-- | src/gui/editem-int.h | 28 | ||||
-rw-r--r-- | src/gui/editem.c | 116 | ||||
-rw-r--r-- | src/gui/editem.h | 29 | ||||
-rw-r--r-- | src/gui/editor.c | 25 | ||||
-rw-r--r-- | src/gui/menus/binary.c | 32 | ||||
-rw-r--r-- | src/gui/menus/binary.h | 6 | ||||
-rw-r--r-- | src/gui/menus/edition.c | 289 | ||||
-rw-r--r-- | src/gui/menus/edition.h | 7 | ||||
-rw-r--r-- | src/gui/menus/menubar.c | 69 | ||||
-rw-r--r-- | src/gui/menus/view.c | 14 | ||||
-rw-r--r-- | src/gui/menus/view.h | 6 | ||||
-rw-r--r-- | src/gui/panels/bintree.c | 18 | ||||
-rw-r--r-- | src/gui/panels/bookmarks.c | 35 | ||||
-rw-r--r-- | src/gui/panels/errors.c | 18 | ||||
-rw-r--r-- | src/gui/panels/glance.c | 50 | ||||
-rw-r--r-- | src/gui/panels/history.c | 19 | ||||
-rw-r--r-- | src/gui/panels/panel-int.h | 1 | ||||
-rw-r--r-- | src/gui/panels/strings.c | 25 | ||||
-rw-r--r-- | src/gui/panels/symbols.c | 38 | ||||
-rw-r--r-- | src/gui/status.c | 52 | ||||
-rw-r--r-- | src/gui/tb/portions.c | 33 |
25 files changed, 669 insertions, 534 deletions
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)); } |