stack: Dispose children before emitting items-changed
authorJulian Sparber <julian@sparber.net>
Mon, 13 Sep 2021 14:29:30 +0000 (16:29 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 31 Oct 2021 21:52:04 +0000 (17:52 -0400)
This makes sure that the `GListModel` returned by
`gtk_stack_get_pages()` actually has the items removed before
`items-changed` is emitted.

Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/4255
gtk/gtkstack.c

index dffc603452f30c6325d9a0a1b3189252a1ecb71a..469a25714a1bac41c7d4e979e6ae6fbb9bff3977 100644 (file)
@@ -690,13 +690,14 @@ gtk_stack_dispose (GObject *obj)
   GtkStack *stack = GTK_STACK (obj);
   GtkStackPrivate *priv = gtk_stack_get_instance_private (stack);
   GtkWidget *child;
-
-  if (priv->pages)
-    g_list_model_items_changed (G_LIST_MODEL (priv->pages), 0, g_list_length (priv->children), 0);
+  guint n_pages = g_list_length (priv->children);
 
   while ((child = gtk_widget_get_first_child (GTK_WIDGET (stack))))
     stack_remove (stack, child, TRUE);
 
+  if (priv->pages)
+    g_list_model_items_changed (G_LIST_MODEL (priv->pages), 0, n_pages, 0);
+
   G_OBJECT_CLASS (gtk_stack_parent_class)->dispose (obj);
 }