fingerprint-dialog: Make the operations cancellable

This commit is contained in:
Marco Trevisan (Treviño) 2020-03-26 06:44:03 +01:00 committed by Benjamin Berg
parent e12bfed744
commit 8ace2050f7
3 changed files with 66 additions and 45 deletions

View file

@ -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

View file

@ -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 {
@ -266,30 +274,31 @@ set_fingerprint_task_func (GTask *task,
void
set_fingerprint_row (GtkWidget *row,
GtkLabel *state_label)
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);
@ -300,7 +309,8 @@ static void
delete_fingerprints_question (GtkWindow *parent,
GtkWidget *fingerprint_row,
GtkLabel *state_label,
ActUser *user)
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
@ -662,7 +674,8 @@ static void
enroll_fingerprints (GtkWindow *parent,
GtkWidget *fingerprint_row,
GtkLabel *state_label,
ActUser *user)
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;
@ -792,15 +806,18 @@ void
fingerprint_button_clicked (GtkWindow *parent,
GtkWidget *fingerprint_row,
GtkLabel *state_label,
ActUser *user)
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);
}
}

View file

@ -21,8 +21,10 @@
#include <act/act.h>
void set_fingerprint_row (GtkWidget *fingerprint_row,
GtkLabel *state_label);
GtkLabel *state_label,
GCancellable *cancellable);
void fingerprint_button_clicked (GtkWindow *parent,
GtkWidget *fingerprint_row,
GtkLabel *state_label,
ActUser *user);
ActUser *user,
GCancellable *cancellable);