[gnome-control-center/gnome-3-36] fingerprint-dialog: Make the operations cancellable



commit c65f108f6608ba3c46d3daacb0c28645f4c66955
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date:   Thu Mar 26 06:44:03 2020 +0100

    fingerprint-dialog: Make the operations cancellable

 panels/user-accounts/cc-user-panel.c         |  6 +-
 panels/user-accounts/um-fingerprint-dialog.c | 91 +++++++++++++++++-----------
 panels/user-accounts/um-fingerprint-dialog.h | 14 +++--
 3 files changed, 66 insertions(+), 45 deletions(-)
---
diff --git a/panels/user-accounts/cc-user-panel.c b/panels/user-accounts/cc-user-panel.c
index 3c8d1fb61..a1e00f79d 100644
--- a/panels/user-accounts/cc-user-panel.c
+++ b/panels/user-accounts/cc-user-panel.c
@@ -856,7 +856,8 @@ show_user (ActUser *user, CcUserPanel *self)
         gtk_widget_set_visible (GTK_WIDGET (self->fingerprint_row), FALSE);
         if (show) {
                 set_fingerprint_row (GTK_WIDGET (self->fingerprint_row),
-                                     self->fingerprint_state_label);
+                                     self->fingerprint_state_label,
+                                     NULL);
         }
 
         /* Autologin: show when local account */
@@ -1090,7 +1091,8 @@ change_fingerprint (CcUserPanel *self)
         fingerprint_button_clicked (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))),
                                     GTK_WIDGET (self->fingerprint_row),
                                     self->fingerprint_state_label,
-                                    user);
+                                    user,
+                                    NULL);
 }
 
 static void
