From 7640b28691817aea89fc5a5dd5e74fd0b40c516f Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Fri, 27 Jan 2017 23:51:43 +0100
Subject: Made the menu bar appear and disappear in the same way Firefox does.

---
 ChangeLog                  |  26 +++++++
 src/gtkext/easygtk.c       |  57 +++++++++++++++
 src/gtkext/easygtk.h       |   3 +
 src/gui/editor.c           | 169 ++++++++++++++++++++++++++++++++++++++++++---
 src/gui/menus/binary.c     |   3 +-
 src/gui/menus/debug.c      |   3 +-
 src/gui/menus/edition.c    |  12 ++--
 src/gui/menus/file.c       |   5 +-
 src/gui/menus/help.c       |   3 +-
 src/gui/menus/plugins.c    |   3 +-
 src/gui/menus/project.c    |   9 +--
 src/gui/menus/view.c       |   6 +-
 src/gui/panels/bookmarks.c |   2 +-
 src/gui/panels/regedit.c   |   2 +-
 src/gui/panels/strings.c   |   2 +-
 src/gui/panels/welcome.c   |   6 +-
 16 files changed, 268 insertions(+), 43 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 0249b88..bd3d98f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+17-01-27  Cyrille Bagard <nocbos@gmail.com>
+
+	* src/gtkext/easygtk.c:
+	* src/gtkext/easygtk.h:
+	Create menus with extended escape key support. Activate accelerators
+	based on sensitive state only.
+
+	* src/gui/editor.c:
+	Make the menu bar appear and disappear in the same way Firefox does.
+
+	* src/gui/menus/binary.c:
+	* src/gui/menus/debug.c:
+	* src/gui/menus/edition.c:
+	* src/gui/menus/file.c:
+	* src/gui/menus/help.c:
+	* src/gui/menus/plugins.c:
+	* src/gui/menus/project.c:
+	* src/gui/menus/view.c:
+	* src/gui/panels/bookmarks.c:
+	* src/gui/panels/regedit.c:
+	* src/gui/panels/strings.c:
+	Update code.
+
+	* src/gui/panels/welcome.c:
+	Add a tip of the day.
+
 17-01-22  Cyrille Bagard <nocbos@gmail.com>
 
 	* src/glibext/gbinportion.c:
