[gnome-control-center/gnome-3-36] fingerprint-dialog: Make the operations cancellable
- From: Robert Ancell <rancell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center/gnome-3-36] fingerprint-dialog: Make the operations cancellable
- Date: Fri, 26 Jun 2020 02:26:08 +0000 (UTC)
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]