diff --git a/panels/user-accounts/um-fingerprint-dialog.c b/panels/user-accounts/um-fingerprint-dialog.c
index f8fbe9f9e..dfc5503a7 100644
--- a/panels/user-accounts/um-fingerprint-dialog.c
+++ b/panels/user-accounts/um-fingerprint-dialog.c
@@ -52,6 +52,7 @@ typedef struct {
         GtkBuilder *dialog;
 
         GDBusProxy *device;
+        GCancellable *cancellable;
         gboolean is_swipe;
         int num_enroll_stages;
         int num_stages_done;
@@ -61,14 +62,14 @@ typedef struct {
 } EnrollData;
 
 static void
-ensure_manager (void)
+ensure_manager (GCancellable *cancellable)
 {
         GError *error = NULL;
 
         if (manager != NULL)
                 return;
 
-        connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+        connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, cancellable, &error);
         if (connection == NULL) {
                 g_warning ("Failed to connect to session bus: %s", error->message);
                 g_error_free (error);
@@ -81,7 +82,7 @@ ensure_manager (void)
                                          "net.reactivated.Fprint",
                                          "/net/reactivated/Fprint/Manager",
                                          "net.reactivated.Fprint.Manager",
-                                         NULL,
+                                         cancellable,
                                          &error);
         if (manager == NULL) {
                 g_warning ("Failed to create fingerprint manager proxy: %s", error->message);
@@ -90,7 +91,7 @@ ensure_manager (void)
 }
 
 static GDBusProxy *
-get_first_device (void)
+get_first_device (GCancellable *cancellable)
 {
         GDBusProxy *device;
         GVariant *result;
@@ -102,7 +103,7 @@ get_first_device (void)
                                          g_variant_new ("()"),
                                          G_DBUS_CALL_FLAGS_NONE,
                                          -1,
-                                         NULL,
+                                         cancellable,
                                          NULL);
         if (result == NULL)
                 return NULL;
@@ -121,7 +122,7 @@ get_first_device (void)
                                         "net.reactivated.Fprint",
                                         device_str,
                                         "net.reactivated.Fprint.Device",
-                                        NULL,
+                                        cancellable,
                                         &error);
         if (device == NULL) {
                 g_warning ("Failed to create fingerprint device proxy: %s", error->message);
@@ -197,7 +198,11 @@ set_fingerprint_row_cb (GObject      *source_object,
 
         if (error) {
                 visible = FALSE;
-                g_message ("Fingerprint row not available: %s", error->message);
+
+                if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+                        g_warning ("Fingerprint row not available: %s",
+                                   error->message);
+                }
         }
 
         if (enabled) {
@@ -222,21 +227,21 @@ set_fingerprint_task_func (GTask        *task,
         GVariantIter *fingers;
         GError *error = NULL;
 
-        ensure_manager ();
+        ensure_manager (cancellable);
         if (manager == NULL) {
                 g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED,
                                          "Impossible to get fprintd manager");
                 return;
         }
 
-        device = get_first_device ();
+        device = get_first_device (cancellable);
         if (device == NULL) {
                 g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED,
                                          "Impossible to get fprintd device");
                 return;
         }
 
-        result = g_dbus_proxy_call_sync (device, "ListEnrolledFingers", g_variant_new ("(s)", ""), 
G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
+        result = g_dbus_proxy_call_sync (device, "ListEnrolledFingers", g_variant_new ("(s)", ""), 
G_DBUS_CALL_FLAGS_NONE, -1, cancellable, &error);
         if (!result) {
                 if (!g_dbus_error_is_remote_error (error) ||
                     strcmp (g_dbus_error_get_remote_error(error), 
"net.reactivated.Fprint.Error.NoEnrolledPrints") != 0) {
@@ -251,6 +256,9 @@ set_fingerprint_task_func (GTask        *task,
         else
                 fingers = NULL;
 
+        if (g_task_return_error_if_cancelled (task))
+                return;
+
         if (fingers == NULL || g_variant_iter_n_children (fingers) == 0) {
                 g_task_return_boolean (task, FALSE);
         } else {
@@ -265,31 +273,32 @@ set_fingerprint_task_func (GTask        *task,
 }
 
 void
-set_fingerprint_row (GtkWidget *row,
-                     GtkLabel  *state_label)
+set_fingerprint_row (GtkWidget    *row,
+                     GtkLabel     *state_label,
+                     GCancellable *cancellable)
 {
         g_autoptr(GTask) task = NULL;
 
-        task = g_task_new (row, NULL, set_fingerprint_row_cb,
+        task = g_task_new (row, cancellable, set_fingerprint_row_cb,
                            g_object_ref (state_label));
         g_task_run_in_thread (task, set_fingerprint_task_func);
 }
 
 static void
-delete_fingerprints (void)
+delete_fingerprints (GCancellable *cancellable)
 {
         GDBusProxy *device;
         GVariant *result;
 
-        ensure_manager ();
+        ensure_manager (cancellable);
         if (manager == NULL)
                 return;
 
-        device = get_first_device ();
+        device = get_first_device (cancellable);
         if (device == NULL)
                 return;
 
-        result = g_dbus_proxy_call_sync (device, "DeleteEnrolledFingers", g_variant_new ("(s)", ""), 
G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL);
+        result = g_dbus_proxy_call_sync (device, "DeleteEnrolledFingers", g_variant_new ("(s)", ""), 
G_DBUS_CALL_FLAGS_NONE, -1, cancellable, NULL);
         if (result)
                 g_variant_unref (result);
 
@@ -297,10 +306,11 @@ delete_fingerprints (void)
 }
 
 static void
-delete_fingerprints_question (GtkWindow *parent,
-                              GtkWidget *fingerprint_row,
-                              GtkLabel  *state_label,
-                              ActUser   *user)
+delete_fingerprints_question (GtkWindow    *parent,
+                              GtkWidget    *fingerprint_row,
+                              GtkLabel     *state_label,
+                              ActUser      *user,
+                              GCancellable *cancellable)
 {
         GtkWidget *question;
         GtkWidget *button;
@@ -323,8 +333,8 @@ delete_fingerprints_question (GtkWindow *parent,
         gtk_dialog_set_default_response (GTK_DIALOG (question), GTK_RESPONSE_OK);
 
         if (gtk_dialog_run (GTK_DIALOG (question)) == GTK_RESPONSE_OK) {
-                delete_fingerprints ();
-                set_fingerprint_row (fingerprint_row, state_label);
+                delete_fingerprints (cancellable);
+                set_fingerprint_row (fingerprint_row, state_label, cancellable);
         }
 
         gtk_widget_destroy (question);
@@ -392,6 +402,7 @@ enroll_data_destroy (EnrollData *data)
                 g_free (data->name);
                 g_object_unref (data->device);
                 g_object_unref (data->dialog);
+                g_object_unref (data->cancellable);
                 gtk_widget_destroy (data->ass);
 
                 g_free (data);
@@ -468,9 +479,10 @@ assistant_cancelled (GtkAssistant *ass, EnrollData *data)
 {
         GtkWidget *fingerprint_row = data->fingerprint_row;
         GtkLabel *state_label = data->state_label;
+        GCancellable *cancellable = data->cancellable;
 
         enroll_data_destroy (data);
-        set_fingerprint_row (fingerprint_row, state_label);
+        set_fingerprint_row (fingerprint_row, state_label, cancellable);
 }
 
 static void
@@ -659,10 +671,11 @@ assistant_prepare (GtkAssistant *ass, GtkWidget *page, EnrollData *data)
 }
 
 static void
-enroll_fingerprints (GtkWindow *parent,
-                     GtkWidget *fingerprint_row,
-                     GtkLabel  *state_label,
-                     ActUser   *user)
+enroll_fingerprints (GtkWindow    *parent,
+                     GtkWidget    *fingerprint_row,
+                     GtkLabel     *state_label,
+                     ActUser      *user,
+                     GCancellable *cancellable)
 {
         GDBusProxy *device = NULL;
         GtkBuilder *dialog;
@@ -672,9 +685,9 @@ enroll_fingerprints (GtkWindow *parent,
         GVariant *result;
         GError *error = NULL;
 
-        ensure_manager ();
+        ensure_manager (cancellable);
         if (manager != NULL)
-                device = get_first_device ();
+                device = get_first_device (cancellable);
 
         if (manager == NULL || device == NULL) {
                 GtkWidget *d;
@@ -689,6 +702,7 @@ enroll_fingerprints (GtkWindow *parent,
 
         data = g_new0 (EnrollData, 1);
         data->device = device;
+        data->cancellable = g_object_ref (cancellable);
         data->fingerprint_row = fingerprint_row;
         data->state_label = state_label;
 
@@ -702,7 +716,7 @@ enroll_fingerprints (GtkWindow *parent,
                                               G_VARIANT_TYPE ("(a{sv})"),
                                               G_DBUS_CALL_FLAGS_NONE,
                                               -1,
-                                              NULL,
+                                              cancellable,
                                               NULL);
         if (result) {
                 GVariant *props;
@@ -789,18 +803,21 @@ enroll_fingerprints (GtkWindow *parent,
 }
 
 void
-fingerprint_button_clicked (GtkWindow *parent,
-                            GtkWidget *fingerprint_row,
-                            GtkLabel  *state_label,
-                            ActUser   *user)
+fingerprint_button_clicked (GtkWindow    *parent,
+                            GtkWidget    *fingerprint_row,
+                            GtkLabel     *state_label,
+                            ActUser      *user,
+                            GCancellable *cancellable)
 {
         bindtextdomain ("fprintd", GNOMELOCALEDIR);
         bind_textdomain_codeset ("fprintd", "UTF-8");
 
         if (is_disable != FALSE) {
-                delete_fingerprints_question (parent, fingerprint_row, state_label, user);
+                delete_fingerprints_question (parent, fingerprint_row,
+                                              state_label, user, cancellable);
         } else {
-                enroll_fingerprints (parent, fingerprint_row, state_label, user);
+                enroll_fingerprints (parent, fingerprint_row, state_label, user,
+                                     cancellable);
         }
 }
 
diff --git a/panels/user-accounts/um-fingerprint-dialog.h b/panels/user-accounts/um-fingerprint-dialog.h
index 58579cc2a..09dbf5133 100644
--- a/panels/user-accounts/um-fingerprint-dialog.h
+++ b/panels/user-accounts/um-fingerprint-dialog.h
@@ -20,9 +20,11 @@
 #include <gtk/gtk.h>
 #include <act/act.h>
 
-void set_fingerprint_row (GtkWidget *fingerprint_row,
-                          GtkLabel  *state_label);
-void fingerprint_button_clicked (GtkWindow *parent,
-                                 GtkWidget *fingerprint_row,
-                                 GtkLabel  *state_label,
-                                 ActUser   *user);
+void set_fingerprint_row (GtkWidget    *fingerprint_row,
+                          GtkLabel     *state_label,
+                          GCancellable *cancellable);
+void fingerprint_button_clicked (GtkWindow    *parent,
+                                 GtkWidget    *fingerprint_row,
+                                 GtkLabel     *state_label,
+                                 ActUser      *user,
+                                 GCancellable *cancellable);


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