diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/editor.c | 76 | ||||
| -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 | ||||
| -rw-r--r-- | src/gui/editem.c | 19 | ||||
| -rw-r--r-- | src/gui/editem.h | 3 | ||||
| -rw-r--r-- | src/gui/menus/view.c | 81 | 
9 files changed, 415 insertions, 201 deletions
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 <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);  } 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 <i18n.h> +#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      : -                                                            *  | 
