diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2017-08-26 22:15:05 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2017-08-26 22:15:05 (GMT) |
commit | 8ca477e012b11a19363542d171b8e973d637641c (patch) | |
tree | 94a4fcde1779f031946eff7a36075f41a17cd73b /src/gui/core | |
parent | 4fb2ac107092671fe27fc3ebf9fc86dff7c3ec19 (diff) |
Removed most of the functions using the editor items as global access to active items.
Diffstat (limited to 'src/gui/core')
-rwxr-xr-x | src/gui/core/Makefile.am | 1 | ||||
-rw-r--r-- | src/gui/core/global.c | 185 | ||||
-rw-r--r-- | src/gui/core/global.h | 20 | ||||
-rw-r--r-- | src/gui/core/items.c | 374 | ||||
-rw-r--r-- | src/gui/core/items.h | 55 | ||||
-rw-r--r-- | src/gui/core/panels.c | 1 |
6 files changed, 635 insertions, 1 deletions
diff --git a/src/gui/core/Makefile.am b/src/gui/core/Makefile.am index 85aaacf..3f73c6c 100755 --- a/src/gui/core/Makefile.am +++ b/src/gui/core/Makefile.am @@ -4,6 +4,7 @@ noinst_LTLIBRARIES = libguicore.la libguicore_la_SOURCES = \ core.h core.c \ global.h global.c \ + items.h items.c \ panels.h panels.c \ theme.h theme.c diff --git a/src/gui/core/global.c b/src/gui/core/global.c index c030623..1eb8672 100644 --- a/src/gui/core/global.c +++ b/src/gui/core/global.c @@ -28,6 +28,21 @@ /* Barre de statut principale */ static GtkStatusStack *_status = NULL; +/* Binaire en cours d'étude ou NULL */ +static GLoadedBinary *_current_binary = NULL; + +G_LOCK_DEFINE_STATIC(_cb_mutex); + +/* Suivi du panneau d'affichage courant ou NULL */ +static GtkDisplayPanel *_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); + /****************************************************************************** @@ -55,7 +70,7 @@ void set_global_status(GtkStatusStack *status) * * * Description : Fournit l'adresse de la barre de statut principale. * * * -* Retour : barre de statut à tenir informée. * +* Retour : Barre de statut à tenir informée. * * * * Remarques : - * * * @@ -66,3 +81,171 @@ GtkStatusStack *get_global_status(void) return _status; } + + +/****************************************************************************** +* * +* Paramètres : binary = instance de binaire chargé. * +* * +* Description : Définit le binaire actif en cours d'étude. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void set_current_binary(GLoadedBinary *binary) +{ + G_LOCK(_cb_mutex); + + if (_current_binary != NULL) + g_object_unref(G_OBJECT(_current_binary)); + + _current_binary = binary; + + G_UNLOCK(_cb_mutex); + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Fournit le binaire actif en cours d'étude. * +* * +* Retour : Instance courante de binaire étudié ou NULL. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GLoadedBinary *get_current_binary(void) +{ + GLoadedBinary *result; /* Instance à retourner */ + + G_LOCK(_cb_mutex); + + result = _current_binary; + + if (result != NULL) + g_object_ref(G_OBJECT(result)); + + G_UNLOCK(_cb_mutex); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : view = représentation courante de binaire. * +* * +* Description : Définit l'affichage de binaire courant. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void set_current_view(GtkDisplayPanel *view) +{ + G_LOCK(_cv_mutex); + + if (_current_view != NULL) + g_object_unref(G_OBJECT(_current_view)); + + _current_view = view; + + G_UNLOCK(_cv_mutex); + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Fournit l'affichage de binaire courant. * +* * +* Retour : Instance en place ou NULL si aucune. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkDisplayPanel *get_current_view(void) +{ + GtkDisplayPanel *result; /* Instance à retourner */ + + G_LOCK(_cv_mutex); + + result = _current_view; + + if (result != NULL) + g_object_ref(G_OBJECT(result)); + + G_UNLOCK(_cv_mutex); + + 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 2306438..33225e3 100644 --- a/src/gui/core/global.h +++ b/src/gui/core/global.h @@ -25,6 +25,8 @@ #define _GUI_CORE_GLOBAL_H +#include "../../analysis/binary.h" +#include "../../gtkext/gtkdisplaypanel.h" #include "../../gtkext/gtkstatusstack.h" @@ -35,6 +37,24 @@ 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 *); + +/* Fournit le binaire actif en cours d'étude. */ +GLoadedBinary *get_current_binary(void); + +/* Définit l'affichage de binaire courant. */ +void set_current_view(GtkDisplayPanel *); + +/* Fournit l'affichage de binaire courant. */ +GtkDisplayPanel *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 new file mode 100644 index 0000000..923a565 --- /dev/null +++ b/src/gui/core/items.c @@ -0,0 +1,374 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * items.c - manipulation de l'ensemble des composants graphiques actifs + * + * Copyright (C) 2017 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include "items.h" + + +#include "global.h" +#include "../editem-int.h" +#include "../../analysis/db/items/move.h" + + + +/* Liste des éléments enregistrés */ +static GEditorItem *_editem_list = NULL; + + +/* Suit les changements de focus des panneaux d'affichage. */ +static gboolean notify_view_panel_focus_change(GtkDisplayPanel *, GdkEventFocus *, gpointer); + +/* Lance une procédure de déplacement de la position courante. */ +static void start_moving_to_address_in_view_panel(GtkDisplayPanel *, const vmpa2t *, gpointer); + +/* Suit les changements de position dans du code d'assembleur. */ +static void track_caret_address_on_view_panel(GtkDisplayPanel *, const vmpa2t *, gpointer); + + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Procède à l'enregistrement d'un élément reactif de l'éditeur.* +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void register_editor_item(GEditorItem *item) +{ + editem_list_add_tail(item, &_editem_list); + +} + + +/****************************************************************************** +* * +* Paramètres : binary = nouvelle instance de binaire analysé. * +* * +* Description : Lance une actualisation du fait d'un changement de binaire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void change_editor_items_current_binary(GLoadedBinary *binary) +{ + GEditorItem *iter; /* Boucle de parcours */ + GEditorItemClass *klass; /* Classe correspondante */ + + set_current_binary(binary); + + editem_list_for_each(iter, _editem_list) + { + 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 : - * +* * +******************************************************************************/ + +static gboolean notify_view_panel_focus_change(GtkDisplayPanel *panel, GdkEventFocus *event, 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->notify_focus != NULL) + klass->notify_focus(iter, event->in ? panel : NULL); + + } + + return FALSE; + +} + + +/****************************************************************************** +* * +* Paramètres : panel = composant d'affichage parcouru. * +* addr = adresse de destination du curseur souhaitée. * +* unused = adresse non utilisée ici. * +* * +* Description : Lance une procédure de déplacement de la position courante. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void start_moving_to_address_in_view_panel(GtkDisplayPanel *panel, const vmpa2t *addr, gpointer unused) +{ + const vmpa2t *src; /* Position courante de curseur*/ + GDbMove *move; /* Déplacement à organiser */ + GLoadedBinary *binary; /* Binaire en cours d'étude */ + + src = gtk_display_panel_get_caret_location(panel); + + /* S'il n'y a pas de passif, pas besoin d'historique */ + if (src == NULL) + gtk_display_panel_scroll_to_address(panel, addr, SPT_CENTER); + + else + { + move = g_db_move_new(src, addr); + + binary = gtk_display_panel_get_binary(panel); + g_loaded_binary_add_to_collection(binary, G_DB_ITEM(move)); + g_object_unref(G_OBJECT(binary)); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : panel = composant d'affichage parcouru. * +* addr = nouvelle adresse du curseur courant. * +* unused = adresse non utilisée ici. * +* * +* Description : Suit les changements de position dans du code d'assembleur. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void track_caret_address_on_view_panel(GtkDisplayPanel *panel, const vmpa2t *addr, 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); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : panel = nouveau panneau d'affichage actif. * +* * +* Description : Lance une actualisation du fait d'un changement de vue. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void change_editor_items_current_view(GtkDisplayPanel *panel) +{ + GtkDisplayPanel *view; /* Affichage actif */ + GEditorItem *iter; /* Boucle de parcours */ + GEditorItemClass *klass; /* Classe correspondante */ + GObject *caret; /* Support du curseur actif */ + + /* Suivi des affichages */ + + view = get_current_view(); + + if (view != NULL) + { + 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); + + 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); + } + + /* Suivi du curseur */ + + caret = get_caret_instance(); + + if (caret != NULL) + { + g_signal_handlers_disconnect_by_func(caret, + G_CALLBACK(start_moving_to_address_in_view_panel), + NULL); + g_signal_handlers_disconnect_by_func(caret, + G_CALLBACK(track_caret_address_on_view_panel), + NULL); + + set_caret_instance(NULL); + g_object_unref(caret); + + } + + if (panel != NULL) + { + g_signal_connect(panel, "move-request", + G_CALLBACK(start_moving_to_address_in_view_panel), + NULL); + + g_signal_connect(panel, "caret-moved", + G_CALLBACK(track_caret_address_on_view_panel), + NULL); + + caret = G_OBJECT(panel); + + g_object_ref(caret); + set_caret_instance(caret); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : panel = nouveau panneau d'affichage actif. * +* * +* Description : Lance une actualisation du fait d'un changement de contenu. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void change_editor_items_current_view_content(GtkDisplayPanel *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); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : binary = binaire contenant l'adresse à représenter. * +* addr = adresse mémoire à mettre en avant. * +* source = composant à l'origine du changement. * +* * +* Description : Concentre l'attention de l'ensemble sur une adresse donnée. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void focus_address_in_editor_items(GLoadedBinary *binary, const vmpa2t *addr, 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); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : project = projet concerné par l'évolution. * +* * +* Description : Lance une actualisation relative à l'étendue du projet. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void update_project_area(GStudyProject *project) +{ + 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_project != NULL) + klass->update_project(iter, project); + + } + +} diff --git a/src/gui/core/items.h b/src/gui/core/items.h new file mode 100644 index 0000000..fc73b5e --- /dev/null +++ b/src/gui/core/items.h @@ -0,0 +1,55 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * items.h - prototypes pour la manipulation de l'ensemble des composants graphiques actifs + * + * Copyright (C) 2017 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _GUI_CORE_ITEMS_H +#define _GUI_CORE_ITEMS_H + + +#include "../editem.h" +#include "../../analysis/binary.h" +#include "../../analysis/project.h" +#include "../../gtkext/gtkdisplaypanel.h" + + + +/* 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 vue. */ +void change_editor_items_current_view(GtkDisplayPanel *); + +/* Lance une actualisation du fait d'un changement de contenu. */ +void change_editor_items_current_view_content(GtkDisplayPanel *); + +/* Concentre l'attention de l'ensemble sur une adresse donnée. */ +void focus_address_in_editor_items(GLoadedBinary *, const vmpa2t *, GEditorItem *); + +/* Lance une actualisation relative à l'étendue du projet. */ +void update_project_area(GStudyProject *); + + + +#endif /* _GUI_CORE_ITEMS_H */ diff --git a/src/gui/core/panels.c b/src/gui/core/panels.c index 38a2c43..5a1beb1 100644 --- a/src/gui/core/panels.c +++ b/src/gui/core/panels.c @@ -25,6 +25,7 @@ #include "panels.h" +#include "items.h" #include "../panels/bintree.h" #include "../panels/bookmarks.h" #include "../panels/errors.h" |