From 7cc3eb04ec5c77f01f25f21ef88723e00a96620e Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Mon, 27 Feb 2012 12:35:25 +0000 Subject: [PATCH] menu: Deactivate the menu if the GdkWindow is withdrawn If the display server or GDK hides the window - fire the "deactivate" signal to ensure that the internal state is consistent. This patch also ensures that the "deactivate" signal will not be fired for a menu that is not active. Bug: https://bugzilla.gnome.org/show_bug.cgi?id=670881 --- gtk/gtkmenu.c | 9 +++++++++ gtk/gtkmenushell.c | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c index dada3298b6..92618c2731 100644 --- a/gtk/gtkmenu.c +++ b/gtk/gtkmenu.c @@ -1018,6 +1018,15 @@ gtk_menu_window_event (GtkWidget *window, case GDK_KEY_RELEASE: handled = gtk_widget_event (menu, event); break; + case GDK_WINDOW_STATE: + /* Window for the menu has been closed by the display server or by GDK. + * Update the internal state as if the user had clicked outside the + * menu + */ + if (event->window_state.new_window_state & GDK_WINDOW_STATE_WITHDRAWN && + event->window_state.changed_mask & GDK_WINDOW_STATE_WITHDRAWN) + gtk_menu_shell_deactivate (GTK_MENU_SHELL(menu)); + break; default: break; } diff --git a/gtk/gtkmenushell.c b/gtk/gtkmenushell.c index da7c8caa45..b74f424e93 100644 --- a/gtk/gtkmenushell.c +++ b/gtk/gtkmenushell.c @@ -612,7 +612,8 @@ gtk_menu_shell_deactivate (GtkMenuShell *menu_shell) { g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell)); - g_signal_emit (menu_shell, menu_shell_signals[DEACTIVATE], 0); + if (menu_shell->priv->active) + g_signal_emit (menu_shell, menu_shell_signals[DEACTIVATE], 0); } static void