]> Pileus Git - ~andy/gtk/commitdiff
Fixed GtkMenuShell to deactivate itself at dispose time
authorTristan Van Berkom <tristan.van.berkom@gmail.com>
Thu, 25 Nov 2010 05:04:52 +0000 (14:04 +0900)
committerTristan Van Berkom <tristan.van.berkom@gmail.com>
Thu, 25 Nov 2010 05:08:55 +0000 (14:08 +0900)
Since GdkDevice stuff, it seems that destroying an active
menu doesnt get rid of all the device grabery, this fixes
bug 635693.

gtk/gtkmenu.c
gtk/gtkmenushell.c

index 3032f3b95e8ded4624d8e13eafa4dde8e26d7f86..13998ee1b9c3ab7414c3d4023f3b2d0db4201c5d 100644 (file)
@@ -1760,8 +1760,11 @@ gtk_menu_popdown (GtkMenu *menu)
   
   /* The X Grab, if present, will automatically be removed when we hide
    * the window */
-  gtk_widget_hide (menu->toplevel);
-  gtk_window_set_transient_for (GTK_WINDOW (menu->toplevel), NULL);
+  if (menu->toplevel)
+    {
+      gtk_widget_hide (menu->toplevel);
+      gtk_window_set_transient_for (GTK_WINDOW (menu->toplevel), NULL);
+    }
 
   pointer = _gtk_menu_shell_get_grab_device (menu_shell);
 
index d630cdd253502075b4aacfec3059a78d627a24fd..7b94ce9b25d11b914d95d17cc7c35f2f3352faac 100644 (file)
@@ -153,6 +153,7 @@ static void gtk_menu_shell_get_property      (GObject           *object,
                                               GParamSpec        *pspec);
 static void gtk_menu_shell_realize           (GtkWidget         *widget);
 static void gtk_menu_shell_finalize          (GObject           *object);
+static void gtk_menu_shell_dispose           (GObject           *object);
 static gint gtk_menu_shell_button_press      (GtkWidget         *widget,
                                              GdkEventButton    *event);
 static gint gtk_menu_shell_button_release    (GtkWidget         *widget,
@@ -222,6 +223,7 @@ gtk_menu_shell_class_init (GtkMenuShellClass *klass)
   object_class->set_property = gtk_menu_shell_set_property;
   object_class->get_property = gtk_menu_shell_get_property;
   object_class->finalize = gtk_menu_shell_finalize;
+  object_class->dispose = gtk_menu_shell_dispose;
 
   widget_class->realize = gtk_menu_shell_realize;
   widget_class->button_press_event = gtk_menu_shell_button_press;
@@ -463,6 +465,16 @@ gtk_menu_shell_finalize (GObject *object)
 }
 
 
+static void 
+gtk_menu_shell_dispose (GObject           *object)
+{
+  GtkMenuShell *menu_shell = GTK_MENU_SHELL (object);
+
+  gtk_menu_shell_deactivate (menu_shell);
+
+  G_OBJECT_CLASS (gtk_menu_shell_parent_class)->dispose (object);
+}
+
 void
 gtk_menu_shell_append (GtkMenuShell *menu_shell,
                       GtkWidget    *child)