[gtk/matthiasc/for-master] Clean up bin disposal
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/matthiasc/for-master] Clean up bin disposal
- Date: Sun, 10 May 2020 20:19:26 +0000 (UTC)
commit 4d7a1507f28e27d0d364e6f1f469f6864b61548f
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. This is not sufficient to break reference
cycles, so we 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 544332d00b..43d2d66a54 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -2661,8 +2661,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]