~kroq-gar78/ubuntu/precise/gnome-control-center/fix-885947

« back to all changes in this revision

Viewing changes to capplets/about-me/gnome-about-me-fingerprint.c

  • Committer: Bazaar Package Importer
  • Author(s): Rodrigo Moya
  • Date: 2011-05-17 10:47:27 UTC
  • mfrom: (0.1.11 experimental) (1.1.45 upstream)
  • Revision ID: james.westby@ubuntu.com-20110517104727-lqel6m8vhfw5jby1
Tags: 1:3.0.1.1-1ubuntu1
* Rebase on Debian, remaining Ubuntu changes:
* debian/control:
  - Build-Depend on hardening-wrapper, dpkg-dev and dh-autoreconf
  - Add dependency on ubuntu-system-service
  - Remove dependency on gnome-icon-theme-symbolic
  - Move dependency on apg, gnome-icon-theme-symbolic and accountsservice to
    be a Recommends: until we get them in main
* debian/rules:
  - Use autoreconf
  - Add binary-post-install rule for gnome-control-center-data
  - Run dh-autoreconf
* debian/gnome-control-center.dirs:
* debian/gnome-control-center.links:
  - Add a link to the control center shell for indicators
* debian/patches/00_disable-nm.patch:
  - Temporary patch to disable building with NetworkManager until we get
    the new one in the archive
* debian/patches/01_git_remove_gettext_calls.patch:
  - Remove calls to AM_GNU_GETTEXT, IT_PROG_INTLTOOL should be enough
* debian/patches/01_git_kill_warning.patch:
  - Kill warning
* debian/patches/50_ubuntu_systemwide_prefs.patch:
  - Ubuntu specific proxy preferences
* debian/patches/51_ubuntu_system_keyboard.patch:
  - Implement the global keyboard spec at https://wiki.ubuntu.com/DefaultKeyboardSettings

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* gnome-about-me-fingerprint.h
2
 
 * Copyright (C) 2008 Bastien Nocera <hadess@hadess.net>
3
 
 *
4
 
 * This program is free software; you can redistribute it and/or modify
5
 
 * it under the terms of the GNU General Public License as published by
6
 
 * the Free Software Foundation; either version 2, or (at your option)
7
 
 * any later version.
8
 
 *
9
 
 * This program is distributed in the hope that it will be useful,
10
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 
 * GNU General Public License for more details.
13
 
 *
14
 
 * You should have received a copy of the GNU General Public License
15
 
 * along with this program; if not, write to the Free Software
16
 
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17
 
 * 02111-1307, USA.
18
 
 */
19
 
 
20
 
#include <glib/gi18n.h>
21
 
#include <gtk/gtk.h>
22
 
#include <dbus/dbus-glib-bindings.h>
23
 
 
24
 
#include "fingerprint-strings.h"
25
 
#include "capplet-util.h"
26
 
 
27
 
/* This must match the number of images on the 2nd page in the UI file */
28
 
#define MAX_ENROLL_STAGES 5
29
 
 
30
 
/* Translate fprintd strings */
31
 
#define TR(s) dgettext("fprintd", s)
32
 
 
33
 
static DBusGProxy *manager = NULL;
34
 
static DBusGConnection *connection = NULL;
35
 
static gboolean is_disable = FALSE;
36
 
 
37
 
enum {
38
 
        STATE_NONE,
39
 
        STATE_CLAIMED,
40
 
        STATE_ENROLLING
41
 
};
42
 
 
43
 
typedef struct {
44
 
        GtkWidget *enable;
45
 
        GtkWidget *disable;
46
 
 
47
 
        GtkWidget *ass;
48
 
        GtkBuilder *dialog;
49
 
 
50
 
        DBusGProxy *device;
51
 
        gboolean is_swipe;
52
 
        int num_enroll_stages;
53
 
        int num_stages_done;
54
 
        char *name;
55
 
        const char *finger;
56
 
        gint state;
57
 
} EnrollData;
58
 
 
59
 
