From d761eddfd4b5a27620aaa5e67a0e2e2bc5d55cb1 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Mon, 23 Jan 2012 01:05:58 +0000 Subject: Added menus to change the current displayed view. Do not try the source view. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@228 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 26 +++ po/fr.po | 6 +- src/editor.c | 76 +-------- src/gtkext/gtkdockstation.c | 40 +++++ src/gtkext/gtkdockstation.h | 3 + src/gtkext/gtkgraphview.c | 382 ++++++++++++++++++++++++++++++-------------- src/gtkext/gtkgraphview.h | 9 +- src/gtkext/gtkviewpanel.c | 3 +- src/gui/editem.c | 19 +++ src/gui/editem.h | 3 + src/gui/menus/view.c | 81 ++++++++++ 11 files changed, 444 insertions(+), 204 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9926314..313c06d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,31 @@ 12-01-16 Cyrille Bagard + * po/fr.po: + Update translations for the View menu. + + * src/editor.c: + Remove old code in favour of view. + + * src/gtkext/gtkdockstation.c: + * src/gtkext/gtkdockstation.h: + Allow to change the active widget. + + * src/gtkext/gtkgraphview.c: + * src/gtkext/gtkgraphview.h: + Update the graph view code. + + * src/gtkext/gtkviewpanel.c: + Prevent a crash if a view is not attaching its binary. + + * src/gui/editem.c: + * src/gui/editem.h: + Provide the current binary. + + * src/gui/menus/view.c: + Add menus to change the current displayed view. + +12-01-16 Cyrille Bagard + * src/editor.c: Update editor on view change. diff --git a/po/fr.po b/po/fr.po index 913145f..276b6a1 100644 --- a/po/fr.po +++ b/po/fr.po @@ -476,15 +476,15 @@ msgstr "Affichage" #: src/editor.c:326 msgid "Text view" -msgstr "" +msgstr "Vue binaire" #: src/editor.c:333 msgid "Graph view" -msgstr "" +msgstr "Vue graphique" #: src/editor.c:340 msgid "Source code" -msgstr "" +msgstr "Code source" #: src/editor.c:357 msgid "Toolbar" diff --git a/src/editor.c b/src/editor.c index 936b9a1..01ba64a 100644 --- a/src/editor.c +++ b/src/editor.c @@ -90,9 +90,6 @@ void mcb_file_save_project_as(GtkMenuItem *, gpointer); /* Charge un projet récent et met à jour la liste. */ void mcb_open_recent_project(GtkMenuItem *, GObject *); -/* Réagit avec le menu "Affichage -> Vue xxx". */ -void mcb_view_change_support(GtkRadioMenuItem *, GObject *); - /* Affiche la boîte d'ajout d'un binaire au projet courant. */ void mcb_project_add_binary(GtkMenuItem *, gpointer); @@ -316,25 +313,6 @@ GtkWidget *create_editor(void) menubar = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menubar); - submenuitem = qck_create_radio_menu_item(ref, "textview", NULL, _("Text view"), G_CALLBACK(mcb_view_change_support), result); - add_accelerator_to_menu_item(submenuitem, "F2", accgroup); - g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(BVW_BLOCK)); - gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - - rgroup = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(submenuitem)); - - submenuitem = qck_create_radio_menu_item(ref, "graphview", rgroup, _("Graph view"), G_CALLBACK(mcb_view_change_support), result); - add_accelerator_to_menu_item(submenuitem, "F3", accgroup); - g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(BVW_GRAPH)); - gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - - rgroup = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(submenuitem)); - - submenuitem = qck_create_radio_menu_item(ref, "sourceview", rgroup, _("Source code"), G_CALLBACK(mcb_view_change_support), result); - add_accelerator_to_menu_item(submenuitem, "F4", accgroup); - g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(BVW_SOURCE)); - gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - submenuitem = qck_create_menu_separator(); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); @@ -887,57 +865,6 @@ void mcb_open_recent_project(GtkMenuItem *menuitem, GObject *ref) } -/****************************************************************************** -* * -* Paramètres : menuitem = élément de menu ayant basculé. * -* ref = adresse de l'espace de référencement global. * -* * -* Description : Réagit avec le menu "Affichage -> Vue xxx". * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void mcb_view_change_support(GtkRadioMenuItem *menuitem, GObject *ref) -{ - GSList *group; /* Liste de menus radio */ - GSList *iter; /* Boucle de parcours */ - BinaryView view; /* Nouvelle vue à présenter */ - GOpenidaBinary *binary; /* Edition courante */ - GtkViewPanel *pview; /* Afficheur effectif de code */ - GtkWidget *panel; /* Nouveau support à utiliser */ - GDockItem *ditem; /* Panneau avec ses infos. */ - - /* On ne traite qu'une seule fois ! */ - if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) return; - - group = gtk_radio_menu_item_get_group(menuitem); - - for (iter = group; iter != NULL; iter = g_slist_next(iter)) - { - if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(iter->data))) continue; - - view = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(iter->data), "kind_of_view")); - - binary = (GOpenidaBinary *)g_object_get_data(ref, "current_binary"); - panel = get_view_for_openida_project_binary(get_current_openida_project(), binary, view, &pview); - - ditem = gtk_dock_panel_get_item_from_binary(get_current_openida_project(), binary); - - g_dock_item_set_panel(ditem, panel); - - change_editor_items_current_view(ref, pview); - - notify_panels_of_view_change(pview, true); - - } - -} - - - /****************************************************************************** @@ -1469,6 +1396,7 @@ static void on_dock_item_switch(GtkDockPanel *panel, GtkWidget *widget, GObject static void refresh_editor_menus(GObject *ref, GOpenidaBinary *binary, GtkBinView *view) { +#if 0 GtkCheckMenuItem *menuitem; /* Menu à coche à traiter */ /* Affichage : type de vue */ @@ -1495,7 +1423,7 @@ static void refresh_editor_menus(GObject *ref, GOpenidaBinary *binary, GtkBinVie menuitem = GTK_CHECK_MENU_ITEM(g_object_get_data(ref, "graphview")); g_signal_connect(menuitem, "toggled", G_CALLBACK(mcb_view_change_support), ref); - +#endif } 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 +#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 + + + +/* 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); } diff --git a/src/gui/editem.c b/src/gui/editem.c index 4afd7bd..0516f4d 100644 --- a/src/gui/editem.c +++ b/src/gui/editem.c @@ -117,6 +117,25 @@ GtkWidget *g_editor_item_get_widget(const GEditorItem *item) * * * Paramètres : item = instance à consulter. * * * +* Description : Fournit le gestionnaire du binaire courant. * +* * +* Retour : Instance en place ou NULL si aucune. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GOpenidaBinary *g_editor_item_get_current_binary(const GEditorItem *item) +{ + return g_object_get_data(item->ref, "current_binary"); + +} + + +/****************************************************************************** +* * +* Paramètres : item = instance à consulter. * +* * * Description : Fournit l'affichage de binaire courant. * * * * Retour : Instance en place ou NULL si aucune. * diff --git a/src/gui/editem.h b/src/gui/editem.h index 40be0c7..286013c 100644 --- a/src/gui/editem.h +++ b/src/gui/editem.h @@ -58,6 +58,9 @@ GType g_editor_item_get_type(void); /* Fournit le composant GTK associé à l'élément réactif. */ GtkWidget *g_editor_item_get_widget(const GEditorItem *); +/* Fournit le gestionnaire du binaire courant. */ +GOpenidaBinary *g_editor_item_get_current_binary(const GEditorItem *); + /* Fournit l'affichage de binaire courant. */ GtkViewPanel *g_editor_item_get_current_view(const GEditorItem *); diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c index 85e65f7..273b41b 100644 --- a/src/gui/menus/view.c +++ b/src/gui/menus/view.c @@ -28,10 +28,16 @@ #include +#include "../editem-int.h" +#include "../../project.h" #include "../../gtkext/easygtk.h" +#include "../../gtkext/gtkdockstation.h" +/* Réagit avec le menu "Affichage -> Vue xxx". */ +static void mcb_view_change_support(GtkRadioMenuItem *, GMenuBar *); + /* Réagit avec le menu "Affichage -> Adresse virtuelle". */ static void mcb_view_addresses(GtkCheckMenuItem *, GMenuBar *); @@ -59,6 +65,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar) GtkWidget *result; /* Support à retourner */ GtkWidget *menubar; /* Support pour éléments */ GtkWidget *submenuitem; /* Sous-élément de menu */ + GSList *rgroup; /* Groupe des boutons radio */ result = gtk_menu_item_new_with_mnemonic(_("_View")); gtk_widget_show(result); @@ -66,6 +73,28 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar) menubar = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(result), menubar); + submenuitem = qck_create_radio_menu_item(ref, "textview", NULL, _("Text view"), + G_CALLBACK(mcb_view_change_support), bar); + add_accelerator_to_menu_item(submenuitem, "F2", accgroup); + g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(BVW_BLOCK)); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + rgroup = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(submenuitem)); + + submenuitem = qck_create_radio_menu_item(ref, "graphview", rgroup, _("Graph view"), + G_CALLBACK(mcb_view_change_support), bar); + add_accelerator_to_menu_item(submenuitem, "F3", accgroup); + g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(BVW_GRAPH)); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + rgroup = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(submenuitem)); + + submenuitem = qck_create_radio_menu_item(ref, "sourceview", rgroup, _("Source code"), + G_CALLBACK(mcb_view_change_support), bar); + add_accelerator_to_menu_item(submenuitem, "F4", accgroup); + g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(BVW_SOURCE)); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + submenuitem = qck_create_menu_separator(); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); @@ -134,6 +163,58 @@ void update_menu_view_for_view(GtkWidget *widget, GtkViewPanel *view, GMenuBar * * Paramètres : menuitem = élément de menu ayant basculé. * * bar = barre de menu parente. * * * +* Description : Réagit avec le menu "Affichage -> Vue xxx". * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void mcb_view_change_support(GtkRadioMenuItem *menuitem, GMenuBar *bar) +{ + GSList *group; /* Liste de menus radio */ + GSList *iter; /* Boucle de parcours */ + BinaryView view; /* Nouvelle vue à présenter */ + GtkViewPanel *vpanel; /* Afficheur effectif de code */ + GtkWidget *station; /* Base du remplacement */ + GOpenidaBinary *binary; /* Edition courante */ + GtkWidget *scroll; /* Nouveau support à utiliser */ + + /* On ne traite qu'une seule fois ! */ + if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) return; + + group = gtk_radio_menu_item_get_group(menuitem); + + for (iter = group; iter != NULL; iter = g_slist_next(iter)) + { + if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(iter->data))) continue; + + view = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(iter->data), "kind_of_view")); + + vpanel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar)); + station = gtk_widget_get_parent(GTK_WIDGET(vpanel)); /* ScrollWindow */ + station = gtk_widget_get_parent(station); /* NoteBook */ + station = gtk_widget_get_parent(station); /* DockStation */ + + binary = g_editor_item_get_current_binary(G_EDITOR_ITEM(bar)); + scroll = get_view_for_openida_project_binary(get_current_openida_project(), + binary, view, &vpanel); + + gtk_dock_panel_change_active_widget(GTK_DOCK_STATION(station), scroll); + + change_editor_items_current_view(G_EDITOR_ITEM(bar)->ref, vpanel); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : menuitem = élément de menu ayant basculé. * +* bar = barre de menu parente. * +* * * Description : Réagit avec le menu "Affichage -> Adresse virtuelle". * * * * Retour : - * -- cgit v0.11.2-87-g4458