From e155b95da6de8aa72c2ba3b2318c33c357091825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 7 Apr 2020 15:26:26 +0200 Subject: [PATCH] fingerprint-manager: Add ability to cache devices --- panels/user-accounts/cc-fingerprint-manager.c | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/panels/user-accounts/cc-fingerprint-manager.c b/panels/user-accounts/cc-fingerprint-manager.c index 3d5f2fe0b..7d1e3fba2 100644 --- a/panels/user-accounts/cc-fingerprint-manager.c +++ b/panels/user-accounts/cc-fingerprint-manager.c @@ -38,6 +38,7 @@ typedef struct ActUser *user; GTask *current_task; CcFingerprintState state; + GList *cached_devices; } CcFingerprintManagerPrivate; G_DEFINE_TYPE_WITH_PRIVATE (CcFingerprintManager, cc_fingerprint_manager, G_TYPE_OBJECT) @@ -70,6 +71,7 @@ cc_fingerprint_manager_dispose (GObject *object) } g_clear_object (&priv->user); + g_list_free_full (g_steal_pointer (&priv->cached_devices), g_object_unref); G_OBJECT_CLASS (cc_fingerprint_manager_parent_class)->dispose (object); } @@ -175,6 +177,8 @@ on_device_proxy (GObject *object, GAsyncResult *res, gpointer user_data) g_autoptr(CcFprintdDevice) fprintd_device = NULL; g_autoptr(GTask) task = G_TASK (user_data); g_autoptr(GError) error = NULL; + CcFingerprintManager *self = g_task_get_source_object (task); + CcFingerprintManagerPrivate *priv = cc_fingerprint_manager_get_instance_private (self); DeviceListData *list_data = g_task_get_task_data (task); fprintd_device = cc_fprintd_device_proxy_new_for_bus_finish (res, &error); @@ -195,7 +199,11 @@ on_device_proxy (GObject *object, GAsyncResult *res, gpointer user_data) list_data->devices = g_list_append (list_data->devices, g_steal_pointer (&fprintd_device)); if (list_data->waiting_devices == 0) - g_task_return_pointer (task, g_steal_pointer (&list_data->devices), object_list_destroy_notify); + { + g_list_free_full (g_steal_pointer (&priv->cached_devices), g_object_unref); + priv->cached_devices = g_list_copy_deep (list_data->devices, (GCopyFunc) g_object_ref, NULL); + g_task_return_pointer (task, g_steal_pointer (&list_data->devices), object_list_destroy_notify); + } } static void @@ -286,11 +294,21 @@ cc_fingerprint_manager_get_devices (CcFingerprintManager *self, GAsyncReadyCallback callback, gpointer user_data) { + CcFingerprintManagerPrivate *priv = cc_fingerprint_manager_get_instance_private (self); g_autoptr(GTask) task = NULL; task = g_task_new (self, cancellable, callback, user_data); g_task_set_source_tag (task, cc_fingerprint_manager_get_devices); + if (priv->cached_devices) + { + GList *devices; + + devices = g_list_copy_deep (priv->cached_devices, (GCopyFunc) g_object_ref, NULL); + g_task_return_pointer (task, devices, object_list_destroy_notify); + return; + } + fprintd_manager_connect (self, on_manager_proxy, g_steal_pointer (&task)); }