static void create_manager (void)
60
 
{
61
 
        GError *error = NULL;
62
 
 
63
 
        connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
64
 
        if (connection == NULL) {
65
 
                g_warning ("Failed to connect to session bus: %s", error->message);
66
 
                return;
67
 
        }
68
 
 
69
 
        manager = dbus_g_proxy_new_for_name (connection,
70
 
                                             "net.reactivated.Fprint",
71
 
                                             "/net/reactivated/Fprint/Manager",
72
 
                                             "net.reactivated.Fprint.Manager");
73
 
}
74
 
 
75
 
static DBusGProxy *
76
 
get_first_device (void)
77
 
{
78
 
        DBusGProxy *device;
79
 
        char *device_str;
80
 
 
81
 
        if (!dbus_g_proxy_call (manager, "GetDefaultDevice", NULL, G_TYPE_INVALID,
82
 
                                DBUS_TYPE_G_OBJECT_PATH, &device_str, G_TYPE_INVALID)) {
83
 
                return NULL;
84
 
        }
85
 
 
86
 
        device = dbus_g_proxy_new_for_name(connection,
87
 
                                           "net.reactivated.Fprint",
88
 
                                           device_str,
89
 
                                           "net.reactivated.Fprint.Device");
90
 
 
91
 
        g_free (device_str);
92
 
 
93
 
        return device;
94
 
}
95
 
 
96
 
static const char *
97
 
get_reason_for_error (const char *dbus_error)
98
 
{
99
 
        if (g_str_equal (dbus_error, "net.reactivated.Fprint.Error.PermissionDenied"))
100
 
                return N_("You are not allowed to access the device. Contact your system administrator.");
101
 
        if (g_str_equal (dbus_error, "net.reactivated.Fprint.Error.AlreadyInUse"))
102
 
                return N_("The device is already in use.");
103
 
        if (g_str_equal (dbus_error, "net.reactivated.Fprint.Error.Internal"))
104
 
                return N_("An internal error occured");
105
 
 
106
 
        return NULL;
107
 
}
108
 
 
109
 
static GtkWidget *
110
 
get_error_dialog (const char *title,
111
 
                  const char *dbus_error,
112
 
                  GtkWindow *parent)
113
 
{
114
 
        GtkWidget *error_dialog;
115
 
        const char *reason;
116
 
 
117
 
        if (dbus_error == NULL)
118
 
                g_warning ("get_error_dialog called with reason == NULL");
119
 
 
120
 
        error_dialog =
121
 
                gtk_message_dialog_new (parent,
122
 
                                GTK_DIALOG_MODAL,
123
 
                                GTK_MESSAGE_ERROR,
124
 
                                GTK_BUTTONS_OK,
125
 
                                "%s", title);
126
 
        reason = get_reason_for_error (dbus_error);
127
 
        gtk_message_dialog_format_secondary_text
128
 
                (GTK_MESSAGE_DIALOG (error_dialog), "%s", reason ? _(reason) : _(dbus_error));
129
 
 
130
 
        gtk_window_set_title (GTK_WINDOW (error_dialog), ""); /* as per HIG */
131
 
        gtk_container_set_border_width (GTK_CONTAINER (error_dialog), 5);
132
 
        gtk_dialog_set_default_response (GTK_DIALOG (error_dialog),
133
 
                                         GTK_RESPONSE_OK);
134
 
        gtk_window_set_modal (GTK_WINDOW (error_dialog), TRUE);
135
 
        gtk_window_set_position (GTK_WINDOW (error_dialog), GTK_WIN_POS_CENTER_ON_PARENT);
136
 
 
137
 
        return error_dialog;
138
 
}
139
 
 
140
 
void
141
 
set_fingerprint_label (GtkWidget *enable, GtkWidget *disable)
142
 
