summaryrefslogtreecommitdiff
path: root/src/gtkext/gtkgraphview.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gtkext/gtkgraphview.c')
-rw-r--r--src/gtkext/gtkgraphview.c206
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]));