[evolution] EAddressbookModel: Update view on client's capabilities property change



commit 0995880436ef9117a651b5bbb9ebb5868088e2b9
Author: Milan Crha <mcrha redhat com>
Date:   Mon Nov 22 17:31:58 2021 +0100

    EAddressbookModel: Update view on client's capabilities property change
    
    The capabilities change can mean the address book backend supports, or not,
    initial query, which changes how the view is populated for the address book.
    
    Related to https://gitlab.gnome.org/GNOME/evolution-data-server/-/issues/354

 src/addressbook/gui/widgets/e-addressbook-model.c | 33 +++++++++++++++++++++++
 1 file changed, 33 insertions(+)
---
diff --git a/src/addressbook/gui/widgets/e-addressbook-model.c 
b/src/addressbook/gui/widgets/e-addressbook-model.c
index 49d0d33b49..2b4441124e 100644
--- a/src/addressbook/gui/widgets/e-addressbook-model.c
+++ b/src/addressbook/gui/widgets/e-addressbook-model.c
@@ -35,6 +35,7 @@
 struct _EAddressbookModelPrivate {
        EClientCache *client_cache;
        gulong client_notify_readonly_handler_id;
+       gulong client_notify_capabilities_handler_id;
 
        EBookClient *book_client;
        gchar *query_str;
@@ -348,6 +349,25 @@ addressbook_model_client_notify_readonly_cb (EClientCache *client_cache,
        }
 }
 
+static gboolean addressbook_model_idle_cb (EAddressbookModel *model);
+
+static void
+addressbook_model_client_notify_capabilities_cb (EClientCache *client_cache,
+                                                EClient *client,
+                                                GParamSpec *pspec,
+                                                EAddressbookModel *model)
+{
+       if (!E_IS_BOOK_CLIENT (client))
+               return;
+
+       if (E_BOOK_CLIENT (client) == model->priv->book_client &&
+           model->priv->client_view_idle_id == 0) {
+               model->priv->client_view_idle_id = g_idle_add (
+                       (GSourceFunc) addressbook_model_idle_cb,
+                       g_object_ref (model));
+       }
+}
+
 static void
 client_view_ready_cb (GObject *source_object,
                       GAsyncResult *result,
@@ -560,6 +580,13 @@ addressbook_model_dispose (GObject *object)
                model->priv->client_notify_readonly_handler_id = 0;
        }
 
+       if (model->priv->client_notify_capabilities_handler_id > 0) {
+               g_signal_handler_disconnect (
+                       model->priv->client_cache,
+                       model->priv->client_notify_capabilities_handler_id);
+               model->priv->client_notify_capabilities_handler_id = 0;
+       }
+
        g_clear_object (&model->priv->client_cache);
        g_clear_object (&model->priv->book_client);
 
@@ -601,6 +628,12 @@ addressbook_model_constructed (GObject *object)
                G_CALLBACK (addressbook_model_client_notify_readonly_cb),
                model);
        model->priv->client_notify_readonly_handler_id = handler_id;
+
+       handler_id = g_signal_connect (
+               client_cache, "client-notify::capabilities",
+               G_CALLBACK (addressbook_model_client_notify_capabilities_cb),
+               model);
+       model->priv->client_notify_capabilities_handler_id = handler_id;
 }
 
 static void


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