diff --git a/src/gtkext/easygtk.c b/src/gtkext/easygtk.c
index 706505b..b931ff0 100644
--- a/src/gtkext/easygtk.c
+++ b/src/gtkext/easygtk.c
@@ -819,6 +819,56 @@ GtkWidget *qck_create_combobox_with_entry(GObject *object, const char *name, GCa
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : item = élément de menu devant recevoir un sous-menu.         *
+*                                                                             *
+*  Description : Met en place un support de menu 'GtkMenu'.                   *
+*                                                                             *
+*  Retour      : Rceptacle pour sous-éléments de menu.                        *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+GtkWidget *qck_create_menu(GtkMenuItem *item)
+{
+    GtkWidget *result;                      /* Composant à retourner       */
+
+    result = gtk_menu_new();
+
+    if (item != NULL)
+    {
+        gtk_menu_item_set_submenu(item, result);
+
+        gboolean handle_escape_on_menu(GtkWidget *menu, GdkEventKey *event, GtkMenuItem *item)
+        {
+            if (event->keyval == GDK_KEY_Escape)
+            {
+                gtk_widget_hide(menu);
+                gtk_menu_item_deselect(item);
+            }
+
+            return FALSE;
+
+        }
+
+        g_signal_connect(result, "key-press-event", G_CALLBACK(handle_escape_on_menu), item);
+
+        void show_parent_selection(GtkWidget *widget, GtkMenuItem *item)
+        {
+            gtk_menu_item_select(item);
+        }
+
+        g_signal_connect(result, "show", G_CALLBACK(show_parent_selection), item);
+
+    }
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : object  = espace dédié à l'inscription de références.        *
 *                name    = nom à donner au nouveau composant.                 *
 *                caption = intitulé du menu à créer.                          *
@@ -953,6 +1003,13 @@ void add_accelerator_to_menu_item(GtkWidget *item, const char *accelerator, GtkA
 
     gtk_accelerator_parse(accelerator, &key, &mods);
 
+    gboolean enable_accel_all_the_time(GtkWidget *widget, guint signal_id, gpointer unused)
+    {
+        return gtk_widget_is_sensitive(widget);
+    }
+
+    g_signal_connect(item, "can-activate-accel", G_CALLBACK(enable_accel_all_the_time), NULL);
+
     gtk_widget_add_accelerator(item, "activate", group,
                                key, mods, GTK_ACCEL_VISIBLE);
 
diff --git a/src/gtkext/easygtk.h b/src/gtkext/easygtk.h
index 1beb536..fb6ad5a 100644
--- a/src/gtkext/easygtk.h
+++ b/src/gtkext/easygtk.h
@@ -92,6 +92,9 @@ GtkWidget *qck_create_combobox2(GObject *, const char *, GCallback, gpointer);
 /* Crée et enregistre un composant 'GtkComboBox'. */
 GtkWidget *qck_create_combobox_with_entry(GObject *, const char *, GCallback, gpointer);
 
+/* Met en place un support de menu 'GtkMenu'. */
+GtkWidget *qck_create_menu(GtkMenuItem *);
+
 /* Crée et enregistre un composant 'GtkMenuItem'. */
 GtkWidget *qck_create_menu_item(GObject *, const char *, const char *, GCallback, gpointer);
 
diff --git a/src/gui/editor.c b/src/gui/editor.c
index 7084980..b856971 100644
--- a/src/gui/editor.c
+++ b/src/gui/editor.c
@@ -71,9 +71,16 @@ GtkWidget *create_editor(void);
 static gboolean on_delete_editor(GtkWidget *, GdkEvent *, gpointer);
 
 /* Quitte le programme en sortie de la boucle de GTK. */
-static void on_destroy_editor(GtkWidget *, gpointer);
+static void on_destroy_editor(GtkWidget *, GObject *);
 
+/* Réagit à un changement de focus pour l'éditeur. */
+static gboolean on_focus_out(GtkWidget *, GdkEventFocus *, GObject *);
 
+/* Permet la disparition de la barre de menus avec le clavier. */
+static void track_root_menubars(GtkContainer *, bool);
+
+/* Suit la frappe de touches sur la fenêtre principale. */
+static gboolean on_key_event(GtkWidget *, GdkEventKey *, GObject *);
 
 
 
@@ -282,11 +289,17 @@ GtkWidget *create_editor(void)
     gtk_window_set_icon_list(GTK_WINDOW(result), icons);
     g_list_free_full(icons, (GDestroyNotify)g_object_unref);
 
-    g_signal_connect(G_OBJECT(result), "delete-event", G_CALLBACK(on_delete_editor), NULL);
-    g_signal_connect(G_OBJECT(result), "destroy", G_CALLBACK(on_destroy_editor), NULL);
-
     ref = G_OBJECT(result);
 
+    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, "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();
     gtk_window_add_accel_group(GTK_WINDOW(result), _accgroup);
 
@@ -307,13 +320,14 @@ GtkWidget *create_editor(void)
 
 
 
+    g_object_set_data(ref, "menuboard", menuboard);
 
-
+    gtk_widget_hide(menuboard);
 
 
     /* Barre d'outils */
 
-    toolbar = build_editor_toolbar(G_OBJECT(result));
+    toolbar = build_editor_toolbar(ref);
     gtk_box_pack_start(GTK_BOX(vbox1), toolbar, FALSE, FALSE, 0);
 
     do
@@ -425,8 +439,7 @@ static gboolean on_delete_editor(GtkWidget *widget, GdkEvent *event, gpointer da
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : widget = fenêtre de l'éditeur de préférences.                *
-*                event  = informations liées à l'événement.                   *
-*                data   = adresse non utilisée ici.                           *
+*                ref    = espace de référencement global.                     *
 *                                                                             *
 *  Description : Quitte le programme en sortie de la boucle de GTK.           *
 *                                                                             *
@@ -436,7 +449,7 @@ static gboolean on_delete_editor(GtkWidget *widget, GdkEvent *event, gpointer da
 *                                                                             *
 ******************************************************************************/
 
-static void on_destroy_editor(GtkWidget *widget, gpointer data)
+static void on_destroy_editor(GtkWidget *widget, GObject *ref)
 {
     GStudyProject *project;                 /* Projet courant              */
 
@@ -447,11 +460,147 @@ static void on_destroy_editor(GtkWidget *widget, gpointer data)
 
     /* ... */
 
+    on_focus_out(widget, NULL, ref);
+
     gtk_main_quit();
 
 }
 
 
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : widget = fenêtre de l'éditeur de préférences.                *
+*                event  = informations liées à l'événement.                   *
+*                ref    = espace de référencement global.                     *
+*                                                                             *
+*  Description : Réagit à un changement de focus pour l'éditeur.              *
+*                                                                             *
+*  Retour      : TRUE pour arrêter la propagation du signal, FALSE sinon.     *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static gboolean on_focus_out(GtkWidget *widget, GdkEventFocus *event, GObject *ref)
+{
+    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  : 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   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void track_root_menubars(GtkContainer *menubar, bool set)
+{
+    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;
+
+    }
+
+    void browse_all_main_items(GtkWidget *item, bool *track)
+    {
+        GtkWidget *menu;                    /* Menu à traiter              */
+
+        menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(item));
+
+        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);
+
+    }
+
+    gtk_container_foreach(menubar, (GtkCallback)browse_all_main_items, &set);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : widget = fenêtre de l'éditeur de préférences.                *
+*                event  = informations liées à l'événement.                   *
+*                ref    = espace de référencement global.                     *
+*                                                                             *
+*  Description : Suit la frappe de touches sur la fenêtre principale.         *
+*                                                                             *
+*  Retour      : FALSE pour poursuivre la propagation de l'événement.         *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static gboolean on_key_event(GtkWidget *widget, GdkEventKey *event, GObject *ref)
+{
+    GtkWidget *menuboard;                   /* Planche de menu à traiter   */
+
+    static bool skip_event = false;
+
+    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);
+            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;
+
+}
+
 
 /* ---------------------------------------------------------------------------------- */
 /*                          INTEGRATION DE LA BARRE D'OUTILS                          */
@@ -1242,7 +1391,7 @@ static void on_dock_menu_request(GtkDockStation *station, GtkWidget *button, GOb
     GList *children;                        /* Composants mis en place     */
     GtkWidget *nopanel;                     /* Sous-élément de menu        */
 
-    menu = GTK_CONTAINER(gtk_menu_new());
+    menu = GTK_CONTAINER(qck_create_menu(NULL));
 
     active = gtk_notebook_get_nth_page(GTK_NOTEBOOK(station), 0);
 
diff --git a/src/gui/menus/binary.c b/src/gui/menus/binary.c
index af6e8c4..0eb28fe 100644
--- a/src/gui/menus/binary.c
+++ b/src/gui/menus/binary.c
@@ -73,8 +73,7 @@ GtkWidget *build_menu_binary(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *ba
     result = gtk_menu_item_new_with_mnemonic(_("_Binary"));
     gtk_widget_show(result);
 
-    menubar = gtk_menu_new();
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(result), menubar);
+    menubar = qck_create_menu(GTK_MENU_ITEM(result));
 
     submenuitem = qck_create_menu_item(ref, "mnu_binary_epoints", _("Entry points"),
                                        G_CALLBACK(mcb_binary_entry_points), bar);
diff --git a/src/gui/menus/debug.c b/src/gui/menus/debug.c
index 79b5ff8..cb270ff 100644
--- a/src/gui/menus/debug.c
+++ b/src/gui/menus/debug.c
@@ -93,8 +93,7 @@ GtkWidget *build_menu_debug(GObject *ref, GtkAccelGroup *accgroup)
     result = gtk_menu_item_new_with_mnemonic(_("_Debug"));
     gtk_widget_show(result);
 
-    menubar = gtk_menu_new();
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(result), menubar);
+    menubar = qck_create_menu(GTK_MENU_ITEM(result));
 
     submenuitem = qck_create_menu_item(ref, "mnu_debug_continue", _("Continue"),
                                        G_CALLBACK(mcb_debug_continue), ref);
diff --git a/src/gui/menus/edition.c b/src/gui/menus/edition.c
index 31fbc0d..f41111d 100644
--- a/src/gui/menus/edition.c
+++ b/src/gui/menus/edition.c
@@ -100,8 +100,7 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
     result = gtk_menu_item_new_with_mnemonic(_("_Edition"));
     gtk_widget_show(result);
 
-    menubar = gtk_menu_new();
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(result), menubar);
+    menubar = qck_create_menu(GTK_MENU_ITEM(result));
 
     submenuitem = qck_create_menu_item(NULL, NULL, _("Go to address..."),
                                        G_CALLBACK(mcb_edition_goto), bar);
@@ -114,8 +113,7 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
     submenuitem = qck_create_menu_item(NULL, NULL, _("Numeric operand"), NULL, NULL);
     gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
 
-    deepmenubar = gtk_menu_new();
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenuitem), deepmenubar);
+    deepmenubar = qck_create_menu(GTK_MENU_ITEM(submenuitem));
 
     deepmenuitem = qck_create_menu_item(ref, "mnu_edit_switch_hex", _("Hexadecimal"),
                                         G_CALLBACK(mcb_edition_switch_numeric_operand), bar);
