summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2019-09-02 05:52:59 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2019-09-02 05:52:59 (GMT)
commit16c917248fd3de8ff4906bc0f4582a6d718fa88a (patch)
treefc8e452924505a1fea3b21bac3dc2e7457a616f8
parentf57420248f65fae9bc0d44849925f8ac5e20ec7f (diff)
Fixed access to the main menus.
-rw-r--r--src/gui/editor.c136
1 files 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;
}