summaryrefslogtreecommitdiff
path: root/gtk/gtklabel.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2004-12-10 22:09:22 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2004-12-10 22:09:22 +0000
commitf3a74ace5f69840657813cd68f441ceadea671e8 (patch)
treef7472b9e2844e5b6a983fc8586bf0b6d08edf6ca /gtk/gtklabel.c
parent5c98a5ebee6c2554d5d230e18091e071aca7292a (diff)
downloadgtk+-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.c56
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