@@ -181,8 +179,7 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
     submenuitem = qck_create_menu_item(NULL, NULL, _("Bookmarks"), NULL, NULL);
     gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
 
-    deepmenubar = gtk_menu_new();
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenuitem), deepmenubar);
+    deepmenubar = qck_create_menu(GTK_MENU_ITEM(submenuitem));
 
     deepmenuitem = qck_create_menu_item(NULL, NULL, _("Toggle at current location"),
                                         G_CALLBACK(mcb_edition_bookmarks_toggle), bar);
@@ -198,8 +195,7 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
     submenuitem = qck_create_menu_item(NULL, NULL, _("Comments"), NULL, NULL);
     gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
 
-    deepmenubar = gtk_menu_new();
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenuitem), deepmenubar);
+    deepmenubar = qck_create_menu(GTK_MENU_ITEM(submenuitem));
 
     deepmenuitem = qck_create_menu_item(NULL, NULL, _("Enter a comment..."),
                                         G_CALLBACK(mcb_edition_comment_enter), bar);
diff --git a/src/gui/menus/file.c b/src/gui/menus/file.c
index cb69957..c3865b6 100644
--- a/src/gui/menus/file.c
+++ b/src/gui/menus/file.c
@@ -74,8 +74,7 @@ GtkWidget *build_menu_file(GObject *ref, GtkAccelGroup *accgroup)
     result = gtk_menu_item_new_with_mnemonic(_("_File"));
     gtk_widget_show(result);
 
