MenuButton: Drop ref to Popover on its ::destroy
authorDaniel Boles <dboles.src@gmail.com>
Sun, 22 Apr 2018 13:52:27 +0000 (14:52 +0100)
committerDaniel Boles <dboles.src@gmail.com>
Sun, 22 Apr 2018 15:11:18 +0000 (16:11 +0100)
Otherwise, if the Popover is destroyed before the MenuButton, the latter
still had a non-NULL but invalid instance and tried to use it in dispose

Close https://gitlab.gnome.org/GNOME/gtk/issues/199

gtk/gtkmenubutton.c

index 2703ea6ee1b9c1449c24526790f6d5c875e3904a..98d139b705c22a84238bf34ebb4ab075568d326f 100644 (file)
@@ -1086,6 +1086,12 @@ gtk_menu_button_get_use_popover (GtkMenuButton *menu_button)
   return priv->use_popover;
 }
 
+static void
+popover_destroy_cb (GtkMenuButton *menu_button)
+{
+  gtk_menu_button_set_popover (menu_button, NULL);
+}
+
 /**
  * gtk_menu_button_set_popover:
  * @menu_button: a #GtkMenuButton
@@ -1127,6 +1133,8 @@ gtk_menu_button_set_popover (GtkMenuButton *menu_button,
       gtk_popover_set_relative_to (GTK_POPOVER (priv->popover), GTK_WIDGET (menu_button));
       g_signal_connect_swapped (priv->popover, "closed",
                                 G_CALLBACK (menu_deactivate_cb), menu_button);
+      g_signal_connect_swapped (priv->popover, "destroy",
+                                G_CALLBACK (popover_destroy_cb), menu_button);
       update_popover_direction (menu_button);
       gtk_style_context_remove_class (gtk_widget_get_style_context (GTK_WIDGET (menu_button)), "menu-button");
     }