{
143
 
        char **fingers;
144
 
        DBusGProxy *device;
145
 
        GError *error = NULL;
146
 
 
147
 
        gtk_widget_set_no_show_all (enable, TRUE);
148
 
        gtk_widget_set_no_show_all (disable, TRUE);
149
 
 
150
 
        if (manager == NULL) {
151
 
                create_manager ();
152
 
                if (manager == NULL) {
153
 
                        gtk_widget_hide (enable);
154
 
                        gtk_widget_hide (disable);
155
 
                        return;
156
 
                }
157
 
        }
158
 
 
159
 
        device = get_first_device ();
160
 
        if (device == NULL) {
161
 
                gtk_widget_hide (enable);
162
 
                gtk_widget_hide (disable);
163
 
                return;
164
 
        }
165
 
 
166
 
        if (!dbus_g_proxy_call (device, "ListEnrolledFingers", &error, G_TYPE_STRING, "", G_TYPE_INVALID,
167
 
                                G_TYPE_STRV, &fingers, G_TYPE_INVALID)) {
168
 
                if (dbus_g_error_has_name (error, "net.reactivated.Fprint.Error.NoEnrolledPrints") == FALSE) {
169
 
                        gtk_widget_hide (enable);
170
 
                        gtk_widget_hide (disable);
171
 
                        g_object_unref (device);
172
 
                        return;
173
 
                }
174
 
                fingers = NULL;
175
 
        }
176
 
 
177
 
        if (fingers == NULL || g_strv_length (fingers) == 0) {
178
 
                gtk_widget_hide (disable);
179
 
                gtk_widget_show (enable);
180
 
                is_disable = FALSE;
181
 
        } else {
182
 
                gtk_widget_hide (enable);
183
 
                gtk_widget_show (disable);
184
 
                is_disable = TRUE;
185
 
        }
186
 
 
187
 
        g_strfreev (fingers);
188
 
        g_object_unref (device);
189
 
}
190
 
 
191
 
static void
192
 
delete_fingerprints (void)
193
 
{
194
 
        DBusGProxy *device;
195
 
 
196
 
        if (manager == NULL) {
197
 
                create_manager ();
198
 
                if (manager == NULL)
199
 
                        return;
200
 
        }
201
 
 
202
 
        device = get_first_device ();
203
 
        if (device == NULL)
204
 
                return;
205
 
 
206
 
        dbus_g_proxy_call (device, "DeleteEnrolledFingers", NULL, G_TYPE_STRING, "", G_TYPE_INVALID, G_TYPE_INVALID);
207
 
 
208
 
        g_object_unref (device);
209
 
}
210
 
 
211
 
static void
212
 
delete_fingerprints_question (GtkBuilder *dialog, GtkWidget *enable, GtkWidget *disable)
213
 
{
214
 
        GtkWidget *question;
215
 
        GtkWidget *button;
216
 
 
217
 
        question = gtk_message_dialog_new (GTK_WINDOW (WID ("about-me-dialog")),
218
 
                                           GTK_DIALOG_MODAL,
219
 
                                           GTK_MESSAGE_QUESTION,
220
 
                                           GTK_BUTTONS_NONE,
221
 
                                           _("Delete registered fingerprints?"));
222
 
        gtk_dialog_add_button (GTK_DIALOG (question), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
223
 
 
224
 
        button = gtk_button_new_with_mnemonic (_("_Delete Fingerprints"));
225
 
        gtk_button_set_image (GTK_BUTTON (button), gtk_image_new_from_stock (GTK_STOCK_DELETE, GTK_ICON_SIZE_BUTTON));
226
 
        gtk_widget_set_can_default (button, TRUE);
227
 
        gtk_widget_show (button);
228
 
        gtk_dialog_add_action_widget (GTK_DIALOG (question), button, GTK_RESPONSE_OK);
229
 
 
230
 
        gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (question),
231
 
                                                  _("Do you want to delete your registered fingerprints so fingerprint login is disabled?"));
232
 
        gtk_container_set_border_width (GTK_CONTAINER (question), 5);
233
 
        gtk_dialog_set_default_response (GTK_DIALOG (question), GTK_RESPONSE_OK);
234
 
        gtk_window_set_position (GTK_WINDOW (question), GTK_WIN_POS_CENTER_ON_PARENT);
235
 
        gtk_window_set_modal (GTK_WINDOW (question), TRUE);
236
 
 
237
 
        if (gtk_dialog_run (GTK_DIALOG (question)) == GTK_RESPONSE_OK) {
238
 
                delete_fingerprints ();
239
 
                set_fingerprint_label (enable, disable);
240
 
        }
241
 
 
242
 
        gtk_widget_destroy (question);
243
 
}
244
 
 
245
 
