diff options
Diffstat (limited to 'src/gtkext')
-rw-r--r-- | src/gtkext/gtkdockstation.c | 40 | ||||
-rw-r--r-- | src/gtkext/gtkdockstation.h | 3 | ||||
-rw-r--r-- | src/gtkext/gtkgraphview.c | 382 | ||||
-rw-r--r-- | src/gtkext/gtkgraphview.h | 9 | ||||
-rw-r--r-- | src/gtkext/gtkviewpanel.c | 3 |
5 files changed, 310 insertions, 127 deletions
diff --git a/src/gtkext/gtkdockstation.c b/src/gtkext/gtkdockstation.c index 4b837bc..3e33f2b 100644 --- a/src/gtkext/gtkdockstation.c +++ b/src/gtkext/gtkdockstation.c @@ -228,6 +228,46 @@ void gtk_dock_panel_add_widget(GtkDockStation *station, GtkWidget *widget, const } +/****************************************************************************** +* * +* Paramètres : station = plateforme GTK à compléter. * +* widget = nouvel élément à intégrer. * +* * +* Description : Change le contenu de l'onglet courant uniquement. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void gtk_dock_panel_change_active_widget(GtkDockStation *station, GtkWidget *widget) +{ + gint index; /* Indice de l'onglet actif */ + GtkWidget *old; /* Ancien composant */ + GtkWidget *label; /* Etiquette d'onglet */ + + index = gtk_notebook_get_current_page(station->notebook); + + g_signal_handlers_disconnect_by_func(station->notebook, + G_CALLBACK(gtk_dock_station_switch_panel), station); + + old = gtk_notebook_get_nth_page(station->notebook, index); + label = gtk_notebook_get_tab_label(station->notebook, old); + + gtk_widget_ref(old); + gtk_widget_ref(label); + + gtk_notebook_remove_page(station->notebook, index); + gtk_notebook_insert_page(station->notebook, widget, label, index); + + gtk_widget_unref(label); + + g_signal_connect(station->notebook, "switch-page", + G_CALLBACK(gtk_dock_station_switch_panel), station); + +} + /****************************************************************************** * * diff --git a/src/gtkext/gtkdockstation.h b/src/gtkext/gtkdockstation.h index 41adacc..a15667a 100644 --- a/src/gtkext/gtkdockstation.h +++ b/src/gtkext/gtkdockstation.h @@ -75,6 +75,9 @@ GtkWidget *gtk_dock_station_new(void); /* Ajoute un paquet d'informations à l'affichage centralisé. */ void gtk_dock_panel_add_widget(GtkDockStation *, GtkWidget *, const char *); +/* Change le contenu de l'onglet courant uniquement. */ +void gtk_dock_panel_change_active_widget(GtkDockStation *, GtkWidget *); + /* Met à jour, si besoin est, le titre de l'affichage concentré. */ void gtk_dock_panel_update_title(GtkDockStation *, GtkWidget *, const char *); diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c index 6e7b85a..ff020d4 100644 --- a/src/gtkext/gtkgraphview.c +++ b/src/gtkext/gtkgraphview.c @@ -2,7 +2,7 @@ /* OpenIDA - Outil d'analyse de fichiers binaires * gtkgraphview.c - affichage de morceaux de code sous forme graphique * - * Copyright (C) 2009-2010 Cyrille Bagard + * Copyright (C) 2009-2012 Cyrille Bagard * * This file is part of OpenIDA. * @@ -24,47 +24,36 @@ #include "gtkgraphview.h" -#include "gtkbinview-int.h" #include "gtkblockview.h" -#include "../format/format.h" -#include "../graph/layout.h" - - -#include <malloc.h> +#include "gtkviewpanel-int.h" -/* Représentation de code binaire sous forme graphique (instace) */ +/* Composant d'affichage sous forme graphique (instance) */ struct _GtkGraphView { - GtkBinView parent; /* A laisser en premier */ + GtkViewPanel parent; /* A laisser en premier */ GtkFixed *support; /* Support des vues en bloc */ - GtkRequisition requisition; /* Espace requis d'affichage */ - - vmpa_t start; /* Début de la portion vue */ - vmpa_t end; /* Fin de la portion affichée */ + GtkRequisition requisition; /* Espace requis d'affichage */ /* A garder ?? */ - GtkBinView **childs; /* Liste des sous-blocs */ + GtkBlockView **childs; /* Liste des sous-blocs */ size_t childs_count; /* Taille de cette liste */ - size_t ready; /* Construction complète */ - GMutex *mutex; /* Accès à la variable */ - GCond *cond; /* Attente de changement */ - GtkLinkRenderer **links; /* Liste des liens graphiques */ size_t links_count; /* Nombre de ces liens */ }; -/* Représentation de code binaire sous forme graphique (classe) */ +/* Composant d'affichage sous forme graphique (classe) */ struct _GtkGraphViewClass { - GtkBinViewClass parent; /* A laisser en premier */ + GtkViewPanelClass parent; /* A laisser en premier */ }; + /* Initialise la classe générique des graphiques de code. */ static void gtk_graph_view_class_init(GtkGraphViewClass *); @@ -80,30 +69,13 @@ static void gtk_graph_view_size_allocate(GtkWidget *, GtkAllocation *); /* Met à jour l'affichage de la vue sous forme graphique. */ static gboolean gtk_graph_view_expose(GtkWidget *, GdkEventExpose *, GtkGraphView *); -/* Supprime tout contenu de l'afficheur de code en graphique. */ -static void gtk_graph_view_reset(GtkGraphView *); - /* Réagit à un défilement quelconque. */ static void gtk_graph_view_scroll(GtkGraphView *); -/* Définit les lignes du graphique de représentation. */ -static void gtk_graph_view_set_rendering_lines(GtkGraphView *, GRenderingLine *, GRenderingLine *); - -/* Réagit à la sélection externe d'une adresse. */ -static void gtk_graph_view_define_main_address(GtkGraphView *, vmpa_t); - -/* Indique la position d'affichage d'une adresse donnée. */ -static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *, vmpa_t, gint *, gint *); - -/* Définit la liste complète des éléments du futur graphique. */ -static GtkBinView **gtk_graph_view_load_nodes(GtkGraphView *, GOpenidaBinary *, GRenderingLine *, GRenderingLine *); - -/* Prend note de la fin d'une construction d'une visualisation. */ -static void notify_graph_view(GtkBinView *, GtkGraphView *); /* Détermine le type du composant d'affichage en graphique. */ -G_DEFINE_TYPE(GtkGraphView, gtk_graph_view, GTK_TYPE_BIN_VIEW) +G_DEFINE_TYPE(GtkGraphView, gtk_graph_view, GTK_TYPE_VIEW_PANEL) /****************************************************************************** @@ -145,18 +117,18 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *klass) static void gtk_graph_view_init(GtkGraphView *view) { GtkViewPanel *viewpanel; /* Instance parente #1 */ - GtkBinView *binview; /* Instance parente #2 */ + //GtkBinView *binview; /* Instance parente #2 */ GdkColor white; /* Couleur de fond normale */ viewpanel = GTK_VIEW_PANEL(view); viewpanel->scroll = (scroll_fc)gtk_graph_view_scroll; - binview = GTK_BIN_VIEW(view); + //binview = GTK_BIN_VIEW(view); - binview->set_lines = (set_rendering_lines_fc)gtk_graph_view_set_rendering_lines; - 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; + //binview->set_lines = (set_rendering_lines_fc)gtk_graph_view_set_rendering_lines; + //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_fixed_set_has_window(view->support, TRUE); @@ -171,8 +143,8 @@ static void gtk_graph_view_init(GtkGraphView *view) gtk_fixed_put(GTK_FIXED(view), GTK_WIDGET(view->support), 0, 0); - view->mutex = g_mutex_new(); - view->cond = g_cond_new(); + //view->mutex = g_mutex_new(); + //view->cond = g_cond_new(); } @@ -195,8 +167,9 @@ static void gtk_graph_view_size_request(GtkWidget *widget, GtkRequisition *requi GtkGraphView *view; /* Autre vision du composant */ fixed_class = g_type_class_peek_parent(GTK_GRAPH_VIEW_GET_CLASS(widget)); + fixed_class = g_type_class_peek_parent(fixed_class); - GTK_WIDGET_CLASS(fixed_class)->size_request(GTK_FIXED(widget), requisition); + GTK_WIDGET_CLASS(fixed_class)->size_request(widget, requisition); view = GTK_GRAPH_VIEW(widget); @@ -229,8 +202,9 @@ static void gtk_graph_view_size_allocate(GtkWidget *widget, GtkAllocation *alloc /* Mise à jour GTK */ fixed_class = g_type_class_peek_parent(GTK_GRAPH_VIEW_GET_CLASS(widget)); + fixed_class = g_type_class_peek_parent(fixed_class); - GTK_WIDGET_CLASS(fixed_class)->size_allocate(GTK_FIXED(widget), allocation); + GTK_WIDGET_CLASS(fixed_class)->size_allocate(widget, allocation); panel = GTK_VIEW_PANEL(widget); @@ -274,6 +248,55 @@ static void gtk_graph_view_size_allocate(GtkWidget *widget, GtkAllocation *alloc /****************************************************************************** * * +* Paramètres : widget = composant GTK à redessiner. * +* event = informations liées à l'événement. * +* view = support maître à consulter. * +* * +* Description : Met à jour l'affichage de la vue sous forme graphique. * +* * +* Retour : FALSE pour poursuivre la propagation de l'événement. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static gboolean gtk_graph_view_expose(GtkWidget *widget, GdkEventExpose *event, GtkGraphView *view) +{ + size_t i; /* Boucle de parcours */ + + for (i = 0; i < view->links_count; i++) + gtk_link_renderer_draw(view->links[i], + GDK_DRAWABLE(widget->window), + GTK_VIEW_PANEL(view)->gc); + + return FALSE; + +} + + +/****************************************************************************** +* * +* Paramètres : view = composant GTK à mettre à jour. * +* * +* Description : Réagit à un défilement quelconque. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_graph_view_scroll(GtkGraphView *view) +{ + gtk_fixed_move(GTK_FIXED(view), GTK_WIDGET(view->support), + -GTK_VIEW_PANEL(view)->hadjustment->value, + -GTK_VIEW_PANEL(view)->vadjustment->value); + +} + + +/****************************************************************************** +* * * Paramètres : - * * * * Description : Crée un nouveau composant pour l'affichage en graphique. * @@ -284,7 +307,7 @@ static void gtk_graph_view_size_allocate(GtkWidget *widget, GtkAllocation *alloc * * ******************************************************************************/ -GtkWidget* gtk_graph_view_new(void) +GtkWidget *gtk_graph_view_new(void) { return g_object_new(GTK_TYPE_GRAPH_VIEW, NULL); @@ -296,34 +319,211 @@ GtkWidget* gtk_graph_view_new(void) + /****************************************************************************** * * -* Paramètres : widget = composant GTK à redessiner. * -* event = informations liées à l'événement. * -* view = support maître à consulter. * +* Paramètres : view = composant GTK à mettre à jour. * +* widget = composant GTK à insérer. * +* x = abscisse du point d'insertion. * +* y = ordonnée du point d'insertion. * * * -* Description : Met à jour l'affichage de la vue sous forme graphique. * +* Description : Place une vue sous forme de bloc dans le graphique. * * * -* Retour : FALSE pour poursuivre la propagation de l'événement. * +* Retour : Plutôt que de redéfinir *toutes* les méthodes de * +* GtkContainer, on étend ! * * * * Remarques : - * * * ******************************************************************************/ -static gboolean gtk_graph_view_expose(GtkWidget *widget, GdkEventExpose *event, GtkGraphView *view) +void gtk_graph_view_put(GtkGraphView *view, GtkWidget *widget, gint x, gint y) { - size_t i; /* Boucle de parcours */ + gtk_fixed_put(view->support, widget, x, y); - for (i = 0; i < view->links_count; i++) - gtk_link_renderer_draw(view->links[i], - GDK_DRAWABLE(widget->window), - GTK_VIEW_PANEL(view)->gc); +} - return FALSE; + +/****************************************************************************** +* * +* 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; } + + + + + + + + + + +#if 0 + +#include "gtkbinview-int.h" +#include "gtkblockview.h" +#include "../format/format.h" +#include "../graph/layout.h" + + +#include <malloc.h> + + + +/* Représentation de code binaire sous forme graphique (instace) */ +struct _GtkGraphView +{ + GtkBinView parent; /* A laisser en premier */ + GtkFixed *support; /* Support des vues en bloc */ + + GtkRequisition requisition; /* Espace requis d'affichage */ + + vmpa_t start; /* Début de la portion vue */ + vmpa_t end; /* Fin de la portion affichée */ + + GtkBinView **childs; /* Liste des sous-blocs */ + size_t childs_count; /* Taille de cette liste */ + + size_t ready; /* Construction complète */ + GMutex *mutex; /* Accès à la variable */ + GCond *cond; /* Attente de changement */ + + GtkLinkRenderer **links; /* Liste des liens graphiques */ + size_t links_count; /* Nombre de ces liens */ + +}; + +/* Représentation de code binaire sous forme graphique (classe) */ +struct _GtkGraphViewClass +{ + GtkBinViewClass parent; /* A laisser en premier */ + +}; + + +/* Initialise la classe générique des graphiques de code. */ +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 tout contenu de l'afficheur de code en graphique. */ +static void gtk_graph_view_reset(GtkGraphView *); + +/* Définit les lignes du graphique de représentation. */ +static void gtk_graph_view_set_rendering_lines(GtkGraphView *, GRenderingLine *, GRenderingLine *); + +/* Réagit à la sélection externe d'une adresse. */ +static void gtk_graph_view_define_main_address(GtkGraphView *, vmpa_t); + +/* Indique la position d'affichage d'une adresse donnée. */ +static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *, vmpa_t, gint *, gint *); + +/* Définit la liste complète des éléments du futur graphique. */ +static GtkBinView **gtk_graph_view_load_nodes(GtkGraphView *, GOpenidaBinary *, GRenderingLine *, GRenderingLine *); + +/* Prend note de la fin d'une construction d'une visualisation. */ +static void notify_graph_view(GtkBinView *, GtkGraphView *); + + +/* Détermine le type du composant d'affichage en graphique. */ +G_DEFINE_TYPE(GtkGraphView, gtk_graph_view, GTK_TYPE_BIN_VIEW) + + +/****************************************************************************** +* * +* Paramètres : klass = classe GTK à initialiser. * +* * +* Description : Initialise la classe générique des graphiques de code. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_graph_view_class_init(GtkGraphViewClass *klass) +{ + GtkWidgetClass *widget_class; /* Classe version Widget */ + + widget_class = (GtkWidgetClass *)klass; + + widget_class->size_request = gtk_graph_view_size_request; + widget_class->size_allocate = gtk_graph_view_size_allocate; + +} + + +/****************************************************************************** +* * +* Paramètres : view = instance GTK à initialiser. * +* * +* Description : Initialise une instance d'afficheur de code en graphique. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_graph_view_init(GtkGraphView *view) +{ + GtkViewPanel *viewpanel; /* Instance parente #1 */ + GtkBinView *binview; /* Instance parente #2 */ + GdkColor white; /* Couleur de fond normale */ + + viewpanel = GTK_VIEW_PANEL(view); + + viewpanel->scroll = (scroll_fc)gtk_graph_view_scroll; + + binview = GTK_BIN_VIEW(view); + + binview->set_lines = (set_rendering_lines_fc)gtk_graph_view_set_rendering_lines; + 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_fixed_set_has_window(view->support, TRUE); + + g_signal_connect(G_OBJECT(view->support), "expose-event", + G_CALLBACK(gtk_graph_view_expose), view); + + gtk_widget_show(GTK_WIDGET(view->support)); + + gdk_color_white(gtk_widget_get_colormap(GTK_WIDGET(view->support)), &white); + gtk_widget_modify_bg(GTK_WIDGET(view->support), GTK_STATE_NORMAL, &white); + + gtk_fixed_put(GTK_FIXED(view), GTK_WIDGET(view->support), 0, 0); + + view->mutex = g_mutex_new(); + view->cond = g_cond_new(); + +} + + + + + + + + /****************************************************************************** * * * Paramètres : view = instance GTK à réinitialiser. * @@ -379,25 +579,6 @@ static void gtk_graph_view_reset(GtkGraphView *view) -/****************************************************************************** -* * -* Paramètres : view = composant GTK à mettre à jour. * -* * -* Description : Réagit à un défilement quelconque. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void gtk_graph_view_scroll(GtkGraphView *view) -{ - gtk_fixed_move(GTK_FIXED(view), GTK_WIDGET(view->support), - -GTK_VIEW_PANEL(view)->hadjustment->value, - -GTK_VIEW_PANEL(view)->vadjustment->value); - -} /****************************************************************************** @@ -660,46 +841,5 @@ static void notify_graph_view(GtkBinView *view, GtkGraphView *parent) } -/****************************************************************************** -* * -* Paramètres : view = composant GTK à mettre à jour. * -* widget = composant GTK à insérer. * -* x = abscisse du point d'insertion. * -* y = ordonnée du point d'insertion. * -* * -* Description : Place une vue sous forme de bloc dans le graphique. * -* * -* Retour : Plutôt que de redéfinir *toutes* les méthodes de * -* GtkContainer, on étend ! * -* * -* Remarques : - * -* * -******************************************************************************/ - -void gtk_graph_view_put(GtkGraphView *view, GtkWidget *widget, gint x, gint y) -{ - gtk_fixed_put(view->support, widget, x, y); - -} - - -/****************************************************************************** -* * -* 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; -} +#endif diff --git a/src/gtkext/gtkgraphview.h b/src/gtkext/gtkgraphview.h index 3706343..9e66fe8 100644 --- a/src/gtkext/gtkgraphview.h +++ b/src/gtkext/gtkgraphview.h @@ -2,7 +2,7 @@ /* OpenIDA - Outil d'analyse de fichiers binaires * gtkgraphview.h - prototypes pour l'affichage de morceaux de code sous forme graphique * - * Copyright (C) 2009 Cyrille Bagard + * Copyright (C) 2009-2012 Cyrille Bagard * * This file is part of OpenIDA. * @@ -40,19 +40,18 @@ #define GTK_GRAPH_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_GRAPH_VIEW, GtkGraphViewClass)) - +/* Composant d'affichage sous forme graphique (instance) */ typedef struct _GtkGraphView GtkGraphView; - +/* Composant d'affichage sous forme graphique (classe) */ typedef struct _GtkGraphViewClass GtkGraphViewClass; - /* Détermine le type du composant d'affichage en graphique. */ GType gtk_graph_view_get_type(void); /* Crée un nouveau composant pour l'affichage en graphique. */ -GtkWidget* gtk_graph_view_new(void); +GtkWidget *gtk_graph_view_new(void); /* Place une vue sous forme de bloc dans le graphique. */ void gtk_graph_view_put(GtkGraphView *, GtkWidget *, gint, gint); diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c index 9ccf209..9aba036 100644 --- a/src/gtkext/gtkviewpanel.c +++ b/src/gtkext/gtkviewpanel.c @@ -342,7 +342,8 @@ void gtk_view_panel_attach_binary(GtkViewPanel *panel, GOpenidaBinary *binary, b panel->display_addr = addr; panel->display_code = code; - panel->attach(panel, binary, addr, code); + if (panel->attach != NULL) /* REMME ? */ + panel->attach(panel, binary, addr, code); } |