summaryrefslogtreecommitdiff
path: root/src/gtkext/gtkgraphdisplay.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gtkext/gtkgraphdisplay.c')
-rw-r--r--src/gtkext/gtkgraphdisplay.c98
1 files changed, 81 insertions, 17 deletions
diff --git a/src/gtkext/gtkgraphdisplay.c b/src/gtkext/gtkgraphdisplay.c
index c74d203..ce882f9 100644
--- a/src/gtkext/gtkgraphdisplay.c
+++ b/src/gtkext/gtkgraphdisplay.c
@@ -33,6 +33,7 @@
#include "graph/cluster.h"
#include "../analysis/routine.h"
#include "../format/format.h"
+#include "../glibext/gbinarycursor.h"
#include "../glibext/gloadedpanel.h"
#include "../gui/core/items.h"
@@ -125,11 +126,17 @@ static bool gtk_graph_display_get_address_coordinates(const GtkGraphDisplay *, c
/* Déplace le curseur à un emplacement défini. */
static bool gtk_graph_display_move_caret_to(GtkGraphDisplay *, gint, gint);
+/* Fournit le position courante dans un panneau de chargement. */
+static GLineCursor *gtk_graph_display_get_cursor(const GtkGraphDisplay *);
+
+/* Définit le position courante dans un panneau de chargement. */
+static void gtk_graph_display_set_cursor(GtkGraphDisplay *, const GLineCursor *);
+
/* Place en cache un rendu destiné à l'aperçu graphique rapide. */
static void gtk_graph_display_cache_glance(GtkGraphDisplay *, cairo_t *, const GtkAllocation *, double);
/* Supprime tout contenu de l'afficheur de code en graphique. */
-static void gtk_graph_display_reset(GtkGraphDisplay *);
+static void gtk_graph_display_reset(GtkGraphDisplay *, bool);
/* Notifie un changement de surbrillance au sein d'un noeud. */
static void gtk_graph_display_changed_highlights(GtkBlockDisplay *, GtkGraphDisplay *);
@@ -179,6 +186,8 @@ static void gtk_graph_display_class_init(GtkGraphDisplayClass *class)
panel_class->get_caret_loc = (get_caret_location_fc)gtk_graph_display_get_caret_location;
panel_class->get_coordinates = (get_addr_coordinates_fc)gtk_graph_display_get_address_coordinates;
panel_class->move_caret_to = (move_caret_to_fc)gtk_graph_display_move_caret_to;
+ panel_class->get_cursor = (get_cursor_fc)gtk_graph_display_get_cursor;
+ panel_class->set_cursor = (set_cursor_fc)gtk_graph_display_set_cursor;
panel_class->cache_glance = (cache_glance_fc)gtk_graph_display_cache_glance;
}
@@ -225,6 +234,7 @@ static void gtk_graph_display_init(GtkGraphDisplay *display)
gtk_widget_set_margin_top(display->extender, 1);
gtk_widget_show(display->extender);
+ gtk_fixed_put(GTK_FIXED(display->support), display->extender, 0, 0);
}
@@ -243,9 +253,14 @@ static void gtk_graph_display_init(GtkGraphDisplay *display)
static void gtk_graph_display_dispose(GtkGraphDisplay *display)
{
- g_object_unref(G_OBJECT(display->extender));
+ /**
+ * display->support est traité par la version amont du conteneur, propriétaire
+ * du composant GTK.
+ *
+ * Pareil pour display->extender.
+ */
- gtk_graph_display_reset(display);
+ gtk_graph_display_reset(display, true);
G_OBJECT_CLASS(gtk_graph_display_parent_class)->dispose(G_OBJECT(display));
@@ -633,7 +648,7 @@ static void gtk_graph_display_define_main_address(GtkGraphDisplay *display, cons
if (need_update)
{
- gtk_graph_display_reset(display);
+ gtk_graph_display_reset(display, false);
format = g_loaded_binary_get_format(GTK_DISPLAY_PANEL(display)->binary);
@@ -667,8 +682,7 @@ static void gtk_graph_display_define_main_address(GtkGraphDisplay *display, cons
gtk_graph_display_compute_requested_size(display, &right, &bottom);
- g_object_ref(G_OBJECT(display->extender));
- gtk_fixed_put(GTK_FIXED(display->support), display->extender, right - 1, bottom - 1);
+ gtk_fixed_move(GTK_FIXED(display->support), display->extender, right - 1, bottom - 1);
/**
* Si possible, on centre le contenu obtenu.
@@ -793,6 +807,55 @@ static bool gtk_graph_display_move_caret_to(GtkGraphDisplay *display, gint x, gi
/******************************************************************************
* *
+* Paramètres : display = composant GTK à consulter. *
+* *
+* Description : Fournit le position courante dans un panneau de chargement. *
+* *
+* Retour : Informations relatives à la position du curseur. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static GLineCursor *gtk_graph_display_get_cursor(const GtkGraphDisplay *display)
+{
+ GLineCursor *result; /* Contenu à retourner */
+
+ result = NULL;
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : display = composant GTK à mettre à jour. *
+* cursor = informations relatives à la position du curseur. *
+* *
+* Description : Définit le position courante dans un panneau de chargement. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_graph_display_set_cursor(GtkGraphDisplay *display, const GLineCursor *cursor)
+{
+ vmpa2t addr; /* Adresse ciblée */
+
+ assert(G_IS_BINARY_CURSOR(cursor));
+
+ g_binary_cursor_get_info(G_BINARY_CURSOR(cursor), &addr);
+
+ gtk_graph_display_define_main_address(display, &addr);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : display = composant GTK à manipuler. *
* cr = assistant pour la création de rendus. *
* area = taille de la surface réduite à disposition. *
@@ -912,6 +975,7 @@ void gtk_graph_display_add_edge(GtkGraphDisplay *display, GGraphEdge *edge)
/******************************************************************************
* *
* Paramètres : display = instance GTK à réinitialiser. *
+* dispose = indique l'origine de l'appel. *
* *
* Description : Supprime tout contenu de l'afficheur de code en graphique. *
* *
@@ -921,26 +985,23 @@ void gtk_graph_display_add_edge(GtkGraphDisplay *display, GGraphEdge *edge)
* *
******************************************************************************/
-static void gtk_graph_display_reset(GtkGraphDisplay *display)
+static void gtk_graph_display_reset(GtkGraphDisplay *display, bool dispose)
{
size_t i; /* Boucle de parcours */
-
- void detach_all_blocks(GtkWidget *widget, GtkContainer *container)
+ if (!dispose)
{
+ void detach_all_blocks(GtkWidget *widget, GtkContainer *container)
+ {
+ if (widget != display->extender)
+ gtk_container_remove(container, widget);
+ }
-
- gtk_container_remove(container, widget);
-
+ gtk_container_foreach(GTK_CONTAINER(display->support), (GtkCallback)detach_all_blocks, display->support);
}
-
- gtk_container_foreach(GTK_CONTAINER(display->support), (GtkCallback)detach_all_blocks, display->support);
-
-
-
if (display->routine != NULL)
{
g_object_unref(G_OBJECT(display->routine));
@@ -948,7 +1009,10 @@ static void gtk_graph_display_reset(GtkGraphDisplay *display)
}
if (display->highlighted != NULL)
+ {
exit_segment_content_list(display->highlighted);
+ display->highlighted = NULL;
+ }
if (display->cluster != NULL)
{