static void
246
 
enroll_data_destroy (EnrollData *data)
247
 
{
248
 
        switch (data->state) {
249
 
        case STATE_ENROLLING:
250
 
                dbus_g_proxy_call(data->device, "EnrollStop", NULL, G_TYPE_INVALID, G_TYPE_INVALID);
251
 
                /* fall-through */
252
 
        case STATE_CLAIMED:
253
 
                dbus_g_proxy_call(data->device, "Release", NULL, G_TYPE_INVALID, G_TYPE_INVALID);
254
 
                /* fall-through */
255
 
        case STATE_NONE:
256
 
                g_free (data->name);
257
 
                g_object_unref (data->device);
258
 
                g_object_unref (data->dialog);
259
 
                gtk_widget_destroy (data->ass);
260
 
 
261
 
                g_free (data);
262
 
        }
263
 
}
264
 
 
265
 
static const char *
266
 
selected_finger (GtkBuilder *dialog)
267
 
{
268
 
        int index;
269
 
 
270
 
        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (WID ("radiobutton1")))) {
271
 
                gtk_widget_set_sensitive (WID ("finger_combobox"), FALSE);
272
 
                return "right-index-finger";
273
 
        }
274
 
        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (WID ("radiobutton2")))) {
275
 
                gtk_widget_set_sensitive (WID ("finger_combobox"), FALSE);
276
 
                return "left-index-finger";
277
 
        }
278
 
        gtk_widget_set_sensitive (WID ("finger_combobox"), TRUE);
279
 
        index = gtk_combo_box_get_active (GTK_COMBO_BOX (WID ("finger_combobox")));
280
 
        switch (index) {
281
 
        case 0:
282
 
                return "left-thumb";
283
 
        case 1:
284
 
                return "left-middle-finger";
285
 
        case 2:
286
 
                return "left-ring-finger";
287
 
        case 3:
288
 
                return "left-little-finger";
289
 
        case 4:
290
 
                return "right-thumb";
291
 
        case 5:
292
 
                return "right-middle-finger";
293
 
        case 6:
294
 
                return "right-ring-finger";
295
 
        case 7:
296
 
                return "right-little-finger";
297
 
        default:
298
 
                g_assert_not_reached ();
299
 
        }
300
 
 
301
 
        return NULL;
302
 
}
303
 
 
304
 
static void
305
 
finger_radio_button_toggled (GtkToggleButton *button, EnrollData *data)
306
 
{
307
 
        GtkBuilder *dialog = data->dialog;
308
 
        char *msg;
309
 
 
310
 
        data->finger = selected_finger (data->dialog);
311
 
 
312
 
        msg = g_strdup_printf (TR(finger_str_to_msg (data->finger, data->is_swipe)), data->name);
313
 
        gtk_label_set_text (GTK_LABEL (WID("enroll-label")), msg);
314
 
        g_free (msg);
315
 
}
316
 
 
317
 
static void
318
 
finger_combobox_changed (GtkComboBox *combobox, EnrollData *data)
319
 
