]> Pileus Git - ~andy/gtk/commitdiff
menu: Deactivate the menu if the GdkWindow is withdrawn
authorRob Bradford <rob@linux.intel.com>
Mon, 27 Feb 2012 12:35:25 +0000 (12:35 +0000)
committerRob Bradford <rob@linux.intel.com>
Wed, 29 Feb 2012 12:18:30 +0000 (12:18 +0000)
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
gtk/gtkmenushell.c

index dada3298b612bee93630955345fa073a64b4b4c6..92618c27312b638c2b48a3a8202e9c9a31aad75e 100644 (file)
@@ -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;
     }
index da7c8caa45034bce1a7289fa4c907bb9f16c8b58..b74f424e937de7e2689e45169fc86012633d2901 100644 (file)
@@ -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