-    menubar = gtk_menu_new();
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(result), menubar);
+    menubar = qck_create_menu(GTK_MENU_ITEM(result));
 
     submenuitem = qck_create_menu_item(NULL, NULL, _("New project"),
                                        G_CALLBACK(mcb_file_new_project), ref);
@@ -299,6 +298,6 @@ static void mcb_file_save_project_as(GtkMenuItem *menuitem, gpointer data)
 
 static void mcb_file_quit(GtkMenuItem *menuitem, GObject *ref)
 {
-    gtk_main_quit();
+    gtk_widget_destroy(GTK_WIDGET(ref));
 
 }
diff --git a/src/gui/menus/help.c b/src/gui/menus/help.c
index 9293540..922fa31 100644
--- a/src/gui/menus/help.c
+++ b/src/gui/menus/help.c
@@ -60,8 +60,7 @@ GtkWidget *build_menu_help(GObject *ref, GtkAccelGroup *accgroup)
     result = gtk_menu_item_new_with_mnemonic(_("_Help"));
     gtk_widget_show(result);
 
-    menubar = gtk_menu_new();
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(result), menubar);
+    menubar = qck_create_menu(GTK_MENU_ITEM(result));
 
     submenuitem = qck_create_menu_item(NULL, NULL, _("About"), G_CALLBACK(mcb_help_about), ref);
     gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
diff --git a/src/gui/menus/plugins.c b/src/gui/menus/plugins.c
index cba6b69..c1b0fc7 100644
--- a/src/gui/menus/plugins.c
+++ b/src/gui/menus/plugins.c
@@ -56,9 +56,8 @@ GtkWidget *build_menu_plugins(GObject *ref, GtkAccelGroup *accgroup)
     result = gtk_menu_item_new_with_mnemonic(_("_Plugins"));
     gtk_widget_show(result);
 
-    menubar = gtk_menu_new();
+    menubar = qck_create_menu(GTK_MENU_ITEM(result));
     g_object_set_data(ref, "menubar_plugins", G_OBJECT(menubar));
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(result), menubar);
 
     return result;
 
diff --git a/src/gui/menus/project.c b/src/gui/menus/project.c
index 58ef244..18c7aaa 100644
--- a/src/gui/menus/project.c
+++ b/src/gui/menus/project.c
@@ -74,14 +74,12 @@ GtkWidget *build_menu_project(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
     result = gtk_menu_item_new_with_mnemonic(_("_Project"));
     gtk_widget_show(result);
 
-    menubar = gtk_menu_new();
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(result), menubar);
+    menubar = qck_create_menu(GTK_MENU_ITEM(result));
 
     submenuitem = qck_create_menu_item(NULL, NULL, _("Add a binary..."), NULL, NULL);
     gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
 
-    deepmenubar = gtk_menu_new();
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenuitem), deepmenubar);
+    deepmenubar = qck_create_menu(GTK_MENU_ITEM(submenuitem));
 
     deepmenuitem = qck_create_menu_item(NULL, NULL, _("Shellcode"),
                                         G_CALLBACK(mcb_project_add_shellcode), bar);
