summaryrefslogtreecommitdiff
path: root/src/glibext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-07-16 20:11:21 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-07-16 20:11:21 (GMT)
commitf6e56cebfa878dd32a2405fd0c916a40140a1ff0 (patch)
tree3e364d2e2b2de19b85ab6d14f856d4b8db11737a /src/glibext
parente0d03e3eddb9d240cc21ac1b7a7ade915fd17942 (diff)
Applied a new GUI update with the new loaded panels features.
Diffstat (limited to 'src/glibext')
-rw-r--r--src/glibext/gbinarycursor.c60
-rw-r--r--src/glibext/gbinarycursor.h4
-rw-r--r--src/glibext/glinecursor-int.h7
-rw-r--r--src/glibext/glinecursor.c23
-rw-r--r--src/glibext/glinecursor.h11
-rw-r--r--src/glibext/gloadedpanel-int.h7
-rw-r--r--src/glibext/gloadedpanel.c34
-rw-r--r--src/glibext/gloadedpanel.h14
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);