diff options
Diffstat (limited to 'src/gui/editor.c')
-rw-r--r-- | src/gui/editor.c | 169 |
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); |