From 6889d5b00893746a4ca19f4fa39ce54ee7dc7d88 Mon Sep 17 00:00:00 2001 From: Rui Matos Date: Wed, 13 Apr 2011 11:26:55 +0100 Subject: [PATCH] GtkWindow: set mnemonics visible on focus in if modifier is pressed With gtk-auto-mnemonics on, we hide mnemonics on focus out. We should also check if the modifier is pressed on focus in and if so, show mnemonics again. https://bugzilla.gnome.org/show_bug.cgi?id=618815 --- gtk/gtkwindow.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 04cad00a37..04cf5c9ad4 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -5928,11 +5928,43 @@ do_focus_change (GtkWidget *widget, g_object_unref (widget); } +static void +maybe_set_mnemonics_visible (GtkWindow *window) +{ + GList *devices, *d; + GdkDeviceManager *device_manager; + + device_manager = gdk_display_get_device_manager (gtk_widget_get_display (GTK_WIDGET (window))); + devices = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_MASTER); + + for (d = devices; d; d = d->next) + { + GdkDevice *dev = d->data; + + if (gdk_device_get_source (dev) == GDK_SOURCE_MOUSE) + { + GdkModifierType mask; + + gdk_device_get_state (dev, gtk_widget_get_window (GTK_WIDGET (window)), + NULL, &mask); + + if (window->priv->mnemonic_modifier & mask) + { + gtk_window_set_mnemonics_visible (window, TRUE); + break; + } + } + } + + g_list_free (devices); +} + static gint gtk_window_focus_in_event (GtkWidget *widget, GdkEventFocus *event) { GtkWindow *window = GTK_WINDOW (widget); + gboolean auto_mnemonics; /* It appears spurious focus in events can occur when * the window is hidden. So we'll just check to see if @@ -5943,6 +5975,11 @@ gtk_window_focus_in_event (GtkWidget *widget, { _gtk_window_set_has_toplevel_focus (window, TRUE); _gtk_window_set_is_active (window, TRUE); + + g_object_get (gtk_widget_get_settings (widget), + "gtk-auto-mnemonics", &auto_mnemonics, NULL); + if (auto_mnemonics) + maybe_set_mnemonics_visible (window); } return FALSE;