diff options
Diffstat (limited to 'src/gtkext')
-rw-r--r-- | src/gtkext/gtkblockdisplay.c | 54 | ||||
-rw-r--r-- | src/gtkext/gtkdisplaypanel-int.h | 12 | ||||
-rw-r--r-- | src/gtkext/gtkdisplaypanel.c | 52 | ||||
-rw-r--r-- | src/gtkext/gtkgraphdisplay.c | 98 |
4 files changed, 199 insertions, 17 deletions
diff --git a/src/gtkext/gtkblockdisplay.c b/src/gtkext/gtkblockdisplay.c index 7fde317..48ca2b8 100644 --- a/src/gtkext/gtkblockdisplay.c +++ b/src/gtkext/gtkblockdisplay.c @@ -28,6 +28,7 @@ #include "../arch/instruction.h" #include "../arch/operand.h" #include "../analysis/loaded.h" +#include "../glibext/gbinarycursor.h" @@ -74,6 +75,12 @@ static gboolean gtk_block_display_need_redraw(GtkBlockDisplay *, GBufferView *); /* Prend acte de l'association d'un binaire chargé. */ static void gtk_block_display_attach_binary(GtkBlockDisplay *, GLoadedBinary *); +/* Fournit le position courante dans un panneau de chargement. */ +static GLineCursor *gtk_block_display_get_cursor(const GtkBlockDisplay *); + +/* Définit le position courante dans un panneau de chargement. */ +static void gtk_block_display_set_cursor(GtkBlockDisplay *, const GLineCursor *); + /* Réagit à un déplacement de curseur. */ static bool gtk_block_display_notify_caret_relocation(GtkBlockDisplay *, const GdkRectangle *, const vmpa2t *); @@ -115,6 +122,8 @@ static void gtk_block_display_class_init(GtkBlockDisplayClass *class) panel_class = GTK_DISPLAY_PANEL_CLASS(class); panel_class->attach = (attach_binary_fc)gtk_block_display_attach_binary; + panel_class->get_cursor = (get_cursor_fc)gtk_block_display_get_cursor; + panel_class->set_cursor = (set_cursor_fc)gtk_block_display_set_cursor; buffer_class = GTK_BUFFER_DISPLAY_CLASS(class); @@ -386,6 +395,51 @@ static void gtk_block_display_attach_binary(GtkBlockDisplay *display, GLoadedBin /****************************************************************************** * * +* 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_block_display_get_cursor(const GtkBlockDisplay *display) +{ + GLineCursor *result; /* Contenu à retourner */ + + result = g_binary_cursor_new(); + + g_binary_cursor_update(G_BINARY_CURSOR(result), >K_BUFFER_DISPLAY(display)->caret_addr); + + 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_block_display_set_cursor(GtkBlockDisplay *display, const GLineCursor *cursor) +{ + + +} + + +/****************************************************************************** +* * * Paramètres : display = composant GTK à manipuler. * * area = emplacement pour le dessin d'un curseur. * * addr = position dans la mémoire représentée du curseur. * diff --git a/src/gtkext/gtkdisplaypanel-int.h b/src/gtkext/gtkdisplaypanel-int.h index 72638c0..7a60152 100644 --- a/src/gtkext/gtkdisplaypanel-int.h +++ b/src/gtkext/gtkdisplaypanel-int.h @@ -32,6 +32,9 @@ #include <gtk/gtk.h> +#include "../glibext/glinecursor.h" + + /* Prend acte de l'association d'un binaire chargé. */ typedef void (* attach_binary_fc) (GtkDisplayPanel *, GLoadedBinary *); @@ -63,6 +66,12 @@ typedef bool (* get_view_position_fc) (const GtkDisplayPanel *, GBufferLine **, /* Déplace le curseur à un emplacement défini. */ typedef bool (* move_caret_to_fc) (GtkDisplayPanel *, gint, gint); +/* Fournit le position courante dans un panneau de chargement. */ +typedef GLineCursor * (* get_cursor_fc) (const GtkDisplayPanel *); + +/* Définit le position courante dans un panneau de chargement. */ +typedef void (* set_cursor_fc) (GtkDisplayPanel *, const GLineCursor *); + /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ typedef void (* cache_glance_fc) (GtkDisplayPanel *, cairo_t *, const GtkAllocation *, double); @@ -100,6 +109,9 @@ struct _GtkDisplayPanelClass get_addr_coordinates_fc get_coordinates;/* Conversion adresse <-> pos. */ get_active_object_fc get_active; /* Infos sur l'objet actif */ move_caret_to_fc move_caret_to; /* Déplacement du curseur */ + + get_cursor_fc get_cursor; /* Fourniture d'une position */ + set_cursor_fc set_cursor; /* Application d'une position */ cache_glance_fc cache_glance; /* Cache de la mignature */ /* Signaux */ diff --git a/src/gtkext/gtkdisplaypanel.c b/src/gtkext/gtkdisplaypanel.c index 08c9838..2cb05ea 100644 --- a/src/gtkext/gtkdisplaypanel.c +++ b/src/gtkext/gtkdisplaypanel.c @@ -98,6 +98,12 @@ static void gtk_display_panel_set_content(GtkDisplayPanel *, GLoadedContent *); /* Fournit le contenu associé à un panneau de chargement. */ static GLoadedContent *gtk_display_panel_get_content(const GtkDisplayPanel *); +/* Fournit le position courante dans un panneau de chargement. */ +static GLineCursor *gtk_display_panel_get_cursor(const GtkDisplayPanel *); + +/* Définit le position courante dans un panneau de chargement. */ +static void gtk_display_panel_set_cursor(GtkDisplayPanel *, const GLineCursor *); + /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ static void gtk_display_panel_cache_glance(GtkDisplayPanel *, cairo_t *, const GtkAllocation *, double); @@ -204,6 +210,9 @@ static void gtk_display_panel_loaded_interface_init(GLoadedPanelInterface *iface iface->set_content = (set_loaded_panel_content_fc)gtk_display_panel_set_content; iface->get_content = (get_loaded_panel_content_fc)gtk_display_panel_get_content; + iface->get_cursor = (get_loaded_cursor_fc)gtk_display_panel_get_cursor; + iface->set_cursor = (set_loaded_cursor_fc)gtk_display_panel_set_cursor; + iface->cache_glance = (cache_loaded_glance_fc)gtk_display_panel_cache_glance; } @@ -1155,6 +1164,49 @@ static GLoadedContent *gtk_display_panel_get_content(const GtkDisplayPanel *pane /****************************************************************************** * * +* Paramètres : panel = composant GTK à consulter. * +* * +* Description : Fournit le position courante dans un panneau de chargement. * +* * +* Retour : Informations relatives à la position du curseur. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GLineCursor *gtk_display_panel_get_cursor(const GtkDisplayPanel *panel) +{ + GLineCursor *result; /* Contenu à retourner */ + + result = GTK_DISPLAY_PANEL_GET_CLASS(panel)->get_cursor(panel); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : panel = 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_display_panel_set_cursor(GtkDisplayPanel *panel, const GLineCursor *cursor) +{ + GTK_DISPLAY_PANEL_GET_CLASS(panel)->set_cursor(panel, cursor); + +} + + +/****************************************************************************** +* * * 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/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) { |