diff options
Diffstat (limited to 'src')
| -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;  }  | 
