diff options
Diffstat (limited to 'src/gui/panels/logs.c')
-rw-r--r-- | src/gui/panels/logs.c | 370 |
1 files changed, 73 insertions, 297 deletions
diff --git a/src/gui/panels/logs.c b/src/gui/panels/logs.c index d11fbd2..729a62b 100644 --- a/src/gui/panels/logs.c +++ b/src/gui/panels/logs.c @@ -1,8 +1,8 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * log.c - panneau d'affichage des messages système + * logs.c - panneau d'affichage des messages système * - * Copyright (C) 2012-2019 Cyrille Bagard + * Copyright (C) 2012-2025 Cyrille Bagard * * This file is part of Chrysalide. * @@ -22,98 +22,57 @@ */ -#include "log.h" +#include "logs.h" -#include <malloc.h> -#include <stdarg.h> -#include <stdio.h> +#include <assert.h> #include <string.h> -#include <gtk/gtk.h> -#include "../panel-int.h" -#include "../core/panels.h" -#include "../../gtkext/easygtk.h" -#include "../../gtkext/named.h" +#include "logs-int.h" +#include "../../gtkext/helpers.h" -/* Colonnes de la liste des messages */ -typedef enum _LogColumn -{ - LGC_PICTURE, /* Image de représentation */ - LGC_STRING, /* Chaîne de caractères */ - - LGC_COUNT /* Nombre de colonnes */ - -} LogColumn; +/* ------------------------- COEUR D'UN PANNEAU D'AFFICHAGE ------------------------- */ -/* Paramètres à transmettre pour un affichage */ -typedef struct _log_data -{ - GPanelItem *item; /* Intermédiaire mis en place */ - LogMessageType type; /* Type de message à afficher */ - char *msg; /* Contenu du message */ - -} log_data; - - -/* Panneau d'accueil (instance) */ -struct _GLogPanel -{ - GPanelItem parent; /* A laisser en premier */ - -}; +/* Initialise la classe des panneaux d'accueil par défaut. */ +static void gtk_logs_panel_class_init(GtkLogsPanelClass *); - -/* Panneau d'accueil (classe) */ -struct _GLogPanelClass -{ - GPanelItemClass parent; /* A laisser en premier */ - -}; - - -/* Initialise la classe des panneaux d'affichage des messages. */ -static void g_log_panel_class_init(GLogPanelClass *); - -/* Initialise une instance de panneau d'affichage des messages. */ -static void g_log_panel_init(GLogPanel *); +/* Initialise une instance de panneau d'accueil par défaut. */ +static void gtk_logs_panel_init(GtkLogsPanel *); /* Supprime toutes les références externes. */ -static void g_log_panel_dispose(GLogPanel *); +static void gtk_logs_panel_dispose(GObject *); /* Procède à la libération totale de la mémoire. */ -static void g_log_panel_finalize(GLogPanel *); +static void gtk_logs_panel_finalize(GObject *); + + -/* Fournit le nom interne attribué à l'élément réactif. */ -static char *g_log_panel_class_get_key(const GLogPanelClass *); +/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */ -/* Fournit une indication sur la personnalité du panneau. */ -static PanelItemPersonality g_log_panel_class_get_personality(const GLogPanelClass *); -/* Indique le chemin initial de la localisation d'un panneau. */ -static char *g_log_panel_class_get_path(const GLogPanelClass *); +/* Indique l'emplacement par défaut pour un affichage. */ +static char *gtk_logs_panel_get_default_path(const GtkTiledPanel *); -/* Indique la définition d'un éventuel raccourci clavier. */ -static char *g_log_panel_class_get_key_bindings(const GLogPanelClass *); -/* Affiche un message dans le journal des messages système. */ -static gboolean log_message(log_data *); +/* ---------------------------------------------------------------------------------- */ +/* COEUR D'UN PANNEAU D'AFFICHAGE */ +/* ---------------------------------------------------------------------------------- */ -/* Indique le type défini pour un panneau d'affichage de messages. */ -G_DEFINE_TYPE(GLogPanel, g_log_panel, G_TYPE_PANEL_ITEM); +/* Indique le type défini pour un panneau d'accueil. */ +G_DEFINE_TYPE(GtkLogsPanel, gtk_logs_panel, GTK_TYPE_TILED_PANEL); /****************************************************************************** * * * Paramètres : class = classe à initialiser. * * * -* Description : Initialise la classe des panneaux d'affichage des messages. * +* Description : Initialise la classe des panneaux d'accueil par défaut. * * * * Retour : - * * * @@ -121,81 +80,40 @@ G_DEFINE_TYPE(GLogPanel, g_log_panel, G_TYPE_PANEL_ITEM); * * ******************************************************************************/ -static void g_log_panel_class_init(GLogPanelClass *class) +static void gtk_logs_panel_class_init(GtkLogsPanelClass *class) { GObjectClass *object; /* Autre version de la classe */ - GEditorItemClass *item; /* Encore une autre vision... */ - GPanelItemClass *panel; /* Version parente de la classe*/ + GtkWidgetClass *widget; /* Classe de haut niveau */ + GtkTiledPanelClass *panel; /* Classe parente */ object = G_OBJECT_CLASS(class); - object->dispose = (GObjectFinalizeFunc/* ! */)g_log_panel_dispose; - object->finalize = (GObjectFinalizeFunc)g_log_panel_finalize; + object->dispose = gtk_logs_panel_dispose; + object->finalize = gtk_logs_panel_finalize; - item = G_EDITOR_ITEM_CLASS(class); + widget = GTK_WIDGET_CLASS(class); - item->get_key = (get_item_key_fc)g_log_panel_class_get_key; + g_type_ensure(G_TYPE_LOG_ENTRY); - panel = G_PANEL_ITEM_CLASS(class); + gtk_widget_class_set_template_from_resource(widget, "/re/chrysalide/framework/gui/panels/logs.ui"); - panel->get_personality = (get_panel_personality_fc)g_log_panel_class_get_personality; - panel->get_path = (get_panel_path_fc)g_log_panel_class_get_path; - panel->get_bindings = (get_panel_bindings_fc)g_log_panel_class_get_key_bindings; + //gtk_widget_class_bind_template_callback_full(widget, BUILDER_CB(gtk_logs_panel_on_selected_rows_changed)); -} + gtk_widget_class_bind_template_child(widget, GtkLogsPanel, store); + gtk_widget_class_bind_template_child(widget, GtkLogsPanel, list); + panel = GTK_TILED_PANEL_CLASS(class); -/****************************************************************************** -* * -* Paramètres : panel = instance à initialiser. * -* * -* Description : Initialise une instance de panneau d'affichage des messages. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_log_panel_init(GLogPanel *panel) -{ - GPanelItem *pitem; /* Version parente du panneau */ - - /* Eléments de base */ - - pitem = G_PANEL_ITEM(panel); - - pitem->widget = G_NAMED_WIDGET(gtk_built_named_widget_new_for_panel(_("Messages"), - _("Misc information"), - PANEL_LOG_ID)); + panel->get_default_path = gtk_logs_panel_get_default_path; } /****************************************************************************** * * -* Paramètres : panel = instance d'objet GLib à traiter. * -* * -* Description : Supprime toutes les références externes. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_log_panel_dispose(GLogPanel *panel) -{ - G_OBJECT_CLASS(g_log_panel_parent_class)->dispose(G_OBJECT(panel)); - -} - - -/****************************************************************************** -* * -* Paramètres : panel = instance d'objet GLib à traiter. * +* Paramètres : panel = instance à initialiser. * * * -* Description : Procède à la libération totale de la mémoire. * +* Description : Initialise une instance de panneau d'accueil par défaut. * * * * Retour : - * * * @@ -203,124 +121,59 @@ static void g_log_panel_dispose(GLogPanel *panel) * * ******************************************************************************/ -static void g_log_panel_finalize(GLogPanel *panel) -{ - G_OBJECT_CLASS(g_log_panel_parent_class)->finalize(G_OBJECT(panel)); - -} - - -/****************************************************************************** -* * -* Paramètres : class = classe à consulter. * -* * -* Description : Fournit le nom interne attribué à l'élément réactif. * -* * -* Retour : Désignation (courte) de l'élément de l'éditeur. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static char *g_log_panel_class_get_key(const GLogPanelClass *class) +static void gtk_logs_panel_init(GtkLogsPanel *panel) { - char *result; /* Description à renvoyer */ + GtkWidget *headers; /* Composant à cacher */ - result = strdup(PANEL_LOG_ID); + gtk_widget_init_template(GTK_WIDGET(panel)); - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : class = classe à consulter. * -* * -* Description : Fournit une indication sur la personnalité du panneau. * -* * -* Retour : Identifiant lié à la nature unique du panneau. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PanelItemPersonality g_log_panel_class_get_personality(const GLogPanelClass *class) -{ - PanelItemPersonality result; /* Personnalité à retourner */ - - result = PIP_PERSISTENT_SINGLETON; - - return result; + /** + * Retrait des entêtes de colonne de l'affichage. + */ -} + headers = gtk_widget_get_first_child(panel->list); - -/****************************************************************************** -* * -* Paramètres : class = classe à consulter. * -* * -* Description : Indique le chemin initial de la localisation d'un panneau. * -* * -* Retour : Chemin fixé associé à la position initiale. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static char *g_log_panel_class_get_path(const GLogPanelClass *class) -{ - char *result; /* Emplacement à retourner */ - - result = strdup("Ms"); - - return result; + gtk_widget_set_visible(headers, FALSE); } /****************************************************************************** * * -* Paramètres : class = classe à consulter. * +* Paramètres : object = instance d'objet GLib à traiter. * * * -* Description : Indique la définition d'un éventuel raccourci clavier. * +* Description : Supprime toutes les références externes. * * * -* Retour : Description d'un raccourci ou NULL si aucun de défini. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -static char *g_log_panel_class_get_key_bindings(const GLogPanelClass *class) +static void gtk_logs_panel_dispose(GObject *object) { - char *result; /* Emplacement à retourner */ - - result = strdup("<Shift>F1"); + gtk_widget_dispose_template(GTK_WIDGET(object), GTK_TYPE_LOGS_PANEL); - return result; + G_OBJECT_CLASS(gtk_logs_panel_parent_class)->dispose(object); } /****************************************************************************** * * -* Paramètres : - * +* Paramètres : object = instance d'objet GLib à traiter. * * * -* Description : Crée un panneau d'affichage des messages système. * +* Description : Procède à la libération totale de la mémoire. * * * -* Retour : Adresse de la structure mise en place. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -GPanelItem *g_log_panel_new(void) +static void gtk_logs_panel_finalize(GObject *object) { - GPanelItem *result; /* Structure à retourner */ - - result = g_object_new(G_TYPE_LOG_PANEL, NULL); - - return result; + G_OBJECT_CLASS(gtk_logs_panel_parent_class)->finalize(object); } @@ -328,8 +181,7 @@ GPanelItem *g_log_panel_new(void) /****************************************************************************** * * * Paramètres : panel = instance d'objet GLib à traiter. * -* type = espèce du message à ajouter. * -* msg = message à faire apparaître à l'écran. * +* entry = élément de journalisation à intégrer. * * * * Description : Affiche un message dans le journal des messages système. * * * @@ -339,113 +191,37 @@ GPanelItem *g_log_panel_new(void) * * ******************************************************************************/ -void g_log_panel_add_message(GLogPanel *panel, LogMessageType type, const char *msg) +void g_log_panel_add_message(GtkLogsPanel *panel, GLogEntry *entry) { - log_data *data; /* Paramètres à joindre */ - - data = calloc(1, sizeof(log_data)); + g_list_store_append(panel->store, entry); - data->item = G_PANEL_ITEM(panel); - data->type = type; - data->msg = strdup(msg); +} - g_object_ref(G_OBJECT(data->item)); - g_main_context_invoke(NULL, (GSourceFunc)log_message, data); -} +/* ---------------------------------------------------------------------------------- */ +/* IMPLEMENTATION DES FONCTIONS DE CLASSE */ +/* ---------------------------------------------------------------------------------- */ /****************************************************************************** * * -* Paramètres : data = paramètres destinés à l'affichage d'un message. * +* Paramètres : panel = panneau graphique à consulter. * * * -* Description : Affiche un message dans le journal des messages système. * +* Description : Indique l'emplacement par défaut pour un affichage. * * * -* Retour : - * +* Retour : Chemin représenté ou NULL pour l'emplacement "M" par défaut. * * * -* Remarques : Cette fonction, et c'est tout son intérêt, est toujours * -* exécutée dans le contexte GTK principal. * +* Remarques : - * * * ******************************************************************************/ -static gboolean log_message(log_data *data) +static char *gtk_logs_panel_get_default_path(const GtkTiledPanel *panel) { - GtkBuilder *builder; /* Constructeur utilisé */ - GtkListStore *store; /* Modèle de gestion */ - GtkTreeIter iter; /* Point d'insertion */ - GtkTreeView *treeview; /* Affichage de la liste */ - - builder = gtk_built_named_widget_get_builder(GTK_BUILT_NAMED_WIDGET(G_PANEL_ITEM(data->item)->widget)); - - /* Mise en place du message */ - - store = GTK_LIST_STORE(gtk_builder_get_object(builder, "store")); + char *result; /* Chemin à retourner */ - gtk_list_store_append(store, &iter); + result = strdup("S"); - switch (data->type) - { - case LMT_INFO: - gtk_list_store_set(store, &iter, - LGC_PICTURE, "gtk-info", - LGC_STRING, data->msg, - -1); - break; - - case LMT_PROCESS: - gtk_list_store_set(store, &iter, - LGC_PICTURE, "gtk-execute", - LGC_STRING, data->msg, - -1); - break; - - case LMT_WARNING: - gtk_list_store_set(store, &iter, - LGC_PICTURE, "gtk-dialog-warning", - LGC_STRING, data->msg, - -1); - break; - - case LMT_BAD_BINARY: - gtk_list_store_set(store, &iter, - LGC_PICTURE, "gtk-dialog-warning", - LGC_STRING, data->msg, - -1); - break; - - case LMT_ERROR: - case LMT_EXT_ERROR: - gtk_list_store_set(store, &iter, - LGC_PICTURE, "gtk-dialog-error", - LGC_STRING, data->msg, - -1); - break; - - default: - gtk_list_store_set(store, &iter, - LGC_STRING, data->msg, - -1); - break; - - } - - /* Défilement pour pointer à l'affichage */ - - treeview = GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview")); - - scroll_to_treeview_iter(treeview, GTK_TREE_MODEL(store), &iter); - - g_object_unref(G_OBJECT(builder)); - - /* Nettoyage de la mémoire */ - - g_object_unref(G_OBJECT(data->item)); - - free(data->msg); - - free(data); - - return G_SOURCE_REMOVE; + return result; } |