diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-04-03 13:10:42 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-04-03 13:10:42 (GMT) |
commit | 6cfa350c21c1e54cf9c597d92a9ea3d1aab01d78 (patch) | |
tree | f961a21eb14ccdc56d24129ff87012c4647579da /src/gtkext/gtkgraphview.c | |
parent | 3293a5b3b13271ea1499718d310c1bd0284762a3 (diff) |
Tried to show basic blocks in the graphic view again.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@499 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gtkext/gtkgraphview.c')
-rw-r--r-- | src/gtkext/gtkgraphview.c | 188 |
1 files changed, 122 insertions, 66 deletions
diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c index 0265518..1f8d51c 100644 --- a/src/gtkext/gtkgraphview.c +++ b/src/gtkext/gtkgraphview.c @@ -79,15 +79,15 @@ static gboolean gtk_graph_view_draw(GtkWidget *, cairo_t *, GtkGraphView *); /* Indique les dimensions de travail du composant d'affichage. */ static void gtk_graph_view_compute_requested_size(GtkGraphView *, gint *, gint *); - -/* Réagit à la sélection externe d'une adresse. */ -static void gtk_graph_view_define_main_address(GtkGraphView *, vmpa_t); - /* Actualise les besoins internes avant un redimensionnement. */ static void gtk_graph_view_prepare_resize(GtkGraphView *); + +/* Réagit à la sélection externe d'une adresse. */ +static void gtk_graph_view_define_main_address(GtkGraphView *, const vmpa2t *); + /* Indique la position d'affichage d'une adresse donnée. */ -static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *, vmpa_t, gint *, gint *); +static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *, const vmpa2t *addr, gint *x, gint *y, ScrollPositionTweak tweak); /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ static void gtk_graph_view_cache_glance(GtkGraphView *, cairo_t *, const GtkAllocation *, double); @@ -129,6 +129,8 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *class) widget_class->size_allocate = gtk_graph_view_size_allocate; panel_class->compute_size = (compute_requested_size)gtk_graph_view_compute_requested_size; + panel_class->define = (define_address_fc)gtk_graph_view_define_main_address; + panel_class->get_coordinates = (get_addr_coordinates_fc)gtk_graph_view_get_address_coordinates; } @@ -144,7 +146,7 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *class) * Remarques : - * * * ******************************************************************************/ - +#include "easygtk.h"//////////// static void gtk_graph_view_init(GtkGraphView *view) { GtkViewPanel *viewpanel; /* Instance parente #1 */ @@ -153,7 +155,6 @@ static void gtk_graph_view_init(GtkGraphView *view) viewpanel = GTK_VIEW_PANEL(view); - viewpanel->define = (define_address_fc)gtk_graph_view_define_main_address; viewpanel->resize = (prepare_resize_fc)gtk_graph_view_prepare_resize; ////////viewpanel->get_coordinates = (get_addr_coordinates_fc)gtk_graph_view_get_address_coordinates; viewpanel->cache_glance = (cache_glance_fc)gtk_graph_view_cache_glance; @@ -166,6 +167,7 @@ static void gtk_graph_view_init(GtkGraphView *view) view->support = GTK_FIXED(gtk_fixed_new()); gtk_widget_set_has_window(GTK_WIDGET(view->support), TRUE); + gtk_widget_set_can_focus(GTK_WIDGET(view->support), TRUE); g_signal_connect(G_OBJECT(view->support), "draw", G_CALLBACK(gtk_graph_view_draw), view); @@ -179,6 +181,26 @@ static void gtk_graph_view_init(GtkGraphView *view) gtk_fixed_put(GTK_FIXED(view), GTK_WIDGET(view->support), 0, 0); + //gtk_widget_size_allocate(view->support, (GtkAllocation []){ { 200, 200, 500, 500 } }); + +#if 0 + do + { + GtkWidget *btn; + + btn = qck_create_button(NULL, NULL, "caption 0", NULL, NULL); + gtk_fixed_put(GTK_FIXED(view), btn, 10, 10); + + + btn = qck_create_button(NULL, NULL, "caption 1", NULL, NULL); + gtk_fixed_put(GTK_FIXED(view->support), btn, 100, 100); + + + + } + while (0); +#endif + //view->mutex = g_mutex_new(); //view->cond = g_cond_new(); @@ -215,19 +237,32 @@ static void gtk_graph_view_size_allocate(GtkWidget *widget, GtkAllocation *alloc GdkWindow *window; /* Fenêtre associée au support */ gboolean changed; /* Changement de valeur ? */ - return; + + printf("GRAPH SIZE ALLOC :: (%d ; %d) - (%d ; %d)\n", + allocation->x, allocation->y, + allocation->width, allocation->height); + + + GTK_WIDGET_CLASS(gtk_graph_view_parent_class)->size_allocate(widget, allocation); + /* Mise à jour GTK */ + /* fixed_class = g_type_class_peek_parent(GTK_GRAPH_VIEW_GET_CLASS(widget)); fixed_class = g_type_class_peek_parent(fixed_class); GTK_WIDGET_CLASS(fixed_class)->size_allocate(widget, allocation); + */ + + panel = GTK_VIEW_PANEL(widget); + /* if (panel->hadjustment == NULL || panel->vadjustment == NULL) return; + */ // !!!! moved !!! gtk_view_panel_compute_allocation(panel, &valloc); @@ -238,8 +273,24 @@ static void gtk_graph_view_size_allocate(GtkWidget *widget, GtkAllocation *alloc view = GTK_GRAPH_VIEW(widget); window = gtk_widget_get_window(GTK_WIDGET(view->support)); + + + gtk_widget_size_allocate(view->support, (GtkAllocation []){ { 0, 0, 1500, 1500 } }); + + //gdk_window_resize(window, 500, 500); + + /* + printf(" --> cmp :: (%d ; %d) vs (%d ; %d)\n", + gdk_window_get_width(window), gdk_window_get_height(window), + req.width, req.height); + */ + /* if (gdk_window_get_width(window) != req.width || gdk_window_get_height(window) != req.height) gdk_window_resize(window, req.width, req.height); + */ + + return; + /* Défilement horizontal */ @@ -299,7 +350,7 @@ static void gtk_graph_view_compute_requested_size(GtkGraphView *view, gint *widt if (width != NULL && view->layout != NULL) { g_graph_layout_size_request(view->layout, &requisition); - *width = requisition.height; + *width = requisition.width; } if (height != NULL && view->layout != NULL) @@ -340,6 +391,42 @@ static gboolean gtk_graph_view_draw(GtkWidget *widget, cairo_t *cr, GtkGraphView /****************************************************************************** * * * Paramètres : view = composant GTK à mettre à jour. * +* * +* Description : Actualise les besoins internes avant un redimensionnement. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_graph_view_prepare_resize(GtkGraphView *view) +{ + size_t i; /* Boucle de parcours */ + + if (view->children_count > 0) + { + for (i = 0; i < view->children_count; i++) + gtk_widget_queue_resize(GTK_WIDGET(view->children[i])); + + /* + build_graph_view(view, g_binary_routine_get_basic_blocks(view->routine), + view->children, view->children_count); + */ + + g_graph_layout_refresh(view->layout); + g_graph_layout_place(view->layout, view); + + change_editor_items_current_view_content(GTK_VIEW_PANEL(view)); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : view = composant GTK à mettre à jour. * * addr = adresse sélectionnée de manière externe. * * * * Description : Réagit à la sélection externe d'une adresse. * @@ -350,16 +437,24 @@ static gboolean gtk_graph_view_draw(GtkWidget *widget, cairo_t *cr, GtkGraphView * * ******************************************************************************/ -static void gtk_graph_view_define_main_address(GtkGraphView *view, vmpa_t addr) +static void gtk_graph_view_define_main_address(GtkGraphView *view, const vmpa2t *addr) { + bool need_update; /* Mise à jour du contenu ? */ + const mrange_t *range; /* Couverture courante */ GExeFormat *format; /* Type de fichier chargé */ GBinRoutine **routines; /* Liste des routines trouvées */ size_t routines_count; /* Nombre de ces routines */ size_t i; /* Boucle de parcours */ - vmpa_t start; /* Début d'une routine */ - vmpa_t end; /* Fin d'une routine */ - if (!(view->start <= addr && addr < view->end)) + if (view->routine == NULL) + need_update = true; + else + { + range = g_binary_routine_get_range(view->routine); + need_update = !mrange_contains_addr(range, addr); + } + + if (need_update) { gtk_graph_view_reset(view); @@ -368,17 +463,13 @@ static void gtk_graph_view_define_main_address(GtkGraphView *view, vmpa_t addr) for (i = 0; i < routines_count; i++) { - start = g_binary_routine_get_address(routines[i]); - end = start + g_binary_routine_get_size(routines[i]); + range = g_binary_routine_get_range(routines[i]); - if (start <= addr && addr < end) + if (mrange_contains_addr(range, addr)) { view->routine = routines[i]; g_object_ref(G_OBJECT(view->routine)); - view->start = start; - view->end = end; - view->children = gtk_graph_view_load_nodes(view, GTK_VIEW_PANEL(view)->binary, routines[i]); @@ -411,46 +502,11 @@ static void gtk_graph_view_define_main_address(GtkGraphView *view, vmpa_t addr) /****************************************************************************** * * -* Paramètres : view = composant GTK à mettre à jour. * -* * -* Description : Actualise les besoins internes avant un redimensionnement. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void gtk_graph_view_prepare_resize(GtkGraphView *view) -{ - size_t i; /* Boucle de parcours */ - - if (view->children_count > 0) - { - for (i = 0; i < view->children_count; i++) - gtk_widget_queue_resize(GTK_WIDGET(view->children[i])); - - /* - build_graph_view(view, g_binary_routine_get_basic_blocks(view->routine), - view->children, view->children_count); - */ - - g_graph_layout_refresh(view->layout); - g_graph_layout_place(view->layout, view); - - change_editor_items_current_view_content(GTK_VIEW_PANEL(view)); - - } - -} - - -/****************************************************************************** -* * -* Paramètres : view = composant GTK à consulter. * -* addr = adresse à présenter à l'écran. * -* x = position horizontale au sein du composant. [OUT] * -* y = position verticale au sein du composant. [OUT] * +* Paramètres : view = composant GTK à consulter. * +* addr = adresse à présenter à l'écran. * +* x = position horizontale au sein du composant. [OUT] * +* y = position verticale au sein du composant. [OUT] * +* tweak = adaptation finale à effectuer. * * * * Description : Indique la position d'affichage d'une adresse donnée. * * * @@ -460,10 +516,9 @@ static void gtk_graph_view_prepare_resize(GtkGraphView *view) * * ******************************************************************************/ -static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *view, vmpa_t addr, gint *x, gint *y) +static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *view, const vmpa2t *addr, gint *x, gint *y, ScrollPositionTweak tweak) { - - + /* TODO */ return false; @@ -564,7 +619,8 @@ void gtk_graph_view_put(GtkGraphView *view, GtkWidget *widget, const GtkAllocati gtk_container_remove(GTK_CONTAINER(parent), widget); } - gtk_fixed_put(view->support, widget, alloc->x, alloc->y); + //gtk_fixed_put(view->support, widget, alloc->x, alloc->y); + gtk_fixed_put(view->support, widget, i * 200, i * 150); if (parent != NULL) g_object_unref(G_OBJECT(widget)); @@ -665,8 +721,8 @@ static GtkViewPanel **gtk_graph_view_load_nodes(GtkGraphView *view, GLoadedBinar GInstrBlock *main_block; /* Premier bloc rattaché */ GInstrBlock **blocks; /* Liste des blocs basiques */ size_t i; /* Boucle de parcours */ - vmpa_t first; /* Début d'un groupe de lignes */ - vmpa_t last; /* Fin d'un groupe de lignes */ + vmpa2t first; /* Début d'un groupe de lignes */ + vmpa2t last; /* Fin d'un groupe de lignes */ GBufferView *subview; /* Partie affichée du tampon */ buffer = g_loaded_binary_get_disassembled_buffer(binary); @@ -692,7 +748,7 @@ static GtkViewPanel **gtk_graph_view_load_nodes(GtkGraphView *view, GLoadedBinar g_flow_block_get_boundary_addresses(G_FLOW_BLOCK(blocks[i]), &first, &last); subview = g_buffer_view_new(buffer); - g_buffer_view_restrict(subview, first, last); + g_buffer_view_restrict(subview, &first, &last); gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(result[i]), subview); } |