From 8ace2050f73c74ca68c774a70f8e80a79f7fb45c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 26 Mar 2020 06:44:03 +0100 Subject: [PATCH] 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 99fdc4046..976e149bc 100644 --- a/panels/user-accounts/cc-user-panel.c +++ b/panels/user-accounts/cc-user-panel.c @@ -855,7 +855,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 */ @@ -1089,7 +1090,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 #include -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);