From 16c917248fd3de8ff4906bc0f4582a6d718fa88a Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Mon, 2 Sep 2019 07:52:59 +0200
Subject: Fixed access to the main menus.

---
 src/gui/editor.c | 136 ++++++++++++++-----------------------------------------
 1 file changed, 34 insertions(+), 102 deletions(-)

diff --git a/src/gui/editor.c b/src/gui/editor.c
index f2807bf..75efc2f 100644
--- a/src/gui/editor.c
+++ b/src/gui/editor.c
@@ -76,14 +76,13 @@ static gboolean on_delete_editor(GtkWidget *, GdkEvent *, gpointer);
 /* Quitte le programme en sortie de la boucle de GTK. */
 static void on_destroy_editor(GtkWidget *, GObject *);
 
-/* Réagit à un changement de focus pour l'éditeur. */
-static gboolean on_focus_out(GtkWidget *, GdkEventFocus *, GObject *);
 
-/* Encadre certains raccourcis actionnés sur un menu. */
-static gboolean track_espace_on_main_submenu(GtkWidget *, GdkEventKey *, GtkWidget *);
 
-/* Permet la disparition de la barre de menus avec le clavier. */
-static void track_root_menubars(GtkContainer *, bool);
+/* ------------------------- AFFICHAGE DE LA BARRE DE MENUS ------------------------- */
+
+
+/* Réagit à un changement d'état pour l'éditeur. */
+static gboolean on_window_state_changed(GtkWidget *, GdkEvent *, GObject *);
 
 /* Suit la frappe de touches sur la fenêtre principale. */
 static gboolean on_key_event(GtkWidget *, GdkEventKey *, GObject *);
@@ -241,12 +240,10 @@ GtkWidget *create_editor(void)
     g_signal_connect(ref, "delete-event", G_CALLBACK(on_delete_editor), NULL);
     g_signal_connect(ref, "destroy", G_CALLBACK(on_destroy_editor), ref);
 
-    g_signal_connect(ref, "focus-out-event", G_CALLBACK(on_focus_out), ref);
+    g_signal_connect(ref, "window-state-event", G_CALLBACK(on_window_state_changed), ref);
     g_signal_connect(ref, "key-press-event", G_CALLBACK(on_key_event), ref);
     g_signal_connect(ref, "key-release-event", G_CALLBACK(on_key_event), ref);
 
-
-
     accgroup = gtk_accel_group_new();
     set_accel_group(accgroup);
 
@@ -406,10 +403,6 @@ static void on_destroy_editor(GtkWidget *widget, GObject *ref)
 
     gtk_tiled_grid_save_positions(get_tiled_grid(), get_main_configuration());
 
-    /* ... */
-
-    on_focus_out(widget, NULL, ref);
-
     /* On évite de mettre à jour un affichage disparu... */
     register_project_change_notification(NULL);
 
@@ -422,13 +415,19 @@ static void on_destroy_editor(GtkWidget *widget, GObject *ref)
 }
 
 
+
+/* ---------------------------------------------------------------------------------- */
+/*                           AFFICHAGE DE LA BARRE DE MENUS                           */
+/* ---------------------------------------------------------------------------------- */
+
+
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : widget = fenêtre de l'éditeur de préférences.                *
+*  Paramètres  : widget = fenêtre principale de l'éditeur.                    *
 *                event  = informations liées à l'événement.                   *
 *                ref    = espace de référencement global.                     *
 *                                                                             *
-*  Description : Réagit à un changement de focus pour l'éditeur.              *
+*  Description : Réagit à un changement d'état pour l'éditeur.                *
 *                                                                             *
 *  Retour      : TRUE pour arrêter la propagation du signal, FALSE sinon.     *
 *                                                                             *
@@ -436,90 +435,36 @@ static void on_destroy_editor(GtkWidget *widget, GObject *ref)
 *                                                                             *
 ******************************************************************************/
 
