diff options
Diffstat (limited to 'src/gtkext')
-rw-r--r-- | src/gtkext/Makefile.am | 1 | ||||
-rw-r--r-- | src/gtkext/gtkgraphview.c | 65 | ||||
-rw-r--r-- | src/gtkext/gtkgraphview.h | 6 | ||||
-rw-r--r-- | src/gtkext/gtklinkrenderer.c | 309 | ||||
-rw-r--r-- | src/gtkext/gtklinkrenderer.h | 80 | ||||
-rw-r--r-- | src/gtkext/gtkviewpanel.c | 23 | ||||
-rw-r--r-- | src/gtkext/gtkviewpanel.h | 3 |
7 files changed, 23 insertions, 464 deletions
diff --git a/src/gtkext/Makefile.am b/src/gtkext/Makefile.am index c028f6b..6d713d9 100644 --- a/src/gtkext/Makefile.am +++ b/src/gtkext/Makefile.am @@ -10,7 +10,6 @@ libgtkext_la_SOURCES = \ gtkbufferview.h gtkbufferview.c \ gtkdockstation.h gtkdockstation.c \ gtkgraphview.h gtkgraphview.c \ - gtklinkrenderer.h gtklinkrenderer.c \ gtksourceview.h gtksourceview.c \ gtkviewpanel-int.h \ gtkviewpanel.h gtkviewpanel.c \ diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c index 3c117d9..ebff35c 100644 --- a/src/gtkext/gtkgraphview.c +++ b/src/gtkext/gtkgraphview.c @@ -40,7 +40,7 @@ struct _GtkGraphView { GtkViewPanel parent; /* A laisser en premier */ - GtkFixed *support; /* Support des vues en bloc */ + GtkWidget *support; /* Support des vues en bloc */ GBinRoutine *routine; /* Routine en cours d'affichage*/ vmpa_t start; /* Début de la portion vue */ /* FIXME : à garder ? */ @@ -53,9 +53,6 @@ struct _GtkGraphView GGraphLayout *layout; /* Disposition en graphique */ - GtkLinkRenderer **links; /* Liste des liens graphiques */ - size_t links_count; /* Nombre de ces liens */ - }; /* Composant d'affichage sous forme graphique (classe) */ @@ -126,10 +123,8 @@ G_DEFINE_TYPE(GtkGraphView, gtk_graph_view, GTK_TYPE_VIEW_PANEL) static void gtk_graph_view_class_init(GtkGraphViewClass *class) { - GtkWidgetClass *widget_class; /* Classe version Widget */ GtkViewPanelClass *panel_class; /* Classe parente */ - widget_class = GTK_WIDGET_CLASS(class); panel_class = GTK_VIEW_PANEL_CLASS(class); panel_class->compute_size = (compute_requested_size_fc)gtk_graph_view_compute_requested_size; @@ -169,16 +164,16 @@ static void gtk_graph_view_init(GtkGraphView *view) //binview->define_address = (define_main_address_fc)gtk_graph_view_define_main_address; //binview->get_coordinates = (get_addr_coordinates_fc)gtk_graph_view_get_address_coordinates; - 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); + view->support = gtk_fixed_new(); + gtk_widget_set_has_window(view->support, TRUE); + gtk_widget_set_can_focus(view->support, TRUE); g_signal_connect(G_OBJECT(view->support), "draw", G_CALLBACK(gtk_graph_view_draw), view); - gtk_widget_show(GTK_WIDGET(view->support)); + gtk_widget_show(view->support); - gtk_fixed_put(GTK_FIXED(view), GTK_WIDGET(view->support), 0, 0); + gtk_fixed_put(GTK_FIXED(view), view->support, 0, 0); //view->mutex = g_mutex_new(); //view->cond = g_cond_new(); @@ -242,7 +237,7 @@ static void gtk_graph_view_adjust_scroll_value(GtkGraphView *view, GtkAdjustment fake_y = 0; gtk_view_panel_compute_fake_coord(GTK_VIEW_PANEL(view), &fake_x, &fake_y); - gtk_fixed_move(GTK_FIXED(view), GTK_WIDGET(view->support), fake_x, -fake_y); + gtk_fixed_move(GTK_FIXED(view), view->support, fake_x, -fake_y); } @@ -498,7 +493,7 @@ 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(GTK_FIXED(view->support), widget, alloc->x, alloc->y); if (parent != NULL) g_object_unref(G_OBJECT(widget)); @@ -508,28 +503,6 @@ void gtk_graph_view_put(GtkGraphView *view, GtkWidget *widget, const GtkAllocati /****************************************************************************** * * -* Paramètres : view = composant GTK à mettre à jour. * -* links = liens graphiques entre les blocs à intégrer. * -* count = quantité de ces liens graphiques. * -* * -* Description : Définit les liens graphiques à présenter avec la vue. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void gtk_graph_view_attach_links(GtkGraphView *view, GtkLinkRenderer **links, size_t count) -{ - view->links = links; - view->links_count = count; - -} - - -/****************************************************************************** -* * * Paramètres : view = instance GTK à réinitialiser. * * * * Description : Supprime tout contenu de l'afficheur de code en graphique. * @@ -599,7 +572,7 @@ static void gtk_graph_view_reset(GtkGraphView *view) static GtkBufferView **gtk_graph_view_load_nodes(GtkGraphView *view, GLoadedBinary *binary, const GBinRoutine *routine) { - GtkViewPanel **result; /* Liste à retourner */ + GtkBufferView **result; /* Liste à retourner */ GCodeBuffer *buffer; /* Tampon brut à découper */ size_t *count; /* Nombre d'éléments créés. */ GInstrBlock *main_block; /* Premier bloc rattaché */ @@ -619,24 +592,24 @@ static GtkBufferView **gtk_graph_view_load_nodes(GtkGraphView *view, GLoadedBina *count = 0; g_instr_block_list_all_blocks(main_block, &blocks, count); - result = (GtkViewPanel **)calloc(*count, sizeof(GtkViewPanel *)); + result = (GtkBufferView **)calloc(*count, sizeof(GtkBufferView *)); for (i = 0; i < *count; i++) { - result[i] = GTK_VIEW_PANEL(gtk_block_view_new()); + result[i] = GTK_BUFFER_VIEW(gtk_block_view_new()); g_signal_connect(result[i], "reach-limit", G_CALLBACK(gtk_graph_view_reach_caret_limit), view); g_signal_connect(result[i], "highlight-changed", G_CALLBACK(gtk_graph_view_changed_highlights), view); gtk_widget_show(GTK_WIDGET(result[i])); - gtk_view_panel_attach_binary(result[i], binary, BVW_BLOCK); + gtk_view_panel_attach_binary(GTK_VIEW_PANEL(result[i]), binary, BVW_BLOCK); - gtk_view_panel_show_border(result[i], true); + gtk_view_panel_show_border(GTK_VIEW_PANEL(result[i]), true); g_flow_block_get_boundary_addresses(G_FLOW_BLOCK(blocks[i]), &first, &last); subview = g_buffer_view_new(buffer, view->highlighted); g_buffer_view_restrict(subview, &first, &last); - gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(result[i]), subview); + gtk_buffer_view_attach_buffer(result[i], subview); } @@ -664,7 +637,7 @@ static void gtk_graph_view_changed_highlights(GtkBlockView *node, GtkGraphView * for (i = 0; i < view->children_count; i++) { - if (view->children[i] == node) + if (view->children[i] == GTK_BUFFER_VIEW(node)) continue; gtk_widget_queue_draw(GTK_WIDGET(view->children[i])); @@ -763,6 +736,10 @@ static void gtk_graph_view_reach_caret_limit(GtkBufferView *node, GdkScrollDirec break; + case GDK_SCROLL_SMOOTH: + assert(0); /* Argument jamais généré */ + break; + } g_object_unref(G_OBJECT(proc)); @@ -817,6 +794,10 @@ static void gtk_graph_view_reach_caret_limit(GtkBufferView *node, GdkScrollDirec case GDK_SCROLL_DOWN: break; + case GDK_SCROLL_SMOOTH: + assert(0); /* Argument jamais généré */ + break; + } /* TODO : scrolling... */ diff --git a/src/gtkext/gtkgraphview.h b/src/gtkext/gtkgraphview.h index bd0e05c..7f841be 100644 --- a/src/gtkext/gtkgraphview.h +++ b/src/gtkext/gtkgraphview.h @@ -28,9 +28,6 @@ #include <gtk/gtk.h> -#include "gtklinkrenderer.h" - - #define GTK_TYPE_GRAPH_VIEW (gtk_graph_view_get_type()) #define GTK_GRAPH_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_GRAPH_VIEW, GtkGraphView)) @@ -56,9 +53,6 @@ GtkWidget *gtk_graph_view_new(void); /* Place une vue sous forme de bloc dans le graphique. */ void gtk_graph_view_put(GtkGraphView *, GtkWidget *, const GtkAllocation *); -/* Définit les liens graphiques à présenter avec la vue. */ -void gtk_graph_view_attach_links(GtkGraphView *, GtkLinkRenderer **, size_t); - #endif /* _GTKEXT_GTKGRAPHVIEW_H */ diff --git a/src/gtkext/gtklinkrenderer.c b/src/gtkext/gtklinkrenderer.c deleted file mode 100644 index 06472f5..0000000 --- a/src/gtkext/gtklinkrenderer.c +++ /dev/null @@ -1,309 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * gtklinkrenderer.c - liens graphiques entre différents morceaux de code - * - * Copyright (C) 2009-2014 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * OpenIDA is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * OpenIDA is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Foobar. If not, see <http://www.gnu.org/licenses/>. - */ - - -#include "gtklinkrenderer.h" - - -#include <math.h> - - - -/* Lien entre morceaux de code (instance) */ -struct _GtkLinkRenderer -{ - GtkWidget/*Object*/ parent; /* A laisser en premier */ - - LinkColor color; /* Couleur d'impression */ - GdkPoint *points; /* Points de la ligne dessinée */ - size_t count; /* Quantité de ces points */ - -}; - - -/* Lien entre morceaux de code (classe) */ -struct _GtkLinkRendererClass -{ - GtkWidgetClass/*ObjectClass*/ parent; /* A laisser en premier */ - -}; - - -#define ARROW_LENGHT 10 -#define ARROW_DEGREES 10 - - -/* Initialise la classe générique des liens graphiques. */ -static void gtk_link_renderer_class_init(GtkLinkRendererClass *); - -/* Initialise une instance de lien graphique entre codes. */ -static void gtk_link_renderer_init(GtkLinkRenderer *); - -/* Dessine une flèche au bout du lien représenté. */ -static void draw_link_arrow(cairo_t *, gint, gint, gint, gint); - - - -/* Détermine le type du moteur de rendu pour les liens graphiques. */ -G_DEFINE_TYPE(GtkLinkRenderer, gtk_link_renderer, GTK_TYPE_WIDGET/*OBJECT*/) - - -/****************************************************************************** -* * -* Paramètres : class = classe GTK à initialiser. * -* * -* Description : Initialise la classe générique des liens graphiques. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void gtk_link_renderer_class_init(GtkLinkRendererClass *class) -{ - -} - - -/****************************************************************************** -* * -* Paramètres : view = instance GTK à initialiser. * -* * -* Description : Initialise une instance de lien graphique entre codes. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void gtk_link_renderer_init(GtkLinkRenderer *view) -{ - -} - - -/****************************************************************************** -* * -* Paramètres : color = couleur d'impression. * -ù points = points consituant la ligne à représenter. * -* count = nombre de ces points. * -* * -* Description : Crée un nouveau moteur de rendu pour les liens graphiques. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void/*GtkObject*/ *gtk_link_renderer_new(LinkColor color, GdkPoint *points, size_t count) -{ - GtkLinkRenderer *result; /* Moteur de rendu à retourner */ - - result = g_object_new(GTK_TYPE_LINK_RENDERER, NULL); - - result->color = color; - result->points = points; - result->count = count; - - return /*GTK_OBJECT*/(result); - -} - - -/****************************************************************************** -* * -* Paramètres : renderer = moteur de rendu à manipuler. * -* requisition = dimensions adaptées validées. [OUT] * -* * -* Description : S'assure qu'une zone sera assez grande pour tout contenir. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void gtk_link_renderer_size_request(const GtkLinkRenderer *renderer, GtkRequisition *requisition) -{ - size_t i; /* Boucle de parcours */ - - for (i = 0; i < renderer->count; i++) - { - requisition->width = MAX(requisition->width, renderer->points[i].x); - requisition->height = MAX(requisition->height, renderer->points[i].y); - } - -} - -#if 0 -/****************************************************************************** -* * -* Paramètres : renderer = moteur de rendu à manipuler. * -* drawable = surface de rendu à utiliser. * -* gc = contexte graphique du dessin. * -* * -* Description : Dessine les liens graphiques enregistrés dans le moteur. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void gtk_link_renderer_draw(const GtkLinkRenderer *renderer, GdkDrawable *drawable, GdkGC *gc) -{ - cairo_t *cairo; /* Gestionnaire de rendu */ - - cairo = gdk_cairo_create(drawable); - - _gtk_link_renderer_draw(renderer, cairo, true); - - cairo_destroy(cairo); - -} - - -/****************************************************************************** -* * -* Paramètres : renderer = moteur de rendu à manipuler. * -* cairo = assistant pour le rendu graphique. * -* arrow = indique le besoin en flèche à l'arrivée. * -* * -* Description : Dessine les liens graphiques enregistrés dans le moteur. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void _gtk_link_renderer_draw(const GtkLinkRenderer *renderer, cairo_t *cairo, bool arrow) -{ - size_t i; /* Boucle de parcours */ - - switch (renderer->color) - { - default: - case LKC_DEFAULT: - cairo_set_source_rgb(cairo, 0, 0, 0); - break; - case LKC_GREEN: - cairo_set_source_rgb(cairo, 0, 0.6, 0); - break; - case LKC_RED: - cairo_set_source_rgb(cairo, 0.8, 0, 0); - break; - case LKC_BLUE: - cairo_set_source_rgb(cairo, 0, 0, 0.8); - break; - case LKC_DASHED_GRAY: - cairo_set_source_rgb(cairo, 0.4, 0.4, 0.4); - break; - } - - switch (renderer->color) - { - default: - case LKC_DEFAULT: - case LKC_GREEN: - case LKC_RED: - case LKC_BLUE: - cairo_set_dash(cairo, (double []) { 6.0 }, 0, 0.0); - break; - case LKC_DASHED_GRAY: - cairo_set_dash(cairo, (double []) { 6.0 }, 1, 0.0); - break; - } - - /** - * Si on ne veut pas de flèche, on doit se destiner à un aperçu... - * Dans ce cas, pour plus de lisibilité, on double la taille d'impression. - * Et pour faire ressortir les boucles, on double encore les liens associés. - */ - cairo_set_line_width(cairo, arrow ? 1 : (renderer->color == LKC_BLUE ? 4 : 2)); - - cairo_move_to(cairo, renderer->points[0].x + 0.5, renderer->points[0].y); - - for (i = 1; i < renderer->count; i++) - cairo_line_to(cairo, renderer->points[i].x + 0.5, renderer->points[i].y); - - cairo_stroke(cairo); - - if (arrow) - draw_link_arrow(cairo, - renderer->points[renderer->count - 2].x, - renderer->points[renderer->count - 2].y, - renderer->points[renderer->count - 1].x, - renderer->points[renderer->count - 1].y); - -} -#endif - -/****************************************************************************** -* * -* Paramètres : cairo = gestionnaire de rendu graphique. * -* start_x = abscisse du début du segment final. * -* start_y = ordonnée du début du segment final. * -* end_x = abscisse de fin de segment et pointe de flèche. * -* end_y = ordonnée de fin de segment et pointe de flèche. * -* * -* Description : Dessine une flèche au bout du lien représenté. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void draw_link_arrow(cairo_t *cairo, gint start_x, gint start_y, gint end_x, gint end_y) -{ - double angle; /* Angle du triangle à remplir */ - double factor_x; /* Direction de la flèche #1 */ - double factor_y; /* Direction de la flèche #2 */ - double x1; /* Abscisse du point n°1 */ - double y1; /* Ordonnée du point n°1 */ - double x2; /* Abscisse du point n°2 */ - double y2; /* Ordonnée du point n°2 */ - - angle = atan2(end_y - start_y, end_x - start_x) + M_PI; - - factor_x = -1; - factor_y = -1; - - x1 = end_x + factor_x * ARROW_LENGHT * cos(angle - ARROW_DEGREES); - y1 = end_y + factor_y * ARROW_LENGHT * sin(angle - ARROW_DEGREES); - x2 = end_x + factor_x * ARROW_LENGHT * cos(angle + ARROW_DEGREES); - y2 = end_y + factor_y * ARROW_LENGHT * sin(angle + ARROW_DEGREES); - - cairo_move_to(cairo, end_x, end_y); - - cairo_line_to(cairo, x1, y1); - cairo_line_to(cairo, x2, y2); - - cairo_move_to(cairo, end_x, end_y); - - cairo_fill(cairo); - -} diff --git a/src/gtkext/gtklinkrenderer.h b/src/gtkext/gtklinkrenderer.h deleted file mode 100644 index e0b1eab..0000000 --- a/src/gtkext/gtklinkrenderer.h +++ /dev/null @@ -1,80 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * gtklinkrenderer.h - prototypes pour les liens graphiques entre différents morceaux de code - * - * Copyright (C) 2009-2014 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * OpenIDA is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * OpenIDA is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Foobar. If not, see <http://www.gnu.org/licenses/>. - */ - - -#ifndef _GTKEXT_GTKLINKRENDERER_H -#define _GTKEXT_GTKLINKRENDERER_H - - -#include <stdbool.h> -#include <gdk/gdk.h> -#include <gtk/gtk.h> - - - -#define GTK_TYPE_LINK_RENDERER (gtk_link_renderer_get_type()) -#define GTK_LINK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_LINK_RENDERER, GtkLinkRenderer)) -#define GTK_LINK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_LINK_RENDERER, GtkLinkRendererClass)) -#define GTK_IS_LINK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_LINK_RENDERER)) -#define GTK_IS_LINK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_TYPE_LINK_RENDERER)) -#define GTK_LINK_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_LINK_RENDERER, GtkLinkRendererClass)) - - -/* Lien entre morceaux de code (instance) */ -typedef struct _GtkLinkRenderer GtkLinkRenderer; - -/* Lien entre morceaux de code (classe) */ -typedef struct _GtkLinkRendererClass GtkLinkRendererClass; - - -/* Couleur de représentation */ -typedef enum _LinkColor -{ - LKC_DEFAULT, /* Noir, par défaut */ - LKC_GREEN, /* Condition vérifiée */ - LKC_RED, /* Condition non vérifiée */ - LKC_BLUE, /* Boucle détectée */ - LKC_DASHED_GRAY, /* Exception omniprésente */ - - LKC_COUNT - -} LinkColor; - - -/* Détermine le type du moteur de rendu pour les liens graphiques. */ -GType gtk_link_renderer_get_type(void); - -/* Crée un nouveau moteur de rendu pour les liens graphiques. */ -void/*GtkObject*/ *gtk_link_renderer_new(LinkColor, GdkPoint *, size_t); - -/* S'assure qu'une zone sera assez grande pour tout contenir. */ -void gtk_link_renderer_size_request(const GtkLinkRenderer *, GtkRequisition *); -#if 0 -/* Dessine les liens graphiques enregistrés dans le moteur. */ -void gtk_link_renderer_draw(const GtkLinkRenderer *, GdkDrawable *, GdkGC *); - -/* Dessine les liens graphiques enregistrés dans le moteur. */ -void _gtk_link_renderer_draw(const GtkLinkRenderer *, cairo_t *, bool); -#endif - - -#endif /* _GTKEXT_GTKLINKRENDERER_H */ diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c index 03f6daa..4241538 100644 --- a/src/gtkext/gtkviewpanel.c +++ b/src/gtkext/gtkviewpanel.c @@ -797,29 +797,6 @@ GLoadedBinary *gtk_view_panel_get_binary(const GtkViewPanel *panel) /****************************************************************************** * * -* Paramètres : view = composant GTK à manipuler. * -* addr = adresse à rechercher. * -* * -* Description : Indique si la vue contient une addrese donnée. * -* * -* Retour : true si l'adresse est présente, false sinon. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool gtk_view_panel_contain_address(const GtkViewPanel *panel, vmpa_t addr) -{ - gint dummy_x; /* Abscisse pour l'appel */ - gint dummy_y; /* Ordonnée pour l'appel */ - - return GTK_VIEW_PANEL_GET_CLASS(panel)->get_coordinates(panel, addr, &dummy_x, &dummy_y, SPT_RAW); - -} - - -/****************************************************************************** -* * * Paramètres : panel = composant GTK à manipuler. * * addr = adresse à présenter à l'écran. * * tweak = adaptation finale à effectuer. * diff --git a/src/gtkext/gtkviewpanel.h b/src/gtkext/gtkviewpanel.h index 080ad97..038e860 100644 --- a/src/gtkext/gtkviewpanel.h +++ b/src/gtkext/gtkviewpanel.h @@ -68,9 +68,6 @@ void gtk_view_panel_set_code_display(GtkViewPanel *, bool); /* Fournit le binaire associé à la représentation. */ GLoadedBinary *gtk_view_panel_get_binary(const GtkViewPanel *); -/* Indique si la vue contient une addrese donnée. */ -bool gtk_view_panel_contain_address(const GtkViewPanel *, vmpa_t); - /* Adaptation d'une position sur une surface */ typedef enum _ScrollPositionTweak { |