{
320
 
        GtkBuilder *dialog = data->dialog;
321
 
        char *msg;
322
 
 
323
 
        data->finger = selected_finger (data->dialog);
324
 
 
325
 
        msg = g_strdup_printf (TR(finger_str_to_msg (data->finger, data->is_swipe)), data->name);
326
 
        gtk_label_set_text (GTK_LABEL (WID("enroll-label")), msg);
327
 
        g_free (msg);
328
 
}
329
 
 
330
 
static void
331
 
assistant_cancelled (GtkAssistant *ass, EnrollData *data)
332
 
{
333
 
        GtkWidget *enable, *disable;
334
 
 
335
 
        enable = data->enable;
336
 
        disable = data->disable;
337
 
 
338
 
        enroll_data_destroy (data);
339
 
        set_fingerprint_label (enable, disable);
340
 
}
341
 
 
342
 
static void
343
 
enroll_result (GObject *object, const char *result, gboolean done, EnrollData *data)
344
 
{
345
 
        GtkBuilder *dialog = data->dialog;
346
 
        char *msg;
347
 
 
348
 
        if (g_str_equal (result, "enroll-completed") || g_str_equal (result, "enroll-stage-passed")) {
349
 
                char *name, *path;
350
 
 
351
 
                data->num_stages_done++;
352
 
                name = g_strdup_printf ("image%d", data->num_stages_done);
353
 
                path = g_build_filename (GNOMECC_PIXMAP_DIR, "print_ok.png", NULL);
354
 
                gtk_image_set_from_file (GTK_IMAGE (WID (name)), path);
355
 
                g_free (name);
356
 
                g_free (path);
357
 
        }
358
 
        if (g_str_equal (result, "enroll-completed")) {
359
 
                gtk_label_set_text (GTK_LABEL (WID ("status-label")), _("Done!"));
360
 
                gtk_assistant_set_page_complete (GTK_ASSISTANT (data->ass), WID ("page2"), TRUE);
361
 
        }
362
 
 
363
 
        if (done != FALSE) {
364
 
                dbus_g_proxy_call(data->device, "EnrollStop", NULL, G_TYPE_INVALID, G_TYPE_INVALID);
365
 
                data->state = STATE_CLAIMED;
366
 
                if (g_str_equal (result, "enroll-completed") == FALSE) {
367
 
                        /* The enrollment failed, restart it */
368
 
                        dbus_g_proxy_call(data->device, "EnrollStart", NULL, G_TYPE_STRING, data->finger, G_TYPE_INVALID, G_TYPE_INVALID);
369
 
                        data->state = STATE_ENROLLING;
370
 
                        result = "enroll-retry-scan";
371
 
                } else {
372
 
                        return;
373
 
                }
374
 
        }
375
 
 
376
 
        msg = g_strdup_printf (TR(enroll_result_str_to_msg (result, data->is_swipe)), data->name);
377
 
        gtk_label_set_text (GTK_LABEL (WID ("status-label")), msg);
378
 
        g_free (msg);
379
 
}
380
 
 
381
 
static void
382
 
assistant_prepare (GtkAssistant *ass, GtkWidget *page, EnrollData *data)
383
 
