summaryrefslogtreecommitdiff
path: root/src/gui/editor.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2017-01-27 22:51:43 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2017-01-27 22:51:43 (GMT)
commit7640b28691817aea89fc5a5dd5e74fd0b40c516f (patch)
tree5b8dc6b6746575fb4bbfcefff36fc9af5f6a2c17 /src/gui/editor.c
parent56b84c3624c59c8a1796bf411b7ba950d12ddfc5 (diff)
Made the menu bar appear and disappear in the same way Firefox does.
Diffstat (limited to 'src/gui/editor.c')
-rw-r--r--src/gui/editor.c169
1 files changed, 159 insertions, 10 deletions
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);