diff options
Diffstat (limited to 'src/gtkext/graph')
-rw-r--r-- | src/gtkext/graph/dot.c | 4 | ||||
-rw-r--r-- | src/gtkext/graph/node.c | 89 |
2 files changed, 73 insertions, 20 deletions
diff --git a/src/gtkext/graph/dot.c b/src/gtkext/graph/dot.c index 0e7091e..64ca2b5 100644 --- a/src/gtkext/graph/dot.c +++ b/src/gtkext/graph/dot.c @@ -2,7 +2,7 @@ /* OpenIDA - Outil d'analyse de fichiers binaires * dot.c - interactions avec le système dot * - * Copyright (C) 2009-2012 Cyrille Bagard + * Copyright (C) 2009-2013 Cyrille Bagard * * This file is part of OpenIDA. * @@ -60,6 +60,8 @@ graph_layout *create_graph_layout(char *cmds) result = (graph_layout *)calloc(1, sizeof(graph_layout)); + agseterr(AGMAX); + result->context = gvContext(); result->graph = agmemread(cmds); diff --git a/src/gtkext/graph/node.c b/src/gtkext/graph/node.c index d9b0eca..879139a 100644 --- a/src/gtkext/graph/node.c +++ b/src/gtkext/graph/node.c @@ -71,6 +71,12 @@ static void g_graph_node_class_init(GGraphNodeClass *); /* Initialise la classe des intermédiaires avec les noeuds dot. */ static void g_graph_node_init(GGraphNode *); +/* Supprime toutes les références externes. */ +static void g_graph_node_dispose(GGraphNode *); + +/* Procède à la libération totale de la mémoire. */ +static void g_graph_node_finalize(GGraphNode *); + /* ---------------------------------------------------------------------------------- */ @@ -96,12 +102,20 @@ G_DEFINE_TYPE(GGraphNode, g_graph_node, G_TYPE_OBJECT); static void g_graph_node_class_init(GGraphNodeClass *klass) { + GObjectClass *object; /* Autre version de la classe */ GdkScreen *screen; /* Ecran par défaut */ gint width; /* Largeur d'écran en pixels */ gint height; /* Hauteur d'écran en pixels */ gint width_mm; /* Largeur d'écran en mm. */ gint height_mm; /* Hauteur d'écran en mm. */ + object = G_OBJECT_CLASS(klass); + + object->dispose = (GObjectFinalizeFunc/* ! */)g_graph_node_dispose; + object->finalize = (GObjectFinalizeFunc)g_graph_node_finalize; + + /* Calcul des résolutions */ + screen = gdk_screen_get_default(); width = gdk_screen_get_width(screen); @@ -158,6 +172,48 @@ static void g_graph_node_init(GGraphNode *node) /****************************************************************************** * * +* Paramètres : node = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_graph_node_dispose(GGraphNode *node) +{ + g_object_unref(G_OBJECT(node->view)); + + G_OBJECT_CLASS(g_graph_node_parent_class)->dispose(G_OBJECT(node)); + +} + + +/****************************************************************************** +* * +* Paramètres : node = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_graph_node_finalize(GGraphNode *node) +{ + free(node->name); + + G_OBJECT_CLASS(g_graph_node_parent_class)->finalize(G_OBJECT(node)); + +} + + +/****************************************************************************** +* * * Paramètres : view = morceau d'affichage à représenter. * * * * Description : Constitue un intermédiaire entre un noeud dot et du code. * @@ -176,6 +232,7 @@ GGraphNode *g_graph_node_new(GtkWidget *view) result = g_object_new(G_TYPE_GRAPH_NODE, NULL); result->view = view; + g_object_ref(G_OBJECT(view)); len = 3 + sizeof(GtkWidget *) * 2 + 1; @@ -305,34 +362,28 @@ void g_graph_node_connect(const GGraphNode *node, gint x, gint y, GdkPoint **poi *points = (GdkPoint *)realloc(*points, ++(*count) * sizeof(GdkPoint)); /* Si le point est sur la gauche... */ - if (alloc->y <= y && y < (alloc->y + alloc->height) && x < alloc->x) - { + if (x < alloc->x) (*points)[*count - 1].x = alloc->x; - (*points)[*count - 1].y = y; - } - /* Si le point est sur la droite... */ - else if (alloc->y <= y && y < (alloc->y + alloc->height) && x > (alloc->x + alloc->width)) - { + /* Ou s'il est sur la droite... */ + else if (x > (alloc->x + alloc->width)) (*points)[*count - 1].x = alloc->x + alloc->width; - (*points)[*count - 1].y = y; - } - /* Si le point est au dessus... */ - else if (alloc->x <= x && x < (alloc->x + alloc->width) && y < alloc->y) - { + /* Ou s'il se trouve déjà bien placé... */ + else (*points)[*count - 1].x = x; + + /* Si le point est au dessus... */ + if (y < alloc->y) (*points)[*count - 1].y = alloc->y; - } - /* Si le point est en dessous... */ - else if (alloc->x <= x && x < (alloc->x + alloc->width) && y > (alloc->y + alloc->height)) - { - (*points)[*count - 1].x = x; + /* Ou s'il est en dessous... */ + else if (y > (alloc->y + alloc->height)) (*points)[*count - 1].y = alloc->y + alloc->height; - } - else (*count)--; + /* Ou s'il se trouve déjà bien placé... */ + else + (*points)[*count - 1].y = y; } |