diff pidgin/gtkmedia.c @ 26087:83704757fa36

Use the dispose method too.
author Mike Ruprecht <maiku@soc.pidgin.im>
date Wed, 07 Jan 2009 20:10:07 +0000
parents 0829a08038c6
children 6c8eabbef4d3
line wrap: on
line diff
--- a/pidgin/gtkmedia.c	Wed Jan 07 08:28:17 2009 +0000
+++ b/pidgin/gtkmedia.c	Wed Jan 07 20:10:07 2009 +0000
@@ -75,6 +75,7 @@
 
 static void pidgin_media_class_init (PidginMediaClass *klass);
 static void pidgin_media_init (PidginMedia *media);
+static void pidgin_media_dispose (GObject *object);
 static void pidgin_media_finalize (GObject *object);
 static void pidgin_media_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
 static void pidgin_media_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
@@ -130,6 +131,7 @@
 /*	GtkContainerClass *container_class = (GtkContainerClass*)klass; */
 	parent_class = g_type_class_peek_parent(klass);
 
+	gobject_class->dispose = pidgin_media_dispose;
 	gobject_class->finalize = pidgin_media_finalize;
 	gobject_class->set_property = pidgin_media_set_property;
 	gobject_class->get_property = pidgin_media_get_property;
@@ -259,20 +261,56 @@
 }
 
 static void
-pidgin_media_finalize (GObject *media)
+pidgin_media_dispose(GObject *media)
+{
+	PidginMedia *gtkmedia = PIDGIN_MEDIA(media);
+	purple_debug_info("gtkmedia", "pidgin_media_dispose\n");
+
+	if (gtkmedia->priv->media) {
+		GstElement *videosendbin = NULL, *videorecvbin = NULL;
+
+		purple_media_get_elements(gtkmedia->priv->media, NULL, NULL,
+					  &videosendbin, &videorecvbin);
+
+		if (videorecvbin) {
+			gst_element_set_locked_state(videorecvbin, TRUE);
+			gst_element_set_state(videorecvbin, GST_STATE_NULL);
+		}
+		if (videosendbin) {
+			gst_element_set_locked_state(videosendbin, TRUE);
+			gst_element_set_state(videosendbin, GST_STATE_NULL);
+		}
+
+		pidgin_media_disconnect_levels(gtkmedia->priv->media, gtkmedia);
+		g_object_unref(gtkmedia->priv->media);
+		gtkmedia->priv->media = NULL;
+	}
+
+	if (gtkmedia->priv->send_level) {
+		gst_object_unref(gtkmedia->priv->send_level);
+		gtkmedia->priv->send_level = NULL;
+	}
+
+	if (gtkmedia->priv->recv_level) {
+		gst_object_unref(gtkmedia->priv->recv_level);
+		gtkmedia->priv->recv_level = NULL;
+	}
+
+	G_OBJECT_CLASS(parent_class)->dispose(media);
+}
+
+static void
+pidgin_media_finalize(GObject *media)
 {
 	PidginMedia *gtkmedia = PIDGIN_MEDIA(media);
 	purple_debug_info("gtkmedia", "pidgin_media_finalize\n");
-	if (gtkmedia->priv->media) {
-		pidgin_media_disconnect_levels(gtkmedia->priv->media, gtkmedia);
-		g_object_unref(gtkmedia->priv->media);
+
+	if (gtkmedia->priv->display) {
+		gtk_widget_destroy(gtkmedia->priv->display);
+		gtkmedia->priv->display = NULL;
 	}
-	if (gtkmedia->priv->send_level)
-		gst_object_unref(gtkmedia->priv->send_level);
-	if (gtkmedia->priv->recv_level)
-		gst_object_unref(gtkmedia->priv->recv_level);
-	if (gtkmedia->priv->display)
-		gtk_widget_destroy(gtkmedia->priv->display);
+
+	G_OBJECT_CLASS(parent_class)->finalize(media);
 }
 
 static void