fingerprint-dialog: Make the operations cancellable
This commit is contained in:
parent
e12bfed744
commit
8ace2050f7
3 changed files with 66 additions and 45 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue