summaryrefslogtreecommitdiff
path: root/addressbook
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2014-10-20 19:48:36 +0200
committerMilan Crha <mcrha@redhat.com>2014-10-20 19:48:36 +0200
commit1281d316821bcd9d645caea9c8f4dd91c08ad7f7 (patch)
treea0648fb73f1a35cdc6df5011c40ad2b0a856595b /addressbook
parent04a93c3ba1996cdadeb673fdedfdb4d0354d3e01 (diff)
downloadevolution-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.c87
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);
}