{
384
 
        const char *name;
385
 
 
386
 
        name = g_object_get_data (G_OBJECT (page), "name");
387
 
        if (name == NULL)
388
 
                return;
389
 
 
390
 
        if (g_str_equal (name, "enroll")) {
391
 
                DBusGProxy *p;
392
 
                GError *error = NULL;
393
 
                GtkBuilder *dialog = data->dialog;
394
 
                char *path;
395
 
                guint i;
396
 
                GValue value = { 0, };
397
 
 
398
 
                if (!dbus_g_proxy_call (data->device, "Claim", &error, G_TYPE_STRING, "", G_TYPE_INVALID, G_TYPE_INVALID)) {
399
 
                        GtkWidget *d;
400
 
                        char *msg;
401
 
 
402
 
                        /* translators:
403
 
                         * The variable is the name of the device, for example:
404
 
                         * "Could you not access "Digital Persona U.are.U 4000/4000B" device */
405
 
                        msg = g_strdup_printf (_("Could not access '%s' device"), data->name);
406
 
                        d = get_error_dialog (msg, dbus_g_error_get_name (error), GTK_WINDOW (data->ass));
407
 
                        g_error_free (error);
408
 
                        gtk_dialog_run (GTK_DIALOG (d));
409
 
                        gtk_widget_destroy (d);
410
 
                        g_free (msg);
411
 
 
412
 
                        enroll_data_destroy (data);
413
 
 
414
 
                        return;
415
 
                }
416
 
                data->state = STATE_CLAIMED;
417
 
 
418
 
                p = dbus_g_proxy_new_from_proxy (data->device, "org.freedesktop.DBus.Properties", NULL);
419
 
                if (!dbus_g_proxy_call (p, "Get", NULL, G_TYPE_STRING, "net.reactivated.Fprint.Device", G_TYPE_STRING, "num-enroll-stages", G_TYPE_INVALID,
420
 
                                       G_TYPE_VALUE, &value, G_TYPE_INVALID) || g_value_get_int (&value) < 1) {
421
 
                        GtkWidget *d;
422
 
                        char *msg;
423
 
 
424
 
                        /* translators:
425
 
                         * The variable is the name of the device, for example:
426
 
                         * "Could you not access "Digital Persona U.are.U 4000/4000B" device */
427
 
                        msg = g_strdup_printf (_("Could not access '%s' device"), data->name);
428
 
                        d = get_error_dialog (msg, "net.reactivated.Fprint.Error.Internal", GTK_WINDOW (data->ass));
429
 
                        gtk_dialog_run (GTK_DIALOG (d));
430
 
                        gtk_widget_destroy (d);
431
 
                        g_free (msg);
432
 
 
433
 
                        enroll_data_destroy (data);
434
 
 
435
 
                        g_object_unref (p);
436
 
                        return;
437
 
                }
438
 
                g_object_unref (p);
439
 
 
440
 
                data->num_enroll_stages = g_value_get_int (&value);
441
 
 
442
 
                /* Hide the extra "bulbs" if not needed */
443
 
                for (i = MAX_ENROLL_STAGES; i > data->num_enroll_stages; i--) {
444
 
                        char *name;
445
 
 
446
 
                        name = g_strdup_printf ("image%d", i);
447
 
                        gtk_widget_hide (WID (name));
448
 
                        g_free (name);
449
 
                }
450
 
                /* And set the right image */
451
 
                {
452
 
                        char *filename;
453
 
 
454
 
                        filename = g_strdup_printf ("%s.png", data->finger);
455
 
                        path = g_build_filename (GNOMECC_PIXMAP_DIR, filename, NULL);
456
 
                        g_free (filename);
457
 
                }
458
 
                for (i = 1; i <= data->num_enroll_stages; i++) {
459
 
                        char *name;
460
 
                        name = g_strdup_printf ("image%d", i);
461
 
                        gtk_image_set_from_file (GTK_IMAGE (WID (name)), path);
462
 
                        g_free (name);
463
 
                }
464
 
                g_free (path);
465
 
 
466
 
                dbus_g_proxy_add_signal(data->device, "EnrollStatus", G_TYPE_STRING, G_TYPE_BOOLEAN, NULL);
467
 
                dbus_g_proxy_connect_signal(data->device, "EnrollStatus", G_CALLBACK(enroll_result), data, NULL);
468
 
 
469
 
                if (!dbus_g_proxy_call(data->device, "EnrollStart", &error, G_TYPE_STRING, data->finger, G_TYPE_INVALID, G_TYPE_INVALID)) {
470
 
                        GtkWidget *d;
471
 
                        char *msg;
472
 
 
473
 
                        /* translators:
474
 
                         * The variable is the name of the device, for example:
475
 
                         * "Could you not access "Digital Persona U.are.U 4000/4000B" device */
476
 
                        msg = g_strdup_printf (_("Could not start finger capture on '%s' device"), data->name);
477
 
                        d = get_error_dialog (msg, dbus_g_error_get_name (error), GTK_WINDOW (data->ass));
478
 
                        g_error_free (error);
479
 
                        gtk_dialog_run (GTK_DIALOG (d));
480
 
                        gtk_widget_destroy (d);
481
 
                        g_free (msg);
482
 
 
483
 
                        enroll_data_destroy (data);
484
 
 
485
 
                        return;
486
 
                }
487
 
                data->state = STATE_ENROLLING;;
488
 
        } else {
489
 
                if (data->state == STATE_ENROLLING) {
490
 
                        dbus_g_proxy_call(data->device, "EnrollStop", NULL, G_TYPE_INVALID, G_TYPE_INVALID);
491
 
                        data->state = STATE_CLAIMED;
492
 
                }
493
 
                if (data->state == STATE_CLAIMED) {
494
 
                        dbus_g_proxy_call(data->device, "Release", NULL, G_TYPE_INVALID, G_TYPE_INVALID);
495
 
                        data->state = STATE_NONE;
496
 
                }
497
 
        }
498
 
}
499
 
 
500
 