@@ -95,8 +93,7 @@ GtkWidget *build_menu_project(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
                                        NULL, NULL);
     gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
 
-    deepmenubar = gtk_menu_new();
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenuitem), deepmenubar);
+    deepmenubar = qck_create_menu(GTK_MENU_ITEM(submenuitem));
 
     return result;
 
diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c
index 9f29ba3..70cd42e 100644
--- a/src/gui/menus/view.c
+++ b/src/gui/menus/view.c
@@ -82,8 +82,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
     result = gtk_menu_item_new_with_mnemonic(_("_View"));
     gtk_widget_show(result);
 
-    menubar = gtk_menu_new();
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(result), menubar);
+    menubar = qck_create_menu(GTK_MENU_ITEM(result));
 
     /* Affichage -> Panneaux latéraux */
 
@@ -91,8 +90,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
     g_signal_connect(submenuitem, "select", G_CALLBACK(mcb_view_update_side_panels_list), bar);
     gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
 
-    deepmenubar = gtk_menu_new();
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenuitem), deepmenubar);
+    deepmenubar = qck_create_menu(GTK_MENU_ITEM(submenuitem));
 
     /* - */
 
diff --git a/src/gui/panels/bookmarks.c b/src/gui/panels/bookmarks.c
index b58fbc5..5eb018b 100644
--- a/src/gui/panels/bookmarks.c
+++ b/src/gui/panels/bookmarks.c
@@ -1098,7 +1098,7 @@ static GtkMenu *build_bookmarks_panel_menu(GBookmarksPanel *panel)
     GtkWidget *result;                      /* Support à retourner         */
     GtkWidget *submenuitem;                 /* Sous-élément de menu        */
 
-    result = gtk_menu_new();
+    result = qck_create_menu(NULL);
 
     submenuitem = qck_create_menu_item(NULL, NULL, _("Edit"), G_CALLBACK(mcb_bookmarks_panel_edit), panel);
     gtk_container_add(GTK_CONTAINER(result), submenuitem);
diff --git a/src/gui/panels/regedit.c b/src/gui/panels/regedit.c
index 65b268e..579c60b 100644
--- a/src/gui/panels/regedit.c
+++ b/src/gui/panels/regedit.c
@@ -913,7 +913,7 @@ GtkMenu *build_param_panel_menu(GRegeditPanel *panel)
     GtkWidget *result;                      /* Support à retourner         */
     GtkWidget *submenuitem;                 /* Sous-élément de menu        */
 
-    result = gtk_menu_new();
+    result = qck_create_menu(NULL);
 
     submenuitem = qck_create_menu_item(NULL, NULL, _("Copy the name"), G_CALLBACK(mcb_param_panel_copy), panel);
     gtk_container_add(GTK_CONTAINER(result), submenuitem);
diff --git a/src/gui/panels/strings.c b/src/gui/panels/strings.c
index da7f539..60c53f4 100644
--- a/src/gui/panels/strings.c
+++ b/src/gui/panels/strings.c
@@ -873,7 +873,7 @@ static GtkMenu *build_strings_panel_menu(GStringsPanel *panel)
     GtkWidget *result;                      /* Support à retourner         */
     GtkWidget *submenuitem;                 /* Sous-élément de menu        */
 
-    result = gtk_menu_new();
+    result = qck_create_menu(NULL);
 
     submenuitem = qck_create_menu_item(NULL, NULL, _("_Edit name"), NULL, NULL);
     gtk_container_add(GTK_CONTAINER(result), submenuitem);
diff --git a/src/gui/panels/welcome.c b/src/gui/panels/welcome.c
index a007f38..a831a6c 100644
--- a/src/gui/panels/welcome.c
+++ b/src/gui/panels/welcome.c
@@ -378,7 +378,11 @@ static void g_welcome_panel_load_tips(GWelcomePanel *panel)
           "Then run the interpreter suitable to your configuration (debug or release):\n\n"
           "  python3-dbg -c 'import pychrysalide ; print(pychrysalide.mod_version())'"),
 
-        _("All the configuration files for Chrysalide are located in $HOME/.config/chrysalide/.")
+        _("All the configuration files for Chrysalide are located in $HOME/.config/chrysalide/."),
+
+        _("The behavior of the main menu bar is copied from the one of a well known browser "
+          "with a fox mascot.\n\n"
+          "To make the menu bar appear and disappear, juste press and release the Alt key.")
 
     };
 
-- 
cgit v0.11.2-87-g4458