diff options
author | Milan Crha <mcrha@redhat.com> | 2014-10-20 19:48:36 +0200 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2014-10-20 19:48:36 +0200 |
commit | 1281d316821bcd9d645caea9c8f4dd91c08ad7f7 (patch) | |
tree | a0648fb73f1a35cdc6df5011c40ad2b0a856595b /addressbook | |
parent | 04a93c3ba1996cdadeb673fdedfdb4d0354d3e01 (diff) | |
download | evolution-data-server-1281d316821bcd9d645caea9c8f4dd91c08ad7f7.tar.gz |
Bug 708166 - Update EClient properties on idle after GDBusProxy notify
Diffstat (limited to 'addressbook')
-rw-r--r-- | addressbook/libebook/e-book-client.c | 87 |
1 files changed, 68 insertions, 19 deletions
diff --git a/addressbook/libebook/e-book-client.c b/addressbook/libebook/e-book-client.c index 126b33103..df58adef3 100644 --- a/addressbook/libebook/e-book-client.c +++ b/addressbook/libebook/e-book-client.c @@ -526,7 +526,8 @@ book_client_dbus_proxy_error_cb (EDBusAddressBook *dbus_proxy, static void book_client_dbus_proxy_property_changed (EClient *client, const gchar *property_name, - const GValue *value) + const GValue *value, + gboolean is_in_main_thread) { const gchar *backend_prop_name = NULL; @@ -586,8 +587,6 @@ book_client_dbus_proxy_property_changed (EClient *client, } if (backend_prop_name != NULL) { - GSource *idle_source; - GMainContext *main_context; SignalClosure *signal_closure; signal_closure = g_slice_new0 (SignalClosure); @@ -600,39 +599,89 @@ book_client_dbus_proxy_property_changed (EClient *client, if (g_str_equal (backend_prop_name, "locale")) signal_closure->property_value = g_value_dup_string (value); - main_context = e_client_ref_main_context (client); + if (is_in_main_thread) { + book_client_emit_backend_property_changed_idle_cb (signal_closure); + signal_closure_free (signal_closure); + } else { + GSource *idle_source; + GMainContext *main_context; - idle_source = g_idle_source_new (); - g_source_set_callback ( - idle_source, - book_client_emit_backend_property_changed_idle_cb, - signal_closure, - (GDestroyNotify) signal_closure_free); - g_source_attach (idle_source, main_context); - g_source_unref (idle_source); + main_context = e_client_ref_main_context (client); - g_main_context_unref (main_context); + idle_source = g_idle_source_new (); + g_source_set_callback ( + idle_source, + book_client_emit_backend_property_changed_idle_cb, + signal_closure, + (GDestroyNotify) signal_closure_free); + g_source_attach (idle_source, main_context); + g_source_unref (idle_source); + + g_main_context_unref (main_context); + } + } +} + +typedef struct { + EClient *client; + gchar *property_name; + GValue property_value; +} IdleProxyNotifyData; + +static void +idle_proxy_notify_data_free (gpointer ptr) +{ + IdleProxyNotifyData *ipn = ptr; + + if (ipn) { + g_clear_object (&ipn->client); + g_free (ipn->property_name); + g_value_unset (&ipn->property_value); + g_free (ipn); } } +static gboolean +book_client_proxy_notify_idle_cb (gpointer user_data) +{ + IdleProxyNotifyData *ipn = user_data; + + g_return_val_if_fail (ipn != NULL, FALSE); + + book_client_dbus_proxy_property_changed (ipn->client, ipn->property_name, &ipn->property_value, TRUE); + + return FALSE; +} + static void book_client_dbus_proxy_notify_cb (EDBusAddressBook *dbus_proxy, GParamSpec *pspec, GWeakRef *client_weak_ref) { EClient *client; - GValue value = G_VALUE_INIT; + GSource *idle_source; + GMainContext *main_context; + IdleProxyNotifyData *ipn; client = g_weak_ref_get (client_weak_ref); if (client == NULL) return; - g_value_init (&value, pspec->value_type); - g_object_get_property (G_OBJECT (dbus_proxy), pspec->name, &value); + ipn = g_new0 (IdleProxyNotifyData, 1); + ipn->client = g_object_ref (client); + ipn->property_name = g_strdup (pspec->name); + g_value_init (&ipn->property_value, pspec->value_type); + g_object_get_property (G_OBJECT (dbus_proxy), pspec->name, &ipn->property_value); - book_client_dbus_proxy_property_changed (client, pspec->name, &value); + main_context = e_client_ref_main_context (client); - g_value_unset (&value); + idle_source = g_idle_source_new (); + g_source_set_callback (idle_source, book_client_proxy_notify_idle_cb, + ipn, idle_proxy_notify_data_free); + g_source_attach (idle_source, main_context); + g_source_unref (idle_source); + + g_main_context_unref (main_context); g_object_unref (client); } @@ -782,7 +831,7 @@ book_client_process_properties (EBookClient *book_client, g_dbus_gvariant_to_gvalue (expected, &value); - book_client_dbus_proxy_property_changed (E_CLIENT (book_client), param->name, &value); + book_client_dbus_proxy_property_changed (E_CLIENT (book_client), param->name, &value, FALSE); g_value_unset (&value); } |