static void
501
 
enroll_fingerprints (GtkWindow *parent, GtkWidget *enable, GtkWidget *disable)
502
 
{
503
 
        DBusGProxy *device, *p;
504
 
        GHashTable *props;
505
 
        GtkBuilder *dialog;
506
 
        EnrollData *data;
507
 
        GtkWidget *ass;
508
 
        char *msg;
509
 
 
510
 
        device = NULL;
511
 
 
512
 
        if (manager == NULL) {
513
 
                create_manager ();
514
 
                if (manager != NULL)
515
 
                        device = get_first_device ();
516
 
        } else {
517
 
                device = get_first_device ();
518
 
        }
519
 
 
520
 
        if (manager == NULL || device == NULL) {
521
 
                GtkWidget *d;
522
 
 
523
 
                d = get_error_dialog (_("Could not access any fingerprint readers"),
524
 
                                      _("Please contact your system administrator for help."),
525
 
                                      parent);
526
 
                gtk_dialog_run (GTK_DIALOG (d));
527
 
                gtk_widget_destroy (d);
528
 
                return;
529
 
        }
530
 
 
531
 
        data = g_new0 (EnrollData, 1);
532
 
        data->device = device;
533
 
        data->enable = enable;
534
 
        data->disable = disable;
535
 
 
536
 
        /* Get some details about the device */
537
 
        p = dbus_g_proxy_new_from_proxy (device, "org.freedesktop.DBus.Properties", NULL);
538
 
        if (dbus_g_proxy_call (p, "GetAll", NULL, G_TYPE_STRING, "net.reactivated.Fprint.Device", G_TYPE_INVALID,
539
 
                               dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), &props, G_TYPE_INVALID)) {
540
 
                const char *scan_type;
541
 
                data->name = g_value_dup_string (g_hash_table_lookup (props, "name"));
542
 
                scan_type = g_value_dup_string (g_hash_table_lookup (props, "scan-type"));
543
 
                if (g_str_equal (scan_type, "swipe"))
544
 
                        data->is_swipe = TRUE;
545
 
                g_hash_table_destroy (props);
546
 
        }
547
 
        g_object_unref (p);
548
 
 
549
 
        dialog = gtk_builder_new ();
550
 
        gtk_builder_add_from_file (dialog, GNOMECC_UI_DIR "/gnome-about-me-fingerprint.ui", NULL);
551
 
        data->dialog = dialog;
552
 
 
553
 
        ass = WID ("assistant");
554
 
        gtk_window_set_title (GTK_WINDOW (ass), _("Enable Fingerprint Login"));
555
 
        gtk_window_set_transient_for (GTK_WINDOW (ass), parent);
