diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2016-10-09 11:35:00 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2016-10-09 11:35:00 (GMT) |
commit | 3628caa2311ee89ad0d2a0aa2438d7e85b497da4 (patch) | |
tree | bf81ed850cec1a35cdcaeff25a3479182e365c3c /src/gtkext/gtkgraphview.c | |
parent | b6427496bde6f3ab34dc62d6b437c4f8a3a29b2d (diff) |
Defined a new and simpler way to produce graphical view of basic blocks.
Diffstat (limited to 'src/gtkext/gtkgraphview.c')
-rw-r--r-- | src/gtkext/gtkgraphview.c | 206 |
1 files changed, 186 insertions, 20 deletions
diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c index 368792b..6255602 100644 --- a/src/gtkext/gtkgraphview.c +++ b/src/gtkext/gtkgraphview.c @@ -30,7 +30,7 @@ #include "gtkblockview.h" #include "gtkbufferview.h" #include "gtkviewpanel-int.h" -#include "graph/layout.h" +#include "graph/cluster.h" #include "../analysis/blocks/flow.h" #include "../gui/editem.h" @@ -49,7 +49,11 @@ struct _GtkGraphView GtkAllocation *allocs; /* Emplacements prévisibles */ size_t children_count; /* Taille de cette liste */ - GGraphLayout *layout; /* Disposition en graphique */ + //GGraphLayout *layout; /* Disposition en graphique */ + GGraphCluster *cluster; /* Disposition en graphique */ + + GGraphEdge **edges; /* Liens entre les noeuds */ + size_t edges_count; /* Quantité de ces liens */ gdouble start_x; /* Abscisse du point de souris */ gdouble start_y; /* Ordonnée du point de souris */ @@ -74,6 +78,12 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *); /* Initialise une instance d'afficheur de code en graphique. */ static void gtk_graph_view_init(GtkGraphView *); +/* Supprime toutes les références externes. */ +static void gtk_graph_view_dispose(GtkGraphView *); + +/* Procède à la libération totale de la mémoire. */ +static void gtk_graph_view_finalize(GtkGraphView *); + /* Indique les dimensions de travail du composant d'affichage. */ static void gtk_graph_view_compute_requested_size(GtkGraphView *, gint *, gint *); @@ -210,9 +220,66 @@ static void gtk_graph_view_init(GtkGraphView *view) //view->mutex = g_mutex_new(); //view->cond = g_cond_new(); + + + view->cluster = NULL; + + +} + + +/****************************************************************************** +* * +* Paramètres : view = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_graph_view_dispose(GtkGraphView *view) +{ + if (view->cluster != NULL) + { + g_object_unref(G_OBJECT(view->cluster)); + view->cluster = NULL; + } + + G_OBJECT_CLASS(gtk_graph_view_parent_class)->dispose(G_OBJECT(view)); + +} + + +/****************************************************************************** +* * +* Paramètres : view = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_graph_view_finalize(GtkGraphView *view) +{ + G_OBJECT_CLASS(gtk_graph_view_parent_class)->finalize(G_OBJECT(view)); + } + + + + + + + + /****************************************************************************** * * * Paramètres : view = composant GTK à consulter. * @@ -229,30 +296,27 @@ static void gtk_graph_view_init(GtkGraphView *view) static void gtk_graph_view_compute_requested_size(GtkGraphView *view, gint *width, gint *height) { - GtkRequisition requisition; /* Taille requise */ + GtkAllocation needed; /* Taille requise */ + gint rwidth; /* Largeur demandée */ + gint rheight; /* Hauteur demandée */ - if (width != NULL) + if (view->cluster != NULL) { - if (view->layout != NULL) - { - g_graph_layout_size_request(view->layout, &requisition); - *width = requisition.width; - } - else - *width = 0; - } + g_graph_cluster_compute_needed_alloc(view->cluster, &needed); + assert(needed.x == 0 && needed.y == 0); - if (height != NULL) + /* TODO : marges ou centrage */ + + } + else { - if (view->layout != NULL) - { - g_graph_layout_size_request(view->layout, &requisition); - *height = requisition.height; - } - else - *height = 0; + needed.width = 0; + needed.height = 0; } + if (width != NULL) *width = needed.width; + if (height != NULL) *height = needed.height; + } @@ -300,8 +364,16 @@ static void gtk_graph_view_adjust_scroll_value(GtkGraphView *view, GtkAdjustment static gboolean gtk_graph_view_draw(GtkWidget *widget, cairo_t *cr, GtkGraphView *view) { + size_t i; /* Boucle de parcours */ + + for (i = 0; i < view->edges_count; i++) + g_graph_edge_draw(view->edges[i], cr, true); + + + /* if (view->layout != NULL) g_graph_layout_draw(view->layout, cr, true); + */ return FALSE; @@ -458,8 +530,10 @@ static void gtk_graph_view_prepare_resize(GtkGraphView *view) for (i = 0; i < view->children_count; i++) gtk_widget_queue_resize(GTK_WIDGET(view->children[i])); + /* g_graph_layout_refresh(view->layout); g_graph_layout_place(view->layout, view); + */ change_editor_items_current_view_content(GTK_VIEW_PANEL(view)); @@ -518,6 +592,7 @@ static void gtk_graph_view_define_main_address(GtkGraphView *view, const vmpa2t view->highlighted = init_segment_content_list(); + /* view->children = gtk_graph_view_load_nodes(view, GTK_VIEW_PANEL(view)->binary, routines[i]); @@ -528,6 +603,33 @@ static void gtk_graph_view_define_main_address(GtkGraphView *view, const vmpa2t view->children, view->children_count); g_graph_layout_place(view->layout, view); + */ + + do + { + + GBlockList *list; + + list = g_binary_routine_get_basic_blocks(routines[i]); + +#if 0 + view->cluster = g_graph_cluster_new(GTK_VIEW_PANEL(view)->binary, + list, 0/* FIXME */, view->highlighted); +#endif + + + view->cluster = bootstrap_graph_cluster(GTK_VIEW_PANEL(view)->binary, + list, view->highlighted); + + + + g_graph_cluster_place(view->cluster, view); + + + } + while (0); + + break; @@ -668,8 +770,10 @@ static void gtk_graph_view_cache_glance(GtkGraphView *view, cairo_t *cairo, cons cairo_scale(cairo, scale, scale); + /* if (view->layout != NULL) g_graph_layout_draw(view->layout, cairo, false); + */ } @@ -714,6 +818,7 @@ void gtk_graph_view_put(GtkGraphView *view, GtkWidget *widget, const GtkAllocati size_t i; /* Boucle de parcours */ GtkWidget *parent; /* Parent en cas de réajustemt.*/ + /* for (i = 0; i < view->children_count; i++) if (GTK_WIDGET(view->children[i]) == widget) { @@ -728,11 +833,38 @@ void gtk_graph_view_put(GtkGraphView *view, GtkWidget *widget, const GtkAllocati g_object_ref(G_OBJECT(widget)); gtk_container_remove(GTK_CONTAINER(parent), widget); } + */ gtk_fixed_put(GTK_FIXED(view->support), widget, alloc->x, alloc->y); + /* if (parent != NULL) g_object_unref(G_OBJECT(widget)); + */ + +} + + + +/****************************************************************************** +* * +* Paramètres : view = composant GTK à mettre à jour. * +* edge = lien entre noeuds à conserver. * +* * +* Description : Intègre un lien entre blocs graphiques dans l'afficheur. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void gtk_graph_view_add_edge(GtkGraphView *view, GGraphEdge *edge) +{ + view->edges = (GGraphEdge **)realloc(view->edges, + ++view->edges_count * sizeof(GGraphEdge *)); + + view->edges[view->edges_count - 1] = edge; } @@ -753,6 +885,40 @@ static void gtk_graph_view_reset(GtkGraphView *view) { size_t i; /* Boucle de parcours */ + + void detach_all_blocks(GtkWidget *widget, GtkContainer *container) + { + + + + gtk_container_remove(container, widget); + + + } + + + gtk_container_foreach(GTK_CONTAINER(view->support), (GtkCallback)detach_all_blocks, view->support); + + + if (view->cluster != NULL) + { + g_object_unref(G_OBJECT(view->cluster)); + view->cluster = NULL; + } + + for (i = 0; i < view->edges_count; i++) + g_object_unref(G_OBJECT(view->edges[i])); + + if (view->edges_count > 0) + { + free(view->edges); + view->edges = NULL; + + view->edges_count = 0; + + } + + /* for (i = 0; i < view->links_count; i++) gtk_object_destroy(GTK_OBJECT(view->links[i])); |