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/glibext | |
parent | e0d03e3eddb9d240cc21ac1b7a7ade915fd17942 (diff) |
Applied a new GUI update with the new loaded panels features.
Diffstat (limited to 'src/glibext')
-rw-r--r-- | src/glibext/gbinarycursor.c | 60 | ||||
-rw-r--r-- | src/glibext/gbinarycursor.h | 4 | ||||
-rw-r--r-- | src/glibext/glinecursor-int.h | 7 | ||||
-rw-r--r-- | src/glibext/glinecursor.c | 23 | ||||
-rw-r--r-- | src/glibext/glinecursor.h | 11 | ||||
-rw-r--r-- | src/glibext/gloadedpanel-int.h | 7 | ||||
-rw-r--r-- | src/glibext/gloadedpanel.c | 34 | ||||
-rw-r--r-- | src/glibext/gloadedpanel.h | 14 |
8 files changed, 151 insertions, 9 deletions
diff --git a/src/glibext/gbinarycursor.c b/src/glibext/gbinarycursor.c index 0c2a197..ee9eb5f 100644 --- a/src/glibext/gbinarycursor.c +++ b/src/glibext/gbinarycursor.c @@ -24,6 +24,9 @@ #include "gbinarycursor.h" +#include <assert.h> + + #include "glinecursor-int.h" @@ -66,12 +69,15 @@ static GLineCursor *g_binary_cursor_duplicate(const GBinaryCursor *); /* Compare deux suivis d'emplacements. */ static int g_binary_cursor_compare(const GBinaryCursor *, const GBinaryCursor *); -/* Détermine si un suivi d'emplacement est valide ou non. */ +/* Détermine si la position de suivi est pertinente ou non. */ static bool g_binary_cursor_is_valid(const GBinaryCursor *); /* Construit une étiquette de représentation d'un suivi. */ static char *g_binary_cursor_build_label(const GBinaryCursor *); +/* Affiche une position dans une barre de statut. */ +static void g_binary_cursor_show_status(const GBinaryCursor *, GtkStatusStack *, GLoadedContent *); + /* ---------------------- ENCADREMENT DES TRANSFERTS DE DONEES ---------------------- */ @@ -133,6 +139,7 @@ static void g_binary_cursor_class_init(GBinaryCursorClass *class) line->compare = (compare_cursor_fc)g_binary_cursor_compare; line->is_valid = (is_cursor_valid_fc)g_binary_cursor_is_valid; line->build_label = (build_cursor_label_fc)g_binary_cursor_build_label; + line->show_status = (show_cursor_status_fc)g_binary_cursor_show_status; line->serialize = (serialize_cursor_fc)g_binary_cursor_serialize; line->unserialize = (unserialize_cursor_fc)g_binary_cursor_unserialize; @@ -278,7 +285,7 @@ static int g_binary_cursor_compare(const GBinaryCursor *cursor, const GBinaryCur * * * Paramètres : cursor = suivi d'emplacement à consulter. * * * -* Description : Détermine si un suivi d'emplacement est valide ou non. * +* Description : Détermine si la position de suivi est pertinente ou non. * * * * Retour : Bilan de validité. * * * @@ -325,6 +332,51 @@ static char *g_binary_cursor_build_label(const GBinaryCursor *cursor) /****************************************************************************** * * +* Paramètres : cursor = emplacement du curseur à afficher. * +* stack = pile de statuts à mettre à jour. * +* content = contenu contenant le curseur à représenter. * +* * +* Description : Affiche une position dans une barre de statut. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_binary_cursor_show_status(const GBinaryCursor *cursor, GtkStatusStack *stack, GLoadedContent *content) +{ + GLoadedBinary *binary; /* Binaire chargé et analysé */ + GArchProcessor *proc; /* Architecture du binaire */ + GArchInstruction *instr; /* Instruction présente */ + + if (g_binary_cursor_is_valid(cursor)) + { + assert(G_IS_LOADED_BINARY(content)); + + binary = G_LOADED_BINARY(content); + + proc = g_loaded_binary_get_processor(binary); + + instr = _g_arch_processor_find_instr_by_address(proc, &cursor->addr, true); + assert(instr != NULL); + + gtk_status_stack_update_current_instruction(stack, binary, instr); + + g_object_unref(G_OBJECT(instr)); + + g_object_unref(G_OBJECT(proc)); + + } + + else + gtk_status_stack_reset_current_instruction(stack); + +} + + +/****************************************************************************** +* * * Paramètres : cursor = suivi de positions à mettre à jour. * * addr = emplacement dans le binaire visé. * * * @@ -348,7 +400,7 @@ void g_binary_cursor_update(GBinaryCursor *cursor, const vmpa2t *addr) * Paramètres : cursor = suivi de positions à consulter. * * addr = emplacement dans le binaire visé. [OUT] * * * -* Description : Transmet la position suivi dans un panneau de chargement. * +* Description : Transmet la position de suivi dans un panneau de chargement. * * * * Retour : - * * * @@ -356,7 +408,7 @@ void g_binary_cursor_update(GBinaryCursor *cursor, const vmpa2t *addr) * * ******************************************************************************/ -void g_binary_cursor_get_info(GBinaryCursor *cursor, vmpa2t *addr) +void g_binary_cursor_get_info(const GBinaryCursor *cursor, vmpa2t *addr) { copy_vmpa(addr, &cursor->addr); diff --git a/src/glibext/gbinarycursor.h b/src/glibext/gbinarycursor.h index 9846c59..63a6f1b 100644 --- a/src/glibext/gbinarycursor.h +++ b/src/glibext/gbinarycursor.h @@ -60,8 +60,8 @@ GLineCursor *g_binary_cursor_new(void); /* Met à jour la position suivi dans un panneau de chargement. */ void g_binary_cursor_update(GBinaryCursor *, const vmpa2t *); -/* Transmet la position suivi dans un panneau de chargement. */ -void g_binary_cursor_get_info(GBinaryCursor *, vmpa2t *); +/* Transmet la position de suivi dans un panneau de chargement. */ +void g_binary_cursor_get_info(const GBinaryCursor *, vmpa2t *); diff --git a/src/glibext/glinecursor-int.h b/src/glibext/glinecursor-int.h index b38e22e..18ec147 100644 --- a/src/glibext/glinecursor-int.h +++ b/src/glibext/glinecursor-int.h @@ -26,6 +26,7 @@ #include "glinecursor.h" +#include "../gtkext/gtkstatusstack.h" @@ -35,12 +36,15 @@ typedef GLineCursor * (* duplicate_cursor_fc) (const GLineCursor *); /* Compare deux suivis d'emplacements. */ typedef int (* compare_cursor_fc) (const GLineCursor *, const GLineCursor *); -/* Détermine si un suivi d'emplacement est valide ou non. */ +/* Détermine si la position de suivi est pertinente ou non. */ typedef bool (* is_cursor_valid_fc) (const GLineCursor *); /* Construit une étiquette de représentation d'un suivi. */ typedef char * (* build_cursor_label_fc) (const GLineCursor *); +/* Affiche une position dans une barre de statut. */ +typedef void (* show_cursor_status_fc) (const GLineCursor *, GtkStatusStack *, GLoadedContent *); + /* Exporte la définition d'un emplacement dans un flux réseau. */ typedef bool (* serialize_cursor_fc) (const GLineCursor *, packed_buffer *); @@ -76,6 +80,7 @@ struct _GLineCursorClass compare_cursor_fc compare; /* Comparaison d'emplacements */ is_cursor_valid_fc is_valid; /* Certificat de validité */ build_cursor_label_fc build_label; /* Obtention d'une étiquette */ + show_cursor_status_fc show_status; /* Affichage dans une barre */ serialize_cursor_fc serialize; /* Sauvegarde d'un emplacement */ unserialize_cursor_fc unserialize; /* Chargement d'un emplacement */ diff --git a/src/glibext/glinecursor.c b/src/glibext/glinecursor.c index 0245ebd..64521f4 100644 --- a/src/glibext/glinecursor.c +++ b/src/glibext/glinecursor.c @@ -190,7 +190,7 @@ int g_line_cursor_compare(const GLineCursor *cursor, const GLineCursor *other) * * * Paramètres : cursor = suivi d'emplacement à consulter. * * * -* Description : Détermine si un suivi d'emplacement est valide ou non. * +* Description : Détermine si la position de suivi est pertinente ou non. * * * * Retour : Bilan de validité. * * * @@ -232,6 +232,27 @@ char *g_line_cursor_build_label(const GLineCursor *cursor) } +/****************************************************************************** +* * +* Paramètres : cursor = emplacement du curseur à afficher. * +* stack = pile de statuts à mettre à jour. * +* content = contenu contenant le curseur à représenter. * +* * +* Description : Affiche une position dans une barre de statut. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_line_cursor_show_status(const GLineCursor *cursor, GtkStatusStack *stack, GLoadedContent *content) +{ + G_LINE_CURSOR_GET_CLASS(cursor)->show_status(cursor, stack, content); + +} + + /* ---------------------------------------------------------------------------------- */ /* ENCADREMENT DES TRANSFERTS DE DONEES */ diff --git a/src/glibext/glinecursor.h b/src/glibext/glinecursor.h index d9c16c4..1cf8d47 100644 --- a/src/glibext/glinecursor.h +++ b/src/glibext/glinecursor.h @@ -29,11 +29,17 @@ #include <stdbool.h> +#include "../analysis/loaded.h" #include "../common/packed.h" #include "../common/sqlite.h" +/* Depuis ../gtkext/gtkstatusstack.h : abstration d'une gestion de barre de statut (instance) */ +typedef struct _GtkStatusStack GtkStatusStack; + + + /* ----------------------- FONCTIONNALITES D'UN SUIVI DE BASE ----------------------- */ @@ -61,12 +67,15 @@ GLineCursor *g_line_cursor_duplicate(const GLineCursor *); /* Compare deux suivis d'emplacements. */ int g_line_cursor_compare(const GLineCursor *, const GLineCursor *); -/* Détermine si un suivi d'emplacement est valide ou non. */ +/* Détermine si la position de suivi est pertinente ou non. */ bool g_line_cursor_is_valid(const GLineCursor *); /* Construit une étiquette de représentation d'un suivi. */ char *g_line_cursor_build_label(const GLineCursor *); +/* Affiche une position dans une barre de statut. */ +void g_line_cursor_show_status(const GLineCursor *, GtkStatusStack *, GLoadedContent *); + /* ---------------------- ENCADREMENT DES TRANSFERTS DE DONEES ---------------------- */ diff --git a/src/glibext/gloadedpanel-int.h b/src/glibext/gloadedpanel-int.h index dbe9c0c..36a1437 100644 --- a/src/glibext/gloadedpanel-int.h +++ b/src/glibext/gloadedpanel-int.h @@ -41,6 +41,9 @@ typedef GLineCursor * (* get_loaded_cursor_fc) (const GLoadedPanel *); /* Définit le position courante dans un panneau de chargement. */ typedef void (* set_loaded_cursor_fc) (GLoadedPanel *, const GLineCursor *); +/* S'assure qu'un emplacement donné est visible à l'écran. */ +typedef void (* scroll_loaded_to_cursor_fc) (GLoadedPanel *, const GLineCursor *, ScrollPositionTweak, bool); + /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ typedef void (* cache_loaded_glance_fc) (GLoadedPanel *, cairo_t *, const GtkAllocation *, double); @@ -50,17 +53,21 @@ struct _GLoadedPanelIface { GTypeInterface base_iface; /* A laisser en premier */ + /* Méthodes virtuelles */ + set_loaded_panel_content_fc set_content;/* Définition du contenu */ get_loaded_panel_content_fc get_content;/* Récupération du contenu */ get_loaded_cursor_fc get_cursor; /* Fourniture d'une position */ set_loaded_cursor_fc set_cursor; /* Application d'une position */ + scroll_loaded_to_cursor_fc scroll; /* Défilement de la vue */ cache_loaded_glance_fc cache_glance; /* Cache de la mignature */ /* Signaux */ void (* move_request) (GLoadedPanel *, const GLineCursor *, gboolean); + void (* cursor_moved) (GLoadedPanel *, const GLineCursor *); }; diff --git a/src/glibext/gloadedpanel.c b/src/glibext/gloadedpanel.c index 8bf750a..ead34b7 100644 --- a/src/glibext/gloadedpanel.c +++ b/src/glibext/gloadedpanel.c @@ -60,6 +60,14 @@ static void g_loaded_panel_default_init(GLoadedPanelInterface *iface) g_cclosure_user_marshal_VOID__OBJECT_BOOLEAN, G_TYPE_NONE, 2, G_TYPE_LINE_CURSOR, G_TYPE_BOOLEAN); + g_signal_new("cursor-moved", + G_TYPE_LOADED_PANEL, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GLoadedPanelIface, cursor_moved), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_LINE_CURSOR); + } @@ -188,6 +196,32 @@ void g_loaded_panel_request_move(GLoadedPanel *panel, const GLineCursor *cursor, /****************************************************************************** * * +* Paramètres : panel = composant GTK à manipuler. * +* cursor = emplacement à présenter à l'écran. * +* tweak = adaptation finale à effectuer. * +* move = doit-on déplacer le curseur à l'adresse indiquée ? * +* * +* Description : S'assure qu'un emplacement donné est visible à l'écran. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_loaded_panel_scroll_to_cursor(GLoadedPanel *panel, const GLineCursor *cursor, ScrollPositionTweak tweak, bool move) +{ + GLoadedPanelIface *iface; /* Interface utilisée */ + + iface = G_LOADED_PANEL_GET_IFACE(panel); + + iface->scroll(panel, cursor, tweak, move); + +} + + +/****************************************************************************** +* * * Paramètres : panel = composant GTK à manipuler. * * cairo = assistant pour la création de rendus. * * area = taille de la surface réduite à disposition. * diff --git a/src/glibext/gloadedpanel.h b/src/glibext/gloadedpanel.h index ffdb35b..50ea058 100644 --- a/src/glibext/gloadedpanel.h +++ b/src/glibext/gloadedpanel.h @@ -26,6 +26,7 @@ #include <glib-object.h> +#include <stdbool.h> #include <gtk/gtk.h> @@ -67,6 +68,19 @@ void g_loaded_panel_set_cursor(GLoadedPanel *, const GLineCursor *); /* Demande à qui veut répondre un déplacement du curseur. */ void g_loaded_panel_request_move(GLoadedPanel *, const GLineCursor *, gboolean); +/* Adaptation d'une position sur une surface */ +typedef enum _ScrollPositionTweak +{ + SPT_RAW, /* Aucun ajustement */ + SPT_TOP, /* Le plus haut possible */ + SPT_CENTER, /* Au centre de la surface */ + SPT_BOTTOM /* Le plus bas possible */ + +} ScrollPositionTweak; + +/* S'assure qu'un emplacement donné est visible à l'écran. */ +void g_loaded_panel_scroll_to_cursor(GLoadedPanel *, const GLineCursor *, ScrollPositionTweak, bool); + /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ void g_loaded_panel_cache_glance(GLoadedPanel *, cairo_t *, const GtkAllocation *, double); |