diff options
-rw-r--r-- | gladeui/glade-adaptor-chooser-widget.c | 21 | ||||
-rw-r--r-- | gladeui/glade-adaptor-chooser.c | 16 |
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); |