diff options
Diffstat (limited to 'src/gui/core')
-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 |
4 files changed, 78 insertions, 215 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 *); |