]> git.0d.be Git - empathy.git/commitdiff
Use TpWeakRef when user_data of an async call is a widget
authorXavier Claessens <xavier.claessens@collabora.co.uk>
Thu, 9 Aug 2012 12:10:59 +0000 (14:10 +0200)
committerXavier Claessens <xavier.claessens@collabora.co.uk>
Tue, 14 Aug 2012 15:20:28 +0000 (17:20 +0200)
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
ubuntu-online-accounts/cc-plugins/app-plugin/empathy-app-plugin-widget.c
ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin-widget.c

index f75b4fdb9b1d0ed746d4f7c42778a2b99529b6ea..9f2a5e01cbe54ac9e556178bea1072cee6c43c75 100644 (file)
@@ -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
index d52b3a360b523ca879c19af187d58e516c626af1..d07982a3b6b2798be3b6c9af146c57deec2076e9 100644 (file)
@@ -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);
 }
 
index fe3b6fe5e5eff53e9e2655eee9a0192e37cdeeb5..f76eb5cd42c4b6ada91a0b4e63959a996d22ebdd 100644 (file)
@@ -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;
     }