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