From ef33cf891f7a9f97f178169adb87aa3695bf9b2b Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Sun, 22 Feb 2009 19:30:32 +0100 Subject: [PATCH] gconfvideo(src|sink): Disconnect GConf notifications Fixes bug #571321. --- ext/gconf/gstgconfvideosink.c | 5 ++++- ext/gconf/gstgconfvideosink.h | 3 +++ ext/gconf/gstgconfvideosrc.c | 5 ++++- ext/gconf/gstgconfvideosrc.h | 3 +++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/ext/gconf/gstgconfvideosink.c b/ext/gconf/gstgconfvideosink.c index 4090cc911..1b05fd371 100644 --- a/ext/gconf/gstgconfvideosink.c +++ b/ext/gconf/gstgconfvideosink.c @@ -122,7 +122,7 @@ gst_gconf_video_sink_init (GstGConfVideoSink * sink, sink->client = gconf_client_get_default (); gconf_client_add_dir (sink->client, GST_GCONF_DIR, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); - gconf_client_notify_add (sink->client, + sink->notify_id = gconf_client_notify_add (sink->client, GST_GCONF_DIR "/" GST_GCONF_VIDEOSINK_KEY, cb_toggle_element, sink, NULL, NULL); } @@ -133,6 +133,9 @@ gst_gconf_video_sink_dispose (GObject * object) GstGConfVideoSink *sink = GST_GCONF_VIDEO_SINK (object); if (sink->client) { + if (sink->notify_id != 0) + gconf_client_notify_remove (sink->client, sink->notify_id); + g_object_unref (G_OBJECT (sink->client)); sink->client = NULL; } diff --git a/ext/gconf/gstgconfvideosink.h b/ext/gconf/gstgconfvideosink.h index 8f69c81a1..2461e6526 100644 --- a/ext/gconf/gstgconfvideosink.h +++ b/ext/gconf/gstgconfvideosink.h @@ -46,6 +46,9 @@ typedef struct _GstGConfVideoSink { GstElement *kid; GstPad *pad; + /* gconf notify id */ + guint notify_id; + /* Current gconf string */ gchar *gconf_str; } GstGConfVideoSink; diff --git a/ext/gconf/gstgconfvideosrc.c b/ext/gconf/gstgconfvideosrc.c index fe177d863..6192d73d1 100644 --- a/ext/gconf/gstgconfvideosrc.c +++ b/ext/gconf/gstgconfvideosrc.c @@ -124,7 +124,7 @@ gst_gconf_video_src_init (GstGConfVideoSrc * src, src->client = gconf_client_get_default (); gconf_client_add_dir (src->client, GST_GCONF_DIR, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); - gconf_client_notify_add (src->client, + src->notify_id = gconf_client_notify_add (src->client, GST_GCONF_DIR "/" GST_GCONF_VIDEOSRC_KEY, cb_toggle_element, src, NULL, NULL); } @@ -135,6 +135,9 @@ gst_gconf_video_src_dispose (GObject * object) GstGConfVideoSrc *src = GST_GCONF_VIDEO_SRC (object); if (src->client) { + if (src->notify_id != 0) + gconf_client_notify_remove (src->client, src->notify_id); + g_object_unref (G_OBJECT (src->client)); src->client = NULL; } diff --git a/ext/gconf/gstgconfvideosrc.h b/ext/gconf/gstgconfvideosrc.h index 6f64e6d10..4a2c8cddf 100644 --- a/ext/gconf/gstgconfvideosrc.h +++ b/ext/gconf/gstgconfvideosrc.h @@ -40,6 +40,9 @@ typedef struct _GstGConfVideoSrc { GstElement *kid; GstPad *pad; + /* gconf key notification id */ + guint notify_id; + /* Current gconf string */ gchar *gconf_str; } GstGConfVideoSrc; -- 2.34.1