From f45fb5228f5399cfc4b973fb527ca2c4a2aa8046 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rafa=C3=ABl=20Carr=C3=A9?=
 <rafael.carre@savoirfairelinux.com>
Date: Thu, 30 Jun 2011 17:21:19 -0400
Subject: [PATCH] * #6326 : try to fix preview destructor

remove unneeded g_idle_remove_by_data() calls
remove on_stage_delete destructor for clutter stage, gtk unrealize event will be used instead
use ref/unref in unrealize callback to be sure preview is still alive
---
 .../src/video/video_preview.c                 | 33 +++++--------------
 1 file changed, 8 insertions(+), 25 deletions(-)

diff --git a/sflphone-client-gnome/src/video/video_preview.c b/sflphone-client-gnome/src/video/video_preview.c
index e720283ae0..f50710d292 100644
--- a/sflphone-client-gnome/src/video/video_preview.c
+++ b/sflphone-client-gnome/src/video/video_preview.c
@@ -302,9 +302,7 @@ video_preview_set_property (GObject *object, guint prop_id,
 static void
 video_preview_init (VideoPreview *self)
 {
-    VideoPreviewPrivate *priv;
-
-    self->priv = priv = VIDEO_PREVIEW_GET_PRIVATE (self);
+    self->priv = VIDEO_PREVIEW_GET_PRIVATE (self);
 }
 
 static void
@@ -312,8 +310,6 @@ video_preview_finalize (GObject *obj)
 {
     VideoPreview *self = VIDEO_PREVIEW (obj);
 
-    g_idle_remove_by_data((void*)self);
-
     /* finalize might be called multiple times, so we must guard against
      * calling g_object_unref() on an invalid GObject.
      */
@@ -460,21 +456,10 @@ on_drawarea_unrealize(GtkWidget *drawarea, gpointer data)
         video_preview_stop(data);
     }
     g_object_notify_by_pspec(G_OBJECT(data), properties[PROP_RUNNING]);
+    g_object_unref(G_OBJECT(data));
     return FALSE; // call other handlers
 }
 
-static gint
-on_stage_delete(ClutterStage *stage, ClutterEvent *event, gpointer data)
-{
-    (void) event;
-    (void) stage;
-    video_preview_stop(data);
-    /* notify explicitly so that the owner of this preview can react */
-    g_object_notify_by_pspec(G_OBJECT(data), properties[PROP_RUNNING]);
-    return TRUE; /* don't call the default delete-event handler */
-}
-
-
 void
 video_preview_run(VideoPreview *preview)
 {
@@ -487,6 +472,7 @@ video_preview_run(VideoPreview *preview)
     priv->using_clutter = !strcmp(priv->format, "rgb24");
     g_print("Preview: using %s render\n", priv->using_clutter ? "clutter" : "cairo");
 
+    g_object_ref(preview);
     g_signal_connect(priv->drawarea, "unrealize", G_CALLBACK(on_drawarea_unrealize), preview);
 
     if (priv->using_clutter) {
@@ -494,10 +480,6 @@ video_preview_run(VideoPreview *preview)
 
         stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(priv->drawarea));
         assert(stage);
-        g_signal_connect (stage, "delete-event", G_CALLBACK(on_stage_delete),
-                preview);
-        //clutter_actor_set_size(stage, priv->width, priv->height);
-
         priv->texture = clutter_texture_new();
 
         /* Add ClutterTexture to the stage */
@@ -522,8 +504,9 @@ void
 video_preview_stop(VideoPreview *preview)
 {
     VideoPreviewPrivate *priv = VIDEO_PREVIEW_GET_PRIVATE(preview);
-    g_idle_remove_by_data((void*)preview);
-    priv->is_running = FALSE;
-    if (!priv->using_clutter && priv->cairo)
-        cairo_destroy(priv->cairo);
+    if (priv) {
+        priv->is_running = FALSE;
+        if (!priv->using_clutter && priv->cairo)
+            cairo_destroy(priv->cairo);
+    }
 }
-- 
GitLab