-static gboolean on_focus_out(GtkWidget *widget, GdkEventFocus *event, GObject *ref)
+static gboolean on_window_state_changed(GtkWidget *widget, GdkEvent *event, GObject *ref)
 {
+    gboolean result;                        /* Consommation à retourner    */
+    GdkWindow *window;                      /* Fenêtre principale          */
+    GdkWindowState state;                   /* Statut courant d'affichage  */
     GtkWidget *menuboard;                   /* Planche de menu à traiter   */
 
-    menuboard = GTK_WIDGET(g_object_get_data(ref, "menuboard"));
-
-    if (gtk_widget_get_visible(menuboard))
-    {
-        track_root_menubars(GTK_CONTAINER(menuboard), false);
-        gtk_widget_hide(menuboard);
-    }
-
-    return FALSE;
-
-}
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : menu  = composant actif pour la réception des touches.       *
-*                event = informations liées à l'événement.                    *
-*                item  = menu parent à manipuler au besoin.                   *
-*                                                                             *
-*  Description : Encadre certains raccourcis actionnés sur un menu.           *
-*                                                                             *
-*  Retour      : FALSE afin de poursuivre la propagation de l'événement.      *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static gboolean track_espace_on_main_submenu(GtkWidget *menu, GdkEventKey *event, GtkWidget *item)
-{
-    GtkWidget *mbar;                        /* Barre de menus principale   */
-
-    if (event->keyval == GDK_KEY_Escape)
-    {
-        mbar = gtk_widget_get_parent(item);
-        track_root_menubars(GTK_CONTAINER(mbar), false);
-        gtk_widget_hide(mbar);
-    }
-
-    return FALSE;
-
-}
-
+    result = FALSE;
 
+    window = gtk_widget_get_window(widget);
 
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : menubar = barre de menu principale à traiter.                *
-*                set     = indique si la surveillance est à activer ou non.   *
-*                                                                             *
-*  Description : Permet la disparition de la barre de menus avec le clavier.  *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
+    state = gdk_window_get_state(window);
 
-static void track_root_menubars(GtkContainer *menubar, bool set)
-{
-    void browse_all_main_items(GtkWidget *item, bool *track)
+    if ((state & GDK_WINDOW_STATE_FOCUSED) == 0)
     {
-        GtkWidget *menu;                    /* Menu à traiter              */
-
-        menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(item));
+        menuboard = GTK_WIDGET(g_object_get_data(ref, "menuboard"));
 
-        if (*track)
-            g_signal_connect(menu, "key-press-event", G_CALLBACK(track_espace_on_main_submenu), item);
-        else
-            g_signal_handlers_disconnect_by_func(menu, G_CALLBACK(track_espace_on_main_submenu), item);
+        if (gtk_widget_get_visible(menuboard))
+            gtk_widget_hide(menuboard);
 
     }
 
-    gtk_container_foreach(menubar, (GtkCallback)browse_all_main_items, &set);
+    return result;
 
 }
 
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : widget = fenêtre de l'éditeur de préférences.                *
+*  Paramètres  : widget = fenêtre principale de l'éditeur.                    *
 *                event  = informations liées à l'événement.                   *
 *                ref    = espace de référencement global.                     *
 *                                                                             *
@@ -533,42 +478,29 @@ static void track_root_menubars(GtkContainer *menubar, bool set)
 
 static gboolean on_key_event(GtkWidget *widget, GdkEventKey *event, GObject *ref)
 {
+    gboolean result;                        /* Consommation à retourner    */
     GtkWidget *menuboard;                   /* Planche de menu à traiter   */
 
-    static bool skip_event = false;
+    result = FALSE;
+
+    result = (event->keyval == GDK_KEY_Alt_L);
 
     menuboard = GTK_WIDGET(g_object_get_data(ref, "menuboard"));
 
     if (gtk_widget_get_visible(menuboard))
     {
         if (event->type == GDK_KEY_PRESS && event->keyval == GDK_KEY_Alt_L)
-        {
-            skip_event = true;
-            track_root_menubars(GTK_CONTAINER(menuboard), false);
             gtk_widget_hide(menuboard);
-        }
+
     }
     else
     {
-        if (event->type == GDK_KEY_PRESS && event->state == GDK_MOD1_MASK)
-        {
-            track_root_menubars(GTK_CONTAINER(menuboard), true);
+        if (event->type == GDK_KEY_PRESS && event->keyval == GDK_KEY_Alt_L)
             gtk_widget_show(menuboard);
-        }
 
-        else if (event->type == GDK_KEY_RELEASE && event->keyval == GDK_KEY_Alt_L)
-        {
-            if (skip_event)
-                skip_event = false;
-            else
-            {
-                track_root_menubars(GTK_CONTAINER(menuboard), true);
-                gtk_widget_show(menuboard);
-            }
-        }
     }
 
-    return FALSE;
+    return result;
 
 }
 
-- 
cgit v0.11.2-87-g4458