diff options
Diffstat (limited to 'src/gui/core')
-rw-r--r-- | src/gui/core/Makefile.am | 4 | ||||
-rw-r--r-- | src/gui/core/core.c | 19 | ||||
-rw-r--r-- | src/gui/core/core.h | 1 | ||||
-rw-r--r-- | src/gui/core/panels.c | 143 | ||||
-rw-r--r-- | src/gui/core/panels.h | 24 |
5 files changed, 117 insertions, 74 deletions
diff --git a/src/gui/core/Makefile.am b/src/gui/core/Makefile.am index 96ef578..3c4cbc7 100644 --- a/src/gui/core/Makefile.am +++ b/src/gui/core/Makefile.am @@ -15,7 +15,6 @@ RES_FILES = \ libguicore_la_SOURCES = \ global.h global.c \ items.h items.c \ - panels.h panels.c \ resources.h resources.c \ theme.h theme.c @@ -24,7 +23,8 @@ libguicore_la_CFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) libguicore4_la_SOURCES = \ core.h core.c \ - logs.h logs.c + logs.h logs.c \ + panels.h panels.c libguicore4_la_CFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) diff --git a/src/gui/core/core.c b/src/gui/core/core.c index 2d47dc9..d02d54c 100644 --- a/src/gui/core/core.c +++ b/src/gui/core/core.c @@ -24,6 +24,7 @@ #include "core.h" +#include "panels.h" #include "../../glibext/linetoken.h" @@ -59,6 +60,15 @@ bool load_gui_components(AvailableGuiComponent flags) } + if ((flags & AGC_PANELS) != 0 && (__loaded & AGC_PANELS) == 0) + { + result = load_main_panels(); + if (!result) goto done; + + __loaded |= AGC_PANELS; + + } + done: return result; @@ -80,6 +90,14 @@ bool load_gui_components(AvailableGuiComponent flags) void unload_gui_components(AvailableGuiComponent flags) { + if ((flags & AGC_PANELS) != 0 && (__loaded & AGC_PANELS) == 0) + { + unload_all_panels(); + + __loaded &= ~AGC_PANELS; + + } + if ((flags & AGC_BUFFER_FEATURES) != 0 && (__loaded & AGC_BUFFER_FEATURES) == 0) { exit_segment_content_hash_table(); @@ -87,7 +105,6 @@ void unload_gui_components(AvailableGuiComponent flags) __loaded &= ~AGC_BUFFER_FEATURES; } - } diff --git a/src/gui/core/core.h b/src/gui/core/core.h index bcb5433..19647ce 100644 --- a/src/gui/core/core.h +++ b/src/gui/core/core.h @@ -34,6 +34,7 @@ typedef enum _AvailableGuiComponent { AGC_NONE = (0 << 0), /* Statut initial */ AGC_BUFFER_FEATURES = (1 << 0), /* Tampons de bribes de texte */ + AGC_PANELS = (1 << 1), /* Panneaux graphiques de base */ } AvailableGuiComponent; diff --git a/src/gui/core/panels.c b/src/gui/core/panels.c index 1b6f604..69ab2aa 100644 --- a/src/gui/core/panels.c +++ b/src/gui/core/panels.c @@ -1,8 +1,8 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * panels.c - gestion d'ensemble de tous les panneaux pour l'éditeur + * panels.c - gestion d'ensemble de tous les panneaux graphiques du framework * - * Copyright (C) 2016-2019 Cyrille Bagard + * Copyright (C) 2016-2024 Cyrille Bagard * * This file is part of Chrysalide. * @@ -25,28 +25,16 @@ #include "panels.h" -#include <assert.h> #include <malloc.h> -#include "items.h" -#include "../panel-int.h" -#include "../panels/bintree.h" -#include "../panels/bookmarks.h" -#include "../panels/errors.h" -#include "../panels/glance.h" -#include "../panels/history.h" -#include "../panels/log.h" -#include "../panels/regedit.h" -#include "../panels/strings.h" -#include "../panels/symbols.h" +#include "../panels/binary.h" #include "../panels/welcome.h" -#include "../../core/params.h" /* Liste des panneaux disponibles */ -static GType *_panels_list = NULL; +static GPanelItem **_panels_list = NULL; static size_t _panels_count = 0; @@ -55,36 +43,54 @@ static size_t _panels_count = 0; * * * Paramètres : - * * * -* Description : Charge les principaux panneaux de l'éditeur. * +* Description : Charge les principaux panneaux graphiques du framework. * * * -* Retour : - * +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -void load_main_panels(void) +bool load_main_panels(void) { - GGenConfig *config; /* Configuration globale */ - GPanelItem *panel; /* Panneau à précharger */ + bool result; /* Bilan à retourner */ - config = get_main_configuration(); + result = true; - register_panel_item(G_TYPE_LOG_PANEL, config); + // TODO register_panel_item(G_TYPE_LOG_PANEL, config); /* Chargement du panneau de rapport au plus tôt */ - panel = g_panel_item_new(G_TYPE_LOG_PANEL, NULL); - g_object_unref(G_OBJECT(panel)); - - register_panel_item(G_TYPE_WELCOME_PANEL, config); - register_panel_item(G_TYPE_REGEDIT_PANEL, config); - register_panel_item(G_TYPE_SYMBOLS_PANEL, config); - register_panel_item(G_TYPE_HISTORY_PANEL, config); - register_panel_item(G_TYPE_STRINGS_PANEL, config); - register_panel_item(G_TYPE_GLANCE_PANEL, config); - register_panel_item(G_TYPE_BOOKMARKS_PANEL, config); - register_panel_item(G_TYPE_BINTREE_PANEL, config); - register_panel_item(G_TYPE_ERROR_PANEL, config); + // TODO panel = g_panel_item_new(G_TYPE_LOG_PANEL, NULL); + + register_panel_item(g_binary_panel_new()); + register_panel_item(g_welcome_panel_new()); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Décharge tous les panneaux graphiques du framework. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void unload_all_panels(void) +{ + size_t i; /* Boucle de parcours */ + + for (i = 0; i < _panels_count; i++) + unref_object(_panels_list[i]); + + _panels_list = NULL; + _panels_count = 0; } @@ -102,27 +108,49 @@ void load_main_panels(void) * * ******************************************************************************/ -void register_panel_item(GType type, GGenConfig *config) +void register_panel_item(/* __steal */ GPanelItem *item) { - GPanelItemClass *class; /* Classe associée au type */ -#ifndef NDEBUG - bool status; /* Bilan de mise en place */ -#endif + _panels_list = realloc(_panels_list, ++_panels_count * sizeof(GPanelItem *)); - _panels_list = realloc(_panels_list, ++_panels_count * sizeof(GType)); + _panels_list[_panels_count - 1] = item; - _panels_list[_panels_count - 1] = type; +} - class = g_type_class_ref(type); -#ifndef NDEBUG - status = gtk_panel_item_class_setup_configuration(class, config); - assert(status); -#else - gtk_panel_item_class_setup_configuration(class, config); -#endif +/****************************************************************************** +* * +* Paramètres : target = type de définition de panneau recherchée. * +* * +* Description : Retrouve la définition d'un type de panneau. * +* * +* Retour : Instance de définition identifiée ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ - g_type_class_unref(class); +GPanelItem *find_item_panel_by_type(GType target) +{ + GPanelItem *result; /* Instance à renvoyer */ + size_t i; /* Boucle de parcours */ + GPanelItem *item; /* Définition de panneau */ + + result = NULL; + + for (i = 0; i < _panels_count; i++) + { + item = _panels_list[i]; + + if (G_OBJECT_TYPE(item) == target) + { + result = item; + ref_object(result); + break; + } + + } + + return result; } @@ -141,27 +169,22 @@ void register_panel_item(GType type, GGenConfig *config) * * ******************************************************************************/ -bool _browse_all_item_panels(bool skip, handle_panel_item_fc handle, void *data) +bool browse_all_item_panels(bool skip, handle_panel_item_fc handle, void *data) { bool result; /* Résultat à renvoyer */ - GType type; /* Type de panneau à traiter */ size_t i; /* Boucle de parcours */ - GPanelItemClass *class; /* Classe associée au type */ + GPanelItem *item; /* Définition de panneau */ result = true; for (i = 0; i < _panels_count; i++) { - type = _panels_list[i]; + item = _panels_list[i]; - if (skip && type == G_TYPE_WELCOME_PANEL) + if (skip && G_OBJECT_TYPE(item) == G_TYPE_WELCOME_PANEL) continue; - class = g_type_class_ref(type); - - result = handle(class, data); - - g_type_class_unref(class); + result = handle(item, data); if (!result) break; diff --git a/src/gui/core/panels.h b/src/gui/core/panels.h index 3846038..aaea9e6 100644 --- a/src/gui/core/panels.h +++ b/src/gui/core/panels.h @@ -1,8 +1,8 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * panels.h - prototypes pour la gestion d'ensemble de tous les panneaux pour l'éditeur + * panels.h - prototypes pour la gestion d'ensemble de tous les panneaux graphiques du framework * - * Copyright (C) 2016-2019 Cyrille Bagard + * Copyright (C) 2016-2024 Cyrille Bagard * * This file is part of Chrysalide. * @@ -30,24 +30,26 @@ #include "../panel.h" -#include "../../glibext/configuration.h" -/* Charge les principaux panneaux de l'éditeur. */ -void load_main_panels(void); +/* Charge les principaux panneaux graphiques du framework. */ +bool load_main_panels(void); + +/* Décharge tous les panneaux graphiques du framework. */ +void unload_all_panels(void); /* Enregistre un panneau comme partie intégrante de l'éditeur. */ -void register_panel_item(GType, GGenConfig *); +void register_panel_item(/* __steal */ GPanelItem *); + +/* Retrouve la définition d'un type de panneau. */ +GPanelItem *find_item_panel_by_type(GType); /* Réalise un traitement sur un panneau de l'éditeur. */ -typedef bool (* handle_panel_item_fc) (GPanelItemClass *, void *); +typedef bool (* handle_panel_item_fc) (GPanelItem *, void *); /* Effectue le parcours de tous les panneaux chargés. */ -bool _browse_all_item_panels(bool, handle_panel_item_fc, void *); - -#define browse_all_item_panels(h, d) \ - _browse_all_item_panels(false, h, d) +bool browse_all_item_panels(bool, handle_panel_item_fc, void *); |