556
 
        gtk_window_set_position (GTK_WINDOW (ass), GTK_WIN_POS_CENTER_ON_PARENT);
557
 
        g_signal_connect (G_OBJECT (ass), "cancel",
558
 
                          G_CALLBACK (assistant_cancelled), data);
559
 
        g_signal_connect (G_OBJECT (ass), "close",
560
 
                          G_CALLBACK (assistant_cancelled), data);
561
 
        g_signal_connect (G_OBJECT (ass), "prepare",
562
 
                          G_CALLBACK (assistant_prepare), data);
563
 
 
564
 
        /* Page 1 */
565
 
        gtk_combo_box_set_active (GTK_COMBO_BOX (WID ("finger_combobox")), 0);
566
 
 
567
 
        g_signal_connect (G_OBJECT (WID ("radiobutton1")), "toggled",
568
 
                          G_CALLBACK (finger_radio_button_toggled), data);
569
 
        g_signal_connect (G_OBJECT (WID ("radiobutton2")), "toggled",
570
 
                          G_CALLBACK (finger_radio_button_toggled), data);
571
 
        g_signal_connect (G_OBJECT (WID ("radiobutton3")), "toggled",
572
 
                          G_CALLBACK (finger_radio_button_toggled), data);
573
 
        g_signal_connect (G_OBJECT (WID ("finger_combobox")), "changed",
574
 
                          G_CALLBACK (finger_combobox_changed), data);
575
 
 
576
 
        data->finger = selected_finger (dialog);
577
 
 
578
 
        g_object_set_data (G_OBJECT (WID("page1")), "name", "intro");
579
 
 
580
 
        /* translators:
581
 
         * The variable is the name of the device, for example:
582
 
         * "To enable fingerprint login, you need to save one of your fingerprints, using the
583
 
         * 'Digital Persona U.are.U 4000/4000B' device." */
584
 
        msg = g_strdup_printf (_("To enable fingerprint login, you need to save one of your fingerprints, using the '%s' device."),
585
 
                               data->name);
586
 
        gtk_label_set_text (GTK_LABEL (WID("intro-label")), msg);
587
 
        g_free (msg);
588
 
 
589
 
        gtk_assistant_set_page_complete (GTK_ASSISTANT (ass), WID("page1"), TRUE);
590
 
 
591
 
        /* Page 2 */
592
 
        if (data->is_swipe != FALSE)
593
 
                gtk_assistant_set_page_title (GTK_ASSISTANT (ass), WID("page2"), _("Swipe finger on reader"));
594
 
        else
595
 
                gtk_assistant_set_page_title (GTK_ASSISTANT (ass), WID("page2"), _("Place finger on reader"));
596
 
 
597
 
        g_object_set_data (G_OBJECT (WID("page2")), "name", "enroll");
598
 
 
599
 
        msg = g_strdup_printf (TR(finger_str_to_msg (data->finger, data->is_swipe)), data->name);
600
 
        gtk_label_set_text (GTK_LABEL (WID("enroll-label")), msg);
601
 
        g_free (msg);
602
 
 
603
 
        /* Page 3 */
604
 
        g_object_set_data (G_OBJECT (WID("page3")), "name", "summary");
605
 
 
606
 
        data->ass = ass;
607
 
        gtk_widget_show_all (ass);
608
 
}
609
 
 
610
 
void
611
 
fingerprint_button_clicked (GtkBuilder *dialog,
612
 
                            GtkWidget *enable,
613
 
                            GtkWidget *disable)
614
 
{
615
 
        bindtextdomain ("fprintd", GNOMELOCALEDIR);
616
 
        bind_textdomain_codeset ("fprintd", "UTF-8");
617
 
 
618
 
        if (is_disable != FALSE) {
619
 
                delete_fingerprints_question (dialog, enable, disable);
620
 
        } else {
621
 
                enroll_fingerprints (GTK_WINDOW (WID ("about-me-dialog")), enable, disable);
622
 
        }
623
 
}
624