[gtk/teardown-cleanup: 2/4] Clean up bin disposal



commit 8dfa7870ca5906fc60c78cc6563a686d4e4f9aa7
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun May 10 16:12:52 2020 -0400

    Clean up bin disposal
    
    When all the GtkBin subclasses were converted to widgets with
    their own dispose(), we made them call gtk_widget_unparent()
    on their child. Unfortunately, this is not sufficient to break
    reference cycles. We need to call gtk_widget_destroy() on
    them to make sure that the dispose is propagated.
    
    The main offender here is the treeview, which keeps a bunch
    of row references which are holding references to itself.
    
    This was showing up as leaks when running anything using a file
    chooser or print dialog with GTK_WIDGET_ASSERT_COMPONENTS=1.

 gtk/gtkaspectframe.c       | 2 +-
 gtk/gtkbutton.c            | 2 +-
 gtk/gtkcombobox.c          | 2 +-
 gtk/gtkfilechooserwidget.c | 2 +-
 gtk/gtkflowbox.c           | 2 +-
 gtk/gtkframe.c             | 4 ++--
 gtk/gtklistbox.c           | 2 +-
 gtk/gtkoverlay.c           | 4 ++--
 gtk/gtkpopover.c           | 2 +-
 gtk/gtkrevealer.c          | 2 +-
 gtk/gtkscrolledwindow.c    | 2 +-
 gtk/gtksearchbar.c         | 2 +-
 gtk/gtkviewport.c          | 2 +-
 gtk/gtkwindow.c            | 5 +++--
 14 files changed, 18 insertions(+), 17 deletions(-)
---
diff --git a/gtk/gtkaspectframe.c b/gtk/gtkaspectframe.c
index 5e96ecc433..e0830d12bb 100644
--- a/gtk/gtkaspectframe.c
+++ b/gtk/gtkaspectframe.c
@@ -187,7 +187,7 @@ gtk_aspect_frame_dispose (GObject *object)
 {
   GtkAspectFrame *self = GTK_ASPECT_FRAME (object);
 
-  g_clear_pointer (&self->child, gtk_widget_unparent);
+  g_clear_pointer (&self->child, gtk_widget_destroy);
 
   G_OBJECT_CLASS (gtk_aspect_frame_parent_class)->dispose (object);
 }
diff --git a/gtk/gtkbutton.c b/gtk/gtkbutton.c
index 7c10d21b16..46e7cc5cbd 100644
--- a/gtk/gtkbutton.c
+++ b/gtk/gtkbutton.c
@@ -450,7 +450,7 @@ gtk_button_dispose (GObject *object)
   GtkButton *button = GTK_BUTTON (object);
   GtkButtonPrivate *priv = gtk_button_get_instance_private (button);
 
-  g_clear_pointer (&priv->child, gtk_widget_unparent);
+  g_clear_pointer (&priv->child, gtk_widget_destroy);
   g_clear_object (&priv->action_helper);
 
   G_OBJECT_CLASS (gtk_button_parent_class)->dispose (object);
diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c
index 266e1d1afe..882aca881d 100644
--- a/gtk/gtkcombobox.c
+++ b/gtk/gtkcombobox.c
@@ -2402,7 +2402,7 @@ gtk_combo_box_dispose (GObject* object)
       /* destroy things (unparent will kill the latest ref from us)
        * last unref on button will destroy the arrow
        */
-      gtk_widget_unparent (priv->box);
+      gtk_widget_destroy (priv->box);
       priv->box = NULL;
       priv->button = NULL;
       priv->arrow = NULL;
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c
index 6dae50bb0d..9b520a35c7 100644
--- a/gtk/gtkfilechooserwidget.c
+++ b/gtk/gtkfilechooserwidget.c
@@ -3101,7 +3101,7 @@ gtk_file_chooser_widget_dispose (GObject *object)
       impl->external_entry = NULL;
     }
 
-  g_clear_pointer (&impl->box, gtk_widget_unparent);
+  g_clear_pointer (&impl->box, gtk_widget_destroy);
 
   G_OBJECT_CLASS (gtk_file_chooser_widget_parent_class)->dispose (object);
 }
diff --git a/gtk/gtkflowbox.c b/gtk/gtkflowbox.c
index 98d66f18ed..145d1dd4a3 100644
--- a/gtk/gtkflowbox.c
+++ b/gtk/gtkflowbox.c
@@ -424,7 +424,7 @@ gtk_flow_box_child_dispose (GObject *object)
   GtkFlowBoxChild *self = GTK_FLOW_BOX_CHILD (object);
   GtkFlowBoxChildPrivate *priv = CHILD_PRIV (self);
 
-  g_clear_pointer (&priv->child, gtk_widget_unparent);
+  g_clear_pointer (&priv->child, gtk_widget_destroy);
 
   G_OBJECT_CLASS (gtk_flow_box_child_parent_class)->dispose (object);
 }
diff --git a/gtk/gtkframe.c b/gtk/gtkframe.c
index a066e76c4b..a906ccebf1 100644
--- a/gtk/gtkframe.c
+++ b/gtk/gtkframe.c
@@ -240,8 +240,8 @@ gtk_frame_dispose (GObject *object)
   GtkFrame *frame = GTK_FRAME (object);
   GtkFramePrivate *priv = gtk_frame_get_instance_private (frame);
 
