summaryrefslogtreecommitdiff
path: root/gladeui
diff options
context:
space:
mode:
authorJuan Pablo Ugarte <juanpablougarte@gmail.com>2020-07-21 11:05:56 -0300
committerJuan Pablo Ugarte <juanpablougarte@gmail.com>2020-07-26 18:00:20 -0300
commit8918dfb79b957cbc97b435a3d28e8ac9f33e759c (patch)
tree6fc0e9d93319127497646617cdc267db4fc9b377 /gladeui
parent1e85f469b9b05ebf3c5485977f047c836486e1e5 (diff)
downloadglade-8918dfb79b957cbc97b435a3d28e8ac9f33e759c.tar.gz
GladeAdaptorChooser[Widget]: use GladeProject weak reference.
Use a weak reference for project to prevent holding a reference after the project is closed.
Diffstat (limited to 'gladeui')
-rw-r--r--gladeui/glade-adaptor-chooser-widget.c21
-rw-r--r--gladeui/glade-adaptor-chooser.c16
2 files changed, 33 insertions, 4 deletions
diff --git a/gladeui/glade-adaptor-chooser-widget.c b/gladeui/glade-adaptor-chooser-widget.c
index 40746af3..cdfa5942 100644
--- a/gladeui/glade-adaptor-chooser-widget.c
+++ b/gladeui/glade-adaptor-chooser-widget.c
@@ -574,6 +574,15 @@ _glade_adaptor_chooser_widget_new (_GladeAdaptorChooserWidgetFlags flags, GladeP
NULL));
}
+static void
+on_project_weak_notify (gpointer data, GObject *project)
+{
+ _GladeAdaptorChooserWidget *chooser = data;
+ _GladeAdaptorChooserWidgetPrivate *priv = GET_PRIVATE (chooser);
+
+ priv->project = NULL;
+}
+
void
_glade_adaptor_chooser_widget_set_project (_GladeAdaptorChooserWidget *chooser,
GladeProject *project)
@@ -583,10 +592,18 @@ _glade_adaptor_chooser_widget_set_project (_GladeAdaptorChooserWidget *chooser,
g_return_if_fail (GLADE_IS_ADAPTOR_CHOOSER_WIDGET (chooser));
priv = GET_PRIVATE (chooser);
- g_clear_object (&priv->project);
+ if (priv->project)
+ {
+ g_object_weak_unref (G_OBJECT (priv->project), on_project_weak_notify, chooser);
+ priv->project = NULL;
+ }
if (project)
- priv->project = g_object_ref (project);
+ {
+ priv->project = project;
+ g_object_weak_ref (G_OBJECT (project), on_project_weak_notify, chooser);
+ }
+
gtk_tree_model_filter_refilter (priv->treemodelfilter);
}
diff --git a/gladeui/glade-adaptor-chooser.c b/gladeui/glade-adaptor-chooser.c
index 42ca56c2..2249b6f5 100644
--- a/gladeui/glade-adaptor-chooser.c
+++ b/gladeui/glade-adaptor-chooser.c
@@ -305,6 +305,15 @@ glade_adaptor_chooser_update_adaptor (GladeAdaptorChooser *chooser)
}
}
+static void
+on_project_weak_notify (gpointer data, GObject *project)
+{
+ GladeAdaptorChooser *chooser = data;
+ GladeAdaptorChooserPrivate *priv = GET_PRIVATE (chooser);
+
+ priv->project = NULL;
+}
+
void
glade_adaptor_chooser_set_project (GladeAdaptorChooser *chooser,
GladeProject *project)
@@ -320,12 +329,15 @@ glade_adaptor_chooser_set_project (GladeAdaptorChooser *chooser,
g_signal_handlers_disconnect_by_func (G_OBJECT (priv->project),
G_CALLBACK (glade_adaptor_chooser_update_adaptor),
chooser);
- g_clear_object (&priv->project);
+ g_object_weak_unref (G_OBJECT (priv->project), on_project_weak_notify, chooser);
+ priv->project = NULL;
}
if (project)
{
- priv->project = g_object_ref (project);
+ priv->project = project;
+ g_object_weak_ref (G_OBJECT (project), on_project_weak_notify, chooser);
+
g_signal_connect_swapped (G_OBJECT (project), "notify::add-item",
G_CALLBACK (glade_adaptor_chooser_update_adaptor),
chooser);