From 16c917248fd3de8ff4906bc0f4582a6d718fa88a Mon Sep 17 00:00:00 2001 From: Cyrille Bagard 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