diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/analysis/project.c | 3 | ||||
| -rw-r--r-- | src/gtkext/easygtk.c | 7 | ||||
| -rw-r--r-- | src/gtkext/gtkbufferview-int.h | 1 | ||||
| -rw-r--r-- | src/gtkext/gtkbufferview.c | 8 | ||||
| -rw-r--r-- | src/gtkext/gtkviewpanel-int.h | 4 | ||||
| -rw-r--r-- | src/gtkext/gtkviewpanel.c | 9 | ||||
| -rw-r--r-- | src/gui/editem-int.h | 13 | ||||
| -rw-r--r-- | src/gui/editem.c | 89 | ||||
| -rw-r--r-- | src/gui/editem.h | 3 | ||||
| -rw-r--r-- | src/gui/menus/edition.c | 17 | ||||
| -rw-r--r-- | src/gui/menus/edition.h | 4 | ||||
| -rw-r--r-- | src/gui/menus/menubar.c | 106 | ||||
| -rw-r--r-- | src/gui/status.c | 5 | ||||
| -rw-r--r-- | src/gui/tb/source.c | 2 | 
14 files changed, 131 insertions, 140 deletions
| diff --git a/src/analysis/project.c b/src/analysis/project.c index 1befb8f..b787262 100644 --- a/src/analysis/project.c +++ b/src/analysis/project.c @@ -645,8 +645,6 @@ size_t g_study_project_attach_binary(GStudyProject *project, GLoadedBinary *bina                  break;          } -        manage_editor_items_view(GTK_VIEW_PANEL(view), true); -          gtk_widget_show(view);          loaded->views[i] = GTK_VIEW_PANEL(view); @@ -715,7 +713,6 @@ void g_study_project_detach_binary(GStudyProject *project, GLoadedBinary *binary      //gtk_dock_panel_remove_item(dpanel, ditem); -    //manage_editor_items_view(GObject *ref, GtkViewPanel *view, bool created)      for (i = 0; i < project->binaries_count; i++)          if (project->binaries[i]->binary == binary) break; diff --git a/src/gtkext/easygtk.c b/src/gtkext/easygtk.c index 5d255a5..3ba6664 100644 --- a/src/gtkext/easygtk.c +++ b/src/gtkext/easygtk.c @@ -953,13 +953,6 @@ void add_accelerator_to_menu_item(GtkWidget *item, const char *accelerator, GtkA      gtk_accelerator_parse(accelerator, &key, &mods); -    gboolean force_accel_activation(GtkWidget *widget, guint signal_id, gpointer data) -    { -        return TRUE; -    } - -    g_signal_connect(item, "can-activate-accel", G_CALLBACK(force_accel_activation), NULL); -      gtk_widget_add_accelerator(item, "activate", group,                                 key, mods, GTK_ACCEL_VISIBLE); diff --git a/src/gtkext/gtkbufferview-int.h b/src/gtkext/gtkbufferview-int.h index 944ddc7..ea181f9 100644 --- a/src/gtkext/gtkbufferview-int.h +++ b/src/gtkext/gtkbufferview-int.h @@ -64,7 +64,6 @@ struct _GtkBufferViewClass      /* Signaux */ -    void (* caret_moved) (GtkBufferView *, const vmpa2t *);      void (* reach_limit) (GtkBufferView *, GdkScrollDirection);  }; diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c index 0e3beeb..d54560c 100644 --- a/src/gtkext/gtkbufferview.c +++ b/src/gtkext/gtkbufferview.c @@ -150,14 +150,6 @@ static void gtk_buffer_view_class_init(GtkBufferViewClass *class)      panel_class->move_caret_to = (move_caret_to_fc)_gtk_buffer_view_move_caret_to;      panel_class->cache_glance = (cache_glance_fc)gtk_buffer_view_cache_glance; -    g_signal_new("caret-moved", -                 GTK_TYPE_BUFFER_VIEW, -                 G_SIGNAL_RUN_LAST, -                 G_STRUCT_OFFSET(GtkBufferViewClass, caret_moved), -                 NULL, NULL, -                 g_cclosure_user_marshal_VOID__UINT64, -                 G_TYPE_NONE, 1, G_TYPE_UINT64); -      g_signal_new("reach-limit",                   GTK_TYPE_BUFFER_VIEW,                   G_SIGNAL_RUN_LAST, diff --git a/src/gtkext/gtkviewpanel-int.h b/src/gtkext/gtkviewpanel-int.h index 5fbcd76..9a2f885 100644 --- a/src/gtkext/gtkviewpanel-int.h +++ b/src/gtkext/gtkviewpanel-int.h @@ -101,6 +101,10 @@ struct _GtkViewPanelClass      move_caret_to_fc move_caret_to;         /* Déplacement du curseur      */      cache_glance_fc cache_glance;           /* Cache de la mignature       */ +    /* Signaux */ + +    void (* caret_moved) (GtkViewPanel *, const vmpa2t *); +  };  /* Propriétés propres au composant d'affichage */ diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c index 861b46f..a347ad8 100644 --- a/src/gtkext/gtkviewpanel.c +++ b/src/gtkext/gtkviewpanel.c @@ -25,7 +25,6 @@  #include "gtkviewpanel-int.h" -#include "../glibext/chrysamarshal.h" @@ -127,6 +126,14 @@ static void gtk_view_panel_class_init(GtkViewPanelClass *class)      panel_class->compute_inc = gtk_view_panel_compute_scroll_inc; +    g_signal_new("caret-moved", +                 GTK_TYPE_VIEW_PANEL, +                 G_SIGNAL_RUN_LAST, +                 G_STRUCT_OFFSET(GtkViewPanelClass, caret_moved), +                 NULL, NULL, +                 g_cclosure_marshal_VOID__POINTER, +                 G_TYPE_NONE, 1, G_TYPE_POINTER); +  } diff --git a/src/gui/editem-int.h b/src/gui/editem-int.h index fa62dc6..9918595 100644 --- a/src/gui/editem-int.h +++ b/src/gui/editem-int.h @@ -34,6 +34,7 @@  #include "../common/dllist.h"  #include "../gtkext/gtkbufferview.h" +#include "../gtkext/gtkviewpanel.h" @@ -41,13 +42,13 @@  typedef void (* update_item_binary_fc) (GEditorItem *, GLoadedBinary *);  /* Réagit à un changement d'affichage principal de contenu. */ -typedef void (* manage_item_view_fc) (GEditorItem *, GtkViewPanel *, bool); - -/* Réagit à un changement d'affichage principal de contenu. */  typedef void (* update_item_view_fc) (GEditorItem *, GtkViewPanel *); +/* Réagit à un changement de focus des panneaux d'affichage. */ +typedef void (* notify_focus_change_fc) (GEditorItem *, GtkViewPanel *); +  /* Suit les changements de position dans du code d'assembleur. */ -typedef void (* track_caret_in_view_fc) (GEditorItem *, GtkBufferView *, const vmpa2t *); +typedef void (* track_caret_in_view_fc) (GEditorItem *, GtkViewPanel *, const vmpa2t *);  /* Concentre l'attention de l'ensemble sur une adresse donnée. */  typedef void (* focus_addr_fc) (GEditorItem *, GLoadedBinary *, const vmpa2t *); @@ -77,10 +78,10 @@ struct _GEditorItemClass      GObjectClass parent;                    /* A laisser en premier        */      update_item_binary_fc update_binary;    /* Changement de binaire       */ -    manage_item_view_fc manage_view;        /* Gestion des vues manipulées */      update_item_view_fc update_view;        /* Rechargement dû à une vue   */ -    track_caret_in_view_fc track_caret;     /* Suivi des positions         */      update_item_view_fc update_content;     /* Rechargement dû à un contenu*/ +    notify_focus_change_fc notify_focus;    /* Gain ou perte de focus      */ +    track_caret_in_view_fc track_caret;     /* Suivi des positions         */      focus_addr_fc focus_addr;               /* Prête attention à une addr. */      update_project_fc update_project;       /* Actualisation des binaires  */ diff --git a/src/gui/editem.c b/src/gui/editem.c index 9f10bec..1dc77c9 100644 --- a/src/gui/editem.c +++ b/src/gui/editem.c @@ -47,12 +47,18 @@ static void g_editor_item_init(GEditorItem *);  /* Liste des éléments enregistrés */  static GEditorItem *_editem_list = NULL; +/* Suivi du panneau d'affichage courant */ +static GtkViewPanel *_current_view = NULL; +  /* Suivi des changements de position */  static GObject *_caret_instance = NULL; +/* Suit les changements de focus des panneaux d'affichage. */ +static gboolean notify_view_panel_focus_change(GtkViewPanel *, GdkEventFocus *, void *); +  /* Suit les changements de position dans du code d'assembleur. */ -static void track_caret_address_on_buffer_views(GtkBufferView *, const vmpa2t *, void *); +static void track_caret_address_on_view_panel(GtkViewPanel *, const vmpa2t *, void *); @@ -173,7 +179,7 @@ GLoadedBinary *g_editor_item_get_current_binary(const GEditorItem *item)  GtkViewPanel *g_editor_item_get_current_view(const GEditorItem *item)  { -    return g_object_get_data(item->ref, "current_view"); +    return _current_view;  } @@ -237,18 +243,19 @@ void change_editor_items_current_binary(GObject *ref, GLoadedBinary *binary)  /******************************************************************************  *                                                                             * -*  Paramètres  : view    = nouveau panneau d'affichage nouveau.               * -*                created = fait état d'une création ou d'une destruction.     * +*  Paramètres  : vpanel = composant d'affichage concerné par l'opération.     * +*                event  = informations liées à l'événement.                   * +*                data   = adresse non utilisée ici.                           *  *                                                                             * -*  Description : Lance une actualisation liée à une modification du cheptel.  * +*  Description : Suit les changements de focus des panneaux d'affichage.      *  *                                                                             * -*  Retour      : -                                                            * +*  Retour      : FALSE pour continuer la propagation.                         *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -void manage_editor_items_view(GtkViewPanel *view, bool created) +static gboolean notify_view_panel_focus_change(GtkViewPanel *vpanel, GdkEventFocus *event, void *data)  {      GEditorItem *iter;                      /* Boucle de parcours          */      GEditorItemClass *klass;                /* Classe correspondante       */ @@ -257,19 +264,21 @@ void manage_editor_items_view(GtkViewPanel *view, bool created)      {          klass = G_EDITOR_ITEM_GET_CLASS(iter); -        if (klass->manage_view != NULL) -            klass->manage_view(iter, view, created); +        if (klass->notify_focus != NULL) +            klass->notify_focus(iter, event->in ? vpanel : NULL);      } +    return FALSE; +  }  /******************************************************************************  *                                                                             * -*  Paramètres  : view = composant d'affichage parcouru.                       * -*                addr = nouvelle adresse du curseur courant.                  * -*                data = adresse non utilisée ici.                             * +*  Paramètres  : vpanel = composant d'affichage parcouru.                     * +*                addr   = nouvelle adresse du curseur courant.                * +*                data   = adresse non utilisée ici.                           *  *                                                                             *  *  Description : Suit les changements de position dans du code d'assembleur.  *  *                                                                             * @@ -279,7 +288,7 @@ void manage_editor_items_view(GtkViewPanel *view, bool created)  *                                                                             *  ******************************************************************************/ -static void track_caret_address_on_buffer_views(GtkBufferView *view, const vmpa2t *addr, void *data) +static void track_caret_address_on_view_panel(GtkViewPanel *vpanel, const vmpa2t *addr, void *data)  {      GEditorItem *iter;                      /* Boucle de parcours          */      GEditorItemClass *klass;                /* Classe correspondante       */ @@ -289,7 +298,7 @@ static void track_caret_address_on_buffer_views(GtkBufferView *view, const vmpa2          klass = G_EDITOR_ITEM_GET_CLASS(iter);          if (klass->track_caret != NULL) -            klass->track_caret(iter, view, addr); +            klass->track_caret(iter, vpanel, addr);      } @@ -298,8 +307,8 @@ static void track_caret_address_on_buffer_views(GtkBufferView *view, const vmpa2  /******************************************************************************  *                                                                             * -*  Paramètres  : ref  = espace de référencement global.                       * -*                view = nouveau panneau d'affichage actif.                    * +*  Paramètres  : ref    = espace de référencement global.                     * +*                vpanel = nouveau panneau d'affichage actif.                  *  *                                                                             *  *  Description : Lance une actualisation du fait d'un changement de vue.      *  *                                                                             * @@ -309,43 +318,55 @@ static void track_caret_address_on_buffer_views(GtkBufferView *view, const vmpa2  *                                                                             *  ******************************************************************************/ -void change_editor_items_current_view(GObject *ref, GtkViewPanel *view) +void change_editor_items_current_view(GObject *ref, GtkViewPanel *vpanel)  {      GEditorItem *iter;                      /* Boucle de parcours          */      GEditorItemClass *klass;                /* Classe correspondante       */ -    g_object_set_data(ref, "current_view", view); +    /* Suivi des affichages */ + +    if (_current_view != NULL) +    { +        g_signal_handlers_disconnect_by_func(_current_view, G_CALLBACK(notify_view_panel_focus_change), NULL); +        g_signal_handlers_disconnect_by_func(_current_view, G_CALLBACK(notify_view_panel_focus_change), NULL); +    } + +    _current_view = vpanel;      editem_list_for_each(iter, _editem_list)      {          klass = G_EDITOR_ITEM_GET_CLASS(iter);          if (klass->update_view != NULL) -            klass->update_view(iter, view); +            klass->update_view(iter, vpanel); + +    } +    if (vpanel != NULL) +    { +        g_signal_connect(vpanel, "focus-in-event", G_CALLBACK(notify_view_panel_focus_change), NULL); +        g_signal_connect(vpanel, "focus-out-event", G_CALLBACK(notify_view_panel_focus_change), NULL);      } +    /* Suivi du curseur */ +      if (_caret_instance != NULL)      {          g_signal_handlers_disconnect_by_func(_caret_instance, -                                             G_CALLBACK(track_caret_address_on_buffer_views), +                                             G_CALLBACK(track_caret_address_on_view_panel),                                               NULL);          g_object_unref(_caret_instance);          _caret_instance = NULL;      } -    if (view != NULL) +    if (vpanel != NULL)      { -        if (GTK_IS_BLOCK_VIEW(view)) -        { -            g_signal_connect(view, "caret-moved", -                             G_CALLBACK(track_caret_address_on_buffer_views), -                             NULL); - -            _caret_instance = G_OBJECT(view); -            g_object_ref(_caret_instance); +        g_signal_connect(vpanel, "caret-moved", +                         G_CALLBACK(track_caret_address_on_view_panel), +                         NULL); -        } +        _caret_instance = G_OBJECT(vpanel); +        g_object_ref(_caret_instance);      } @@ -354,8 +375,8 @@ void change_editor_items_current_view(GObject *ref, GtkViewPanel *view)  /******************************************************************************  *                                                                             * -*  Paramètres  : ref  = espace de référencement global.                       * -*                view = nouveau panneau d'affichage actif.                    * +*  Paramètres  : ref    = espace de référencement global.                     * +*                vpanel = nouveau panneau d'affichage actif.                  *  *                                                                             *  *  Description : Lance une actualisation du fait d'un changement de contenu.  *  *                                                                             * @@ -365,7 +386,7 @@ void change_editor_items_current_view(GObject *ref, GtkViewPanel *view)  *                                                                             *  ******************************************************************************/ -void change_editor_items_current_view_content(GtkViewPanel *view) +void change_editor_items_current_view_content(GtkViewPanel *vpanel)  {      GEditorItem *iter;                      /* Boucle de parcours          */      GEditorItemClass *klass;                /* Classe correspondante       */ @@ -375,7 +396,7 @@ void change_editor_items_current_view_content(GtkViewPanel *view)          klass = G_EDITOR_ITEM_GET_CLASS(iter);          if (klass->update_content != NULL) -            klass->update_content(iter, view); +            klass->update_content(iter, vpanel);      } diff --git a/src/gui/editem.h b/src/gui/editem.h index 67bc402..90b1919 100644 --- a/src/gui/editem.h +++ b/src/gui/editem.h @@ -79,9 +79,6 @@ void register_editor_item(GEditorItem *);  /* Lance une actualisation du fait d'un changement de binaire. */  void change_editor_items_current_binary(GObject *, GLoadedBinary *); -/* Lance une actualisation liée à une modification du cheptel. */ -void manage_editor_items_view(GtkViewPanel *, bool) __attribute__ ((deprecated));; -  /* Lance une actualisation du fait d'un changement de vue. */  void change_editor_items_current_view(GObject *, GtkViewPanel *); diff --git a/src/gui/menus/edition.c b/src/gui/menus/edition.c index 2cc22b2..99ade8c 100644 --- a/src/gui/menus/edition.c +++ b/src/gui/menus/edition.c @@ -229,9 +229,9 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b  /******************************************************************************  *                                                                             * -*  Paramètres  : bar  = barre de menus à actualiser.                          * -*                addr = nouvelle adresse du curseur courant.                  * -*                info = barre de statut présentant les informations.          * +*  Paramètres  : ref    = espace de référencements à consulter.               * +*                vpanel = panneau d'affichage actif ou NULL si aucun.         * +*                addr   = nouvelle adresse du curseur courant.                *  *                                                                             *  *  Description : Met à jour les accès du menu "Edition" selon une position.   *  *                                                                             * @@ -241,7 +241,7 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b  *                                                                             *  ******************************************************************************/ -void update_access_in_menu_edition(GObject *ref, GtkBufferView *view, const vmpa2t *addr) +void update_access_in_menu_edition(GObject *ref, GtkViewPanel *vpanel, const vmpa2t *addr)  {      bool state;                             /* Etat principal à considérer */      gboolean access;                        /* Accès à déterminer          */ @@ -252,14 +252,14 @@ void update_access_in_menu_edition(GObject *ref, GtkBufferView *view, const vmpa      /* Préliminaire */ -    if (view == NULL || addr == NULL) +    if (vpanel == NULL || addr == NULL)      {          state = false;          line = NULL;          segment = NULL;      }      else -        state = gtk_view_panel_get_position(GTK_VIEW_PANEL(view), &line, &segment); +        state = gtk_view_panel_get_position(vpanel, &line, &segment);      if (state)          creator = g_buffer_segment_get_creator(segment); @@ -292,6 +292,11 @@ void update_access_in_menu_edition(GObject *ref, GtkBufferView *view, const vmpa      item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_follow_ref"));      gtk_widget_set_sensitive(item, access); +    access = state; + +    item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_list_xrefs")); +    gtk_widget_set_sensitive(item, access); +      /* Nettoyage et sortie finale */      if (creator != NULL) g_object_unref(G_OBJECT(creator)); diff --git a/src/gui/menus/edition.h b/src/gui/menus/edition.h index 82a48bd..8be50f8 100644 --- a/src/gui/menus/edition.h +++ b/src/gui/menus/edition.h @@ -30,7 +30,7 @@  #include "menubar.h" -#include "../../gtkext/gtkbufferview.h" +#include "../../gtkext/gtkviewpanel.h" @@ -38,7 +38,7 @@  GtkWidget *build_menu_edition(GObject *, GtkAccelGroup *, GMenuBar *);  /* Met à jour les accès du menu "Edition" selon une position. */ -void update_access_in_menu_edition(GObject *, GtkBufferView *, const vmpa2t *); +void update_access_in_menu_edition(GObject *, GtkViewPanel *, const vmpa2t *); diff --git a/src/gui/menus/menubar.c b/src/gui/menus/menubar.c index cbb6ae2..db1905c 100644 --- a/src/gui/menus/menubar.c +++ b/src/gui/menus/menubar.c @@ -74,14 +74,14 @@ static void g_menu_bar_dispose(GMenuBar *);  /* Procède à la libération totale de la mémoire. */  static void g_menu_bar_finalize(GMenuBar *); -/* Lance une actualisation liée à une modification du cheptel. */ -static void manage_view_in_menu_bar(GMenuBar *, GtkViewPanel *, bool); -  /* Lance une actualisation du fait d'un changement de vue. */  static void update_menu_bar_for_view(GMenuBar *, GtkViewPanel *); +/* Réagit à un changement de focus des panneaux d'affichage. */ +static void notify_focus_change_for_menu_bar(GMenuBar *, GtkViewPanel *); +  /* Met à jour les accès aux menus en fonction de la position. */ -static void track_caret_address_for_menu_bar(GMenuBar *, GtkBufferView *, const vmpa2t *); +static void track_caret_address_for_menu_bar(GMenuBar *, GtkViewPanel *, const vmpa2t *);  /* Lance une actualisation relative à l'étendue du projet. */  static void update_menu_bar_for_project(GMenuBar *, GStudyProject *); @@ -116,8 +116,8 @@ static void g_menu_bar_class_init(GMenuBarClass *klass)      editem = G_EDITOR_ITEM_CLASS(klass); -    editem->manage_view = (manage_item_view_fc)manage_view_in_menu_bar;      editem->update_view = (update_item_view_fc)update_menu_bar_for_view; +    editem->notify_focus = (notify_focus_change_fc)notify_focus_change_for_menu_bar;      editem->track_caret = (track_caret_in_view_fc)track_caret_address_for_menu_bar;      editem->update_project = (update_project_fc)update_menu_bar_for_project; @@ -262,11 +262,10 @@ GEditorItem *g_menu_bar_new(GObject *ref, GtkAccelGroup *accgroup)  /******************************************************************************  *                                                                             * -*  Paramètres  : bar     = barre de menus à actualiser.                       * -*                view    = nouveau panneau d'affichage nouveau.               * -*                created = fait état d'une création ou d'une destruction.     * +*  Paramètres  : bar  = barre de menus à actualiser.                          * +*                view = nouveau panneau d'affichage actif.                    *  *                                                                             * -*  Description : Lance une actualisation liée à une modification du cheptel.  * +*  Description : Lance une actualisation du fait d'un changement de vue.      *  *                                                                             *  *  Retour      : -                                                            *  *                                                                             * @@ -274,55 +273,9 @@ GEditorItem *g_menu_bar_new(GObject *ref, GtkAccelGroup *accgroup)  *                                                                             *  ******************************************************************************/ -static void manage_view_in_menu_bar(GMenuBar *bar, GtkViewPanel *view, bool created) +static void update_menu_bar_for_view(GMenuBar *bar, GtkViewPanel *view)  { - -    gboolean view_got_focus(GtkWidget *widget, GtkDirectionType dir, GObject *ref) -    { -        GtkWidget *item; - -        item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_follow_ref")); - -        gtk_widget_set_sensitive(item, TRUE); - -        item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_list_xrefs")); - -        gtk_widget_set_sensitive(item, TRUE); - -        return FALSE; - -    } - -    gboolean view_lost_focus(GtkWidget *widget, GtkDirectionType dir, GObject *ref) -    { -        GtkWidget *item; - -        item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_follow_ref")); - -        gtk_widget_set_sensitive(item, FALSE); - -        item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_list_xrefs")); - -        gtk_widget_set_sensitive(item, FALSE); - -        return FALSE; - -    } - - -    if (created) -    { -        g_signal_connect(view, "focus-in-event", G_CALLBACK(view_got_focus), G_EDITOR_ITEM(bar)->ref); -        g_signal_connect(view, "focus-out-event", G_CALLBACK(view_lost_focus), G_EDITOR_ITEM(bar)->ref); -    } -    else -    { -        g_signal_handlers_disconnect_by_func(view, G_CALLBACK(view_got_focus), G_EDITOR_ITEM(bar)->ref); -        g_signal_handlers_disconnect_by_func(view, G_CALLBACK(view_lost_focus), G_EDITOR_ITEM(bar)->ref); -    } - - -    //    update_menu_view_for_view(bar->view, view, bar); +    update_menu_view_for_view(bar->view, view, bar);  } @@ -330,9 +283,9 @@ static void manage_view_in_menu_bar(GMenuBar *bar, GtkViewPanel *view, bool crea  /******************************************************************************  *                                                                             *  *  Paramètres  : bar  = barre de menus à actualiser.                          * -*                view = nouveau panneau d'affichage actif.                    * +*                panel = composant d'affichage concerné par l'opération.      *  *                                                                             * -*  Description : Lance une actualisation du fait d'un changement de vue.      * +*  Description : Réagit à un changement de focus des panneaux d'affichage.    *  *                                                                             *  *  Retour      : -                                                            *  *                                                                             * @@ -340,18 +293,39 @@ static void manage_view_in_menu_bar(GMenuBar *bar, GtkViewPanel *view, bool crea  *                                                                             *  ******************************************************************************/ -static void update_menu_bar_for_view(GMenuBar *bar, GtkViewPanel *view) +static void notify_focus_change_for_menu_bar(GMenuBar *bar, GtkViewPanel *panel)  { -    update_menu_view_for_view(bar->view, view, bar); +    GBufferLine *line;                      /* Ligne de position courante  */ +    const mrange_t *range;                  /* Couverture en mémoire       */ +    const vmpa2t *addr;                     /* Position courante           */ +    GEditorItem *item;                      /* Autre version de l'élément  */ + +    if (panel != NULL && gtk_view_panel_get_position(panel, &line, NULL)) +    { +        range = g_buffer_line_get_range(line); +        addr = get_mrange_addr(range); +    } +    else +    { +        line = NULL; +        addr = NULL; +    } + +    item = G_EDITOR_ITEM(bar); + +    update_access_in_menu_edition(item->ref, panel, addr); + +    if (line != NULL) +        g_object_unref(G_OBJECT(line));  }  /******************************************************************************  *                                                                             * -*  Paramètres  : bar  = barre de menus à actualiser.                          * -*                addr = nouvelle adresse du curseur courant.                  * -*                info = barre de statut présentant les informations.          * +*  Paramètres  : bar    = barre de menus à actualiser.                        * +*                vpanel = panneau d'affichage actif ou NULL si aucun.         * +*                addr   = nouvelle adresse du curseur courant.                *  *                                                                             *  *  Description : Met à jour les accès aux menus en fonction de la position.   *  *                                                                             * @@ -361,13 +335,13 @@ static void update_menu_bar_for_view(GMenuBar *bar, GtkViewPanel *view)  *                                                                             *  ******************************************************************************/ -static void track_caret_address_for_menu_bar(GMenuBar *bar, GtkBufferView *view, const vmpa2t *addr) +static void track_caret_address_for_menu_bar(GMenuBar *bar, GtkViewPanel *vpanel, const vmpa2t *addr)  {      GEditorItem *item;                      /* Autre version de l'élément  */      item = G_EDITOR_ITEM(bar); -    update_access_in_menu_edition(item->ref, view, addr); +    update_access_in_menu_edition(item->ref, vpanel, addr);  } diff --git a/src/gui/status.c b/src/gui/status.c index a3daded..f1171bd 100644 --- a/src/gui/status.c +++ b/src/gui/status.c @@ -250,9 +250,11 @@ static void track_caret_address_for_status_info(GStatusInfo *info, GtkBufferView  static void focus_address_in_status_info(GStatusInfo *info, GLoadedBinary *binary, const vmpa2t *addr)  { +    GEditorItem *item;                      /* Autre version de l'élément  */      GArchProcessor *proc;                   /* Architecture du binaire     */      GArchInstruction *instr;                /* Instruction présente        */ -    GEditorItem *item;                      /* Autre version de l'élément  */ + +    item = G_EDITOR_ITEM(info);      if (addr == NULL)          gtk_status_stack_reset_current_instruction(GTK_STATUS_STACK(item->widget)); @@ -264,7 +266,6 @@ static void focus_address_in_status_info(GStatusInfo *info, GLoadedBinary *binar          instr = _g_arch_processor_find_instr_by_address(proc, addr, true);          assert(instr != NULL); -        item = G_EDITOR_ITEM(info);          gtk_status_stack_update_current_instruction(GTK_STATUS_STACK(item->widget), binary, instr);          g_object_unref(G_OBJECT(proc)); diff --git a/src/gui/tb/source.c b/src/gui/tb/source.c index 61ad242..466bade 100644 --- a/src/gui/tb/source.c +++ b/src/gui/tb/source.c @@ -309,7 +309,7 @@ static void change_selected_source(GtkComboBox *widget, GSourceTbItem *item)      binary = G_LOADED_BINARY(g_object_get_data(ref, "current_binary"));      buffer = g_loaded_binary_get_decompiled_buffer(binary, index); -    view = GTK_BUFFER_VIEW(g_object_get_data(ref, "current_view")); +    view = GTK_BUFFER_VIEW(g_object_get_data(ref, /*"current_view"*/)); /* TODO : utiliser g_editor_item_get_current_view() */      if (GTK_IS_BUFFER_VIEW(view))          gtk_buffer_view_attach_buffer(view, buffer,                                        g_loaded_binary_display_decomp_lines(binary), NULL); | 
