[empathy] Use TpWeakRef when user_data of an async call is a widget



commit 77ea9d56fb15dfd6edb1554ba31c42a7789d62d1
Author: Xavier Claessens <xavier claessens collabora co uk>
Date:   Thu Aug 9 14:10:59 2012 +0200

    Use TpWeakRef when user_data of an async call is a widget
    
    Keeping a ref on widgets is not enough to keep it alive, because
    gtk_widget_destroy will run destroy even if there are still refs.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=680775

 libempathy-gtk/empathy-avatar-chooser.c            |   13 ++++++++-----
 .../app-plugin/empathy-app-plugin-widget.c         |   12 ++++++++++--
 .../cc-plugins/empathy-accounts-plugin-widget.c    |   12 ++++++++++--
 3 files changed, 28 insertions(+), 9 deletions(-)
---
diff --git a/libempathy-gtk/empathy-avatar-chooser.c b/libempathy-gtk/empathy-avatar-chooser.c
index f75b4fd..9f2a5e0 100644
--- a/libempathy-gtk/empathy-avatar-chooser.c
+++ b/libempathy-gtk/empathy-avatar-chooser.c
@@ -123,15 +123,18 @@ get_avatar_cb (GObject *source,
     GAsyncResult *result,
     gpointer user_data)
 {
-  TpWeakRef *weak = user_data;
-  EmpathyAvatarChooser *self = tp_weak_ref_dup_object (weak);
+  TpWeakRef *wr = user_data;
+  EmpathyAvatarChooser *self = tp_weak_ref_dup_object (wr);
   const GArray *avatar;
   GdkPixbuf *pixbuf;
   gchar *mime_type;
   GError *error = NULL;
 
   if (self == NULL)
-    goto out;
+    {
+      tp_weak_ref_destroy (wr);
+      return;
+    }
 
   avatar = tp_account_get_avatar_finish (self->priv->account, result, &error);
   if (avatar == NULL)
@@ -159,10 +162,10 @@ get_avatar_cb (GObject *source,
   g_free (mime_type);
 
   self->priv->changed = FALSE;
-  g_object_unref (self);
 
 out:
-  tp_weak_ref_destroy (weak);
+  tp_weak_ref_destroy (wr);
+  g_object_unref (self);
 }
 
 static void
diff --git a/ubuntu-online-accounts/cc-plugins/app-plugin/empathy-app-plugin-widget.c b/ubuntu-online-accounts/cc-plugins/app-plugin/empathy-app-plugin-widget.c
index d52b3a3..d07982a 100644
--- a/ubuntu-online-accounts/cc-plugins/app-plugin/empathy-app-plugin-widget.c
+++ b/ubuntu-online-accounts/cc-plugins/app-plugin/empathy-app-plugin-widget.c
@@ -176,11 +176,18 @@ manager_prepared_cb (GObject *source,
     GAsyncResult *result,
     gpointer user_data)
 {
-  EmpathyAppPluginWidget *self = user_data;
+  TpWeakRef *wr = user_data;
+  EmpathyAppPluginWidget *self = tp_weak_ref_dup_object (wr);
   TpAccountManager *manager = (TpAccountManager *) source;
   GList *accounts;
   GError *error = NULL;
 
+  if (self == NULL)
+    {
+      tp_weak_ref_destroy (wr);
+      return;
+    }
+
   if (!tp_proxy_prepare_finish (manager, result, &error))
     {
       g_debug ("Error preparing Account Manager: %s", error->message);
@@ -215,6 +222,7 @@ manager_prepared_cb (GObject *source,
   g_list_free (accounts);
 
 out:
+  tp_weak_ref_destroy (wr);
   g_object_unref (self);
 }
 
@@ -241,7 +249,7 @@ empathy_app_plugin_widget_constructed (GObject *object)
    * AgAccount */
   manager = tp_account_manager_dup ();
   tp_proxy_prepare_async (manager, NULL,
-      manager_prepared_cb, g_object_ref (self));
+      manager_prepared_cb, tp_weak_ref_new (self, NULL, NULL));
   g_object_unref (manager);
 }
 
diff --git a/ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin-widget.c b/ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin-widget.c
index fe3b6fe..f76eb5c 100644
--- a/ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin-widget.c
+++ b/ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin-widget.c
@@ -291,11 +291,18 @@ manager_prepared_cb (GObject *source,
     GAsyncResult *result,
     gpointer user_data)
 {
-  EmpathyAccountsPluginWidget *self = user_data;
+  TpWeakRef *wr = user_data;
+  EmpathyAccountsPluginWidget *self = tp_weak_ref_dup_object (wr);
   TpAccountManager *manager = (TpAccountManager *) source;
   GList *accounts;
   GError *error = NULL;
 
+  if (self == NULL)
+    {
+      tp_weak_ref_destroy (wr);
+      return;
+    }
+
   if (!tp_proxy_prepare_finish (manager, result, &error))
     {
       g_debug ("Error preparing Account Manager: %s", error->message);
@@ -324,6 +331,7 @@ manager_prepared_cb (GObject *source,
   g_list_free (accounts);
 
 out:
+  tp_weak_ref_destroy (wr);
   g_object_unref (self);
 }
 
@@ -354,7 +362,7 @@ empathy_accounts_plugin_widget_constructed (GObject *object)
       manager = tp_account_manager_dup ();
 
       tp_proxy_prepare_async (manager, NULL,
-          manager_prepared_cb, g_object_ref (self));
+          manager_prepared_cb, tp_weak_ref_new (self, NULL, NULL));
       g_object_unref (manager);
       return;
     }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]