diff options
author | Matthias Clasen <mclasen@redhat.com> | 2004-12-10 22:09:22 +0000 |
---|---|---|
committer | Matthias Clasen <matthiasc@src.gnome.org> | 2004-12-10 22:09:22 +0000 |
commit | f3a74ace5f69840657813cd68f441ceadea671e8 (patch) | |
tree | f7472b9e2844e5b6a983fc8586bf0b6d08edf6ca /gtk/gtklabel.c | |
parent | 5c98a5ebee6c2554d5d230e18091e071aca7292a (diff) | |
download | gtk+-f3a74ace5f69840657813cd68f441ceadea671e8.tar.gz |
Support no-Alt mnemnonics in menu bars (#101309, Owen Taylor)
2004-12-10 Matthias Clasen <mclasen@redhat.com>
Support no-Alt mnemnonics in menu bars (#101309, Owen Taylor)
* gtk/gtkwindow.c: Factor out mnemonic hash code into
a separate file.
* gtk/gtkmnemonichash.[hc]: Factored out mnemonic hash
code from gtkwindow.c.
* gtk/Makefile.am (gtk_c_sources): Add gtkmnemonichash.[hc].
* gtk/gtkmenushell.c (struct _GtkMenuShellPrivate): Give
menu shells their own mnemonic hash.
* gtk/gtkmenushell.h: Add private api to support mnemonics.
* gtk/gtklabel.c (gtk_label_setup_mnemonic): Add mnemonic to
the menushell mnemonic hash when inside a menu.
Diffstat (limited to 'gtk/gtklabel.c')
-rw-r--r-- | gtk/gtklabel.c | 56 |
1 files changed, 44 insertions, 12 deletions
diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c index b9c4c2971f..8a95d94512 100644 --- a/gtk/gtklabel.c +++ b/gtk/gtklabel.c @@ -833,27 +833,59 @@ static void gtk_label_setup_mnemonic (GtkLabel *label, guint last_key) { + GtkWidget *widget = GTK_WIDGET (label); GtkWidget *toplevel; - - if (last_key != GDK_VoidSymbol && label->mnemonic_window) + GtkWidget *mnemonic_menu; + + mnemonic_menu = g_object_get_data (G_OBJECT (label), "gtk-mnemonic-menu"); + + if (last_key != GDK_VoidSymbol) { - gtk_window_remove_mnemonic (label->mnemonic_window, - last_key, - GTK_WIDGET (label)); - label->mnemonic_window = NULL; + if (label->mnemonic_window) + { + gtk_window_remove_mnemonic (label->mnemonic_window, + last_key, + widget); + label->mnemonic_window = NULL; + } + if (mnemonic_menu) + { + _gtk_menu_shell_remove_mnemonic (GTK_MENU_SHELL (mnemonic_menu), + last_key, + widget); + label->mnemonic_window = NULL; + } } if (label->mnemonic_keyval == GDK_VoidSymbol) return; - - toplevel = gtk_widget_get_toplevel (GTK_WIDGET (label)); + + toplevel = gtk_widget_get_toplevel (widget); if (GTK_WIDGET_TOPLEVEL (toplevel)) { - gtk_window_add_mnemonic (GTK_WINDOW (toplevel), - label->mnemonic_keyval, - GTK_WIDGET (label)); - label->mnemonic_window = GTK_WINDOW (toplevel); + GtkWidget *menu_shell; + + menu_shell = gtk_widget_get_ancestor (widget, + GTK_TYPE_MENU_SHELL); + + if (menu_shell) + { + _gtk_menu_shell_add_mnemonic (GTK_MENU_SHELL (menu_shell), + label->mnemonic_keyval, + widget); + mnemonic_menu = menu_shell; + } + + if (!(menu_shell && GTK_IS_MENU (menu_shell))) + { + gtk_window_add_mnemonic (GTK_WINDOW (toplevel), + label->mnemonic_keyval, + widget); + label->mnemonic_window = GTK_WINDOW (toplevel); + } } + + g_object_set_data (G_OBJECT (label), "gtk-mnemonic-menu", mnemonic_menu); } static void |