-  g_clear_pointer (&priv->label_widget, gtk_widget_unparent);
-  g_clear_pointer (&priv->child, gtk_widget_unparent);
+  g_clear_pointer (&priv->label_widget, gtk_widget_destroy);
+  g_clear_pointer (&priv->child, gtk_widget_destroy);
 
   G_OBJECT_CLASS (gtk_frame_parent_class)->dispose (object);
 }
diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c
index fd9376ae35..736b184e16 100644
--- a/gtk/gtklistbox.c
+++ b/gtk/gtklistbox.c
@@ -3376,7 +3376,7 @@ gtk_list_box_row_dispose (GObject *object)
   GtkListBoxRowPrivate *priv = ROW_PRIV (row);
 
   g_clear_object (&priv->action_helper);
-  g_clear_pointer (&priv->child, gtk_widget_unparent);
+  g_clear_pointer (&priv->child, gtk_widget_destroy);
 
   G_OBJECT_CLASS (gtk_list_box_row_parent_class)->dispose (object);
 }
diff --git a/gtk/gtkoverlay.c b/gtk/gtkoverlay.c
index b5c0d0d169..580cdbc8e8 100644
--- a/gtk/gtkoverlay.c
+++ b/gtk/gtkoverlay.c
@@ -270,10 +270,10 @@ gtk_overlay_dispose (GObject *object)
   GtkOverlay *overlay = GTK_OVERLAY (object);
   GtkWidget *child;
 
-  g_clear_pointer (&overlay->child, gtk_widget_unparent);
+  g_clear_pointer (&overlay->child, gtk_widget_destroy);
 
   while ((child = gtk_widget_get_first_child (GTK_WIDGET (overlay))))
-    gtk_widget_unparent (child);
+    gtk_widget_destroy (child);
 
   G_OBJECT_CLASS (gtk_overlay_parent_class)->dispose (object);
 }
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index 7b21e2b725..ddae381a95 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -1025,7 +1025,7 @@ gtk_popover_dispose (GObject *object)
   GtkPopover *popover = GTK_POPOVER (object);
   GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
 
-  g_clear_pointer (&priv->contents_widget, gtk_widget_unparent);
+  g_clear_pointer (&priv->contents_widget, gtk_widget_destroy);
   g_clear_pointer (&priv->arrow_render_node, gsk_render_node_unref);
 
   G_OBJECT_CLASS (gtk_popover_parent_class)->dispose (object);
diff --git a/gtk/gtkrevealer.c b/gtk/gtkrevealer.c
index d325686a39..95dacdc015 100644
--- a/gtk/gtkrevealer.c
+++ b/gtk/gtkrevealer.c
@@ -175,7 +175,7 @@ gtk_revealer_dispose (GObject *obj)
   GtkRevealer *revealer = GTK_REVEALER (obj);
   GtkRevealerPrivate *priv = gtk_revealer_get_instance_private (revealer);
 
-  g_clear_pointer (&priv->child, gtk_widget_unparent);
+  g_clear_pointer (&priv->child, gtk_widget_destroy);
 
   G_OBJECT_CLASS (gtk_revealer_parent_class)->dispose (obj);
 }
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index 24bdd5a063..ea7394f0a5 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -2617,7 +2617,7 @@ gtk_scrolled_window_dispose (GObject *object)
   GtkScrolledWindow *self = GTK_SCROLLED_WINDOW (object);
   GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (self);
 
-  g_clear_pointer (&priv->child, gtk_widget_unparent);
+  g_clear_pointer (&priv->child, gtk_widget_destroy);
 
   remove_indicator (self, &priv->hindicator);
   remove_indicator (self, &priv->vindicator);
diff --git a/gtk/gtksearchbar.c b/gtk/gtksearchbar.c
index a4796fa248..ecdc8ec016 100644
--- a/gtk/gtksearchbar.c
+++ b/gtk/gtksearchbar.c
@@ -248,7 +248,7 @@ gtk_search_bar_dispose (GObject *object)
   gtk_search_bar_set_key_capture_widget (bar, NULL);
   gtk_search_bar_set_entry (bar, NULL);
 
-  g_clear_pointer (&bar->revealer, gtk_widget_unparent);
+  g_clear_pointer (&bar->revealer, gtk_widget_destroy);
 
   bar->child = NULL;
   bar->box_center = NULL;
diff --git a/gtk/gtkviewport.c b/gtk/gtkviewport.c
index c85f7a5142..f92b64b766 100644
--- a/gtk/gtkviewport.c
+++ b/gtk/gtkviewport.c
@@ -319,7 +319,7 @@ gtk_viewport_dispose (GObject *object)
 
   clear_focus_change_handler (viewport);
 
-  g_clear_pointer (&viewport->child, gtk_widget_unparent);
+  g_clear_pointer (&viewport->child, gtk_widget_destroy);
 
   G_OBJECT_CLASS (gtk_viewport_parent_class)->dispose (object);
 
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 07bf4d8103..925acbe3b8 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -2404,8 +2404,9 @@ gtk_window_dispose (GObject *object)
   gtk_window_set_focus (window, NULL);
   gtk_window_set_default_widget (window, NULL);
 
-  g_clear_pointer (&priv->child, gtk_widget_unparent);
-  unset_titlebar (window);
+  g_clear_pointer (&priv->child, gtk_widget_destroy);
+  g_clear_pointer (&priv->title_box, gtk_widget_destroy);
+  priv->titlebar = NULL;
 
   G_OBJECT_CLASS (gtk_window_parent_class)->dispose (object);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]