summaryrefslogtreecommitdiff
path: root/capplets/about-me
diff options
context:
space:
mode:
Diffstat (limited to 'capplets/about-me')
-rw-r--r--capplets/about-me/AUTHORS2
-rw-r--r--capplets/about-me/Makefile.am59
-rw-r--r--capplets/about-me/e-image-chooser.c455
-rw-r--r--capplets/about-me/e-image-chooser.h66
-rw-r--r--capplets/about-me/eel-alert-dialog.c466
-rw-r--r--capplets/about-me/eel-alert-dialog.h61
-rw-r--r--capplets/about-me/eel-gtk-macros.h178
-rw-r--r--capplets/about-me/fingerprint-strings.h111
-rw-r--r--capplets/about-me/fprintd-marshal.list1
-rw-r--r--capplets/about-me/icons/Makefile.am30
-rw-r--r--capplets/about-me/icons/left-index-finger.pngbin0 -> 1515 bytes
-rw-r--r--capplets/about-me/icons/left-index-finger.svg177
-rw-r--r--capplets/about-me/icons/left-little-finger.pngbin0 -> 1500 bytes
-rw-r--r--capplets/about-me/icons/left-little-finger.svg180
-rw-r--r--capplets/about-me/icons/left-middle-finger.pngbin0 -> 1483 bytes
-rw-r--r--capplets/about-me/icons/left-middle-finger.svg180
-rw-r--r--capplets/about-me/icons/left-ring-finger.pngbin0 -> 1512 bytes
-rw-r--r--capplets/about-me/icons/left-ring-finger.svg180
-rw-r--r--capplets/about-me/icons/left-thumb.pngbin0 -> 1512 bytes
-rw-r--r--capplets/about-me/icons/left-thumb.svg180
-rw-r--r--capplets/about-me/icons/print_error.pngbin0 -> 4160 bytes
-rw-r--r--capplets/about-me/icons/print_error.svg525
-rw-r--r--capplets/about-me/icons/print_ok.pngbin0 -> 3677 bytes
-rw-r--r--capplets/about-me/icons/print_ok.svg310
-rw-r--r--capplets/about-me/icons/right-index-finger.pngbin0 -> 1506 bytes
-rw-r--r--capplets/about-me/icons/right-index-finger.svg179
-rw-r--r--capplets/about-me/icons/right-little-finger.pngbin0 -> 1479 bytes
-rw-r--r--capplets/about-me/icons/right-little-finger.svg182
-rw-r--r--capplets/about-me/icons/right-middle-finger.pngbin0 -> 1468 bytes
-rw-r--r--capplets/about-me/icons/right-middle-finger.svg182
-rw-r--r--capplets/about-me/icons/right-ring-finger.pngbin0 -> 1506 bytes
-rw-r--r--capplets/about-me/icons/right-ring-finger.svg182
-rw-r--r--capplets/about-me/icons/right-thumb.pngbin0 -> 1486 bytes
-rw-r--r--capplets/about-me/icons/right-thumb.svg182
-rw-r--r--capplets/about-me/mate-about-me-dialog.ui1622
-rw-r--r--capplets/about-me/mate-about-me-fingerprint.c624
-rw-r--r--capplets/about-me/mate-about-me-fingerprint.h27
-rw-r--r--capplets/about-me/mate-about-me-fingerprint.ui276
-rw-r--r--capplets/about-me/mate-about-me-password.c1136
-rw-r--r--capplets/about-me/mate-about-me-password.h9
-rw-r--r--capplets/about-me/mate-about-me-password.ui319
-rw-r--r--capplets/about-me/mate-about-me.c1005
-rw-r--r--capplets/about-me/mate-about-me.desktop.in.in14
43 files changed, 9100 insertions, 0 deletions
diff --git a/capplets/about-me/AUTHORS b/capplets/about-me/AUTHORS
new file mode 100644
index 00000000..c02ecb55
--- /dev/null
+++ b/capplets/about-me/AUTHORS
@@ -0,0 +1,2 @@
+Diego Gonzalez Gonzalez <[email protected]>
+Chris Toshok <[email protected]> \ No newline at end of file
diff --git a/capplets/about-me/Makefile.am b/capplets/about-me/Makefile.am
new file mode 100644
index 00000000..6cd5e139
--- /dev/null
+++ b/capplets/about-me/Makefile.am
@@ -0,0 +1,59 @@
+SUBDIRS = icons
+
+# This is used in MATECC_CAPPLETS_CFLAGS
+cappletname = about-me
+
+ui_files = mate-about-me-dialog.ui mate-about-me-password.ui mate-about-me-fingerprint.ui
+Desktop_in_files = mate-about-me.desktop.in
+
+mate_about_me_SOURCES = \
+ eel-alert-dialog.c \
+ eel-alert-dialog.h \
+ eel-gtk-macros.h \
+ mate-about-me-password.c \
+ mate-about-me-password.h \
+ e-image-chooser.c \
+ e-image-chooser.h \
+ mate-about-me-fingerprint.c \
+ mate-about-me-fingerprint.h \
+ $(MARSHALFILES) \
+ fingerprint-strings.h \
+ mate-about-me.c
+
+MARSHALFILES = marshal.c marshal.h
+BUILT_SOURCES = $(MARSHALFILES)
+
+marshal.h: fprintd-marshal.list
+ @GLIB_GENMARSHAL@ --prefix=fprintd_marshal $< --header > $@
+marshal.c: fprintd-marshal.list
+ @GLIB_GENMARSHAL@ --prefix=fprintd_marshal $< --body --header > $@
+
+if BUILD_ABOUTME
+bin_PROGRAMS = mate-about-me
+
+mate_about_me_LDADD = $(MATECC_CAPPLETS_LIBS) $(LIBEBOOK_LIBS)
+mate_about_me_LDFLAGS = -export-dynamic
+
+@INTLTOOL_DESKTOP_RULE@
+
+desktopdir = $(datadir)/applications
+desktop_DATA = $(Desktop_in_files:.desktop.in=.desktop)
+
+uidir = $(pkgdatadir)/ui
+ui_DATA = $(ui_files)
+
+INCLUDES = \
+ $(MATECC_CAPPLETS_CFLAGS) \
+ $(LIBEBOOK_CFLAGS) \
+ -DDATADIR="\"$(datadir)\"" \
+ -DMATECC_DATA_DIR="\"$(pkgdatadir)\"" \
+ -DMATECC_UI_DIR="\"$(uidir)\"" \
+ -DMATECC_PIXMAP_DIR="\"$(pkgdatadir)/pixmaps\"" \
+ -DMATELOCALEDIR="\"$(datadir)/locale\""
+
+endif # BUILD_ABOUTME
+
+CLEANFILES = $(MATECC_CAPPLETS_CLEANFILES) $(desktop_DATA) $(MARSHALFILES)
+EXTRA_DIST = $(ui_files) fprintd-marshal.list
+
+-include $(top_srcdir)/git.mk
diff --git a/capplets/about-me/e-image-chooser.c b/capplets/about-me/e-image-chooser.c
new file mode 100644
index 00000000..31a189f1
--- /dev/null
+++ b/capplets/about-me/e-image-chooser.c
@@ -0,0 +1,455 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* e-image-chooser.c
+ * Copyright (C) 2004 Novell, Inc.
+ * Author: Chris Toshok <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <glib-object.h>
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+#include <gtk/gtk.h>
+
+#include "e-image-chooser.h"
+
+struct _EImageChooserPrivate {
+
+ GtkWidget *image;
+ GtkWidget *browse_button;
+
+ char *image_buf;
+ int image_buf_size;
+ int image_width;
+ int image_height;
+
+ gboolean editable;
+};
+
+enum {
+ CHANGED,
+ LAST_SIGNAL
+};
+
+
+static gint image_chooser_signals [LAST_SIGNAL] = { 0 };
+
+static void e_image_chooser_init (EImageChooser *chooser);
+static void e_image_chooser_class_init (EImageChooserClass *klass);
+static void e_image_chooser_dispose (GObject *object);
+
+static gboolean image_drag_motion_cb (GtkWidget *widget,
+ GdkDragContext *context,
+ gint x, gint y, guint time, EImageChooser *chooser);
+static gboolean image_drag_drop_cb (GtkWidget *widget,
+ GdkDragContext *context,
+ gint x, gint y, guint time, EImageChooser *chooser);
+static void image_drag_data_received_cb (GtkWidget *widget,
+ GdkDragContext *context,
+ gint x, gint y,
+ GtkSelectionData *selection_data,
+ guint info, guint time, EImageChooser *chooser);
+
+static GtkObjectClass *parent_class = NULL;
+#define PARENT_TYPE GTK_TYPE_VBOX
+
+enum DndTargetType {
+ DND_TARGET_TYPE_URI_LIST
+};
+#define URI_LIST_TYPE "text/uri-list"
+
+static GtkTargetEntry image_drag_types[] = {
+ { URI_LIST_TYPE, 0, DND_TARGET_TYPE_URI_LIST },
+};
+static const int num_image_drag_types = sizeof (image_drag_types) / sizeof (image_drag_types[0]);
+
+GtkWidget *
+e_image_chooser_new (void)
+{
+ return g_object_new (E_TYPE_IMAGE_CHOOSER, NULL);
+}
+
+GType
+e_image_chooser_get_type (void)
+{
+ static GType eic_type = 0;
+
+ if (!eic_type) {
+ static const GTypeInfo eic_info = {
+ sizeof (EImageChooserClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) e_image_chooser_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (EImageChooser),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) e_image_chooser_init,
+ };
+
+ eic_type = g_type_register_static (PARENT_TYPE, "EImageChooser", &eic_info, 0);
+ }
+
+ return eic_type;
+}
+
+
+static void
+e_image_chooser_class_init (EImageChooserClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ parent_class = g_type_class_ref (PARENT_TYPE);
+
+ image_chooser_signals [CHANGED] =
+ g_signal_new ("changed",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (EImageChooserClass, changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ GTK_TYPE_NONE, 0);
+
+ object_class->dispose = e_image_chooser_dispose;
+}
+
+static void
+e_image_chooser_init (EImageChooser *chooser)
+{
+ EImageChooserPrivate *priv;
+
+ priv = chooser->priv = g_new0 (EImageChooserPrivate, 1);
+
+ priv->image = gtk_image_new ();
+
+ gtk_box_set_homogeneous (GTK_BOX (chooser), FALSE);
+ gtk_box_pack_start (GTK_BOX (chooser), priv->image, TRUE, TRUE, 0);
+
+ gtk_drag_dest_set (priv->image, 0, image_drag_types, num_image_drag_types, GDK_ACTION_COPY);
+ g_signal_connect (priv->image,
+ "drag_motion", G_CALLBACK (image_drag_motion_cb), chooser);
+ g_signal_connect (priv->image,
+ "drag_drop", G_CALLBACK (image_drag_drop_cb), chooser);
+ g_signal_connect (priv->image,
+ "drag_data_received", G_CALLBACK (image_drag_data_received_cb), chooser);
+
+ gtk_widget_show_all (priv->image);
+
+ /* we default to being editable */
+ priv->editable = TRUE;
+}
+
+static void
+e_image_chooser_dispose (GObject *object)
+{
+ EImageChooser *eic = E_IMAGE_CHOOSER (object);
+
+ if (eic->priv) {
+ EImageChooserPrivate *priv = eic->priv;
+
+ if (priv->image_buf) {
+ g_free (priv->image_buf);
+ priv->image_buf = NULL;
+ }
+
+ g_free (eic->priv);
+ eic->priv = NULL;
+ }
+
+ if (G_OBJECT_CLASS (parent_class)->dispose)
+ (* G_OBJECT_CLASS (parent_class)->dispose) (object);
+}
+
+
+static gboolean
+set_image_from_data (EImageChooser *chooser,
+ char *data, int length)
+{
+ gboolean rv = FALSE;
+ GdkPixbufLoader *loader = gdk_pixbuf_loader_new ();
+ GdkPixbuf *pixbuf;
+
+ gdk_pixbuf_loader_write (loader, data, length, NULL);
+ gdk_pixbuf_loader_close (loader, NULL);
+
+ pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
+ if (pixbuf)
+ g_object_ref (pixbuf);
+ g_object_unref (loader);
+
+ if (pixbuf) {
+ GdkPixbuf *scaled;
+ GtkRequisition chooser_size;
+
+ float scale;
+ int new_height, new_width;
+
+ gtk_widget_size_request (gtk_widget_get_parent (GTK_WIDGET (chooser)),
+ &chooser_size);
+ chooser_size.width -= 5;
+ chooser_size.height -= 5;
+
+ new_height = gdk_pixbuf_get_height (pixbuf);
+ new_width = gdk_pixbuf_get_width (pixbuf);
+
+ if (chooser->priv->image_height == 0
+ && chooser->priv->image_width == 0) {
+ scale = 1.0;
+ }
+ else if (chooser->priv->image_height < new_height
+ || chooser->priv->image_width < new_width) {
+ /* we need to scale down */
+ if (new_height > new_width)
+ scale = (float)chooser_size.height / new_height;
+ else
+ scale = (float)chooser_size.width / new_width;
+ }
+ else {
+ /* we need to scale up */
+ if (new_height > new_width)
+ scale = (float)new_height / chooser_size.height;
+ else
+ scale = (float)new_width / chooser_size.width;
+ }
+
+ if (scale == 1.0) {
+ gtk_image_set_from_pixbuf (GTK_IMAGE (chooser->priv->image), pixbuf);
+
+ chooser->priv->image_width = new_width;
+ chooser->priv->image_height = new_height;
+ }
+ else {
+ new_width *= scale;
+ new_height *= scale;
+ new_width = MIN (new_width, chooser_size.width);
+ new_height = MIN (new_height, chooser_size.height);
+
+ scaled = gdk_pixbuf_scale_simple (pixbuf,
+ new_width, new_height,
+ GDK_INTERP_BILINEAR);
+
+ gtk_image_set_from_pixbuf (GTK_IMAGE (chooser->priv->image), scaled);
+ g_object_unref (scaled);
+ }
+
+ g_object_unref (pixbuf);
+
+ g_free (chooser->priv->image_buf);
+ chooser->priv->image_buf = data;
+ chooser->priv->image_buf_size = length;
+
+ g_signal_emit (chooser,
+ image_chooser_signals [CHANGED], 0);
+
+ rv = TRUE;
+ }
+
+ return rv;
+}
+
+static gboolean
+image_drag_motion_cb (GtkWidget *widget,
+ GdkDragContext *context,
+ gint x, gint y, guint time, EImageChooser *chooser)
+{
+ GList *p;
+
+ if (!chooser->priv->editable)
+ return FALSE;
+
+ for (p = context->targets; p != NULL; p = p->next) {
+ char *possible_type;
+
+ possible_type = gdk_atom_name (GDK_POINTER_TO_ATOM (p->data));
+ if (!strcmp (possible_type, URI_LIST_TYPE)) {
+ g_free (possible_type);
+ gdk_drag_status (context, GDK_ACTION_COPY, time);
+ return TRUE;
+ }
+
+ g_free (possible_type);
+ }
+
+ return FALSE;
+}
+
+static gboolean
+image_drag_drop_cb (GtkWidget *widget,
+ GdkDragContext *context,
+ gint x, gint y, guint time, EImageChooser *chooser)
+{
+ GList *p;
+
+ if (!chooser->priv->editable)
+ return FALSE;
+
+ if (context->targets == NULL) {
+ return FALSE;
+ }
+
+ for (p = context->targets; p != NULL; p = p->next) {
+ char *possible_type;
+
+ possible_type = gdk_atom_name (GDK_POINTER_TO_ATOM (p->data));
+ if (!strcmp (possible_type, URI_LIST_TYPE)) {
+ g_free (possible_type);
+ gtk_drag_get_data (widget, context,
+ GDK_POINTER_TO_ATOM (p->data),
+ time);
+ return TRUE;
+ }
+
+ g_free (possible_type);
+ }
+
+ return FALSE;
+}
+
+static void
+image_drag_data_received_cb (GtkWidget *widget,
+ GdkDragContext *context,
+ gint x, gint y,
+ GtkSelectionData *selection_data,
+ guint info, guint time, EImageChooser *chooser)
+{
+ char *target_type;
+ gboolean handled = FALSE;
+
+ target_type = gdk_atom_name (gtk_selection_data_get_target (selection_data));
+
+ if (!strcmp (target_type, URI_LIST_TYPE)) {
+ const char *data = gtk_selection_data_get_data (selection_data);
+ char *uri;
+ GFile *file;
+ GInputStream *istream;
+ char *nl = strstr (data, "\r\n");
+
+ if (nl)
+ uri = g_strndup (data, nl - (char *) data);
+ else
+ uri = g_strdup (data);
+
+ file = g_file_new_for_uri (uri);
+ istream = G_INPUT_STREAM (g_file_read (file, NULL, NULL));
+
+ if (istream != NULL) {
+ GFileInfo *info;
+
+ info = g_file_query_info (file,
+ G_FILE_ATTRIBUTE_STANDARD_SIZE,
+ G_FILE_QUERY_INFO_NONE,
+ NULL, NULL);
+
+ if (info != NULL) {
+ gsize size;
+ gboolean success;
+ gchar *buf;
+
+ size = g_file_info_get_size (info);
+ g_object_unref (info);
+
+ buf = g_malloc (size);
+
+ success = g_input_stream_read_all (istream,
+ buf,
+ size,
+ &size,
+ NULL,
+ NULL);
+ g_input_stream_close (istream, NULL, NULL);
+
+ if (success &&
+ set_image_from_data (chooser, buf, size))
+ handled = TRUE;
+ else
+ g_free (buf);
+ }
+
+ g_object_unref (istream);
+ }
+
+ g_object_unref (file);
+ g_free (uri);
+ }
+
+ gtk_drag_finish (context, handled, FALSE, time);
+}
+
+gboolean
+e_image_chooser_set_from_file (EImageChooser *chooser, const char *filename)
+{
+ gchar *data;
+ gsize data_length;
+
+ g_return_val_if_fail (E_IS_IMAGE_CHOOSER (chooser), FALSE);
+ g_return_val_if_fail (filename, FALSE);
+
+ if (!g_file_get_contents (filename, &data, &data_length, NULL)) {
+ return FALSE;
+ }
+
+ if (!set_image_from_data (chooser, data, data_length))
+ g_free (data);
+
+ return TRUE;
+}
+
+void
+e_image_chooser_set_editable (EImageChooser *chooser, gboolean editable)
+{
+ g_return_if_fail (E_IS_IMAGE_CHOOSER (chooser));
+
+ chooser->priv->editable = editable;
+
+ gtk_widget_set_sensitive (chooser->priv->browse_button, editable);
+}
+
+gboolean
+e_image_chooser_get_image_data (EImageChooser *chooser, char **data, gsize *data_length)
+{
+ g_return_val_if_fail (E_IS_IMAGE_CHOOSER (chooser), FALSE);
+ g_return_val_if_fail (data != NULL, FALSE);
+ g_return_val_if_fail (data_length != NULL, FALSE);
+
+ *data_length = chooser->priv->image_buf_size;
+ *data = g_malloc (*data_length);
+ memcpy (*data, chooser->priv->image_buf, *data_length);
+
+ return TRUE;
+}
+
+gboolean
+e_image_chooser_set_image_data (EImageChooser *chooser, char *data, gsize data_length)
+{
+ char *buf;
+
+ g_return_val_if_fail (E_IS_IMAGE_CHOOSER (chooser), FALSE);
+ g_return_val_if_fail (data != NULL, FALSE);
+
+ /* yuck, a copy... */
+ buf = g_malloc (data_length);
+ memcpy (buf, data, data_length);
+
+ if (!set_image_from_data (chooser, buf, data_length)) {
+ g_free (buf);
+ return FALSE;
+ }
+
+ return TRUE;
+}
diff --git a/capplets/about-me/e-image-chooser.h b/capplets/about-me/e-image-chooser.h
new file mode 100644
index 00000000..b2b2fbf2
--- /dev/null
+++ b/capplets/about-me/e-image-chooser.h
@@ -0,0 +1,66 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* e-image-chooser.c
+ * Copyright (C) 2004 Novell, Inc.
+ * Author: Chris Toshok <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _E_IMAGE_CHOOSER_H_
+#define _E_IMAGE_CHOOSER_H_
+
+#include <gtk/gtk.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define E_TYPE_IMAGE_CHOOSER (e_image_chooser_get_type ())
+#define E_IMAGE_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_IMAGE_CHOOSER, EImageChooser))
+#define E_IMAGE_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_IMAGE_CHOOSER, EImageChooserClass))
+#define E_IS_IMAGE_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_IMAGE_CHOOSER))
+#define E_IS_IMAGE_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_IMAGE_CHOOSER))
+
+typedef struct _EImageChooser EImageChooser;
+typedef struct _EImageChooserClass EImageChooserClass;
+typedef struct _EImageChooserPrivate EImageChooserPrivate;
+
+struct _EImageChooser
+{
+ GtkVBox parent;
+
+ EImageChooserPrivate *priv;
+};
+
+struct _EImageChooserClass
+{
+ GtkVBoxClass parent_class;
+
+ /* signals */
+ void (*changed) (EImageChooser *chooser);
+
+
+};
+
+GtkWidget *e_image_chooser_new (void);
+GType e_image_chooser_get_type (void);
+
+gboolean e_image_chooser_set_from_file (EImageChooser *chooser, const char *filename);
+gboolean e_image_chooser_set_image_data (EImageChooser *chooser, char *data, gsize data_length);
+void e_image_chooser_set_editable (EImageChooser *chooser, gboolean editable);
+
+gboolean e_image_chooser_get_image_data (EImageChooser *chooser, char **data, gsize *data_length);
+
+#endif /* _E_IMAGE_CHOOSER_H_ */
diff --git a/capplets/about-me/eel-alert-dialog.c b/capplets/about-me/eel-alert-dialog.c
new file mode 100644
index 00000000..6370d6db
--- /dev/null
+++ b/capplets/about-me/eel-alert-dialog.c
@@ -0,0 +1,466 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
+/* eel-alert-dialog.c: An HIG compliant alert dialog.
+
+ The Mate Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Mate Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the Mate Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+*/
+
+#include "eel-alert-dialog.h"
+#include "eel-gtk-macros.h"
+
+#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+
+#include <string.h>
+
+enum {
+ PROP_0,
+ PROP_ALERT_TYPE,
+ PROP_BUTTONS
+};
+
+struct _EelAlertDialogDetails {
+ GtkWidget *image;
+ GtkWidget *primary_label;
+ GtkWidget *secondary_label;
+ GtkWidget *details_expander;
+ GtkWidget *details_label;
+ GtkMessageType type;
+};
+
+
+static gpointer parent_class;
+
+static void eel_alert_dialog_finalize (GObject *object);
+static void eel_alert_dialog_class_init (EelAlertDialogClass *klass);
+static void eel_alert_dialog_init (EelAlertDialog *dialog);
+static void eel_alert_dialog_style_set (GtkWidget *widget,
+ GtkStyle *prev_style);
+static void eel_alert_dialog_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void eel_alert_dialog_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void eel_alert_dialog_add_buttons (EelAlertDialog *alert_dialog,
+ GtkButtonsType buttons);
+
+GType
+eel_alert_dialog_get_type (void)
+{
+ static GType dialog_type = 0;
+
+ if (!dialog_type) {
+
+ static const GTypeInfo dialog_info =
+ {
+ sizeof (EelAlertDialogClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) eel_alert_dialog_class_init,
+ NULL,
+ NULL,
+ sizeof (EelAlertDialog),
+ 0,
+ (GInstanceInitFunc) eel_alert_dialog_init,
+ };
+
+ dialog_type = g_type_register_static (GTK_TYPE_DIALOG, "EelAlertDialog",
+ &dialog_info, 0);
+ }
+ return dialog_type;
+}
+
+static void
+eel_alert_dialog_class_init (EelAlertDialogClass *class)
+{
+ GtkWidgetClass *widget_class;
+ GObjectClass *gobject_class;
+
+ widget_class = GTK_WIDGET_CLASS (class);
+ gobject_class = G_OBJECT_CLASS (class);
+
+ parent_class = g_type_class_peek_parent (class);
+
+ G_OBJECT_CLASS (class)->finalize = eel_alert_dialog_finalize;
+
+ widget_class->style_set = eel_alert_dialog_style_set;
+
+ gobject_class->set_property = eel_alert_dialog_set_property;
+ gobject_class->get_property = eel_alert_dialog_get_property;
+
+ gtk_widget_class_install_style_property (widget_class,
+ g_param_spec_int ("alert_border",
+ _("Image/label border"),
+ _("Width of border around the label and image in the alert dialog"),
+ 0,
+ G_MAXINT,
+ 5,
+ G_PARAM_READABLE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_ALERT_TYPE,
+ g_param_spec_enum ("alert_type",
+ _("Alert Type"),
+ _("The type of alert"),
+ GTK_TYPE_MESSAGE_TYPE,
+ GTK_MESSAGE_INFO,
+ G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT));
+
+ g_object_class_install_property (gobject_class,
+ PROP_BUTTONS,
+ g_param_spec_enum ("buttons",
+ _("Alert Buttons"),
+ _("The buttons shown in the alert dialog"),
+ GTK_TYPE_BUTTONS_TYPE,
+ GTK_BUTTONS_NONE,
+ G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
+}
+
+static void
+eel_alert_dialog_finalize (GObject *object)
+{
+ EelAlertDialog *dialog;
+
+ dialog = EEL_ALERT_DIALOG (object);
+
+ g_free (dialog->details);
+
+ EEL_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
+}
+
+
+static void
+eel_alert_dialog_init (EelAlertDialog *dialog)
+{
+ GtkWidget *hbox;
+ GtkWidget *vbox;
+ GtkWidget *expander;
+
+ dialog->details = g_new0 (EelAlertDialogDetails, 1);
+
+ dialog->details->primary_label = gtk_label_new (NULL);
+ dialog->details->secondary_label = gtk_label_new (NULL);
+ dialog->details->details_label = gtk_label_new (NULL);
+ dialog->details->image = gtk_image_new_from_stock (NULL, GTK_ICON_SIZE_DIALOG);
+ gtk_misc_set_alignment (GTK_MISC (dialog->details->image), 0.5, 0.0);
+
+ gtk_label_set_line_wrap (GTK_LABEL (dialog->details->primary_label), TRUE);
+ gtk_label_set_selectable (GTK_LABEL (dialog->details->primary_label), TRUE);
+ gtk_label_set_use_markup (GTK_LABEL (dialog->details->primary_label), TRUE);
+ gtk_misc_set_alignment (GTK_MISC (dialog->details->primary_label), 0.0, 0.5);
+
+ gtk_label_set_line_wrap (GTK_LABEL (dialog->details->secondary_label), TRUE);
+ gtk_label_set_selectable (GTK_LABEL (dialog->details->secondary_label), TRUE);
+ gtk_misc_set_alignment (GTK_MISC (dialog->details->secondary_label), 0.0, 0.5);
+
+ gtk_label_set_line_wrap (GTK_LABEL (dialog->details->details_label), TRUE);
+ gtk_label_set_selectable (GTK_LABEL (dialog->details->details_label), TRUE);
+ gtk_misc_set_alignment (GTK_MISC (dialog->details->details_label), 0.0, 0.5);
+
+ hbox = gtk_hbox_new (FALSE, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+ gtk_box_pack_start (GTK_BOX (hbox), dialog->details->image,
+ FALSE, FALSE, 0);
+
+ vbox = gtk_vbox_new (FALSE, 12);
+
+ gtk_box_pack_start (GTK_BOX (hbox), vbox,
+ FALSE, FALSE, 0);
+
+ gtk_box_pack_start (GTK_BOX (vbox), dialog->details->primary_label,
+ FALSE, FALSE, 0);
+
+ gtk_box_pack_start (GTK_BOX (vbox), dialog->details->secondary_label,
+ FALSE, FALSE, 0);
+
+ expander = gtk_expander_new_with_mnemonic (_("Show more _details"));
+ dialog->details->details_expander = expander;
+ gtk_expander_set_spacing (GTK_EXPANDER (expander), 6);
+ gtk_container_add (GTK_CONTAINER (expander), dialog->details->details_label);
+
+ gtk_box_pack_start (GTK_BOX (vbox), expander,
+ FALSE, FALSE, 0);
+
+
+ gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), hbox,
+ FALSE, FALSE, 0);
+
+ gtk_widget_show_all (hbox);
+ gtk_widget_hide (expander);
+
+}
+
+static void
+setup_type (EelAlertDialog *dialog,
+ GtkMessageType type)
+{
+ const gchar *stock_id = NULL;
+ GtkStockItem item;
+
+ switch (type) {
+ case GTK_MESSAGE_INFO:
+ stock_id = GTK_STOCK_DIALOG_INFO;
+ break;
+ case GTK_MESSAGE_QUESTION:
+ stock_id = GTK_STOCK_DIALOG_QUESTION;
+ break;
+ case GTK_MESSAGE_WARNING:
+ stock_id = GTK_STOCK_DIALOG_WARNING;
+ break;
+ case GTK_MESSAGE_ERROR:
+ stock_id = GTK_STOCK_DIALOG_ERROR;
+ break;
+ default:
+ g_warning ("Unknown GtkMessageType %d", type);
+ break;
+ }
+
+ if (stock_id == NULL) {
+ stock_id = GTK_STOCK_DIALOG_INFO;
+ }
+
+ if (gtk_stock_lookup (stock_id, &item)) {
+ gtk_image_set_from_stock (GTK_IMAGE (dialog->details->image), stock_id,
+ GTK_ICON_SIZE_DIALOG);
+ } else {
+ g_warning ("Stock dialog ID doesn't exist?");
+ }
+}
+
+static void
+eel_alert_dialog_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ EelAlertDialog *dialog;
+
+ dialog = EEL_ALERT_DIALOG (object);
+
+ switch (prop_id) {
+ case PROP_ALERT_TYPE:
+ dialog->details->type = g_value_get_enum (value);
+ setup_type (dialog, dialog->details->type);
+ break;
+ case PROP_BUTTONS:
+ eel_alert_dialog_add_buttons (dialog, g_value_get_enum (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+eel_alert_dialog_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ EelAlertDialog *dialog;
+
+ dialog = EEL_ALERT_DIALOG (object);
+
+ switch (prop_id) {
+ case PROP_ALERT_TYPE:
+ g_value_set_enum (value, dialog->details->type);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+void
+eel_alert_dialog_set_primary_label (EelAlertDialog *dialog,
+ const gchar *message)
+{
+ gchar *markup_str;
+ char *escaped_message;
+
+ if (message != NULL) {
+ escaped_message = g_markup_escape_text (message, -1);
+ markup_str = g_strconcat ("<span weight=\"bold\" size=\"larger\">", escaped_message, "</span>", NULL);
+ gtk_label_set_markup (GTK_LABEL (EEL_ALERT_DIALOG (dialog)->details->primary_label),
+ markup_str);
+ g_free (markup_str);
+ g_free (escaped_message);
+ }
+}
+
+void
+eel_alert_dialog_set_secondary_label (EelAlertDialog *dialog,
+ const gchar *message)
+{
+ if (message != NULL) {
+ gtk_label_set_text (GTK_LABEL (EEL_ALERT_DIALOG (dialog)->details->secondary_label),
+ message);
+ } else {
+ gtk_widget_hide (EEL_ALERT_DIALOG (dialog)->details->secondary_label);
+ }
+}
+
+void
+eel_alert_dialog_set_details_label (EelAlertDialog *dialog,
+ const gchar *message)
+{
+ if (message != NULL) {
+ gtk_widget_show (dialog->details->details_expander);
+ gtk_label_set_text (GTK_LABEL (dialog->details->details_label), message);
+ } else {
+ gtk_widget_hide (dialog->details->details_expander);
+ }
+}
+
+
+GtkWidget*
+eel_alert_dialog_new (GtkWindow *parent,
+ GtkDialogFlags flags,
+ GtkMessageType type,
+ GtkButtonsType buttons,
+ const gchar *primary_message,
+ const gchar *secondary_message,
+ const gchar *title)
+{
+ GtkWidget *widget;
+ GtkDialog *dialog;
+
+ g_return_val_if_fail (parent == NULL || GTK_IS_WINDOW (parent), NULL);
+
+ widget = g_object_new (EEL_TYPE_ALERT_DIALOG,
+ "alert_type", type,
+ "buttons", buttons,
+ NULL);
+ atk_object_set_role (gtk_widget_get_accessible (widget), ATK_ROLE_ALERT);
+
+ dialog = GTK_DIALOG (widget);
+
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
+ gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), 14);
+ gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
+ gtk_dialog_set_has_separator (dialog, FALSE);
+
+ gtk_window_set_title (GTK_WINDOW (dialog),
+ (title != NULL) ? title : "");
+
+ eel_alert_dialog_set_primary_label (EEL_ALERT_DIALOG (dialog),
+ primary_message);
+
+ eel_alert_dialog_set_secondary_label (EEL_ALERT_DIALOG (dialog),
+ secondary_message);
+
+ if (parent != NULL) {
+ gtk_window_set_transient_for (GTK_WINDOW (widget),
+ GTK_WINDOW (parent));
+ }
+
+ if (flags & GTK_DIALOG_MODAL) {
+ gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+ }
+
+ if (flags & GTK_DIALOG_DESTROY_WITH_PARENT) {
+ gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE);
+ }
+ return widget;
+}
+
+static void
+eel_alert_dialog_add_buttons (EelAlertDialog* alert_dialog,
+ GtkButtonsType buttons)
+{
+ GtkDialog* dialog;
+
+ dialog = GTK_DIALOG (alert_dialog);
+
+ switch (buttons) {
+ case GTK_BUTTONS_NONE:
+ break;
+ case GTK_BUTTONS_OK:
+ gtk_dialog_add_button (dialog,
+ GTK_STOCK_OK,
+ GTK_RESPONSE_OK);
+ gtk_dialog_set_default_response (dialog,
+ GTK_RESPONSE_OK);
+ break;
+ case GTK_BUTTONS_CLOSE:
+ gtk_dialog_add_button (dialog,
+ GTK_STOCK_CLOSE,
+ GTK_RESPONSE_CLOSE);
+ gtk_dialog_set_default_response (dialog,
+ GTK_RESPONSE_CLOSE);
+ break;
+ case GTK_BUTTONS_CANCEL:
+ gtk_dialog_add_button (dialog,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL);
+ gtk_dialog_set_default_response (dialog,
+ GTK_RESPONSE_CANCEL);
+ break;
+ case GTK_BUTTONS_YES_NO:
+ gtk_dialog_add_button (dialog,
+ GTK_STOCK_NO,
+ GTK_RESPONSE_NO);
+ gtk_dialog_add_button (dialog,
+ GTK_STOCK_YES,
+ GTK_RESPONSE_YES);
+ gtk_dialog_set_default_response (dialog,
+ GTK_RESPONSE_YES);
+ break;
+ case GTK_BUTTONS_OK_CANCEL:
+ gtk_dialog_add_button (dialog,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL);
+ gtk_dialog_add_button (dialog,
+ GTK_STOCK_OK,
+ GTK_RESPONSE_OK);
+ gtk_dialog_set_default_response (dialog,
+ GTK_RESPONSE_OK);
+ break;
+ default:
+ g_warning ("Unknown GtkButtonsType");
+ break;
+ }
+ g_object_notify (G_OBJECT (alert_dialog), "buttons");
+}
+
+static void
+eel_alert_dialog_style_set (GtkWidget *widget,
+ GtkStyle *prev_style)
+{
+ GtkWidget *parent;
+ gint border_width;
+
+ border_width = 0;
+
+ parent = gtk_widget_get_parent (EEL_ALERT_DIALOG (widget)->details->image);
+
+ if (parent != NULL) {
+ gtk_widget_style_get (widget, "alert_border",
+ &border_width, NULL);
+
+ gtk_container_set_border_width (GTK_CONTAINER (parent),
+ border_width);
+ }
+
+ if (GTK_WIDGET_CLASS (parent_class)->style_set) {
+ (GTK_WIDGET_CLASS (parent_class)->style_set) (widget, prev_style);
+ }
+}
diff --git a/capplets/about-me/eel-alert-dialog.h b/capplets/about-me/eel-alert-dialog.h
new file mode 100644
index 00000000..60c6b9c0
--- /dev/null
+++ b/capplets/about-me/eel-alert-dialog.h
@@ -0,0 +1,61 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
+/* eel-alert-dialog.h: An HIG compliant alert dialog.
+
+ The Mate Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Mate Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the Mate Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+*/
+
+#ifndef EEL_ALERT_DIALOG_H
+#define EEL_ALERT_DIALOG_H
+
+#include <gtk/gtk.h>
+
+#define EEL_TYPE_ALERT_DIALOG (eel_alert_dialog_get_type ())
+#define EEL_ALERT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEL_TYPE_ALERT_DIALOG, EelAlertDialog))
+
+typedef struct _EelAlertDialog EelAlertDialog;
+typedef struct _EelAlertDialogClass EelAlertDialogClass;
+typedef struct _EelAlertDialogDetails EelAlertDialogDetails;
+
+struct _EelAlertDialog
+{
+ GtkDialog parent_instance;
+ EelAlertDialogDetails *details;
+};
+
+struct _EelAlertDialogClass
+{
+ GtkDialogClass parent_class;
+};
+
+GType eel_alert_dialog_get_type (void);
+
+GtkWidget* eel_alert_dialog_new (GtkWindow *parent,
+ GtkDialogFlags flags,
+ GtkMessageType type,
+ GtkButtonsType buttons,
+ const gchar *primary_message,
+ const gchar *secondary_message,
+ const gchar *title);
+void eel_alert_dialog_set_primary_label (EelAlertDialog *dialog,
+ const gchar *message);
+void eel_alert_dialog_set_secondary_label (EelAlertDialog *dialog,
+ const gchar *message);
+void eel_alert_dialog_set_details_label (EelAlertDialog *dialog,
+ const gchar *message);
+
+#endif /* EEL_ALERT_DIALOG_H */
diff --git a/capplets/about-me/eel-gtk-macros.h b/capplets/about-me/eel-gtk-macros.h
new file mode 100644
index 00000000..b3a9d671
--- /dev/null
+++ b/capplets/about-me/eel-gtk-macros.h
@@ -0,0 +1,178 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-
+
+ eel-gtk-macros.h: Macros to reduce boilerplate when using GTK.
+
+ Copyright (C) 1999, 2000, 2001 Eazel, Inc.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Authors: Darin Adler <[email protected]>
+ Ramiro Estrugo <[email protected]>
+*/
+
+#ifndef EEL_GTK_MACROS_H
+#define EEL_GTK_MACROS_H
+
+#ifndef EEL_DISABLE_DEPRECATED
+
+/* Define a parent_class global and a get_type function for a GTK class.
+ Since this is boilerplate, it's better not to repeat it over and over again.
+ Called like this:
+
+ EEL_CLASS_BOILERPLATE (EelBookmark, eel_bookmark, GTK_TYPE_OBJECT)
+
+ The parent_class_type parameter is guaranteed to be evaluated only once
+ so it can be an expression, even an expression that contains a function call.
+*/
+
+#define EEL_CLASS_BOILERPLATE(class_name, prefix, parent_class_type) \
+ EEL_BOILERPLATE (class_name, class_name, prefix, parent_class_type, \
+ EEL_REGISTER_TYPE)
+#define EEL_REGISTER_TYPE(class_name, corba_name) \
+ g_type_register_static (parent_type, #class_name, &info, 0)
+
+#define EEL_BOILERPLATE(class_name, corba_name, prefix, parent_class_type, \
+ register_type) \
+ \
+static gpointer parent_class; \
+ \
+GType \
+prefix##_get_type (void) \
+{ \
+ GType parent_type; \
+ static GType type; \
+ \
+ if (type == 0) { \
+ static GTypeInfo info = { \
+ sizeof (class_name##Class), \
+ NULL, NULL, \
+ (GClassInitFunc) prefix##_class_init, \
+ NULL, NULL, \
+ sizeof (class_name), 0, \
+ (GInstanceInitFunc) prefix##_init, \
+ NULL \
+ }; \
+ \
+ parent_type = (parent_class_type); \
+ type = register_type (class_name, corba_name); \
+ parent_class = g_type_class_ref (parent_type); \
+ } \
+ \
+ return type; \
+}
+
+/* Call a parent class version of a virtual function (or default
+ * signal handler since that's the same thing). Nice because it
+ * documents what it's doing and there is less chance for a
+ * typo. Depends on the parent class pointer having the conventional
+ * name "parent_class" as the boilerplate macro above does it.
+ */
+#define EEL_CALL_PARENT(parent_class_cast_macro, signal, parameters) \
+ \
+G_STMT_START { \
+ if (parent_class_cast_macro (parent_class)->signal != NULL) { \
+ (* parent_class_cast_macro (parent_class)->signal) parameters;\
+ } \
+} G_STMT_END
+
+/* Same thing, for functions with a return value. */
+#define EEL_CALL_PARENT_WITH_RETURN_VALUE(parent_class_cast_macro, signal, \
+ parameters) \
+ \
+(parent_class_cast_macro (parent_class)->signal == NULL) \
+ ? 0 \
+ : ((* parent_class_cast_macro (parent_class)->signal) parameters)
+
+#endif /* EEL_DISABLE_DEPRECATED */
+
+/* Call a virtual function. Useful when the virtual function is not a
+ * signal, otherwise you want to gtk_signal emit. Nice because it
+ * documents what it's doing and there is less chance for a typo.
+ */
+#define EEL_CALL_METHOD(class_cast_macro, object, signal, parameters) \
+ \
+G_STMT_START { \
+ if (class_cast_macro (G_OBJECT_GET_CLASS (object))->signal != NULL) { \
+ (* class_cast_macro (G_OBJECT_GET_CLASS (object))->signal) \
+ parameters; \
+ } \
+} G_STMT_END
+
+/* Same thing, for functions with a return value. */
+#define EEL_CALL_METHOD_WITH_RETURN_VALUE(class_cast_macro, object, signal, \
+ parameters) \
+ \
+(class_cast_macro (G_OBJECT_GET_CLASS (object))->signal == NULL) \
+ ? 0 \
+ : ((* class_cast_macro (G_OBJECT_GET_CLASS (object))->signal) \
+ parameters) \
+
+#ifndef G_DISABLE_ASSERT
+
+/* Define a signal that is not implemented by this class but must be
+ * implemented by subclasses. This macro should be used inside the
+ * class initialization function. The companion macro EEL_IMPLEMENT_MUST_OVERRIDE_SIGNAL
+ * must be used earlier in the file. Called like this:
+ *
+ * EEL_ASSIGN_MUST_OVERRIDE_SIGNAL (klass,
+ * fm_directory_view,
+ * clear);
+ */
+#define EEL_ASSIGN_MUST_OVERRIDE_SIGNAL(class_pointer, prefix, signal) \
+ \
+* (void (**)(void)) & (class_pointer)->signal = prefix##_unimplemented_##signal
+
+/* Provide a debug-only implementation of a signal that must be implemented
+ * by subclasses. The debug-only implementation fires a warning if it is called.
+ * This macro should be placed as if it were a function, earlier in the file
+ * than the class initialization function. Called like this:
+ *
+ * EEL_IMPLEMENT_MUST_OVERRIDE_SIGNAL (fm_directory_view, clear);
+ */
+#define EEL_IMPLEMENT_MUST_OVERRIDE_SIGNAL(prefix, signal) \
+ \
+static void \
+prefix##_unimplemented_##signal (void) \
+{ \
+ g_warning ("failed to override signal " #prefix "->" #signal); \
+}
+
+#else /* G_DISABLE_ASSERT */
+
+#define EEL_DEFINE_MUST_OVERRIDE_SIGNAL(class_cast_macro, class_pointer, prefix, signal)
+#define EEL_IMPLEMENT_MUST_OVERRIDE_SIGNAL(prefix, signal)
+#define EEL_ASSIGN_MUST_OVERRIDE_SIGNAL(class_pointer, prefix, signal)
+
+#endif /* G_DISABLE_ASSERT */
+
+/* Access a method. */
+#define EEL_ACCESS_METHOD(class_cast_macro, object, method) \
+(class_cast_macro (G_OBJECT_GET_CLASS (object))->method)
+
+/* Invoke a method for a given object. */
+#define EEL_INVOKE_METHOD(class_cast_macro, object, method, parameters) \
+((* EEL_ACCESS_METHOD (class_cast_macro, object, method)) parameters)
+
+/* Assert the non-nullness of a method for a given object. */
+#define EEL_ASSERT_METHOD(class_cast_macro, object, method) \
+g_assert (EEL_ACCESS_METHOD (class_cast_macro, object, method) != NULL)
+
+/* Invoke a method if it ain't null. */
+#define EEL_INVOKE_METHOD_IF(class_cast_macro, object, method, parameters) \
+(EEL_ACCESS_METHOD (class_cast_macro, object, method) ? 0 : \
+ EEL_INVOKE_METHOD (class_cast_macro, object, method, parameters))
+
+#endif /* EEL_GTK_MACROS_H */
diff --git a/capplets/about-me/fingerprint-strings.h b/capplets/about-me/fingerprint-strings.h
new file mode 100644
index 00000000..d1b919e9
--- /dev/null
+++ b/capplets/about-me/fingerprint-strings.h
@@ -0,0 +1,111 @@
+/*
+ * Helper functions to translate statuses and actions to strings
+ * Copyright (C) 2008 Bastien Nocera <[email protected]>
+ *
+ * Experimental code. This will be moved out of fprintd into it's own
+ * package once the system has matured.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+struct {
+ const char *dbus_name;
+ const char *place_str;
+ const char *swipe_str;
+} fingers[11] = {
+ { "left-thumb", N_("Place your left thumb on %s"), N_("Swipe your left thumb on %s") },
+ { "left-index-finger", N_("Place your left index finger on %s"), N_("Swipe your left index finger on %s") },
+ { "left-middle-finger", N_("Place your left middle finger on %s"), N_("Swipe your left middle finger on %s") },
+ { "left-ring-finger", N_("Place your left ring finger on %s"), N_("Swipe your left ring finger on %s") },
+ { "left-little-finger", N_("Place your left little finger on %s"), N_("Swipe your left little finger on %s") },
+ { "right-thumb", N_("Place your right thumb on %s"), N_("Swipe your right thumb on %s") },
+ { "right-index-finger", N_("Place your right index finger on %s"), N_("Swipe your right index finger on %s") },
+ { "right-middle-finger", N_("Place your right middle finger on %s"), N_("Swipe your right middle finger on %s") },
+ { "right-ring-finger", N_("Place your right ring finger on %s"), N_("Swipe your right ring finger on %s") },
+ { "right-little-finger", N_("Place your right little finger on %s"), N_("Swipe your right little finger on %s") },
+ { NULL, NULL, NULL }
+};
+
+static const char *finger_str_to_msg(const char *finger_name, gboolean is_swipe)
+{
+ int i;
+
+ if (finger_name == NULL)
+ return NULL;
+
+ for (i = 0; fingers[i].dbus_name != NULL; i++) {
+ if (g_str_equal (fingers[i].dbus_name, finger_name)) {
+ if (is_swipe == FALSE)
+ return fingers[i].place_str;
+ else
+ return fingers[i].swipe_str;
+ }
+ }
+
+ return NULL;
+}
+
+/* Cases not handled:
+ * verify-no-match
+ * verify-match
+ * verify-unknown-error
+ */
+static const char *verify_result_str_to_msg(const char *result, gboolean is_swipe)
+{
+ if (result == NULL)
+ return NULL;
+
+ if (strcmp (result, "verify-retry-scan") == 0) {
+ if (is_swipe == FALSE)
+ return N_("Place your finger on the reader again");
+ else
+ return N_("Swipe your finger again");
+ }
+ if (strcmp (result, "verify-swipe-too-short") == 0)
+ return N_("Swipe was too short, try again");
+ if (strcmp (result, "verify-finger-not-centered") == 0)
+ return N_("Your finger was not centered, try swiping your finger again");
+ if (strcmp (result, "verify-remove-and-retry") == 0)
+ return N_("Remove your finger, and try swiping your finger again");
+
+ return NULL;
+}
+
+/* Cases not handled:
+ * enroll-completed
+ * enroll-failed
+ * enroll-unknown-error
+ */
+static const char *enroll_result_str_to_msg(const char *result, gboolean is_swipe)
+{
+ if (result == NULL)
+ return NULL;
+
+ if (strcmp (result, "enroll-retry-scan") == 0 || strcmp (result, "enroll-stage-passed") == 0) {
+ if (is_swipe == FALSE)
+ return N_("Place your finger on the reader again");
+ else
+ return N_("Swipe your finger again");
+ }
+ if (strcmp (result, "enroll-swipe-too-short") == 0)
+ return N_("Swipe was too short, try again");
+ if (strcmp (result, "enroll-finger-not-centered") == 0)
+ return N_("Your finger was not centered, try swiping your finger again");
+ if (strcmp (result, "enroll-remove-and-retry") == 0)
+ return N_("Remove your finger, and try swiping your finger again");
+
+ return NULL;
+}
+
diff --git a/capplets/about-me/fprintd-marshal.list b/capplets/about-me/fprintd-marshal.list
new file mode 100644
index 00000000..c4effb63
--- /dev/null
+++ b/capplets/about-me/fprintd-marshal.list
@@ -0,0 +1 @@
+VOID:STRING,BOOLEAN
diff --git a/capplets/about-me/icons/Makefile.am b/capplets/about-me/icons/Makefile.am
new file mode 100644
index 00000000..a35a9e64
--- /dev/null
+++ b/capplets/about-me/icons/Makefile.am
@@ -0,0 +1,30 @@
+pixmapsdir = $(pkgdatadir)/pixmaps
+pixmaps_DATA = \
+ left-index-finger.svg \
+ left-little-finger.svg \
+ left-middle-finger.svg \
+ left-ring-finger.svg \
+ left-thumb.svg \
+ print_error.svg \
+ print_ok.svg \
+ right-index-finger.svg \
+ right-little-finger.svg \
+ right-middle-finger.svg \
+ right-ring-finger.svg \
+ right-thumb.svg \
+ left-index-finger.png \
+ left-middle-finger.png \
+ left-little-finger.png \
+ left-ring-finger.png \
+ left-thumb.png \
+ print_error.png \
+ print_ok.png \
+ right-index-finger.png \
+ right-middle-finger.png \
+ right-little-finger.png \
+ right-ring-finger.png \
+ right-thumb.png
+
+EXTRA_DIST = $(pixmaps_DATA)
+
+-include $(top_srcdir)/git.mk
diff --git a/capplets/about-me/icons/left-index-finger.png b/capplets/about-me/icons/left-index-finger.png
new file mode 100644
index 00000000..1a9cb2c7
--- /dev/null
+++ b/capplets/about-me/icons/left-index-finger.png
Binary files differ
diff --git a/capplets/about-me/icons/left-index-finger.svg b/capplets/about-me/icons/left-index-finger.svg
new file mode 100644
index 00000000..3c36aeaa
--- /dev/null
+++ b/capplets/about-me/icons/left-index-finger.svg
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ x="0px"
+ y="0px"
+ width="48"
+ height="48"
+ viewBox="0 0 40.425 46.214"
+ enable-background="new 0 0 40.425 46.214"
+ xml:space="preserve"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="left-index-finger.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
+ id="metadata44"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs42"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 23.107 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="40.424999 : 23.107 : 1"
+ inkscape:persp3d-origin="20.2125 : 15.404667 : 1"
+ id="perspective46" />
+
+
+
+
+
+
+<radialGradient
+ r="8.341651"
+ fy="9.3411446"
+ fx="38.658855"
+ cy="9.3411446"
+ cx="38.658855"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient2479"
+ xlink:href="#linearGradient2378"
+ inkscape:collect="always" /><linearGradient
+ id="linearGradient2378"><stop
+ id="stop2386"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ style="stop-color:#27dc16;stop-opacity:1;"
+ offset="1"
+ id="stop2382" /></linearGradient><linearGradient
+ id="linearGradient3702"><stop
+ id="stop3704"
+ offset="0"
+ style="stop-color:black;stop-opacity:0;" /><stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0.5"
+ id="stop3710" /><stop
+ id="stop3706"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" /></linearGradient><linearGradient
+ id="linearGradient6732"><stop
+ id="stop6734"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ id="stop6736"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:1;" /></linearGradient><linearGradient
+ id="linearGradient4585"><stop
+ id="stop4587"
+ offset="0"
+ style="stop-color:#9e9e9e;stop-opacity:1;" /><stop
+ id="stop4589"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:0;" /></linearGradient><inkscape:perspective
+ id="perspective2516"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 24 : 1"
+ sodipodi:type="inkscape:persp3d" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86956"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86964"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86966"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /></defs><sodipodi:namedview
+ inkscape:window-height="933"
+ inkscape:window-width="1054"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="11.122171"
+ inkscape:cx="22.316511"
+ inkscape:cy="30.299841"
+ inkscape:window-x="36"
+ inkscape:window-y="91"
+ inkscape:current-layer="svg2" />
+<g
+ id="g35"
+ style="fill:url(#radialGradient86956);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(1.1605241,0,0,1.3370602,-4.3871473,-0.7984997)">
+ <circle
+ style="fill:url(#radialGradient86964);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:ry="3.829"
+ sodipodi:rx="3.829"
+ sodipodi:cy="5.5700002"
+ sodipodi:cx="26.49"
+ id="circle37"
+ r="3.829"
+ cy="5.5700002"
+ cx="26.49"
+ stroke-miterlimit="3.8637" />
+ <path
+ style="fill:url(#radialGradient86966);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path39"
+ stroke-miterlimit="3.8637"
+ d="" />
+ </g><g
+ id="Background">
+</g>
+<g
+ id="Guides"
+ display="none"
+ style="display:none">
+</g>
+<g
+ id="g7"
+ style="fill:#2f2f2f;fill-opacity:1">
+ <path
+ style="fill:#2f2f2f;fill-opacity:1;fill-rule:evenodd"
+ id="path9"
+ d="M 20.569,13.286 C 20.843,15.459 20.791,17.834 20.82,18.542 C 20.865,18.917 21.913,19.241 22.094,18.877 C 22.301,17.514 22.586,14.847 22.92,13.455 C 23.372,9.917 23.886,8.247 24.072,7.257 C 24.58,4.567 25.014,3.12 26.762,3.12 C 28.384,3.12 28.623,5.167 28.153,8.165 C 28.025,9.379 28.036,12.24 27.433,14.894 C 27.165,16.691 26.962,21.278 27.139,24.981 C 27.189,26.045 27.669,27.315 28.242,27.945 C 29.462,27.773 30.379,24.377 31.988,22.847 C 32.809,21.464 34.883,19.299 36.951,19.299 C 39.243,19.299 39.292,21 38.345,22.262 C 37.187,23.806 36.525,24.528 36.079,25.802 C 35.633,27.076 33.758,29.778 33.471,31.209 C 32.902,34.054 32.471,35.105 29.284,37.661 C 27.783,38.865 27.302,39.637 26.855,40.401 C 26.347,41.273 26.409,44.721 26.409,46.212 L 10.64,46.212 C 10.64,46.212 10.767,43.587 10.513,42.058 C 10.461,41.746 10.105,39.613 9.176,38.231 C 8.317,36.954 5.902,32.306 5.902,26.836 C 5.902,24.026 4.39,21.718 3.854,19.533 C 3.591,17.833 2.638,15.423 2.57,14.709 C 1.684,11.559 2.132,10.118 3.741,10.118 C 5.132,10.118 5.528,11.927 6.093,13.622 C 6.258,14.52 7.505,16.934 7.788,18.233 C 8.038,19.088 8.897,21.556 9.437,21.727 C 9.75,21.784 10.151,21.523 10.291,21.043 C 10.52,20.26 9.818,18.945 9.539,15.26 C 9.087,12.343 9.17,10.139 9.116,8.949 C 8.653,5.424 9.133,3.598 10.693,3.598 C 12.176,3.598 12.568,4.455 13.02,7.936 C 13.189,9.518 13.754,12.095 14.037,14.864 C 14.213,16.364 14.639,18.601 14.98,19.17 C 15.285,19.503 15.919,19.198 15.9,18.848 C 15.894,16.377 15.732,14.977 15.958,12.999 C 15.845,10.287 16.219,7.823 16.219,6.467 C 16.219,3.494 16.502,1.473 18.358,1.473 C 20.333,1.473 20.287,3.776 20.287,6.806 C 20.399,7.545 20.456,10.087 20.569,13.286 z"
+ clip-rule="evenodd" />
+ </g>
+<g
+ style="display:inline"
+ inkscape:label="Base"
+ id="layer1"
+ transform="translate(-52.466647,2.6102791)" /></svg> \ No newline at end of file
diff --git a/capplets/about-me/icons/left-little-finger.png b/capplets/about-me/icons/left-little-finger.png
new file mode 100644
index 00000000..978942ee
--- /dev/null
+++ b/capplets/about-me/icons/left-little-finger.png
Binary files differ
diff --git a/capplets/about-me/icons/left-little-finger.svg b/capplets/about-me/icons/left-little-finger.svg
new file mode 100644
index 00000000..0835854f
--- /dev/null
+++ b/capplets/about-me/icons/left-little-finger.svg
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ x="0px"
+ y="0px"
+ width="48"
+ height="48"
+ viewBox="0 0 40.425 46.214"
+ enable-background="new 0 0 40.425 46.214"
+ xml:space="preserve"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="left-pinky-finger.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/Users/mlanglie/Desktop/Fingerprint Enrollment Icons/Vector/left-ring-finger.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><metadata
+ id="metadata44"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs42"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 23.107 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="40.424999 : 23.107 : 1"
+ inkscape:persp3d-origin="20.2125 : 15.404667 : 1"
+ id="perspective46" />
+
+
+
+
+
+
+<radialGradient
+ r="8.341651"
+ fy="9.3411446"
+ fx="38.658855"
+ cy="9.3411446"
+ cx="38.658855"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient2479"
+ xlink:href="#linearGradient2378"
+ inkscape:collect="always" /><linearGradient
+ id="linearGradient2378"><stop
+ id="stop2386"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ style="stop-color:#27dc16;stop-opacity:1;"
+ offset="1"
+ id="stop2382" /></linearGradient><linearGradient
+ id="linearGradient3702"><stop
+ id="stop3704"
+ offset="0"
+ style="stop-color:black;stop-opacity:0;" /><stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0.5"
+ id="stop3710" /><stop
+ id="stop3706"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" /></linearGradient><linearGradient
+ id="linearGradient6732"><stop
+ id="stop6734"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ id="stop6736"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:1;" /></linearGradient><linearGradient
+ id="linearGradient4585"><stop
+ id="stop4587"
+ offset="0"
+ style="stop-color:#9e9e9e;stop-opacity:1;" /><stop
+ id="stop4589"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:0;" /></linearGradient><inkscape:perspective
+ id="perspective2516"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 24 : 1"
+ sodipodi:type="inkscape:persp3d" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86956"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86964"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86966"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /></defs><sodipodi:namedview
+ inkscape:window-height="933"
+ inkscape:window-width="1054"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="11.122171"
+ inkscape:cx="22.316511"
+ inkscape:cy="30.299841"
+ inkscape:window-x="122"
+ inkscape:window-y="443"
+ inkscape:current-layer="svg2" />
+<g
+ id="g35"
+ style="fill:url(#radialGradient86956);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(1.1074589,0,0,1.2726911,-25.531655,5.5330271)">
+ <circle
+ style="fill:url(#radialGradient86964);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:ry="3.829"
+ sodipodi:rx="3.829"
+ sodipodi:cy="5.5700002"
+ sodipodi:cx="26.49"
+ id="circle37"
+ r="3.829"
+ cy="5.5700002"
+ cx="26.49"
+ stroke-miterlimit="3.8637" />
+ <path
+ style="fill:url(#radialGradient86966);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path39"
+ stroke-miterlimit="3.8637"
+ d="" />
+ </g><g
+ id="Background">
+</g>
+<g
+ id="Guides"
+ display="none"
+ style="display:none">
+</g>
+<g
+ id="g7"
+ style="fill:#2f2f2f;fill-opacity:1">
+ <path
+ style="fill:#2f2f2f;fill-opacity:1;fill-rule:evenodd"
+ id="path9"
+ d="M 20.569,13.286 C 20.843,15.459 20.791,17.834 20.82,18.542 C 20.865,18.917 21.913,19.241 22.094,18.877 C 22.301,17.514 22.586,14.847 22.92,13.455 C 23.372,9.917 23.886,8.247 24.072,7.257 C 24.58,4.567 25.014,3.12 26.762,3.12 C 28.384,3.12 28.623,5.167 28.153,8.165 C 28.025,9.379 28.036,12.24 27.433,14.894 C 27.165,16.691 26.962,21.278 27.139,24.981 C 27.189,26.045 27.669,27.315 28.242,27.945 C 29.462,27.773 30.379,24.377 31.988,22.847 C 32.809,21.464 34.883,19.299 36.951,19.299 C 39.243,19.299 39.292,21 38.345,22.262 C 37.187,23.806 36.525,24.528 36.079,25.802 C 35.633,27.076 33.758,29.778 33.471,31.209 C 32.902,34.054 32.471,35.105 29.284,37.661 C 27.783,38.865 27.302,39.637 26.855,40.401 C 26.347,41.273 26.409,44.721 26.409,46.212 L 10.64,46.212 C 10.64,46.212 10.767,43.587 10.513,42.058 C 10.461,41.746 10.105,39.613 9.176,38.231 C 8.317,36.954 5.902,32.306 5.902,26.836 C 5.902,24.026 4.39,21.718 3.854,19.533 C 3.591,17.833 2.638,15.423 2.57,14.709 C 1.684,11.559 2.132,10.118 3.741,10.118 C 5.132,10.118 5.528,11.927 6.093,13.622 C 6.258,14.52 7.505,16.934 7.788,18.233 C 8.038,19.088 8.897,21.556 9.437,21.727 C 9.75,21.784 10.151,21.523 10.291,21.043 C 10.52,20.26 9.818,18.945 9.539,15.26 C 9.087,12.343 9.17,10.139 9.116,8.949 C 8.653,5.424 9.133,3.598 10.693,3.598 C 12.176,3.598 12.568,4.455 13.02,7.936 C 13.189,9.518 13.754,12.095 14.037,14.864 C 14.213,16.364 14.639,18.601 14.98,19.17 C 15.285,19.503 15.919,19.198 15.9,18.848 C 15.894,16.377 15.732,14.977 15.958,12.999 C 15.845,10.287 16.219,7.823 16.219,6.467 C 16.219,3.494 16.502,1.473 18.358,1.473 C 20.333,1.473 20.287,3.776 20.287,6.806 C 20.399,7.545 20.456,10.087 20.569,13.286 z"
+ clip-rule="evenodd" />
+ </g>
+<g
+ style="display:inline"
+ inkscape:label="Base"
+ id="layer1"
+ transform="translate(-52.466647,2.6102791)" /></svg> \ No newline at end of file
diff --git a/capplets/about-me/icons/left-middle-finger.png b/capplets/about-me/icons/left-middle-finger.png
new file mode 100644
index 00000000..406925e9
--- /dev/null
+++ b/capplets/about-me/icons/left-middle-finger.png
Binary files differ
diff --git a/capplets/about-me/icons/left-middle-finger.svg b/capplets/about-me/icons/left-middle-finger.svg
new file mode 100644
index 00000000..1082da2e
--- /dev/null
+++ b/capplets/about-me/icons/left-middle-finger.svg
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ x="0px"
+ y="0px"
+ width="48"
+ height="48"
+ viewBox="0 0 40.425 46.214"
+ enable-background="new 0 0 40.425 46.214"
+ xml:space="preserve"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="left-middle-finger.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/Users/mlanglie/Desktop/Fingerprint Enrollment Icons/Vector/left-index-finger.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><metadata
+ id="metadata44"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs42"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 23.107 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="40.424999 : 23.107 : 1"
+ inkscape:persp3d-origin="20.2125 : 15.404667 : 1"
+ id="perspective46" />
+
+
+
+
+
+
+<radialGradient
+ r="8.341651"
+ fy="9.3411446"
+ fx="38.658855"
+ cy="9.3411446"
+ cx="38.658855"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient2479"
+ xlink:href="#linearGradient2378"
+ inkscape:collect="always" /><linearGradient
+ id="linearGradient2378"><stop
+ id="stop2386"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ style="stop-color:#27dc16;stop-opacity:1;"
+ offset="1"
+ id="stop2382" /></linearGradient><linearGradient
+ id="linearGradient3702"><stop
+ id="stop3704"
+ offset="0"
+ style="stop-color:black;stop-opacity:0;" /><stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0.5"
+ id="stop3710" /><stop
+ id="stop3706"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" /></linearGradient><linearGradient
+ id="linearGradient6732"><stop
+ id="stop6734"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ id="stop6736"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:1;" /></linearGradient><linearGradient
+ id="linearGradient4585"><stop
+ id="stop4587"
+ offset="0"
+ style="stop-color:#9e9e9e;stop-opacity:1;" /><stop
+ id="stop4589"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:0;" /></linearGradient><inkscape:perspective
+ id="perspective2516"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 24 : 1"
+ sodipodi:type="inkscape:persp3d" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86956"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86964"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86966"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /></defs><sodipodi:namedview
+ inkscape:window-height="933"
+ inkscape:window-width="1054"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="11.122171"
+ inkscape:cx="22.316511"
+ inkscape:cy="30.299841"
+ inkscape:window-x="122"
+ inkscape:window-y="443"
+ inkscape:current-layer="svg2" />
+<g
+ id="g35"
+ style="fill:url(#radialGradient86956);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(1.1824583,0,0,1.3363867,-12.845608,-2.0066594)">
+ <circle
+ style="fill:url(#radialGradient86964);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:ry="3.829"
+ sodipodi:rx="3.829"
+ sodipodi:cy="5.5700002"
+ sodipodi:cx="26.49"
+ id="circle37"
+ r="3.829"
+ cy="5.5700002"
+ cx="26.49"
+ stroke-miterlimit="3.8637" />
+ <path
+ style="fill:url(#radialGradient86966);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path39"
+ stroke-miterlimit="3.8637"
+ d="" />
+ </g><g
+ id="Background">
+</g>
+<g
+ id="Guides"
+ display="none"
+ style="display:none">
+</g>
+<g
+ id="g7"
+ style="fill:#2f2f2f;fill-opacity:1">
+ <path
+ style="fill:#2f2f2f;fill-opacity:1;fill-rule:evenodd"
+ id="path9"
+ d="M 20.569,13.286 C 20.843,15.459 20.791,17.834 20.82,18.542 C 20.865,18.917 21.913,19.241 22.094,18.877 C 22.301,17.514 22.586,14.847 22.92,13.455 C 23.372,9.917 23.886,8.247 24.072,7.257 C 24.58,4.567 25.014,3.12 26.762,3.12 C 28.384,3.12 28.623,5.167 28.153,8.165 C 28.025,9.379 28.036,12.24 27.433,14.894 C 27.165,16.691 26.962,21.278 27.139,24.981 C 27.189,26.045 27.669,27.315 28.242,27.945 C 29.462,27.773 30.379,24.377 31.988,22.847 C 32.809,21.464 34.883,19.299 36.951,19.299 C 39.243,19.299 39.292,21 38.345,22.262 C 37.187,23.806 36.525,24.528 36.079,25.802 C 35.633,27.076 33.758,29.778 33.471,31.209 C 32.902,34.054 32.471,35.105 29.284,37.661 C 27.783,38.865 27.302,39.637 26.855,40.401 C 26.347,41.273 26.409,44.721 26.409,46.212 L 10.64,46.212 C 10.64,46.212 10.767,43.587 10.513,42.058 C 10.461,41.746 10.105,39.613 9.176,38.231 C 8.317,36.954 5.902,32.306 5.902,26.836 C 5.902,24.026 4.39,21.718 3.854,19.533 C 3.591,17.833 2.638,15.423 2.57,14.709 C 1.684,11.559 2.132,10.118 3.741,10.118 C 5.132,10.118 5.528,11.927 6.093,13.622 C 6.258,14.52 7.505,16.934 7.788,18.233 C 8.038,19.088 8.897,21.556 9.437,21.727 C 9.75,21.784 10.151,21.523 10.291,21.043 C 10.52,20.26 9.818,18.945 9.539,15.26 C 9.087,12.343 9.17,10.139 9.116,8.949 C 8.653,5.424 9.133,3.598 10.693,3.598 C 12.176,3.598 12.568,4.455 13.02,7.936 C 13.189,9.518 13.754,12.095 14.037,14.864 C 14.213,16.364 14.639,18.601 14.98,19.17 C 15.285,19.503 15.919,19.198 15.9,18.848 C 15.894,16.377 15.732,14.977 15.958,12.999 C 15.845,10.287 16.219,7.823 16.219,6.467 C 16.219,3.494 16.502,1.473 18.358,1.473 C 20.333,1.473 20.287,3.776 20.287,6.806 C 20.399,7.545 20.456,10.087 20.569,13.286 z"
+ clip-rule="evenodd" />
+ </g>
+<g
+ style="display:inline"
+ inkscape:label="Base"
+ id="layer1"
+ transform="translate(-52.466647,2.6102791)" /></svg> \ No newline at end of file
diff --git a/capplets/about-me/icons/left-ring-finger.png b/capplets/about-me/icons/left-ring-finger.png
new file mode 100644
index 00000000..169ff687
--- /dev/null
+++ b/capplets/about-me/icons/left-ring-finger.png
Binary files differ
diff --git a/capplets/about-me/icons/left-ring-finger.svg b/capplets/about-me/icons/left-ring-finger.svg
new file mode 100644
index 00000000..50ace807
--- /dev/null
+++ b/capplets/about-me/icons/left-ring-finger.svg
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ x="0px"
+ y="0px"
+ width="48"
+ height="48"
+ viewBox="0 0 40.425 46.214"
+ enable-background="new 0 0 40.425 46.214"
+ xml:space="preserve"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="left-ring-finger.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/Users/mlanglie/Desktop/Fingerprint Enrollment Icons/Vector/left-middle-finger.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><metadata
+ id="metadata44"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs42"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 23.107 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="40.424999 : 23.107 : 1"
+ inkscape:persp3d-origin="20.2125 : 15.404667 : 1"
+ id="perspective46" />
+
+
+
+
+
+
+<radialGradient
+ r="8.341651"
+ fy="9.3411446"
+ fx="38.658855"
+ cy="9.3411446"
+ cx="38.658855"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient2479"
+ xlink:href="#linearGradient2378"
+ inkscape:collect="always" /><linearGradient
+ id="linearGradient2378"><stop
+ id="stop2386"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ style="stop-color:#27dc16;stop-opacity:1;"
+ offset="1"
+ id="stop2382" /></linearGradient><linearGradient
+ id="linearGradient3702"><stop
+ id="stop3704"
+ offset="0"
+ style="stop-color:black;stop-opacity:0;" /><stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0.5"
+ id="stop3710" /><stop
+ id="stop3706"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" /></linearGradient><linearGradient
+ id="linearGradient6732"><stop
+ id="stop6734"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ id="stop6736"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:1;" /></linearGradient><linearGradient
+ id="linearGradient4585"><stop
+ id="stop4587"
+ offset="0"
+ style="stop-color:#9e9e9e;stop-opacity:1;" /><stop
+ id="stop4589"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:0;" /></linearGradient><inkscape:perspective
+ id="perspective2516"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 24 : 1"
+ sodipodi:type="inkscape:persp3d" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86956"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86964"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86966"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /></defs><sodipodi:namedview
+ inkscape:window-height="933"
+ inkscape:window-width="1054"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="11.122171"
+ inkscape:cx="22.316511"
+ inkscape:cy="30.299841"
+ inkscape:window-x="122"
+ inkscape:window-y="443"
+ inkscape:current-layer="svg2" />
+<g
+ id="g35"
+ style="fill:url(#radialGradient86956);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(1.1824583,0,0,1.3363867,-20.636466,-0.7947482)">
+ <circle
+ style="fill:url(#radialGradient86964);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:ry="3.829"
+ sodipodi:rx="3.829"
+ sodipodi:cy="5.5700002"
+ sodipodi:cx="26.49"
+ id="circle37"
+ r="3.829"
+ cy="5.5700002"
+ cx="26.49"
+ stroke-miterlimit="3.8637" />
+ <path
+ style="fill:url(#radialGradient86966);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path39"
+ stroke-miterlimit="3.8637"
+ d="" />
+ </g><g
+ id="Background">
+</g>
+<g
+ id="Guides"
+ display="none"
+ style="display:none">
+</g>
+<g
+ id="g7"
+ style="fill:#2f2f2f;fill-opacity:1">
+ <path
+ style="fill:#2f2f2f;fill-opacity:1;fill-rule:evenodd"
+ id="path9"
+ d="M 20.569,13.286 C 20.843,15.459 20.791,17.834 20.82,18.542 C 20.865,18.917 21.913,19.241 22.094,18.877 C 22.301,17.514 22.586,14.847 22.92,13.455 C 23.372,9.917 23.886,8.247 24.072,7.257 C 24.58,4.567 25.014,3.12 26.762,3.12 C 28.384,3.12 28.623,5.167 28.153,8.165 C 28.025,9.379 28.036,12.24 27.433,14.894 C 27.165,16.691 26.962,21.278 27.139,24.981 C 27.189,26.045 27.669,27.315 28.242,27.945 C 29.462,27.773 30.379,24.377 31.988,22.847 C 32.809,21.464 34.883,19.299 36.951,19.299 C 39.243,19.299 39.292,21 38.345,22.262 C 37.187,23.806 36.525,24.528 36.079,25.802 C 35.633,27.076 33.758,29.778 33.471,31.209 C 32.902,34.054 32.471,35.105 29.284,37.661 C 27.783,38.865 27.302,39.637 26.855,40.401 C 26.347,41.273 26.409,44.721 26.409,46.212 L 10.64,46.212 C 10.64,46.212 10.767,43.587 10.513,42.058 C 10.461,41.746 10.105,39.613 9.176,38.231 C 8.317,36.954 5.902,32.306 5.902,26.836 C 5.902,24.026 4.39,21.718 3.854,19.533 C 3.591,17.833 2.638,15.423 2.57,14.709 C 1.684,11.559 2.132,10.118 3.741,10.118 C 5.132,10.118 5.528,11.927 6.093,13.622 C 6.258,14.52 7.505,16.934 7.788,18.233 C 8.038,19.088 8.897,21.556 9.437,21.727 C 9.75,21.784 10.151,21.523 10.291,21.043 C 10.52,20.26 9.818,18.945 9.539,15.26 C 9.087,12.343 9.17,10.139 9.116,8.949 C 8.653,5.424 9.133,3.598 10.693,3.598 C 12.176,3.598 12.568,4.455 13.02,7.936 C 13.189,9.518 13.754,12.095 14.037,14.864 C 14.213,16.364 14.639,18.601 14.98,19.17 C 15.285,19.503 15.919,19.198 15.9,18.848 C 15.894,16.377 15.732,14.977 15.958,12.999 C 15.845,10.287 16.219,7.823 16.219,6.467 C 16.219,3.494 16.502,1.473 18.358,1.473 C 20.333,1.473 20.287,3.776 20.287,6.806 C 20.399,7.545 20.456,10.087 20.569,13.286 z"
+ clip-rule="evenodd" />
+ </g>
+<g
+ style="display:inline"
+ inkscape:label="Base"
+ id="layer1"
+ transform="translate(-52.466647,2.6102791)" /></svg> \ No newline at end of file
diff --git a/capplets/about-me/icons/left-thumb.png b/capplets/about-me/icons/left-thumb.png
new file mode 100644
index 00000000..eaf875d0
--- /dev/null
+++ b/capplets/about-me/icons/left-thumb.png
Binary files differ
diff --git a/capplets/about-me/icons/left-thumb.svg b/capplets/about-me/icons/left-thumb.svg
new file mode 100644
index 00000000..fd0f5827
--- /dev/null
+++ b/capplets/about-me/icons/left-thumb.svg
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ x="0px"
+ y="0px"
+ width="48"
+ height="48"
+ viewBox="0 0 40.425 46.214"
+ enable-background="new 0 0 40.425 46.214"
+ xml:space="preserve"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="left-thumb.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/Users/mlanglie/Desktop/Fingerprint Enrollment Icons/Vector/left-pinky-finger.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><metadata
+ id="metadata44"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs42"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 23.107 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="40.424999 : 23.107 : 1"
+ inkscape:persp3d-origin="20.2125 : 15.404667 : 1"
+ id="perspective46" />
+
+
+
+
+
+
+<radialGradient
+ r="8.341651"
+ fy="9.3411446"
+ fx="38.658855"
+ cy="9.3411446"
+ cx="38.658855"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient2479"
+ xlink:href="#linearGradient2378"
+ inkscape:collect="always" /><linearGradient
+ id="linearGradient2378"><stop
+ id="stop2386"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ style="stop-color:#27dc16;stop-opacity:1;"
+ offset="1"
+ id="stop2382" /></linearGradient><linearGradient
+ id="linearGradient3702"><stop
+ id="stop3704"
+ offset="0"
+ style="stop-color:black;stop-opacity:0;" /><stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0.5"
+ id="stop3710" /><stop
+ id="stop3706"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" /></linearGradient><linearGradient
+ id="linearGradient6732"><stop
+ id="stop6734"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ id="stop6736"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:1;" /></linearGradient><linearGradient
+ id="linearGradient4585"><stop
+ id="stop4587"
+ offset="0"
+ style="stop-color:#9e9e9e;stop-opacity:1;" /><stop
+ id="stop4589"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:0;" /></linearGradient><inkscape:perspective
+ id="perspective2516"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 24 : 1"
+ sodipodi:type="inkscape:persp3d" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86956"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86964"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86966"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /></defs><sodipodi:namedview
+ inkscape:window-height="933"
+ inkscape:window-width="1054"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="11.122171"
+ inkscape:cx="22.316511"
+ inkscape:cy="30.299841"
+ inkscape:window-x="116"
+ inkscape:window-y="498"
+ inkscape:current-layer="svg2" />
+<g
+ id="g35"
+ style="fill:url(#radialGradient86956);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(1.1916623,0,0,1.4021101,4.5265732,14.334323)">
+ <circle
+ style="fill:url(#radialGradient86964);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:ry="3.829"
+ sodipodi:rx="3.829"
+ sodipodi:cy="5.5700002"
+ sodipodi:cx="26.49"
+ id="circle37"
+ r="3.829"
+ cy="5.5700002"
+ cx="26.49"
+ stroke-miterlimit="3.8637" />
+ <path
+ style="fill:url(#radialGradient86966);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path39"
+ stroke-miterlimit="3.8637"
+ d="" />
+ </g><g
+ id="Background">
+</g>
+<g
+ id="Guides"
+ display="none"
+ style="display:none">
+</g>
+<g
+ id="g7"
+ style="fill:#2f2f2f;fill-opacity:1">
+ <path
+ style="fill:#2f2f2f;fill-opacity:1;fill-rule:evenodd"
+ id="path9"
+ d="M 20.569,13.286 C 20.843,15.459 20.791,17.834 20.82,18.542 C 20.865,18.917 21.913,19.241 22.094,18.877 C 22.301,17.514 22.586,14.847 22.92,13.455 C 23.372,9.917 23.886,8.247 24.072,7.257 C 24.58,4.567 25.014,3.12 26.762,3.12 C 28.384,3.12 28.623,5.167 28.153,8.165 C 28.025,9.379 28.036,12.24 27.433,14.894 C 27.165,16.691 26.962,21.278 27.139,24.981 C 27.189,26.045 27.669,27.315 28.242,27.945 C 29.462,27.773 30.379,24.377 31.988,22.847 C 32.809,21.464 34.883,19.299 36.951,19.299 C 39.243,19.299 39.292,21 38.345,22.262 C 37.187,23.806 36.525,24.528 36.079,25.802 C 35.633,27.076 33.758,29.778 33.471,31.209 C 32.902,34.054 32.471,35.105 29.284,37.661 C 27.783,38.865 27.302,39.637 26.855,40.401 C 26.347,41.273 26.409,44.721 26.409,46.212 L 10.64,46.212 C 10.64,46.212 10.767,43.587 10.513,42.058 C 10.461,41.746 10.105,39.613 9.176,38.231 C 8.317,36.954 5.902,32.306 5.902,26.836 C 5.902,24.026 4.39,21.718 3.854,19.533 C 3.591,17.833 2.638,15.423 2.57,14.709 C 1.684,11.559 2.132,10.118 3.741,10.118 C 5.132,10.118 5.528,11.927 6.093,13.622 C 6.258,14.52 7.505,16.934 7.788,18.233 C 8.038,19.088 8.897,21.556 9.437,21.727 C 9.75,21.784 10.151,21.523 10.291,21.043 C 10.52,20.26 9.818,18.945 9.539,15.26 C 9.087,12.343 9.17,10.139 9.116,8.949 C 8.653,5.424 9.133,3.598 10.693,3.598 C 12.176,3.598 12.568,4.455 13.02,7.936 C 13.189,9.518 13.754,12.095 14.037,14.864 C 14.213,16.364 14.639,18.601 14.98,19.17 C 15.285,19.503 15.919,19.198 15.9,18.848 C 15.894,16.377 15.732,14.977 15.958,12.999 C 15.845,10.287 16.219,7.823 16.219,6.467 C 16.219,3.494 16.502,1.473 18.358,1.473 C 20.333,1.473 20.287,3.776 20.287,6.806 C 20.399,7.545 20.456,10.087 20.569,13.286 z"
+ clip-rule="evenodd" />
+ </g>
+<g
+ style="display:inline"
+ inkscape:label="Base"
+ id="layer1"
+ transform="translate(-52.466647,2.6102791)" /></svg> \ No newline at end of file
diff --git a/capplets/about-me/icons/print_error.png b/capplets/about-me/icons/print_error.png
new file mode 100644
index 00000000..d67150b1
--- /dev/null
+++ b/capplets/about-me/icons/print_error.png
Binary files differ
diff --git a/capplets/about-me/icons/print_error.svg b/capplets/about-me/icons/print_error.svg
new file mode 100644
index 00000000..4ad6beed
--- /dev/null
+++ b/capplets/about-me/icons/print_error.svg
@@ -0,0 +1,525 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ x="0px"
+ y="0px"
+ width="48"
+ height="48"
+ viewBox="0 0 36.184 43.865"
+ enable-background="new 0 0 36.184 43.865"
+ xml:space="preserve"
+ id="svg2419"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="print_error.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/Users/mlanglie/Desktop/print_error.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><metadata
+ id="metadata2435"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs2433"><linearGradient
+ inkscape:collect="always"
+ id="linearGradient84104"><stop
+ style="stop-color:#fffffc;stop-opacity:1;"
+ offset="0"
+ id="stop84106" /><stop
+ style="stop-color:#fffffc;stop-opacity:0;"
+ offset="1"
+ id="stop84108" /></linearGradient><linearGradient
+ id="linearGradient84076"><stop
+ style="stop-color:#73d216;stop-opacity:1;"
+ offset="0"
+ id="stop84078" /><stop
+ id="stop84090"
+ offset="0.31459025"
+ style="stop-color:#73d216;stop-opacity:1;" /><stop
+ style="stop-color:#4e9a06;stop-opacity:1;"
+ offset="1"
+ id="stop84080" /></linearGradient><linearGradient
+ id="linearGradient3531"><stop
+ id="stop3533"
+ offset="0"
+ style="stop-color:#9b9b9b;stop-opacity:1;" /><stop
+ id="stop3535"
+ offset="1"
+ style="stop-color:#414141;stop-opacity:1;" /></linearGradient><linearGradient
+ id="linearGradient3483"><stop
+ id="stop3485"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" /><stop
+ id="stop3487"
+ offset="1"
+ style="stop-color:#787878;stop-opacity:1" /></linearGradient><linearGradient
+ id="linearGradient3263"><stop
+ id="stop3265"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ id="stop3267"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" /></linearGradient><linearGradient
+ id="linearGradient3247"><stop
+ style="stop-color:#52a714;stop-opacity:1;"
+ offset="0"
+ id="stop3249" /><stop
+ style="stop-color:#398800;stop-opacity:1;"
+ offset="1"
+ id="stop3251" /></linearGradient><linearGradient
+ id="linearGradient3233"><stop
+ id="stop3235"
+ offset="0"
+ style="stop-color:#398800;stop-opacity:1;" /><stop
+ id="stop3237"
+ offset="1"
+ style="stop-color:#84c706;stop-opacity:1;" /></linearGradient><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 21.932501 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="36.183998 : 21.932501 : 1"
+ inkscape:persp3d-origin="18.091999 : 14.621667 : 1"
+ id="perspective2437" />
+
+
+
+
+
+ <filter
+ inkscape:collect="always"
+ id="filter3471"><feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.057808254"
+ id="feGaussianBlur3473" /></filter><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3233"
+ id="linearGradient3517"
+ gradientUnits="userSpaceOnUse"
+ x1="25.144751"
+ y1="43.865002"
+ x2="25.144751"
+ y2="23.838018" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3247"
+ id="linearGradient3519"
+ gradientUnits="userSpaceOnUse"
+ x1="30.691881"
+ y1="23.365002"
+ x2="30.691881"
+ y2="44.365963" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3263"
+ id="linearGradient3521"
+ gradientUnits="userSpaceOnUse"
+ x1="26.455547"
+ y1="24.322035"
+ x2="26.455547"
+ y2="30.466549" /><linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="55.692348"
+ x2="18.072493"
+ y1="29.205048"
+ x1="21.55229"
+ id="linearGradient5138"
+ xlink:href="#linearGradient5132"
+ inkscape:collect="always" /><linearGradient
+ id="linearGradient5132"
+ inkscape:collect="always"><stop
+ id="stop5134"
+ offset="0"
+ style="stop-color:white;stop-opacity:1;" /><stop
+ id="stop5136"
+ offset="1"
+ style="stop-color:white;stop-opacity:0;" /></linearGradient><linearGradient
+ id="linearGradient1913"><stop
+ id="stop1915"
+ offset="0"
+ style="stop-color:#73d216;stop-opacity:1" /><stop
+ id="stop1917"
+ offset="1"
+ style="stop-color:#8ae234;stop-opacity:1" /></linearGradient><inkscape:perspective
+ id="perspective84036"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 24 : 1"
+ sodipodi:type="inkscape:persp3d" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient84076"
+ id="radialGradient84088"
+ cx="26.183998"
+ cy="40.111427"
+ fx="26.183998"
+ fy="40.111427"
+ r="10.5"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9228377,7.3282173e-8,-7.9001009e-8,0.8924238,2.0204218,4.4167191)" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3263"
+ id="linearGradient84092"
+ gradientUnits="userSpaceOnUse"
+ x1="26.455547"
+ y1="24.322035"
+ x2="26.455547"
+ y2="30.466549" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient84104"
+ id="linearGradient84110"
+ x1="28.185518"
+ y1="22.649143"
+ x2="27.596079"
+ y2="42.648415"
+ gradientUnits="userSpaceOnUse" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient84076"
+ id="radialGradient84134"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0862379,-2.5925308e-8,1.5464794e-8,0.8186283,-2.2580516,7.302016)"
+ cx="26.183998"
+ cy="39.098457"
+ fx="26.183998"
+ fy="39.098457"
+ r="10.5" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3263"
+ id="linearGradient84136"
+ gradientUnits="userSpaceOnUse"
+ x1="26.455547"
+ y1="24.322035"
+ x2="26.455547"
+ y2="30.466549" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient84104"
+ id="linearGradient84138"
+ gradientUnits="userSpaceOnUse"
+ x1="21.515692"
+ y1="23.09075"
+ x2="34.488232"
+ y2="40.661182" /><filter
+ inkscape:collect="always"
+ id="filter84266"
+ x="-0.07103052"
+ width="1.142061"
+ y="-0.5276553"
+ height="2.0553105"><feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.45756194"
+ id="feGaussianBlur84268" /></filter><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3263"
+ id="linearGradient84277"
+ gradientUnits="userSpaceOnUse"
+ x1="26.455547"
+ y1="24.322035"
+ x2="26.455547"
+ y2="30.466549" /><linearGradient
+ id="linearGradient5171"><stop
+ style="stop-color:#fe3a00;stop-opacity:1"
+ offset="0"
+ id="stop5173" /><stop
+ style="stop-color:#c00;stop-opacity:1;"
+ offset="1"
+ id="stop5175" /></linearGradient><inkscape:perspective
+ id="perspective7871"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 24 : 1"
+ sodipodi:type="inkscape:persp3d" /><inkscape:perspective
+ id="perspective7973"
+ inkscape:persp3d-origin="14 : 9.3333333 : 1"
+ inkscape:vp_z="28 : 14 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 14 : 1"
+ sodipodi:type="inkscape:persp3d" />
+
+<radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5171"
+ id="radialGradient8812"
+ cx="26.184002"
+ cy="39.797016"
+ fx="26.184002"
+ fy="39.797016"
+ r="10.65866"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9444304,0,0,0.7220468,1.4550326,11.504981)" /><linearGradient
+ y2="40.661182"
+ x2="34.488232"
+ y1="23.09075"
+ x1="21.515692"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient84279"
+ xlink:href="#linearGradient84104"
+ inkscape:collect="always" /><linearGradient
+ y2="30.466549"
+ x2="26.455547"
+ y1="24.322035"
+ x1="26.455547"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient9095"
+ xlink:href="#linearGradient3263"
+ inkscape:collect="always" /><linearGradient
+ y2="40.661182"
+ x2="34.488232"
+ y1="23.09075"
+ x1="21.515692"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient9089"
+ xlink:href="#linearGradient84104"
+ inkscape:collect="always" /><linearGradient
+ y2="30.466549"
+ x2="26.455547"
+ y1="24.322035"
+ x1="26.455547"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient9087"
+ xlink:href="#linearGradient3263"
+ inkscape:collect="always" /><radialGradient
+ r="10.5"
+ fy="39.098457"
+ fx="26.183998"
+ cy="39.098457"
+ cx="26.183998"
+ gradientTransform="matrix(1.0862379,-2.5925308e-8,1.5464794e-8,0.8186283,-2.2580516,7.302016)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient9085"
+ xlink:href="#linearGradient84076"
+ inkscape:collect="always" /><linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="42.648415"
+ x2="27.596079"
+ y1="22.649143"
+ x1="28.185518"
+ id="linearGradient9083"
+ xlink:href="#linearGradient84104"
+ inkscape:collect="always" /><linearGradient
+ y2="30.466549"
+ x2="26.455547"
+ y1="24.322035"
+ x1="26.455547"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient9081"
+ xlink:href="#linearGradient3263"
+ inkscape:collect="always" /><radialGradient
+ gradientTransform="matrix(0.9228377,7.3282173e-8,-7.9001009e-8,0.8924238,2.0204218,4.4167191)"
+ gradientUnits="userSpaceOnUse"
+ r="10.5"
+ fy="40.111427"
+ fx="26.183998"
+ cy="40.111427"
+ cx="26.183998"
+ id="radialGradient9079"
+ xlink:href="#linearGradient84076"
+ inkscape:collect="always" /><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective9077" /><linearGradient
+ id="linearGradient9071"><stop
+ style="stop-color:#73d216;stop-opacity:1"
+ offset="0"
+ id="stop9073" /><stop
+ style="stop-color:#8ae234;stop-opacity:1"
+ offset="1"
+ id="stop9075" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5132"
+ id="linearGradient9063"
+ x1="21.55229"
+ y1="29.205048"
+ x2="18.072493"
+ y2="55.692348"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ y2="30.466549"
+ x2="26.455547"
+ y1="24.322035"
+ x1="26.455547"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient9061"
+ xlink:href="#linearGradient3263"
+ inkscape:collect="always" /><linearGradient
+ y2="44.365963"
+ x2="30.691881"
+ y1="23.365002"
+ x1="30.691881"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient9059"
+ xlink:href="#linearGradient3247"
+ inkscape:collect="always" /><linearGradient
+ y2="23.838018"
+ x2="25.144751"
+ y1="43.865002"
+ x1="25.144751"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient9057"
+ xlink:href="#linearGradient3233"
+ inkscape:collect="always" />
+
+
+
+
+
+ <inkscape:perspective
+ id="perspective9051"
+ inkscape:persp3d-origin="18.091999 : 14.621667 : 1"
+ inkscape:vp_z="36.183998 : 21.932501 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 21.932501 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ id="linearGradient9045"><stop
+ style="stop-color:#398800;stop-opacity:1;"
+ offset="0"
+ id="stop9047" /><stop
+ style="stop-color:#84c706;stop-opacity:1;"
+ offset="1"
+ id="stop9049" /></linearGradient><linearGradient
+ id="linearGradient9039"><stop
+ id="stop9041"
+ offset="0"
+ style="stop-color:#52a714;stop-opacity:1;" /><stop
+ id="stop9043"
+ offset="1"
+ style="stop-color:#398800;stop-opacity:1;" /></linearGradient><linearGradient
+ id="linearGradient9033"><stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop9035" /><stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop9037" /></linearGradient><linearGradient
+ id="linearGradient9027"><stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop9029" /><stop
+ style="stop-color:#787878;stop-opacity:1"
+ offset="1"
+ id="stop9031" /></linearGradient><linearGradient
+ id="linearGradient9021"><stop
+ style="stop-color:#9b9b9b;stop-opacity:1;"
+ offset="0"
+ id="stop9023" /><stop
+ style="stop-color:#414141;stop-opacity:1;"
+ offset="1"
+ id="stop9025" /></linearGradient><linearGradient
+ id="linearGradient9013"><stop
+ id="stop9015"
+ offset="0"
+ style="stop-color:#73d216;stop-opacity:1;" /><stop
+ style="stop-color:#73d216;stop-opacity:1;"
+ offset="0.31459025"
+ id="stop9017" /><stop
+ id="stop9019"
+ offset="1"
+ style="stop-color:#4e9a06;stop-opacity:1;" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3263"
+ id="linearGradient9115"
+ gradientUnits="userSpaceOnUse"
+ x1="26.455547"
+ y1="24.322035"
+ x2="26.455547"
+ y2="30.466549" /></defs><sodipodi:namedview
+ inkscape:window-height="733"
+ inkscape:window-width="1263"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="10.958333"
+ inkscape:cx="16.307224"
+ inkscape:cy="24"
+ inkscape:window-x="6"
+ inkscape:window-y="140"
+ inkscape:current-layer="svg2419" />
+<path
+ id="path2424"
+ d="M 11.485207,8.6743869 C 11.872117,8.5219533 18.066562,7.5772471 17.547442,14.819684 C 16.836811,24.751336 10.199071,21.863582 8.4570051,28.091683 C 9.1530536,27.855507 9.3319265,27.184615 9.77036,26.633222 C 11.09052,24.971517 11.912946,24.144427 13.199081,23.591154 C 17.777838,21.620819 20.261644,13.237019 16.405184,9.3659791 C 14.958646,7.9131637 12.270692,8.0514823 11.485207,8.6743869 z M -0.41567362,30.622819 C -0.62079412,30.073309 -0.81036052,29.508743 -0.98534482,28.932886 C 0.28134733,30.510848 2.408639,29.511665 3.7800623,29.851546 C 7.7792565,30.842672 10.201988,29.700696 12.4972,27.002072 C 14.538683,24.600785 15.730521,26.026314 17.692291,22.415916 C 18.187107,21.506024 19.527682,20.515211 20.049718,16.478567 C 20.335526,14.26641 21.73087,14.007651 21.560747,12.407106 C 21.300215,9.95501 21.209476,9.6012157 20.182901,7.9460967 C 18.706228,5.5636294 16.443158,4.9249489 14.396731,4.9187631 C 12.674334,4.9140584 11.84411,5.6088349 11.260829,5.8365431 C 15.390232,4.8356399 18.977454,6.2618089 19.977781,8.6743869 C 20.486207,9.9004346 20.744795,10.273048 20.835204,11.578136 C 20.978108,13.644446 20.307334,14.416019 20.263588,13.790293 C 20.079855,11.11331 19.152438,7.8049552 16.050354,6.738867 C 14.094417,6.0670338 11.302445,6.5779657 9.6303729,7.8454158 C 7.5908326,9.7988133 6.4952361,12.616937 6.4952361,14.474358 C 6.4952361,18.037708 6.4689884,19.168722 5.854599,22.494014 C 5.596011,23.89696 4.6627611,25.357303 5.2022963,27.278709 C 5.9975029,26.985134 6.7110502,25.878585 6.9949136,25.111717 C 8.9868188,19.727642 10.292396,20.99227 12.343602,18.829042 C 12.831614,18.314346 13.669595,16.922691 13.771669,16.409877 C 14.018591,15.167833 14.629092,12.200099 12.557472,12.269729 C 10.832904,13.36875 11.557145,15.649595 10.237957,17.872102 C 12.271664,16.963152 12.138481,13.127869 12.885082,13.037538 C 13.533495,12.95944 13.493638,14.504468 13.351707,15.328734 C 13.046456,17.100529 12.422345,18.101693 11.019554,19.120734 C 9.9006261,19.933709 8.8604412,20.065441 7.8484484,21.773252 C 7.6579099,22.073413 6.3027534,25.346012 6.134574,25.654641 C 5.2858998,27.216607 5.3879741,25.564311 6.3212239,22.946607 C 6.3212239,22.946607 7.2311425,20.110606 7.1115699,17.014904 C 7.0571303,15.581848 7.1368454,9.9201951 10.843597,7.9150456 C 12.438871,7.052201 14.9149,6.5102179 16.620025,7.776727 C 21.95802,11.740919 19.47227,21.463682 15.405828,24.214058 C 13.770697,25.320606 12.413596,25.389296 11.019554,27.516768 C 9.932706,29.17565 6.8500655,30.289726 4.7074794,29.321496 C 5.5649027,28.845379 6.8957558,28.803036 7.2787772,27.73883 C 10.085332,19.931827 15.530262,23.306048 16.183536,14.966471 C 16.414904,12.009088 14.877959,9.6953099 12.69746,9.6953099 C 10.466409,9.6953099 8.9664042,12.675276 8.6281009,15.440706 C 8.4657544,16.774023 8.3782621,18.528881 8.2713273,19.450064 C 10.056167,18.413145 8.4851971,11.162239 12.484562,10.747283 C 15.963834,10.386902 15.66636,14.964589 15.26973,16.96127 C 14.967396,18.483716 14.270374,19.795389 11.270365,21.516375 C 9.690645,22.422502 8.643655,23.573275 7.8426157,25.457043 C 7.3730743,26.56171 6.4126046,28.452065 4.547077,28.632726 C 4.3332073,28.653426 3.9268547,26.573943 3.8004772,25.47304 C 3.6138271,23.848031 4.453752,22.765006 4.7327549,21.015793 C 5.0438382,19.072746 5.2615964,17.525836 5.2781228,14.197721 C 4.4936096,9.0893427 5.2917327,7.5791289 7.4226532,5.1562011 C 9.9142358,2.3220811 12.045219,2.0705493 13.508882,2.0570557 C 15.652565,2.0393053 16.899028,3.5509526 16.263252,3.4276891 C 14.62326,3.1105913 11.630055,2.6909308 9.0577845,5.2945196 C 7.6229131,6.7454536 6.0402768,8.6122845 6.2084562,10.886543 C 6.8802017,7.6195895 10.334508,3.7516736 13.747676,3.7516736 C 17.577206,3.7516736 19.976808,5.1712562 21.120039,7.0155042 C 22.280769,8.8889209 22.761976,10.297513 22.761976,12.822062 C 22.761976,14.686071 21.730541,15.451057 21.262943,16.962211 C 21.083098,17.542773 20.463848,19.045459 20.191651,20.211286 C 19.097998,24.896241 18.309596,27.152622 14.271346,30.220096 C 12.511782,31.556235 11.111907,31.646565 10.179629,31.285243 C 10.187406,31.13281 12.366934,30.934272 13.724035,28.937591 C 15.002392,27.055705 16.650162,27.007717 17.396761,24.840726 C 16.622941,25.778846 15.419438,26.673683 14.41425,27.115925 C 14.130387,27.241071 13.618072,27.886557 13.421701,28.116148 C 11.368551,30.531548 9.713004,31.103642 7.3458545,31.373692 C 7.7220709,31.550589 8.110925,31.687026 8.5231103,31.739719 C 11.53187,32.124565 13.387675,32.163143 15.774267,30.055431 C 19.142717,27.08111 19.696834,25.201106 20.047775,22.967308 C 20.307334,21.313131 21.669648,17.436727 22.261326,15.868175 C 23.094574,13.65922 22.570465,18.105457 22.332292,18.688842 C 20.93825,22.115755 21.500144,26.735784 17.955739,30.380997 C 15.523456,32.882964 12.32416,33.811675 7.1358733,32.637379 C 5.7525248,32.324044 6.253216,31.857336 4.671552,31.373692 C 4.1971499,31.159157 1.6540024,31.013311 1.3623619,31.011429 C 0.72269676,31.007665 0.11997297,30.875933 -0.41567362,30.622819 z M 4.2680743,5.1477326 C 2.8681995,6.7162844 3.1442858,7.9310416 2.2158966,9.2445983 C 0.39119867,11.826545 1.4517984,15.393659 1.0658607,17.99913 C 0.56618308,21.378997 0.52283784,20.110089 0.0065640818,17.990301 C -0.75463862,14.864849 -0.20180392,13.731954 -0.076398418,12.407106 C 0.6186783,9.1298026 1.2262629,7.7560263 2.8691715,5.6887748 C 4.2253003,3.9828454 6.149156,3.0371977 4.2680743,5.1477326 z M 24.036445,36.450079 C 23.488161,37.083333 22.896131,37.673305 22.262298,38.211523 L 21.475841,38.506979 C 18.241547,39.711387 16.58114,39.821477 11.857534,39.082837 C 9.932706,38.781735 7.3050248,38.411944 5.4978253,39.277612 C 6.5839482,39.510065 10.395401,38.361053 11.576587,39.986142 C 11.459931,40.156453 9.2113823,39.88358 7.0960157,40.347465 C 6.5837004,40.058595 6.0888836,39.731146 5.6115651,39.367002 C 5.1527173,39.009443 4.8173306,38.720573 4.4926375,38.413826 C 6.9570004,37.030641 10.904842,37.507699 13.34879,37.820091 C 17.581468,38.362075 19.260345,38.181414 21.964825,37.188718 C 22.696843,36.919609 23.388031,36.670259 24.036445,36.450079 z M 26.094456,7.8981086 C 27.151167,9.9813566 28.257457,11.575313 28.257457,14.734999 C 28.257457,18.212845 25.759069,19.908303 25.360494,22.223022 C 24.987194,24.390014 24.927894,26.193802 24.599312,26.193802 C 24.132687,26.193802 23.98395,24.125609 24.054915,22.674675 C 24.126854,21.205864 24.314124,20.404861 24.655344,19.310545 C 25.039337,18.081673 25.62266,15.331577 25.504059,13.251152 C 25.348517,10.505481 25.590559,11.089486 26.303134,12.745546 C 26.769759,13.828571 26.261622,15.950138 26.303134,17.484815 C 27.329709,15.648996 27.135261,12.882863 26.349775,10.877714 C 26.087298,10.20494 25.726989,8.8446969 26.094456,7.8981086 z M 24.622001,9.2587722 C 24.485902,8.654687 23.723397,6.4935811 22.726959,5.2026076 C 21.232786,3.2689699 22.578201,3.6726143 23.649494,4.846911 C 24.696483,5.9948613 25.472289,7.3598893 25.501453,8.680032 C 25.560753,11.39277 25.122651,11.470929 24.622001,9.2587722 z M 28.324534,16.874703 C 28.602565,16.515264 28.874762,18.765998 28.371196,19.556391 C 27.026733,21.665043 27.509885,25.128655 26.639823,27.894085 C 25.254531,32.293934 20.848813,35.618286 15.998831,35.528896 C 19.543236,34.354599 22.714341,33.813557 24.183237,26.840229 C 24.312532,26.225793 25.174816,26.557005 24.397107,29.459814 C 25.254531,28.223415 25.999186,25.124891 26.111954,22.623864 C 26.186809,20.930167 27.729588,18.502534 28.324534,16.874703 z M 0.35036898,7.0776065 C 3.1160939,2.0115701 8.6912897,0.54275818 13.214636,0.54275818 C 16.041605,0.54275818 18.507912,1.0273437 20.818678,2.3550142 C 21.174479,2.6147144 21.713042,2.9355759 22.002738,3.2253863 C 22.938905,4.1653883 21.369626,3.7445623 19.405193,2.8753556 C 15.80217,1.2811182 13.224356,1.5241817 11.057467,1.8713897 C 9.4544161,2.1282671 8.4327017,3.4107521 7.629718,4.1889118 C 4.6705382,7.05126 4.2097461,9.6106249 4.5655476,12.822062 C 5.0068971,16.806955 4.2680743,21.015793 3.3367686,23.309812 C 2.8604223,24.48505 2.9236112,26.011258 3.1365088,26.978548 C 3.5214743,28.723056 5.0173803,29.448829 3.1481744,29.208582 C -0.12595652,28.787761 -0.12403302,24.289333 0.99392257,21.109887 C 2.1361815,17.860811 1.50895,15.966631 1.7492717,13.57764 C 2.8163869,2.8893489 3.1267874,15.841548 3.0655428,16.408937 C 2.7077971,19.726701 2.2340211,20.608302 1.7385783,22.084704 C 0.6727661,25.260787 1.9314335,27.1104 2.2661583,27.366598 C 0.91096007,23.04949 3.2794126,21.655634 3.4660626,16.648877 C 3.5117529,15.433179 3.5311956,14.688893 3.3455178,13.046948 C 2.7748744,7.9799706 4.0814242,5.0574021 6.9725545,2.7097496 C 5.2188225,2.7266866 3.8724152,3.9950776 2.6825216,5.1477326 C 1.376944,6.4114188 0.16469114,9.2935264 -0.21249732,10.402898 C -0.77633582,12.06178 -1.2711526,10.046281 0.35036898,7.0776065 z M -1.1097781,28.513226 C -2.0128918,25.368594 -2.4649347,21.861701 -2.3900803,18.216487 C -2.3609163,16.765553 -2.2306501,15.171597 -1.7834679,13.305707 C -0.91243472,9.6699043 -0.68197602,11.586122 -0.74034592,12.032491 C -1.892347,20.8421 1.6144968,19.138912 -0.52455272,25.744091 C -1.2711526,25.202108 -0.48304042,21.510409 -1.656139,19.312946 C -1.3508469,21.734954 -2.0167804,25.74309 0.62937185,28.271403 C 1.3856931,28.994988 2.8681995,29.389244 0.72269676,29.208582 C -0.014181718,29.14648 -0.61787772,28.901835 -1.1097781,28.513226 z M 0.48744008,32.752173 C 0.31731635,32.398379 0.15496979,32.036116 -0.001544018,31.666325 C 1.0075324,31.547766 3.0567937,31.442381 4.827052,32.187607 C 5.8555711,32.620441 3.7965886,32.40967 2.0000826,32.51976 C 1.3565291,32.558339 0.82574314,32.712653 0.48744008,32.752173 z M 1.3409749,34.366831 C 1.1446035,34.029973 0.95600926,33.683706 0.77422,33.328971 C 5.2207668,32.537638 7.1728144,33.319562 10.628756,33.606549 C 14.190659,33.902946 18.050036,32.097277 19.263261,30.020616 C 19.886399,28.953587 20.061384,28.694827 20.186789,28.414427 C 20.295669,28.171663 20.367606,27.912904 20.662164,27.098048 C 21.315439,25.292378 21.284331,27.753885 21.120039,28.360793 C 20.008889,32.4586 19.076611,31.735955 17.211084,33.542565 C 21.502088,32.007888 22.154392,28.937591 21.595413,24.661006 C 21.461259,23.63726 22.257437,20.869947 22.622961,19.880074 C 22.622961,19.880074 23.390948,17.397867 23.395808,12.997078 C 23.398724,10.126261 22.460614,5.7019479 18.621652,4.0505932 C 17.335517,3.4973188 15.549704,1.9767551 15.549704,1.9767551 C 16.345283,2.4005401 18.263906,2.6674072 20.120685,3.773956 C 20.191651,3.8162985 24.211429,6.0576243 24.612921,11.923462 C 24.802488,14.69548 24.823213,14.824989 24.636563,16.630658 C 24.636563,16.630658 24.522513,18.48748 23.87021,20.022157 C 23.555238,20.876533 23.217907,23.396378 23.404558,24.661006 C 23.836185,27.588279 22.063983,34.896582 14.845879,34.896582 C 11.657275,34.896582 9.7168927,34.487272 8.1906401,34.251096 C 6.8082637,34.036561 4.0143469,33.91612 1.3409749,34.366831 z M 3.9297711,37.852084 C 3.5603597,37.465356 3.2055303,37.055105 2.865283,36.622271 C 3.9113006,36.029477 4.8299684,36.020068 6.6935517,36.070879 C 8.8283608,36.070879 12.045156,36.916786 11.057467,37.195306 C 11.009832,37.207538 6.4806541,36.578988 3.9297711,37.852084 z M 14.733111,41.653493 C 14.310232,41.716536 13.88152,41.763583 13.44406,41.791811 C 11.361746,41.927308 9.4310844,41.515174 7.6851297,40.656094 C 8.5367202,40.538475 10.183517,40.482019 11.744767,40.7022 C 12.669268,40.832991 13.723062,41.288407 14.733111,41.653493 z M 20.761322,39.340655 C 19.332282,40.284421 17.738953,40.992951 16.005636,41.406965 C 14.734083,41.029648 11.984449,40.585503 12.005589,39.75495 C 12.021421,39.132891 15.493321,40.331468 17.489114,40.076472 C 18.855937,39.902398 19.892232,39.635171 20.761322,39.340655 z M 26.76134,32.003183 C 27.309624,31.472491 26.651489,34.623708 23.573708,35.937265 C 21.48945,36.675905 18.394173,38.324437 13.07076,36.917727 C 12.417485,36.744594 10.347808,36.196965 9.8870164,36.103812 C 6.2998369,35.382109 4.4372258,35.597584 2.4064351,36.01254 C 2.1702062,35.685092 1.9417545,35.345412 1.7210798,34.995381 C 2.3753268,34.730976 4.0192075,34.628413 5.200352,34.626531 C 8.9615437,34.619945 14.003037,35.980548 15.996887,36.070879 C 20.670913,36.282591 23.680644,33.000582 24.053944,33.000582 C 24.986221,33.000582 23.179994,34.632178 22.678372,35.082889 C 22.251605,35.467734 24.361138,34.516441 26.76134,32.003183 z M 28.531599,25.021387 C 28.408138,27.148859 28.247735,30.101537 26.467755,31.577877 C 23.628148,33.933056 24.799572,32.277938 26.039044,30.634111 C 28.194268,27.774586 27.297959,21.332891 28.708527,20.0852 C 28.725053,21.437335 28.621035,23.498941 28.531599,25.021387 z"
+ style="fill:#a1a1a1;fill-opacity:1"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:nodetypes="cscssscccssssssscsssscsscsssccssscscssssscsssscssssssscsssscsssssscscsscssssssscsccssscsccccscccscssccssssssscsccsssccsscscsccscsssssssssssscsscssccsssccsscccsscccssssscscsscssccsssccccsccscscccsscccssccssssccsscc" /><path
+ sodipodi:type="arc"
+ style="opacity:0.24299999;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter84266)"
+ id="path84140"
+ sodipodi:cx="27.093658"
+ sodipodi:cy="38.810692"
+ sodipodi:rx="7.7301183"
+ sodipodi:ry="1.0405928"
+ d="M 34.823777,38.810692 A 7.7301183,1.0405928 0 1 1 19.36354,38.810692 A 7.7301183,1.0405928 0 1 1 34.823777,38.810692 z"
+ transform="matrix(1.1911672,0,0,2.1266149,-5.0625748,-41.775272)" /><g
+ id="Background">
+</g>
+<g
+ id="Guides">
+</g>
+
+<circle
+ clip-rule="evenodd"
+ cx="26.184"
+ cy="33.865002"
+ r="10"
+ id="circle2428"
+ sodipodi:cx="26.184"
+ sodipodi:cy="33.865002"
+ sodipodi:rx="10"
+ sodipodi:ry="10"
+ style="fill:url(#radialGradient8812);fill-opacity:1;fill-rule:evenodd;stroke:#a40000;stroke-width:1.31732059000000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(1.1263785,0,0,1.1511056,-2.2713556,-9.1997707)" /><path
+ sodipodi:type="arc"
+ style="opacity:0.5;fill:url(#linearGradient84277);fill-opacity:1;stroke:none;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3253"
+ sodipodi:cx="26.455547"
+ sodipodi:cy="27.394291"
+ sodipodi:rx="6.1445141"
+ sodipodi:ry="3.072257"
+ d="M 32.600061,27.394291 A 6.1445141,3.072257 0 1 1 20.311033,27.394291 A 6.1445141,3.072257 0 1 1 32.600061,27.394291 z"
+ transform="matrix(1.1246822,0,0,1.4387643,-2.5144268,-14.969086)" /><path
+ sodipodi:type="arc"
+ style="opacity:0.48;fill:none;fill-opacity:1;stroke:#e64837;stroke-width:1.21842730000000010;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path84102"
+ sodipodi:cx="28.185518"
+ sodipodi:cy="31.917336"
+ sodipodi:rx="10.027505"
+ sodipodi:ry="10.240856"
+ d="M 38.213023,31.917336 A 10.027505,10.240856 0 1 1 18.158013,31.917336 A 10.027505,10.240856 0 1 1 38.213023,31.917336 z"
+ transform="matrix(0.9962424,0,0,0.9957004,-0.8393988,-2.0505383)" /><g
+ id="g7978"
+ transform="translate(103.26268,8.6771365)">
+</g><g
+ style="display:none"
+ id="g7980"
+ display="none"
+ transform="translate(103.26268,8.6771365)">
+</g><path
+ id="path7993"
+ style="opacity:0.55;fill:#a40000;fill-opacity:1;fill-rule:evenodd;stroke:#a40000;stroke-width:1.14231765000000007;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 27.143847,37.652725 C 26.708227,37.652725 26.326837,37.518032 25.998788,37.249507 C 25.677852,36.974118 25.516939,36.592349 25.516939,36.10334 C 25.516939,35.676959 25.66985,35.315778 25.977452,35.018942 C 26.291276,34.7161 26.672666,34.565107 27.122511,34.56425 C 27.571466,34.56425 27.953745,34.7161 28.26757,35.018942 C 28.588505,35.31492 28.749418,35.676959 28.749418,36.10334 C 28.749418,36.585484 28.588505,36.963823 28.26757,37.239212 C 27.946633,37.515458 27.571466,37.652725 27.143847,37.652725 z M 25.956115,30.858079 L 25.613842,25.912229 C 25.549833,24.94794 25.517828,24.256464 25.517828,23.836088 C 25.517828,23.26472 25.670739,22.82118 25.978341,22.504613 C 26.292165,22.18118 26.702004,22.019893 27.208746,22.019035 C 27.82217,22.019035 28.232008,22.225791 28.439151,22.638445 C 28.645403,23.045095 28.749418,23.633622 28.749418,24.404025 C 28.749418,24.858717 28.724526,25.320272 28.674741,25.787834 L 28.214228,30.878669 C 28.164443,31.484354 28.056871,31.94934 27.893292,32.272773 C 27.728822,32.596205 27.457671,32.758349 27.079838,32.758349 C 26.694892,32.758349 26.427296,32.603067 26.277052,32.293362 C 26.126807,31.976794 26.020125,31.498939 25.956115,30.858079 z" /><path
+ id="path8814"
+ style="fill:#ffffff;fill-rule:evenodd"
+ d="M 27.143847,36.992527 C 26.708227,36.992527 26.326837,36.857834 25.998788,36.589309 C 25.677852,36.31392 25.516939,35.932151 25.516939,35.443142 C 25.516939,35.016761 25.66985,34.65558 25.977452,34.358744 C 26.291276,34.055902 26.672666,33.904909 27.122511,33.904052 C 27.571466,33.904052 27.953745,34.055902 28.26757,34.358744 C 28.588505,34.654722 28.749418,35.016761 28.749418,35.443142 C 28.749418,35.925286 28.588505,36.303625 28.26757,36.579014 C 27.946633,36.85526 27.571466,36.992527 27.143847,36.992527 z M 25.956115,30.197881 L 25.613842,25.252031 C 25.549833,24.287742 25.517828,23.596266 25.517828,23.17589 C 25.517828,22.604522 25.670739,22.160982 25.978341,21.844415 C 26.292165,21.520982 26.702004,21.359695 27.208746,21.358837 C 27.82217,21.358837 28.232008,21.565593 28.439151,21.978247 C 28.645403,22.384897 28.749418,22.973424 28.749418,23.743827 C 28.749418,24.198519 28.724526,24.660074 28.674741,25.127636 L 28.214228,30.218471 C 28.164443,30.824156 28.056871,31.289142 27.893292,31.612575 C 27.728822,31.936007 27.457671,32.098151 27.079838,32.098151 C 26.694892,32.098151 26.427296,31.942869 26.277052,31.633164 C 26.126807,31.316596 26.020125,30.838741 25.956115,30.197881 z" /><rect
+ style="fill:#666666;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect9126"
+ width="1.8060035"
+ height="42.650608"
+ x="-26.038683"
+ y="-24.284592"
+ transform="matrix(-0.6420845,-0.7666339,0.7632254,-0.6461324,0,0)"
+ ry="0"
+ rx="0.018515259" /></svg> \ No newline at end of file
diff --git a/capplets/about-me/icons/print_ok.png b/capplets/about-me/icons/print_ok.png
new file mode 100644
index 00000000..4dd615e7
--- /dev/null
+++ b/capplets/about-me/icons/print_ok.png
Binary files differ
diff --git a/capplets/about-me/icons/print_ok.svg b/capplets/about-me/icons/print_ok.svg
new file mode 100644
index 00000000..ba821ef7
--- /dev/null
+++ b/capplets/about-me/icons/print_ok.svg
@@ -0,0 +1,310 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ x="0px"
+ y="0px"
+ width="48"
+ height="48"
+ viewBox="0 0 36.184 43.865"
+ enable-background="new 0 0 36.184 43.865"
+ xml:space="preserve"
+ id="svg2419"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="print_ok.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/Users/mlanglie/Desktop/Fingerprint Enrollment Icons/Vector/print_ok.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><metadata
+ id="metadata2435"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs2433"><linearGradient
+ inkscape:collect="always"
+ id="linearGradient84104"><stop
+ style="stop-color:#fffffc;stop-opacity:1;"
+ offset="0"
+ id="stop84106" /><stop
+ style="stop-color:#fffffc;stop-opacity:0;"
+ offset="1"
+ id="stop84108" /></linearGradient><linearGradient
+ id="linearGradient84076"><stop
+ style="stop-color:#73d216;stop-opacity:1;"
+ offset="0"
+ id="stop84078" /><stop
+ id="stop84090"
+ offset="0.31459025"
+ style="stop-color:#73d216;stop-opacity:1;" /><stop
+ style="stop-color:#4e9a06;stop-opacity:1;"
+ offset="1"
+ id="stop84080" /></linearGradient><linearGradient
+ id="linearGradient3531"><stop
+ id="stop3533"
+ offset="0"
+ style="stop-color:#9b9b9b;stop-opacity:1;" /><stop
+ id="stop3535"
+ offset="1"
+ style="stop-color:#414141;stop-opacity:1;" /></linearGradient><linearGradient
+ id="linearGradient3483"><stop
+ id="stop3485"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" /><stop
+ id="stop3487"
+ offset="1"
+ style="stop-color:#787878;stop-opacity:1" /></linearGradient><linearGradient
+ id="linearGradient3263"><stop
+ id="stop3265"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ id="stop3267"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" /></linearGradient><linearGradient
+ id="linearGradient3247"><stop
+ style="stop-color:#52a714;stop-opacity:1;"
+ offset="0"
+ id="stop3249" /><stop
+ style="stop-color:#398800;stop-opacity:1;"
+ offset="1"
+ id="stop3251" /></linearGradient><linearGradient
+ id="linearGradient3233"><stop
+ id="stop3235"
+ offset="0"
+ style="stop-color:#398800;stop-opacity:1;" /><stop
+ id="stop3237"
+ offset="1"
+ style="stop-color:#84c706;stop-opacity:1;" /></linearGradient><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 21.932501 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="36.183998 : 21.932501 : 1"
+ inkscape:persp3d-origin="18.091999 : 14.621667 : 1"
+ id="perspective2437" />
+
+
+
+
+
+ <filter
+ inkscape:collect="always"
+ id="filter3471"><feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.057808254"
+ id="feGaussianBlur3473" /></filter><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3233"
+ id="linearGradient3517"
+ gradientUnits="userSpaceOnUse"
+ x1="25.144751"
+ y1="43.865002"
+ x2="25.144751"
+ y2="23.838018" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3247"
+ id="linearGradient3519"
+ gradientUnits="userSpaceOnUse"
+ x1="30.691881"
+ y1="23.365002"
+ x2="30.691881"
+ y2="44.365963" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3263"
+ id="linearGradient3521"
+ gradientUnits="userSpaceOnUse"
+ x1="26.455547"
+ y1="24.322035"
+ x2="26.455547"
+ y2="30.466549" /><linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="55.692348"
+ x2="18.072493"
+ y1="29.205048"
+ x1="21.55229"
+ id="linearGradient5138"
+ xlink:href="#linearGradient5132"
+ inkscape:collect="always" /><linearGradient
+ id="linearGradient5132"
+ inkscape:collect="always"><stop
+ id="stop5134"
+ offset="0"
+ style="stop-color:white;stop-opacity:1;" /><stop
+ id="stop5136"
+ offset="1"
+ style="stop-color:white;stop-opacity:0;" /></linearGradient><linearGradient
+ id="linearGradient1913"><stop
+ id="stop1915"
+ offset="0"
+ style="stop-color:#73d216;stop-opacity:1" /><stop
+ id="stop1917"
+ offset="1"
+ style="stop-color:#8ae234;stop-opacity:1" /></linearGradient><inkscape:perspective
+ id="perspective84036"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 24 : 1"
+ sodipodi:type="inkscape:persp3d" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient84076"
+ id="radialGradient84088"
+ cx="26.183998"
+ cy="40.111427"
+ fx="26.183998"
+ fy="40.111427"
+ r="10.5"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9228377,7.3282173e-8,-7.9001009e-8,0.8924238,2.0204218,4.4167191)" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3263"
+ id="linearGradient84092"
+ gradientUnits="userSpaceOnUse"
+ x1="26.455547"
+ y1="24.322035"
+ x2="26.455547"
+ y2="30.466549" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient84104"
+ id="linearGradient84110"
+ x1="28.185518"
+ y1="22.649143"
+ x2="27.596079"
+ y2="42.648415"
+ gradientUnits="userSpaceOnUse" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient84076"
+ id="radialGradient84134"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0862379,-2.5925308e-8,1.5464794e-8,0.8186283,-2.2580516,7.302016)"
+ cx="26.183998"
+ cy="39.098457"
+ fx="26.183998"
+ fy="39.098457"
+ r="10.5" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3263"
+ id="linearGradient84136"
+ gradientUnits="userSpaceOnUse"
+ x1="26.455547"
+ y1="24.322035"
+ x2="26.455547"
+ y2="30.466549" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient84104"
+ id="linearGradient84138"
+ gradientUnits="userSpaceOnUse"
+ x1="21.515692"
+ y1="23.09075"
+ x2="34.488232"
+ y2="40.661182" /><filter
+ inkscape:collect="always"
+ id="filter84266"
+ x="-0.07103052"
+ width="1.142061"
+ y="-0.5276553"
+ height="2.0553105"><feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.45756194"
+ id="feGaussianBlur84268" /></filter><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3263"
+ id="linearGradient84277"
+ gradientUnits="userSpaceOnUse"
+ x1="26.455547"
+ y1="24.322035"
+ x2="26.455547"
+ y2="30.466549" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient84104"
+ id="linearGradient84279"
+ gradientUnits="userSpaceOnUse"
+ x1="21.515692"
+ y1="23.09075"
+ x2="34.488232"
+ y2="40.661182" /></defs><sodipodi:namedview
+ inkscape:window-height="713"
+ inkscape:window-width="1222"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="4.399364"
+ inkscape:cx="39.372624"
+ inkscape:cy="7.0437262"
+ inkscape:window-x="15"
+ inkscape:window-y="165"
+ inkscape:current-layer="svg2419" />
+<path
+ sodipodi:type="arc"
+ style="opacity:0.24299999;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter84266)"
+ id="path84140"
+ sodipodi:cx="27.093658"
+ sodipodi:cy="38.810692"
+ sodipodi:rx="7.7301183"
+ sodipodi:ry="1.0405928"
+ d="M 34.823777,38.810692 A 7.7301183,1.0405928 0 1 1 19.36354,38.810692 A 7.7301183,1.0405928 0 1 1 34.823777,38.810692 z"
+ transform="matrix(1.1911672,0,0,2.1266149,-5.0625748,-41.775272)" /><g
+ id="Background">
+</g>
+<g
+ id="Guides">
+</g>
+<path
+ id="path2424"
+ d="M 11.4715,8.6587828 C 11.85841,8.5063492 18.052855,7.561643 17.533735,14.80408 C 16.823104,24.735732 10.185364,21.847978 8.4432981,28.076079 C 9.1393466,27.839903 9.3182195,27.169011 9.756653,26.617618 C 11.076813,24.955913 11.899239,24.128823 13.185374,23.57555 C 17.764131,21.605215 20.247937,13.221415 16.391477,9.350375 C 14.944939,7.8975596 12.256985,8.0358782 11.4715,8.6587828 z M -0.42938057,30.607215 C -0.63450107,30.057705 -0.82406747,29.493139 -0.99905177,28.917282 C 0.26764038,30.495244 2.394932,29.496061 3.7663553,29.835942 C 7.7655495,30.827068 10.188281,29.685092 12.483493,26.986468 C 14.524976,24.585181 15.716814,26.01071 17.678584,22.400312 C 18.1734,21.49042 19.513975,20.499607 20.036011,16.462963 C 20.321819,14.250806 21.717163,13.992047 21.54704,12.391502 C 21.286508,9.9394059 21.195769,9.5856116 20.169194,7.9304926 C 18.692521,5.5480253 16.429451,4.9093448 14.383024,4.903159 C 12.660627,4.8984543 11.830403,5.5932308 11.247122,5.820939 C 15.376525,4.8200358 18.963747,6.2462048 19.964074,8.6587828 C 20.4725,9.8848305 20.731088,10.257444 20.821497,11.562532 C 20.964401,13.628842 20.293627,14.400415 20.249881,13.774689 C 20.066148,11.097706 19.138731,7.7893511 16.036647,6.7232629 C 14.08071,6.0514297 11.288738,6.5623616 9.6166659,7.8298117 C 7.5771256,9.7832092 6.4815291,12.601333 6.4815291,14.458754 C 6.4815291,18.022104 6.4552814,19.153118 5.840892,22.47841 C 5.582304,23.881356 4.6490541,25.341699 5.1885893,27.263105 C 5.9837959,26.96953 6.6973432,25.862981 6.9812066,25.096113 C 8.9731118,19.712038 10.278689,20.976666 12.329895,18.813438 C 12.817907,18.298742 13.655888,16.907087 13.757962,16.394273 C 14.004884,15.152229 14.615385,12.184495 12.543765,12.254125 C 10.819197,13.353146 11.543438,15.633991 10.22425,17.856498 C 12.257957,16.947548 12.124774,13.112265 12.871375,13.021934 C 13.519788,12.943836 13.479931,14.488864 13.338,15.31313 C 13.032749,17.084925 12.408638,18.086089 11.005847,19.10513 C 9.8869191,19.918105 8.8467342,20.049837 7.8347414,21.757648 C 7.6442029,22.057809 6.2890464,25.330408 6.120867,25.639037 C 5.2721928,27.201003 5.3742671,25.548707 6.3075169,22.931003 C 6.3075169,22.931003 7.2174355,20.095002 7.0978629,16.9993 C 7.0434233,15.566244 7.1231384,9.904591 10.82989,7.8994415 C 12.425164,7.0365969 14.901193,6.4946138 16.606318,7.7611229 C 21.944313,11.725315 19.458563,21.448078 15.392121,24.198454 C 13.75699,25.305002 12.399889,25.373692 11.005847,27.501164 C 9.918999,29.160046 6.8363585,30.274122 4.6937724,29.305892 C 5.5511957,28.829775 6.8820488,28.787432 7.2650702,27.723226 C 10.071625,19.916223 15.516555,23.290444 16.169829,14.950867 C 16.401197,11.993484 14.864252,9.6797058 12.683753,9.6797058 C 10.452702,9.6797058 8.9526972,12.659672 8.6143939,15.425102 C 8.4520474,16.758419 8.3645551,18.513277 8.2576203,19.43446 C 10.04246,18.397541 8.4714901,11.146635 12.470855,10.731679 C 15.950127,10.371298 15.652653,14.948985 15.256023,16.945666 C 14.953689,18.468112 14.256667,19.779785 11.256658,21.500771 C 9.676938,22.406898 8.629948,23.557671 7.8289087,25.441439 C 7.3593673,26.546106 6.3988976,28.436461 4.53337,28.617122 C 4.3195003,28.637822 3.9131477,26.558339 3.7867702,25.457436 C 3.6001201,23.832427 4.440045,22.749402 4.7190479,21.000189 C 5.0301312,19.057142 5.2478894,17.510232 5.2644158,14.182117 C 4.4799026,9.0737386 5.2780257,7.5635248 7.4089462,5.140597 C 9.9005288,2.306477 12.031512,2.0549452 13.495175,2.0414516 C 15.638858,2.0237012 16.885321,3.5353485 16.249545,3.412085 C 14.609553,3.0949872 11.616348,2.6753267 9.0440775,5.2789155 C 7.6092061,6.7298495 6.0265698,8.5966804 6.1947492,10.870939 C 6.8664947,7.6039854 10.320801,3.7360695 13.733969,3.7360695 C 17.563499,3.7360695 19.963101,5.1556521 21.106332,6.9999001 C 22.267062,8.8733168 22.748269,10.281909 22.748269,12.806458 C 22.748269,14.670467 21.716834,15.435453 21.249236,16.946607 C 21.069391,17.527169 20.450141,19.029855 20.177944,20.195682 C 19.084291,24.880637 18.295889,27.137018 14.257639,30.204492 C 12.498075,31.540631 11.0982,31.630961 10.165922,31.269639 C 10.173699,31.117206 12.353227,30.918668 13.710328,28.921987 C 14.988685,27.040101 16.636455,26.992113 17.383054,24.825122 C 16.609234,25.763242 15.405731,26.658079 14.400543,27.100321 C 14.11668,27.225467 13.604365,27.870953 13.407994,28.100544 C 11.354844,30.515944 9.699297,31.088038 7.3321475,31.358088 C 7.7083639,31.534985 8.097218,31.671422 8.5094033,31.724115 C 11.518163,32.108961 13.373968,32.147539 15.76056,30.039827 C 19.12901,27.065506 19.683127,25.185502 20.034068,22.951704 C 20.293627,21.297527 21.655941,17.421123 22.247619,15.852571 C 23.080867,13.643616 22.556758,18.089853 22.318585,18.673238 C 20.924543,22.100151 21.486437,26.72018 17.942032,30.365393 C 15.509749,32.86736 12.310453,33.796071 7.1221663,32.621775 C 5.7388178,32.30844 6.239509,31.841732 4.657845,31.358088 C 4.1834429,31.143553 1.6402954,30.997707 1.3486549,30.995825 C 0.70898981,30.992061 0.10626602,30.860329 -0.42938057,30.607215 z M 4.2543673,5.1321285 C 2.8544925,6.7006803 3.1305788,7.9154375 2.2021896,9.2289942 C 0.37749172,11.810941 1.4380914,15.378055 1.0521537,17.983526 C 0.55247613,21.363393 0.50913089,20.094485 -0.0071428722,17.974697 C -0.76834557,14.849245 -0.21551087,13.71635 -0.090105372,12.391502 C 0.60497135,9.1141985 1.2125559,7.7404222 2.8554645,5.6731707 C 4.2115933,3.9672413 6.135449,3.0215936 4.2543673,5.1321285 z M 24.022738,36.434475 C 23.474454,37.067729 22.882424,37.657701 22.248591,38.195919 L 21.462134,38.491375 C 18.22784,39.695783 16.567433,39.805873 11.843827,39.067233 C 9.918999,38.766131 7.2913178,38.39634 5.4841183,39.262008 C 6.5702412,39.494461 10.381694,38.345449 11.56288,39.970538 C 11.446224,40.140849 9.1976753,39.867976 7.0823087,40.331861 C 6.5699934,40.042991 6.0751766,39.715542 5.5978581,39.351398 C 5.1390103,38.993839 4.8036236,38.704969 4.4789305,38.398222 C 6.9432934,37.015037 10.891135,37.492095 13.335083,37.804487 C 17.567761,38.346471 19.246638,38.16581 21.951118,37.173114 C 22.683136,36.904005 23.374324,36.654655 24.022738,36.434475 z M 26.080749,7.8825045 C 27.13746,9.9657525 28.24375,11.559709 28.24375,14.719395 C 28.24375,18.197241 25.745362,19.892699 25.346787,22.207418 C 24.973487,24.37441 24.914187,26.178198 24.585605,26.178198 C 24.11898,26.178198 23.970243,24.110005 24.041208,22.659071 C 24.113147,21.19026 24.300417,20.389257 24.641637,19.294941 C 25.02563,18.066069 25.608953,15.315973 25.490352,13.235548 C 25.33481,10.489877 25.576852,11.073882 26.289427,12.729942 C 26.756052,13.812967 26.247915,15.934534 26.289427,17.469211 C 27.316002,15.633392 27.121554,12.867259 26.336068,10.86211 C 26.073591,10.189336 25.713282,8.8290928 26.080749,7.8825045 z M 24.608294,9.2431681 C 24.472195,8.6390829 23.70969,6.477977 22.713252,5.1870035 C 21.219079,3.2533658 22.564494,3.6570102 23.635787,4.8313069 C 24.682776,5.9792572 25.458582,7.3442852 25.487746,8.6644279 C 25.547046,11.377166 25.108944,11.455325 24.608294,9.2431681 z M 28.310827,16.859099 C 28.588858,16.49966 28.861055,18.750394 28.357489,19.540787 C 27.013026,21.649439 27.496178,25.113051 26.626116,27.878481 C 25.240824,32.27833 20.835106,35.602682 15.985124,35.513292 C 19.529529,34.338995 22.700634,33.797953 24.16953,26.824625 C 24.298825,26.210189 25.161109,26.541401 24.3834,29.44421 C 25.240824,28.207811 25.985479,25.109287 26.098247,22.60826 C 26.173102,20.914563 27.715881,18.48693 28.310827,16.859099 z M 0.33666203,7.0620024 C 3.1023869,1.995966 8.6775827,0.52715408 13.200929,0.52715408 C 16.027898,0.52715408 18.494205,1.0117396 20.804971,2.3394101 C 21.160772,2.5991103 21.699335,2.9199718 21.989031,3.2097822 C 22.925198,4.1497842 21.355919,3.7289582 19.391486,2.8597515 C 15.788463,1.2655141 13.210649,1.5085776 11.04376,1.8557856 C 9.4407091,2.112663 8.4189947,3.395148 7.616011,4.1733077 C 4.6568312,7.0356559 4.1960391,9.5950208 4.5518406,12.806458 C 4.9931901,16.791351 4.2543673,21.000189 3.3230616,23.294208 C 2.8467153,24.469446 2.9099042,25.995654 3.1228018,26.962944 C 3.5077673,28.707452 5.0036733,29.433225 3.1344674,29.192978 C -0.13966347,28.772157 -0.13773997,24.273729 0.98021562,21.094283 C 2.1224745,17.845207 1.495243,15.951027 1.7355647,13.562036 C 2.8026799,2.8737448 3.1130804,15.825944 3.0518358,16.393333 C 2.6940901,19.711097 2.2203141,20.592698 1.7248713,22.0691 C 0.65905915,25.245183 1.9177265,27.094796 2.2524513,27.350994 C 0.89725312,23.033886 3.2657056,21.64003 3.4523556,16.633273 C 3.4980459,15.417575 3.5174886,14.673289 3.3318108,13.031344 C 2.7611674,7.9643665 4.0677172,5.041798 6.9588475,2.6941455 C 5.2051155,2.7110825 3.8587082,3.9794735 2.6688146,5.1321285 C 1.363237,6.3958147 0.15098419,9.2779223 -0.22620427,10.387294 C -0.79004277,12.046176 -1.2848596,10.030677 0.33666203,7.0620024 z M -1.1234851,28.497622 C -2.0265988,25.35299 -2.4786417,21.846097 -2.4037873,18.200883 C -2.3746233,16.749949 -2.2443571,15.155993 -1.7971749,13.290103 C -0.92614167,9.6543002 -0.69568297,11.570518 -0.75405287,12.016887 C -1.906054,20.826496 1.6007898,19.123308 -0.53825967,25.728487 C -1.2848596,25.186504 -0.49674737,21.494805 -1.669846,19.297342 C -1.3645539,21.71935 -2.0304874,25.727486 0.6156649,28.255799 C 1.3719861,28.979384 2.8544925,29.37364 0.70898981,29.192978 C -0.027888672,29.130876 -0.63158467,28.886231 -1.1234851,28.497622 z M 0.47373313,32.736569 C 0.3036094,32.382775 0.14126284,32.020512 -0.015250972,31.650721 C 0.99382545,31.532162 3.0430867,31.426777 4.813345,32.172003 C 5.8418641,32.604837 3.7828816,32.394066 1.9863756,32.504156 C 1.3428221,32.542735 0.81203619,32.697049 0.47373313,32.736569 z M 1.3272679,34.351227 C 1.1308965,34.014369 0.94230231,33.668102 0.76051305,33.313367 C 5.2070598,32.522034 7.1591074,33.303958 10.615049,33.590945 C 14.176952,33.887342 18.036329,32.081673 19.249554,30.005012 C 19.872692,28.937983 20.047677,28.679223 20.173082,28.398823 C 20.281962,28.156059 20.353899,27.8973 20.648457,27.082444 C 21.301732,25.276774 21.270624,27.738281 21.106332,28.345189 C 19.995182,32.442996 19.062904,31.720351 17.197377,33.526961 C 21.488381,31.992284 22.140685,28.921987 21.581706,24.645402 C 21.447552,23.621656 22.24373,20.854343 22.609254,19.86447 C 22.609254,19.86447 23.377241,17.382263 23.382101,12.981474 C 23.385017,10.110657 22.446907,5.6863438 18.607945,4.0349891 C 17.32181,3.4817147 15.535997,1.961151 15.535997,1.961151 C 16.331576,2.384936 18.250199,2.6518031 20.106978,3.7583519 C 20.177944,3.8006944 24.197722,6.0420202 24.599214,11.907858 C 24.788781,14.679876 24.809506,14.809385 24.622856,16.615054 C 24.622856,16.615054 24.508806,18.471876 23.856503,20.006553 C 23.541531,20.860929 23.2042,23.380774 23.390851,24.645402 C 23.822478,27.572675 22.050276,34.880978 14.832172,34.880978 C 11.643568,34.880978 9.7031857,34.471668 8.1769331,34.235492 C 6.7945567,34.020957 4.0006399,33.900516 1.3272679,34.351227 z M 3.9160641,37.83648 C 3.5466527,37.449752 3.1918233,37.039501 2.851576,36.606667 C 3.8975936,36.013873 4.8162614,36.004464 6.6798447,36.055275 C 8.8146538,36.055275 12.031449,36.901182 11.04376,37.179702 C 10.996125,37.191934 6.4669471,36.563384 3.9160641,37.83648 z M 14.719404,41.637889 C 14.296525,41.700932 13.867813,41.747979 13.430353,41.776207 C 11.348039,41.911704 9.4173774,41.49957 7.6714227,40.64049 C 8.5230132,40.522871 10.16981,40.466415 11.73106,40.686596 C 12.655561,40.817387 13.709355,41.272803 14.719404,41.637889 z M 20.747615,39.325051 C 19.318575,40.268817 17.725246,40.977347 15.991929,41.391361 C 14.720376,41.014044 11.970742,40.569899 11.991882,39.739346 C 12.007714,39.117287 15.479614,40.315864 17.475407,40.060868 C 18.84223,39.886794 19.878525,39.619567 20.747615,39.325051 z M 26.747633,31.987579 C 27.295917,31.456887 26.637782,34.608104 23.560001,35.921661 C 21.475743,36.660301 18.380466,38.308833 13.057053,36.902123 C 12.403778,36.72899 10.334101,36.181361 9.8733094,36.088208 C 6.2861299,35.366505 4.4235188,35.58198 2.3927281,35.996936 C 2.1564992,35.669488 1.9280475,35.329808 1.7073728,34.979777 C 2.3616198,34.715372 4.0055005,34.612809 5.186645,34.610927 C 8.9478367,34.604341 13.98933,35.964944 15.98318,36.055275 C 20.657206,36.266987 23.666937,32.984978 24.040237,32.984978 C 24.972514,32.984978 23.166287,34.616574 22.664665,35.067285 C 22.237898,35.45213 24.347431,34.500837 26.747633,31.987579 z M 28.517892,25.005783 C 28.394431,27.133255 28.234028,30.085933 26.454048,31.562273 C 23.614441,33.917452 24.785865,32.262334 26.025337,30.618507 C 28.180561,27.758982 27.284252,21.317287 28.69482,20.069596 C 28.711346,21.421731 28.607328,23.483337 28.517892,25.005783 z"
+ style="fill:#a1a1a1;fill-opacity:1"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ sodipodi:nodetypes="cscssscccssssssscsssscsscsssccssscscssssscsssscssssssscsssscsssssscscsscssssssscsccssscsccccscccscssccssssssscsccsssccsscscsccscsssssssssssscsscssccsssccsscccsscccssssscscsscssccsssccccsccscscccsscccssccssssccsscc" />
+<circle
+ clip-rule="evenodd"
+ cx="26.184"
+ cy="33.865002"
+ r="10"
+ id="circle2428"
+ sodipodi:cx="26.184"
+ sodipodi:cy="33.865002"
+ sodipodi:rx="10"
+ sodipodi:ry="10"
+ style="fill:url(#radialGradient84134);fill-opacity:1;fill-rule:evenodd;stroke:#448c00;stroke-width:1.31732059;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(1.1263785,0,0,1.1511056,-2.2713556,-9.1997707)" /><path
+ sodipodi:type="arc"
+ style="opacity:0.50746268;fill:url(#linearGradient84277);fill-opacity:1;stroke:none;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3253"
+ sodipodi:cx="26.455547"
+ sodipodi:cy="27.394291"
+ sodipodi:rx="6.1445141"
+ sodipodi:ry="3.072257"
+ d="M 32.600061,27.394291 A 6.1445141,3.072257 0 1 1 20.311033,27.394291 A 6.1445141,3.072257 0 1 1 32.600061,27.394291 z"
+ transform="matrix(1.1111101,0,0,1.2758999,-2.2387648,-10.924499)" /><path
+ clip-rule="evenodd"
+ d="M 21.777021,33.575871 C 22.428021,34.222871 23.330021,35.596871 24.012021,36.209871 C 25.264021,34.898871 27.599021,31.912871 31.077021,29.499871 C 31.754021,29.029871 33.458021,29.462871 32.557021,30.487871 C 29.846021,33.287871 27.332021,36.692871 25.385021,39.387871 C 24.468021,40.656871 23.706021,39.994871 22.908021,38.978871 C 21.912021,37.682871 20.897021,36.071871 20.509021,35.011871 C 20.282021,34.392871 20.974021,32.785871 21.777021,33.575871 z"
+ id="path2430"
+ style="opacity:0.42786069;fill:#398800;fill-opacity:1;fill-rule:evenodd;stroke:#398800;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3471)"
+ transform="matrix(1.1263785,0,0,1.1511056,-2.2713556,-9.1997707)" /><path
+ clip-rule="evenodd"
+ d="M 21.969435,28.185201 C 22.702707,28.929966 23.718701,30.511585 24.486892,31.217213 C 25.897117,29.708113 28.527211,26.270911 32.444755,23.493294 C 33.207314,22.952275 35.126663,23.450703 34.111795,24.630586 C 31.058183,27.853682 28.226468,31.773196 26.033409,34.875426 C 25.00052,36.33618 24.142219,35.574148 23.243369,34.404624 C 22.121497,32.912791 20.978222,31.05836 20.541188,29.838188 C 20.2855,29.125654 21.064954,27.275827 21.969435,28.185201 z"
+ id="path3469"
+ style="fill:#ffffff;fill-rule:evenodd" /><path
+ sodipodi:type="arc"
+ style="opacity:0.36815945;fill:none;fill-opacity:1;stroke:url(#linearGradient84279);stroke-width:1.2184273;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path84102"
+ sodipodi:cx="28.185518"
+ sodipodi:cy="31.917336"
+ sodipodi:rx="10.027505"
+ sodipodi:ry="10.240856"
+ d="M 38.213023,31.917336 A 10.027505,10.240856 0 1 1 18.158013,31.917336 A 10.027505,10.240856 0 1 1 38.213023,31.917336 z"
+ transform="matrix(1.0116992,0,0,1.0189783,-1.4418411,-2.7101136)" /></svg> \ No newline at end of file
diff --git a/capplets/about-me/icons/right-index-finger.png b/capplets/about-me/icons/right-index-finger.png
new file mode 100644
index 00000000..4aaeaac4
--- /dev/null
+++ b/capplets/about-me/icons/right-index-finger.png
Binary files differ
diff --git a/capplets/about-me/icons/right-index-finger.svg b/capplets/about-me/icons/right-index-finger.svg
new file mode 100644
index 00000000..5a621a2e
--- /dev/null
+++ b/capplets/about-me/icons/right-index-finger.svg
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ x="0px"
+ y="0px"
+ width="48"
+ height="48"
+ viewBox="0 0 40.425 46.214"
+ enable-background="new 0 0 40.425 46.214"
+ xml:space="preserve"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="right-index-finger.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
+ id="metadata44"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs42"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 23.107 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="40.424999 : 23.107 : 1"
+ inkscape:persp3d-origin="20.2125 : 15.404667 : 1"
+ id="perspective46" />
+
+
+
+
+
+
+<radialGradient
+ r="8.341651"
+ fy="9.3411446"
+ fx="38.658855"
+ cy="9.3411446"
+ cx="38.658855"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient2479"
+ xlink:href="#linearGradient2378"
+ inkscape:collect="always" /><linearGradient
+ id="linearGradient2378"><stop
+ id="stop2386"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ style="stop-color:#27dc16;stop-opacity:1;"
+ offset="1"
+ id="stop2382" /></linearGradient><linearGradient
+ id="linearGradient3702"><stop
+ id="stop3704"
+ offset="0"
+ style="stop-color:black;stop-opacity:0;" /><stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0.5"
+ id="stop3710" /><stop
+ id="stop3706"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" /></linearGradient><linearGradient
+ id="linearGradient6732"><stop
+ id="stop6734"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ id="stop6736"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:1;" /></linearGradient><linearGradient
+ id="linearGradient4585"><stop
+ id="stop4587"
+ offset="0"
+ style="stop-color:#9e9e9e;stop-opacity:1;" /><stop
+ id="stop4589"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:0;" /></linearGradient><inkscape:perspective
+ id="perspective2516"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 24 : 1"
+ sodipodi:type="inkscape:persp3d" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86956"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86964"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86966"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /></defs><sodipodi:namedview
+ inkscape:window-height="922"
+ inkscape:window-width="1302"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="11.122171"
+ inkscape:cx="15.672125"
+ inkscape:cy="30.299841"
+ inkscape:window-x="36"
+ inkscape:window-y="91"
+ inkscape:current-layer="svg2" />
+<g
+ id="g35"
+ style="fill:url(#radialGradient86956);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-1.1605241,0,0,1.3370602,44.823901,-0.7984997)">
+ <circle
+ style="fill:url(#radialGradient86964);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:ry="3.829"
+ sodipodi:rx="3.829"
+ sodipodi:cy="5.5700002"
+ sodipodi:cx="26.49"
+ id="circle37"
+ r="3.829"
+ cy="5.5700002"
+ cx="26.49"
+ stroke-miterlimit="3.8637" />
+ <path
+ style="fill:url(#radialGradient86966);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path39"
+ stroke-miterlimit="3.8637"
+ d="" />
+ </g><g
+ id="Background"
+ transform="matrix(-1,0,0,1,40.436754,0)">
+</g>
+<g
+ id="Guides"
+ display="none"
+ style="display:none">
+</g>
+<g
+ id="g7"
+ style="fill:#2f2f2f;fill-opacity:1"
+ transform="matrix(-1,0,0,1,40.436754,0)">
+ <path
+ style="fill:#2f2f2f;fill-opacity:1;fill-rule:evenodd"
+ id="path9"
+ d="M 20.569,13.286 C 20.843,15.459 20.791,17.834 20.82,18.542 C 20.865,18.917 21.913,19.241 22.094,18.877 C 22.301,17.514 22.586,14.847 22.92,13.455 C 23.372,9.917 23.886,8.247 24.072,7.257 C 24.58,4.567 25.014,3.12 26.762,3.12 C 28.384,3.12 28.623,5.167 28.153,8.165 C 28.025,9.379 28.036,12.24 27.433,14.894 C 27.165,16.691 26.962,21.278 27.139,24.981 C 27.189,26.045 27.669,27.315 28.242,27.945 C 29.462,27.773 30.379,24.377 31.988,22.847 C 32.809,21.464 34.883,19.299 36.951,19.299 C 39.243,19.299 39.292,21 38.345,22.262 C 37.187,23.806 36.525,24.528 36.079,25.802 C 35.633,27.076 33.758,29.778 33.471,31.209 C 32.902,34.054 32.471,35.105 29.284,37.661 C 27.783,38.865 27.302,39.637 26.855,40.401 C 26.347,41.273 26.409,44.721 26.409,46.212 L 10.64,46.212 C 10.64,46.212 10.767,43.587 10.513,42.058 C 10.461,41.746 10.105,39.613 9.176,38.231 C 8.317,36.954 5.902,32.306 5.902,26.836 C 5.902,24.026 4.39,21.718 3.854,19.533 C 3.591,17.833 2.638,15.423 2.57,14.709 C 1.684,11.559 2.132,10.118 3.741,10.118 C 5.132,10.118 5.528,11.927 6.093,13.622 C 6.258,14.52 7.505,16.934 7.788,18.233 C 8.038,19.088 8.897,21.556 9.437,21.727 C 9.75,21.784 10.151,21.523 10.291,21.043 C 10.52,20.26 9.818,18.945 9.539,15.26 C 9.087,12.343 9.17,10.139 9.116,8.949 C 8.653,5.424 9.133,3.598 10.693,3.598 C 12.176,3.598 12.568,4.455 13.02,7.936 C 13.189,9.518 13.754,12.095 14.037,14.864 C 14.213,16.364 14.639,18.601 14.98,19.17 C 15.285,19.503 15.919,19.198 15.9,18.848 C 15.894,16.377 15.732,14.977 15.958,12.999 C 15.845,10.287 16.219,7.823 16.219,6.467 C 16.219,3.494 16.502,1.473 18.358,1.473 C 20.333,1.473 20.287,3.776 20.287,6.806 C 20.399,7.545 20.456,10.087 20.569,13.286 z"
+ clip-rule="evenodd" />
+ </g>
+<g
+ style="display:inline"
+ inkscape:label="Base"
+ id="layer1"
+ transform="matrix(-1,0,0,1,92.903401,2.6102791)" /></svg> \ No newline at end of file
diff --git a/capplets/about-me/icons/right-little-finger.png b/capplets/about-me/icons/right-little-finger.png
new file mode 100644
index 00000000..17946afc
--- /dev/null
+++ b/capplets/about-me/icons/right-little-finger.png
Binary files differ
diff --git a/capplets/about-me/icons/right-little-finger.svg b/capplets/about-me/icons/right-little-finger.svg
new file mode 100644
index 00000000..9fcec2af
--- /dev/null
+++ b/capplets/about-me/icons/right-little-finger.svg
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ x="0px"
+ y="0px"
+ width="48"
+ height="48"
+ viewBox="0 0 40.425 46.214"
+ enable-background="new 0 0 40.425 46.214"
+ xml:space="preserve"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="right-pinky-finger.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/Users/mlanglie/Desktop/Fingerprint Enrollment Icons/Vector/left-ring-finger.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><metadata
+ id="metadata44"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs42"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 23.107 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="40.424999 : 23.107 : 1"
+ inkscape:persp3d-origin="20.2125 : 15.404667 : 1"
+ id="perspective46" />
+
+
+
+
+
+
+<radialGradient
+ r="8.341651"
+ fy="9.3411446"
+ fx="38.658855"
+ cy="9.3411446"
+ cx="38.658855"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient2479"
+ xlink:href="#linearGradient2378"
+ inkscape:collect="always" /><linearGradient
+ id="linearGradient2378"><stop
+ id="stop2386"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ style="stop-color:#27dc16;stop-opacity:1;"
+ offset="1"
+ id="stop2382" /></linearGradient><linearGradient
+ id="linearGradient3702"><stop
+ id="stop3704"
+ offset="0"
+ style="stop-color:black;stop-opacity:0;" /><stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0.5"
+ id="stop3710" /><stop
+ id="stop3706"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" /></linearGradient><linearGradient
+ id="linearGradient6732"><stop
+ id="stop6734"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ id="stop6736"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:1;" /></linearGradient><linearGradient
+ id="linearGradient4585"><stop
+ id="stop4587"
+ offset="0"
+ style="stop-color:#9e9e9e;stop-opacity:1;" /><stop
+ id="stop4589"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:0;" /></linearGradient><inkscape:perspective
+ id="perspective2516"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 24 : 1"
+ sodipodi:type="inkscape:persp3d" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86956"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86964"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86966"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /></defs><sodipodi:namedview
+ inkscape:window-height="933"
+ inkscape:window-width="1054"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="11.122171"
+ inkscape:cx="22.316511"
+ inkscape:cy="30.299841"
+ inkscape:window-x="346"
+ inkscape:window-y="109"
+ inkscape:current-layer="svg2" />
+<g
+ id="g35"
+ style="fill:url(#radialGradient86956);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-1.1074589,0,0,1.2726911,65.968411,5.5330271)">
+ <circle
+ style="fill:url(#radialGradient86964);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:ry="3.829"
+ sodipodi:rx="3.829"
+ sodipodi:cy="5.5700002"
+ sodipodi:cx="26.49"
+ id="circle37"
+ r="3.829"
+ cy="5.5700002"
+ cx="26.49"
+ stroke-miterlimit="3.8637" />
+ <path
+ style="fill:url(#radialGradient86966);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path39"
+ stroke-miterlimit="3.8637"
+ d="" />
+ </g><g
+ id="Background"
+ transform="matrix(-1,0,0,1,40.436756,0)">
+</g>
+<g
+ id="Guides"
+ display="none"
+ style="display:none">
+</g>
+<g
+ id="g7"
+ style="fill:#2f2f2f;fill-opacity:1"
+ transform="matrix(-1,0,0,1,40.436756,0)">
+ <path
+ style="fill:#2f2f2f;fill-opacity:1;fill-rule:evenodd"
+ id="path9"
+ d="M 20.569,13.286 C 20.843,15.459 20.791,17.834 20.82,18.542 C 20.865,18.917 21.913,19.241 22.094,18.877 C 22.301,17.514 22.586,14.847 22.92,13.455 C 23.372,9.917 23.886,8.247 24.072,7.257 C 24.58,4.567 25.014,3.12 26.762,3.12 C 28.384,3.12 28.623,5.167 28.153,8.165 C 28.025,9.379 28.036,12.24 27.433,14.894 C 27.165,16.691 26.962,21.278 27.139,24.981 C 27.189,26.045 27.669,27.315 28.242,27.945 C 29.462,27.773 30.379,24.377 31.988,22.847 C 32.809,21.464 34.883,19.299 36.951,19.299 C 39.243,19.299 39.292,21 38.345,22.262 C 37.187,23.806 36.525,24.528 36.079,25.802 C 35.633,27.076 33.758,29.778 33.471,31.209 C 32.902,34.054 32.471,35.105 29.284,37.661 C 27.783,38.865 27.302,39.637 26.855,40.401 C 26.347,41.273 26.409,44.721 26.409,46.212 L 10.64,46.212 C 10.64,46.212 10.767,43.587 10.513,42.058 C 10.461,41.746 10.105,39.613 9.176,38.231 C 8.317,36.954 5.902,32.306 5.902,26.836 C 5.902,24.026 4.39,21.718 3.854,19.533 C 3.591,17.833 2.638,15.423 2.57,14.709 C 1.684,11.559 2.132,10.118 3.741,10.118 C 5.132,10.118 5.528,11.927 6.093,13.622 C 6.258,14.52 7.505,16.934 7.788,18.233 C 8.038,19.088 8.897,21.556 9.437,21.727 C 9.75,21.784 10.151,21.523 10.291,21.043 C 10.52,20.26 9.818,18.945 9.539,15.26 C 9.087,12.343 9.17,10.139 9.116,8.949 C 8.653,5.424 9.133,3.598 10.693,3.598 C 12.176,3.598 12.568,4.455 13.02,7.936 C 13.189,9.518 13.754,12.095 14.037,14.864 C 14.213,16.364 14.639,18.601 14.98,19.17 C 15.285,19.503 15.919,19.198 15.9,18.848 C 15.894,16.377 15.732,14.977 15.958,12.999 C 15.845,10.287 16.219,7.823 16.219,6.467 C 16.219,3.494 16.502,1.473 18.358,1.473 C 20.333,1.473 20.287,3.776 20.287,6.806 C 20.399,7.545 20.456,10.087 20.569,13.286 z"
+ clip-rule="evenodd" />
+ </g>
+<g
+ style="display:inline"
+ inkscape:label="Base"
+ id="layer1"
+ transform="matrix(-1,0,0,1,92.903403,2.6102791)" /></svg> \ No newline at end of file
diff --git a/capplets/about-me/icons/right-middle-finger.png b/capplets/about-me/icons/right-middle-finger.png
new file mode 100644
index 00000000..71bd41ba
--- /dev/null
+++ b/capplets/about-me/icons/right-middle-finger.png
Binary files differ
diff --git a/capplets/about-me/icons/right-middle-finger.svg b/capplets/about-me/icons/right-middle-finger.svg
new file mode 100644
index 00000000..b33a654a
--- /dev/null
+++ b/capplets/about-me/icons/right-middle-finger.svg
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ x="0px"
+ y="0px"
+ width="48"
+ height="48"
+ viewBox="0 0 40.425 46.214"
+ enable-background="new 0 0 40.425 46.214"
+ xml:space="preserve"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="right-middle-finger.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/Users/mlanglie/Desktop/Fingerprint Enrollment Icons/Vector/left-index-finger.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><metadata
+ id="metadata44"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs42"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 23.107 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="40.424999 : 23.107 : 1"
+ inkscape:persp3d-origin="20.2125 : 15.404667 : 1"
+ id="perspective46" />
+
+
+
+
+
+
+<radialGradient
+ r="8.341651"
+ fy="9.3411446"
+ fx="38.658855"
+ cy="9.3411446"
+ cx="38.658855"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient2479"
+ xlink:href="#linearGradient2378"
+ inkscape:collect="always" /><linearGradient
+ id="linearGradient2378"><stop
+ id="stop2386"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ style="stop-color:#27dc16;stop-opacity:1;"
+ offset="1"
+ id="stop2382" /></linearGradient><linearGradient
+ id="linearGradient3702"><stop
+ id="stop3704"
+ offset="0"
+ style="stop-color:black;stop-opacity:0;" /><stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0.5"
+ id="stop3710" /><stop
+ id="stop3706"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" /></linearGradient><linearGradient
+ id="linearGradient6732"><stop
+ id="stop6734"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ id="stop6736"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:1;" /></linearGradient><linearGradient
+ id="linearGradient4585"><stop
+ id="stop4587"
+ offset="0"
+ style="stop-color:#9e9e9e;stop-opacity:1;" /><stop
+ id="stop4589"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:0;" /></linearGradient><inkscape:perspective
+ id="perspective2516"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 24 : 1"
+ sodipodi:type="inkscape:persp3d" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86956"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86964"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86966"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /></defs><sodipodi:namedview
+ inkscape:window-height="933"
+ inkscape:window-width="1054"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="11.122171"
+ inkscape:cx="22.316511"
+ inkscape:cy="30.299841"
+ inkscape:window-x="362"
+ inkscape:window-y="121"
+ inkscape:current-layer="svg2" />
+<g
+ id="g35"
+ style="fill:url(#radialGradient86956);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-1.1824583,0,0,1.3363867,53.282364,-2.0066594)">
+ <circle
+ style="fill:url(#radialGradient86964);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:ry="3.829"
+ sodipodi:rx="3.829"
+ sodipodi:cy="5.5700002"
+ sodipodi:cx="26.49"
+ id="circle37"
+ r="3.829"
+ cy="5.5700002"
+ cx="26.49"
+ stroke-miterlimit="3.8637" />
+ <path
+ style="fill:url(#radialGradient86966);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path39"
+ stroke-miterlimit="3.8637"
+ d="" />
+ </g><g
+ id="Background"
+ transform="matrix(-1,0,0,1,40.436756,0)">
+</g>
+<g
+ id="Guides"
+ display="none"
+ style="display:none">
+</g>
+<g
+ id="g7"
+ style="fill:#2f2f2f;fill-opacity:1"
+ transform="matrix(-1,0,0,1,40.436756,0)">
+ <path
+ style="fill:#2f2f2f;fill-opacity:1;fill-rule:evenodd"
+ id="path9"
+ d="M 20.569,13.286 C 20.843,15.459 20.791,17.834 20.82,18.542 C 20.865,18.917 21.913,19.241 22.094,18.877 C 22.301,17.514 22.586,14.847 22.92,13.455 C 23.372,9.917 23.886,8.247 24.072,7.257 C 24.58,4.567 25.014,3.12 26.762,3.12 C 28.384,3.12 28.623,5.167 28.153,8.165 C 28.025,9.379 28.036,12.24 27.433,14.894 C 27.165,16.691 26.962,21.278 27.139,24.981 C 27.189,26.045 27.669,27.315 28.242,27.945 C 29.462,27.773 30.379,24.377 31.988,22.847 C 32.809,21.464 34.883,19.299 36.951,19.299 C 39.243,19.299 39.292,21 38.345,22.262 C 37.187,23.806 36.525,24.528 36.079,25.802 C 35.633,27.076 33.758,29.778 33.471,31.209 C 32.902,34.054 32.471,35.105 29.284,37.661 C 27.783,38.865 27.302,39.637 26.855,40.401 C 26.347,41.273 26.409,44.721 26.409,46.212 L 10.64,46.212 C 10.64,46.212 10.767,43.587 10.513,42.058 C 10.461,41.746 10.105,39.613 9.176,38.231 C 8.317,36.954 5.902,32.306 5.902,26.836 C 5.902,24.026 4.39,21.718 3.854,19.533 C 3.591,17.833 2.638,15.423 2.57,14.709 C 1.684,11.559 2.132,10.118 3.741,10.118 C 5.132,10.118 5.528,11.927 6.093,13.622 C 6.258,14.52 7.505,16.934 7.788,18.233 C 8.038,19.088 8.897,21.556 9.437,21.727 C 9.75,21.784 10.151,21.523 10.291,21.043 C 10.52,20.26 9.818,18.945 9.539,15.26 C 9.087,12.343 9.17,10.139 9.116,8.949 C 8.653,5.424 9.133,3.598 10.693,3.598 C 12.176,3.598 12.568,4.455 13.02,7.936 C 13.189,9.518 13.754,12.095 14.037,14.864 C 14.213,16.364 14.639,18.601 14.98,19.17 C 15.285,19.503 15.919,19.198 15.9,18.848 C 15.894,16.377 15.732,14.977 15.958,12.999 C 15.845,10.287 16.219,7.823 16.219,6.467 C 16.219,3.494 16.502,1.473 18.358,1.473 C 20.333,1.473 20.287,3.776 20.287,6.806 C 20.399,7.545 20.456,10.087 20.569,13.286 z"
+ clip-rule="evenodd" />
+ </g>
+<g
+ style="display:inline"
+ inkscape:label="Base"
+ id="layer1"
+ transform="matrix(-1,0,0,1,92.903403,2.6102791)" /></svg> \ No newline at end of file
diff --git a/capplets/about-me/icons/right-ring-finger.png b/capplets/about-me/icons/right-ring-finger.png
new file mode 100644
index 00000000..aa73ae6e
--- /dev/null
+++ b/capplets/about-me/icons/right-ring-finger.png
Binary files differ
diff --git a/capplets/about-me/icons/right-ring-finger.svg b/capplets/about-me/icons/right-ring-finger.svg
new file mode 100644
index 00000000..9e264fe6
--- /dev/null
+++ b/capplets/about-me/icons/right-ring-finger.svg
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ x="0px"
+ y="0px"
+ width="48"
+ height="48"
+ viewBox="0 0 40.425 46.214"
+ enable-background="new 0 0 40.425 46.214"
+ xml:space="preserve"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="right-ring-finger.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/Users/mlanglie/Desktop/Fingerprint Enrollment Icons/Vector/left-middle-finger.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><metadata
+ id="metadata44"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs42"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 23.107 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="40.424999 : 23.107 : 1"
+ inkscape:persp3d-origin="20.2125 : 15.404667 : 1"
+ id="perspective46" />
+
+
+
+
+
+
+<radialGradient
+ r="8.341651"
+ fy="9.3411446"
+ fx="38.658855"
+ cy="9.3411446"
+ cx="38.658855"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient2479"
+ xlink:href="#linearGradient2378"
+ inkscape:collect="always" /><linearGradient
+ id="linearGradient2378"><stop
+ id="stop2386"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ style="stop-color:#27dc16;stop-opacity:1;"
+ offset="1"
+ id="stop2382" /></linearGradient><linearGradient
+ id="linearGradient3702"><stop
+ id="stop3704"
+ offset="0"
+ style="stop-color:black;stop-opacity:0;" /><stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0.5"
+ id="stop3710" /><stop
+ id="stop3706"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" /></linearGradient><linearGradient
+ id="linearGradient6732"><stop
+ id="stop6734"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ id="stop6736"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:1;" /></linearGradient><linearGradient
+ id="linearGradient4585"><stop
+ id="stop4587"
+ offset="0"
+ style="stop-color:#9e9e9e;stop-opacity:1;" /><stop
+ id="stop4589"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:0;" /></linearGradient><inkscape:perspective
+ id="perspective2516"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 24 : 1"
+ sodipodi:type="inkscape:persp3d" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86956"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86964"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86966"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /></defs><sodipodi:namedview
+ inkscape:window-height="933"
+ inkscape:window-width="1054"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="11.122171"
+ inkscape:cx="22.316511"
+ inkscape:cy="30.299841"
+ inkscape:window-x="424"
+ inkscape:window-y="91"
+ inkscape:current-layer="svg2" />
+<g
+ id="g35"
+ style="fill:url(#radialGradient86956);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-1.1824583,0,0,1.3363867,61.073222,-0.7947482)">
+ <circle
+ style="fill:url(#radialGradient86964);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:ry="3.829"
+ sodipodi:rx="3.829"
+ sodipodi:cy="5.5700002"
+ sodipodi:cx="26.49"
+ id="circle37"
+ r="3.829"
+ cy="5.5700002"
+ cx="26.49"
+ stroke-miterlimit="3.8637" />
+ <path
+ style="fill:url(#radialGradient86966);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path39"
+ stroke-miterlimit="3.8637"
+ d="" />
+ </g><g
+ id="Background"
+ transform="matrix(-1,0,0,1,40.436756,0)">
+</g>
+<g
+ id="Guides"
+ display="none"
+ style="display:none">
+</g>
+<g
+ id="g7"
+ style="fill:#2f2f2f;fill-opacity:1"
+ transform="matrix(-1,0,0,1,40.436756,0)">
+ <path
+ style="fill:#2f2f2f;fill-opacity:1;fill-rule:evenodd"
+ id="path9"
+ d="M 20.569,13.286 C 20.843,15.459 20.791,17.834 20.82,18.542 C 20.865,18.917 21.913,19.241 22.094,18.877 C 22.301,17.514 22.586,14.847 22.92,13.455 C 23.372,9.917 23.886,8.247 24.072,7.257 C 24.58,4.567 25.014,3.12 26.762,3.12 C 28.384,3.12 28.623,5.167 28.153,8.165 C 28.025,9.379 28.036,12.24 27.433,14.894 C 27.165,16.691 26.962,21.278 27.139,24.981 C 27.189,26.045 27.669,27.315 28.242,27.945 C 29.462,27.773 30.379,24.377 31.988,22.847 C 32.809,21.464 34.883,19.299 36.951,19.299 C 39.243,19.299 39.292,21 38.345,22.262 C 37.187,23.806 36.525,24.528 36.079,25.802 C 35.633,27.076 33.758,29.778 33.471,31.209 C 32.902,34.054 32.471,35.105 29.284,37.661 C 27.783,38.865 27.302,39.637 26.855,40.401 C 26.347,41.273 26.409,44.721 26.409,46.212 L 10.64,46.212 C 10.64,46.212 10.767,43.587 10.513,42.058 C 10.461,41.746 10.105,39.613 9.176,38.231 C 8.317,36.954 5.902,32.306 5.902,26.836 C 5.902,24.026 4.39,21.718 3.854,19.533 C 3.591,17.833 2.638,15.423 2.57,14.709 C 1.684,11.559 2.132,10.118 3.741,10.118 C 5.132,10.118 5.528,11.927 6.093,13.622 C 6.258,14.52 7.505,16.934 7.788,18.233 C 8.038,19.088 8.897,21.556 9.437,21.727 C 9.75,21.784 10.151,21.523 10.291,21.043 C 10.52,20.26 9.818,18.945 9.539,15.26 C 9.087,12.343 9.17,10.139 9.116,8.949 C 8.653,5.424 9.133,3.598 10.693,3.598 C 12.176,3.598 12.568,4.455 13.02,7.936 C 13.189,9.518 13.754,12.095 14.037,14.864 C 14.213,16.364 14.639,18.601 14.98,19.17 C 15.285,19.503 15.919,19.198 15.9,18.848 C 15.894,16.377 15.732,14.977 15.958,12.999 C 15.845,10.287 16.219,7.823 16.219,6.467 C 16.219,3.494 16.502,1.473 18.358,1.473 C 20.333,1.473 20.287,3.776 20.287,6.806 C 20.399,7.545 20.456,10.087 20.569,13.286 z"
+ clip-rule="evenodd" />
+ </g>
+<g
+ style="display:inline"
+ inkscape:label="Base"
+ id="layer1"
+ transform="matrix(-1,0,0,1,92.903403,2.6102791)" /></svg> \ No newline at end of file
diff --git a/capplets/about-me/icons/right-thumb.png b/capplets/about-me/icons/right-thumb.png
new file mode 100644
index 00000000..1c967d61
--- /dev/null
+++ b/capplets/about-me/icons/right-thumb.png
Binary files differ
diff --git a/capplets/about-me/icons/right-thumb.svg b/capplets/about-me/icons/right-thumb.svg
new file mode 100644
index 00000000..0aa0f2e4
--- /dev/null
+++ b/capplets/about-me/icons/right-thumb.svg
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ x="0px"
+ y="0px"
+ width="48"
+ height="48"
+ viewBox="0 0 40.425 46.214"
+ enable-background="new 0 0 40.425 46.214"
+ xml:space="preserve"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="right-thumb.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/Users/mlanglie/Desktop/Fingerprint Enrollment Icons/Vector/left-pinky-finger.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><metadata
+ id="metadata44"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs42"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 23.107 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="40.424999 : 23.107 : 1"
+ inkscape:persp3d-origin="20.2125 : 15.404667 : 1"
+ id="perspective46" />
+
+
+
+
+
+
+<radialGradient
+ r="8.341651"
+ fy="9.3411446"
+ fx="38.658855"
+ cy="9.3411446"
+ cx="38.658855"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient2479"
+ xlink:href="#linearGradient2378"
+ inkscape:collect="always" /><linearGradient
+ id="linearGradient2378"><stop
+ id="stop2386"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ style="stop-color:#27dc16;stop-opacity:1;"
+ offset="1"
+ id="stop2382" /></linearGradient><linearGradient
+ id="linearGradient3702"><stop
+ id="stop3704"
+ offset="0"
+ style="stop-color:black;stop-opacity:0;" /><stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0.5"
+ id="stop3710" /><stop
+ id="stop3706"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" /></linearGradient><linearGradient
+ id="linearGradient6732"><stop
+ id="stop6734"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" /><stop
+ id="stop6736"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:1;" /></linearGradient><linearGradient
+ id="linearGradient4585"><stop
+ id="stop4587"
+ offset="0"
+ style="stop-color:#9e9e9e;stop-opacity:1;" /><stop
+ id="stop4589"
+ offset="1"
+ style="stop-color:#dddddd;stop-opacity:0;" /></linearGradient><inkscape:perspective
+ id="perspective2516"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 24 : 1"
+ sodipodi:type="inkscape:persp3d" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86956"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86964"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2378"
+ id="radialGradient86966"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0059869,5.3782029e-7,-9.45767e-7,1.1767077,-0.1585918,-0.9842761)"
+ cx="26.49"
+ cy="5.5700002"
+ fx="26.49"
+ fy="5.5700002"
+ r="4.0552225" /></defs><sodipodi:namedview
+ inkscape:window-height="933"
+ inkscape:window-width="1054"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="11.122171"
+ inkscape:cx="22.316511"
+ inkscape:cy="30.299841"
+ inkscape:window-x="116"
+ inkscape:window-y="117"
+ inkscape:current-layer="svg2" />
+<g
+ id="g35"
+ style="fill:url(#radialGradient86956);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-1.1916623,0,0,1.4021101,35.910183,14.334323)">
+ <circle
+ style="fill:url(#radialGradient86964);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:ry="3.829"
+ sodipodi:rx="3.829"
+ sodipodi:cy="5.5700002"
+ sodipodi:cx="26.49"
+ id="circle37"
+ r="3.829"
+ cy="5.5700002"
+ cx="26.49"
+ stroke-miterlimit="3.8637" />
+ <path
+ style="fill:url(#radialGradient86966);fill-opacity:1;stroke:#31ae00;stroke-width:0.45244551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path39"
+ stroke-miterlimit="3.8637"
+ d="" />
+ </g><g
+ id="Background"
+ transform="matrix(-1,0,0,1,40.436756,0)">
+</g>
+<g
+ id="Guides"
+ display="none"
+ style="display:none">
+</g>
+<g
+ id="g7"
+ style="fill:#2f2f2f;fill-opacity:1"
+ transform="matrix(-1,0,0,1,40.436756,0)">
+ <path
+ style="fill:#2f2f2f;fill-opacity:1;fill-rule:evenodd"
+ id="path9"
+ d="M 20.569,13.286 C 20.843,15.459 20.791,17.834 20.82,18.542 C 20.865,18.917 21.913,19.241 22.094,18.877 C 22.301,17.514 22.586,14.847 22.92,13.455 C 23.372,9.917 23.886,8.247 24.072,7.257 C 24.58,4.567 25.014,3.12 26.762,3.12 C 28.384,3.12 28.623,5.167 28.153,8.165 C 28.025,9.379 28.036,12.24 27.433,14.894 C 27.165,16.691 26.962,21.278 27.139,24.981 C 27.189,26.045 27.669,27.315 28.242,27.945 C 29.462,27.773 30.379,24.377 31.988,22.847 C 32.809,21.464 34.883,19.299 36.951,19.299 C 39.243,19.299 39.292,21 38.345,22.262 C 37.187,23.806 36.525,24.528 36.079,25.802 C 35.633,27.076 33.758,29.778 33.471,31.209 C 32.902,34.054 32.471,35.105 29.284,37.661 C 27.783,38.865 27.302,39.637 26.855,40.401 C 26.347,41.273 26.409,44.721 26.409,46.212 L 10.64,46.212 C 10.64,46.212 10.767,43.587 10.513,42.058 C 10.461,41.746 10.105,39.613 9.176,38.231 C 8.317,36.954 5.902,32.306 5.902,26.836 C 5.902,24.026 4.39,21.718 3.854,19.533 C 3.591,17.833 2.638,15.423 2.57,14.709 C 1.684,11.559 2.132,10.118 3.741,10.118 C 5.132,10.118 5.528,11.927 6.093,13.622 C 6.258,14.52 7.505,16.934 7.788,18.233 C 8.038,19.088 8.897,21.556 9.437,21.727 C 9.75,21.784 10.151,21.523 10.291,21.043 C 10.52,20.26 9.818,18.945 9.539,15.26 C 9.087,12.343 9.17,10.139 9.116,8.949 C 8.653,5.424 9.133,3.598 10.693,3.598 C 12.176,3.598 12.568,4.455 13.02,7.936 C 13.189,9.518 13.754,12.095 14.037,14.864 C 14.213,16.364 14.639,18.601 14.98,19.17 C 15.285,19.503 15.919,19.198 15.9,18.848 C 15.894,16.377 15.732,14.977 15.958,12.999 C 15.845,10.287 16.219,7.823 16.219,6.467 C 16.219,3.494 16.502,1.473 18.358,1.473 C 20.333,1.473 20.287,3.776 20.287,6.806 C 20.399,7.545 20.456,10.087 20.569,13.286 z"
+ clip-rule="evenodd" />
+ </g>
+<g
+ style="display:inline"
+ inkscape:label="Base"
+ id="layer1"
+ transform="matrix(-1,0,0,1,92.903403,2.6102791)" /></svg> \ No newline at end of file
diff --git a/capplets/about-me/mate-about-me-dialog.ui b/capplets/about-me/mate-about-me-dialog.ui
new file mode 100644
index 00000000..fdf79b6e
--- /dev/null
+++ b/capplets/about-me/mate-about-me-dialog.ui
@@ -0,0 +1,1622 @@
+<?xml version="1.0"?>
+<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-naming-policy toplevel-contextual -->
+ <object class="GtkDialog" id="about-me-dialog">
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">About Me</property>
+ <property name="type_hint">dialog</property>
+ <property name="has_separator">False</property>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox2">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkVBox" id="vbox55">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkHBox" id="hbox58">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkHBox" id="hbox59">
+ <property name="visible">True</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkButton" id="button-image">
+ <property name="width_request">80</property>
+ <property name="height_request">80</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Select your photo</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="fullname">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Full Name</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="buttons_vbox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkHBox" id="hbox60">
+ <property name="visible">True</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label1012">
+ <property name="visible">True</property>
+ <property name="yalign">0</property>
+ <property name="label" translatable="yes">User name:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="login">
+ <property name="visible">True</property>
+ <property name="yalign">0</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="password">
+ <property name="label" translatable="yes">Change Passwo_rd...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="enable_fingerprint_button">
+ <property name="label" translatable="yes">Enable _Fingerprint Login...</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="disable_fingerprint_button">
+ <property name="label" translatable="yes">Disable _Fingerprint Login...</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox61">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkNotebook" id="notebook2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkVBox" id="vbox57">
+ <property name="visible">True</property>
+ <property name="border_width">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">18</property>
+ <child>
+ <object class="GtkVBox" id="vbox62">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label1017">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Email</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox62">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="label1058">
+ <property name="visible">True</property>
+ <property name="label"> </property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="table121">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label1015">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Work:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">email-work-e</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1016">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes" comments="Home vs Work (email)">_Home:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">email-home-e</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="email-work-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="email-home-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox63">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label1021">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Telephone</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox63">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="label1059">
+ <property name="visible">True</property>
+ <property name="label"> </property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="table122">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">4</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label1018">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Wor_k:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">phone-work-e</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1019">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes" comments="Home vs Work (phone)">Hom_e:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">phone-home-e</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="phone-work-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="phone-home-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="phone-mobile-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="phone-work-fax-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1020">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Mobile:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">phone-mobile-e</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1057">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Work _fax:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">phone-work-fax-e</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox64">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label1023">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Instant Messaging</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox64">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="label1060">
+ <property name="visible">True</property>
+ <property name="label"> </property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="table123">
+ <property name="visible">True</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">4</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label1022">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_XMPP:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">im-jabber-e</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="im-jabber-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="im-msn-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1052">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Yahoo:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">im-yahoo-e</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1053">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">M_SN:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">im-msn-e</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1054">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">IC_Q:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">im-icq-e</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1055">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">A_IM/iChat:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">im-aim-e</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1056">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_GroupWise:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">im-groupwise-e</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="im-icq-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="im-yahoo-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="im-aim-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="im-groupwise-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label1024">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Contact</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox60">
+ <property name="visible">True</property>
+ <property name="border_width">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">18</property>
+ <child>
+ <object class="GtkVBox" id="vbox61">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkVBox" id="vbox65">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label1043">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes" comments="Home vs Work (address)">Home</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox65">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="label1061">
+ <property name="visible">True</property>
+ <property name="label"> </property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="addr-table-1">
+ <property name="visible">True</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">4</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label1037">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Address:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">addr-street-1</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="addr-scrolledwindow-1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTextView" id="addr-street-1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="accepts_tab">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1038">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">C_ity:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">addr-locality-1</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1039">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_ZIP/Postal code:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">addr-code-1</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1040">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_State/Province:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">addr-region-1</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1041">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Co_untry:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">addr-country-1</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1042">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">P._O. box:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">addr-po-1</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="addr-po-1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="addr-locality-1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="addr-code-1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="addr-country-1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="addr-region-1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox66">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label1050">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Work</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox66">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="label1062">
+ <property name="visible">True</property>
+ <property name="label"> </property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="addr-table-2">
+ <property name="visible">True</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">4</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label1044">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">A_ddress:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">addr-street-2</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="addr-scrolledwindow-2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTextView" id="addr-street-2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="accepts_tab">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1045">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">ZIP/_Postal code:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">addr-code-2</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1046">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">State/Pro_vince:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">addr-region-2</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1047">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Cou_ntry:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">addr-country-2</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1048">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">P.O. _box:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">addr-po-2</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1049">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Ci_ty:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">addr-locality-2</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="addr-po-2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="addr-locality-2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="addr-code-2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="addr-region-2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="addr-country-2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label1051">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Address</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox59">
+ <property name="visible">True</property>
+ <property name="border_width">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">18</property>
+ <child>
+ <object class="GtkVBox" id="vbox67">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label1028">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Web</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox67">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="label1063">
+ <property name="visible">True</property>
+ <property name="label"> </property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="table124">
+ <property name="visible">True</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label1025">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Home page:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">web-homepage-e</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1026">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Web _log:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">web-weblog-e</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1027">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Cale_ndar:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">web-calendar-e</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="web-homepage-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="web-weblog-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="web-calendar-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox68">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label1035">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Job</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox68">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="label1064">
+ <property name="visible">True</property>
+ <property name="label"> </property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="table125">
+ <property name="visible">True</property>
+ <property name="n_rows">6</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label1029">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Profession:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">job-profession-e</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1030">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">C_ompany:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">job-company-e</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1031">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Manager:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">job-manager-e</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1032">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Title:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">job-title-e</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1033">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Department:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">job-dept-e</property>
+ </object>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1034">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">A_ssistant:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">job-assistant-e</property>
+ </object>
+ <packing>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="job-profession-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="job-company-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="job-manager-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="job-title-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="job-dept-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="job-assistant-e">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label1036">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Personal Info</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area2">
+ <property name="visible">True</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="closebutton1">
+ <property name="label">gtk-close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-7">closebutton1</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/capplets/about-me/mate-about-me-fingerprint.c b/capplets/about-me/mate-about-me-fingerprint.c
new file mode 100644
index 00000000..0d6e40ae
--- /dev/null
+++ b/capplets/about-me/mate-about-me-fingerprint.c
@@ -0,0 +1,624 @@
+/* mate-about-me-fingerprint.h
+ * Copyright (C) 2008 Bastien Nocera <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <dbus/dbus-glib-bindings.h>
+
+#include "fingerprint-strings.h"
+#include "capplet-util.h"
+
+/* This must match the number of images on the 2nd page in the UI file */
+#define MAX_ENROLL_STAGES 5
+
+/* Translate fprintd strings */
+#define TR(s) dgettext("fprintd", s)
+
+static DBusGProxy *manager = NULL;
+static DBusGConnection *connection = NULL;
+static gboolean is_disable = FALSE;
+
+enum {
+ STATE_NONE,
+ STATE_CLAIMED,
+ STATE_ENROLLING
+};
+
+typedef struct {
+ GtkWidget *enable;
+ GtkWidget *disable;
+
+ GtkWidget *ass;
+ GtkBuilder *dialog;
+
+ DBusGProxy *device;
+ gboolean is_swipe;
+ int num_enroll_stages;
+ int num_stages_done;
+ char *name;
+ const char *finger;
+ gint state;
+} EnrollData;
+
+static void create_manager (void)
+{
+ GError *error = NULL;
+
+ connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+ if (connection == NULL) {
+ g_warning ("Failed to connect to session bus: %s", error->message);
+ return;
+ }
+
+ manager = dbus_g_proxy_new_for_name (connection,
+ "net.reactivated.Fprint",
+ "/net/reactivated/Fprint/Manager",
+ "net.reactivated.Fprint.Manager");
+}
+
+static DBusGProxy *
+get_first_device (void)
+{
+ DBusGProxy *device;
+ char *device_str;
+
+ if (!dbus_g_proxy_call (manager, "GetDefaultDevice", NULL, G_TYPE_INVALID,
+ DBUS_TYPE_G_OBJECT_PATH, &device_str, G_TYPE_INVALID)) {
+ return NULL;
+ }
+
+ device = dbus_g_proxy_new_for_name(connection,
+ "net.reactivated.Fprint",
+ device_str,
+ "net.reactivated.Fprint.Device");
+
+ g_free (device_str);
+
+ return device;
+}
+
+static const char *
+get_reason_for_error (const char *dbus_error)
+{
+ if (g_str_equal (dbus_error, "net.reactivated.Fprint.Error.PermissionDenied"))
+ return N_("You are not allowed to access the device. Contact your system administrator.");
+ if (g_str_equal (dbus_error, "net.reactivated.Fprint.Error.AlreadyInUse"))
+ return N_("The device is already in use.");
+ if (g_str_equal (dbus_error, "net.reactivated.Fprint.Error.Internal"))
+ return N_("An internal error occured");
+
+ return NULL;
+}
+
+static GtkWidget *
+get_error_dialog (const char *title,
+ const char *dbus_error,
+ GtkWindow *parent)
+{
+ GtkWidget *error_dialog;
+ const char *reason;
+
+ if (dbus_error == NULL)
+ g_warning ("get_error_dialog called with reason == NULL");
+
+ error_dialog =
+ gtk_message_dialog_new (parent,
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_OK,
+ "%s", title);
+ reason = get_reason_for_error (dbus_error);
+ gtk_message_dialog_format_secondary_text
+ (GTK_MESSAGE_DIALOG (error_dialog), "%s", reason ? _(reason) : _(dbus_error));
+
+ gtk_window_set_title (GTK_WINDOW (error_dialog), ""); /* as per HIG */
+ gtk_container_set_border_width (GTK_CONTAINER (error_dialog), 5);
+ gtk_dialog_set_default_response (GTK_DIALOG (error_dialog),
+ GTK_RESPONSE_OK);
+ gtk_window_set_modal (GTK_WINDOW (error_dialog), TRUE);
+ gtk_window_set_position (GTK_WINDOW (error_dialog), GTK_WIN_POS_CENTER_ON_PARENT);
+
+ return error_dialog;
+}
+
+void
+set_fingerprint_label (GtkWidget *enable, GtkWidget *disable)
+{
+ char **fingers;
+ DBusGProxy *device;
+ GError *error = NULL;
+
+ gtk_widget_set_no_show_all (enable, TRUE);
+ gtk_widget_set_no_show_all (disable, TRUE);
+
+ if (manager == NULL) {
+ create_manager ();
+ if (manager == NULL) {
+ gtk_widget_hide (enable);
+ gtk_widget_hide (disable);
+ return;
+ }
+ }
+
+ device = get_first_device ();
+ if (device == NULL) {
+ gtk_widget_hide (enable);
+ gtk_widget_hide (disable);
+ return;
+ }
+
+ if (!dbus_g_proxy_call (device, "ListEnrolledFingers", &error, G_TYPE_STRING, "", G_TYPE_INVALID,
+ G_TYPE_STRV, &fingers, G_TYPE_INVALID)) {
+ if (dbus_g_error_has_name (error, "net.reactivated.Fprint.Error.NoEnrolledPrints") == FALSE) {
+ gtk_widget_hide (enable);
+ gtk_widget_hide (disable);
+ g_object_unref (device);
+ return;
+ }
+ fingers = NULL;
+ }
+
+ if (fingers == NULL || g_strv_length (fingers) == 0) {
+ gtk_widget_hide (disable);
+ gtk_widget_show (enable);
+ is_disable = FALSE;
+ } else {
+ gtk_widget_hide (enable);
+ gtk_widget_show (disable);
+ is_disable = TRUE;
+ }
+
+ g_strfreev (fingers);
+ g_object_unref (device);
+}
+
+static void
+delete_fingerprints (void)
+{
+ DBusGProxy *device;
+
+ if (manager == NULL) {
+ create_manager ();
+ if (manager == NULL)
+ return;
+ }
+
+ device = get_first_device ();
+ if (device == NULL)
+ return;
+
+ dbus_g_proxy_call (device, "DeleteEnrolledFingers", NULL, G_TYPE_STRING, "", G_TYPE_INVALID, G_TYPE_INVALID);
+
+ g_object_unref (device);
+}
+
+static void
+delete_fingerprints_question (GtkBuilder *dialog, GtkWidget *enable, GtkWidget *disable)
+{
+ GtkWidget *question;
+ GtkWidget *button;
+
+ question = gtk_message_dialog_new (GTK_WINDOW (WID ("about-me-dialog")),
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_NONE,
+ _("Delete registered fingerprints?"));
+ gtk_dialog_add_button (GTK_DIALOG (question), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+
+ button = gtk_button_new_with_mnemonic (_("_Delete Fingerprints"));
+ gtk_button_set_image (GTK_BUTTON (button), gtk_image_new_from_stock (GTK_STOCK_DELETE, GTK_ICON_SIZE_BUTTON));
+ gtk_widget_set_can_default (button, TRUE);
+ gtk_widget_show (button);
+ gtk_dialog_add_action_widget (GTK_DIALOG (question), button, GTK_RESPONSE_OK);
+
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (question),
+ _("Do you want to delete your registered fingerprints so fingerprint login is disabled?"));
+ gtk_container_set_border_width (GTK_CONTAINER (question), 5);
+ gtk_dialog_set_default_response (GTK_DIALOG (question), GTK_RESPONSE_OK);
+ gtk_window_set_position (GTK_WINDOW (question), GTK_WIN_POS_CENTER_ON_PARENT);
+ gtk_window_set_modal (GTK_WINDOW (question), TRUE);
+
+ if (gtk_dialog_run (GTK_DIALOG (question)) == GTK_RESPONSE_OK) {
+ delete_fingerprints ();
+ set_fingerprint_label (enable, disable);
+ }
+
+ gtk_widget_destroy (question);
+}
+
+static void
+enroll_data_destroy (EnrollData *data)
+{
+ switch (data->state) {
+ case STATE_ENROLLING:
+ dbus_g_proxy_call(data->device, "EnrollStop", NULL, G_TYPE_INVALID, G_TYPE_INVALID);
+ /* fall-through */
+ case STATE_CLAIMED:
+ dbus_g_proxy_call(data->device, "Release", NULL, G_TYPE_INVALID, G_TYPE_INVALID);
+ /* fall-through */
+ case STATE_NONE:
+ g_free (data->name);
+ g_object_unref (data->device);
+ g_object_unref (data->dialog);
+ gtk_widget_destroy (data->ass);
+
+ g_free (data);
+ }
+}
+
+static const char *
+selected_finger (GtkBuilder *dialog)
+{
+ int index;
+
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (WID ("radiobutton1")))) {
+ gtk_widget_set_sensitive (WID ("finger_combobox"), FALSE);
+ return "right-index-finger";
+ }
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (WID ("radiobutton2")))) {
+ gtk_widget_set_sensitive (WID ("finger_combobox"), FALSE);
+ return "left-index-finger";
+ }
+ gtk_widget_set_sensitive (WID ("finger_combobox"), TRUE);
+ index = gtk_combo_box_get_active (GTK_COMBO_BOX (WID ("finger_combobox")));
+ switch (index) {
+ case 0:
+ return "left-thumb";
+ case 1:
+ return "left-middle-finger";
+ case 2:
+ return "left-ring-finger";
+ case 3:
+ return "left-little-finger";
+ case 4:
+ return "right-thumb";
+ case 5:
+ return "right-middle-finger";
+ case 6:
+ return "right-ring-finger";
+ case 7:
+ return "right-little-finger";
+ default:
+ g_assert_not_reached ();
+ }
+
+ return NULL;
+}
+
+static void
+finger_radio_button_toggled (GtkToggleButton *button, EnrollData *data)
+{
+ GtkBuilder *dialog = data->dialog;
+ char *msg;
+
+ data->finger = selected_finger (data->dialog);
+
+ msg = g_strdup_printf (TR(finger_str_to_msg (data->finger, data->is_swipe)), data->name);
+ gtk_label_set_text (GTK_LABEL (WID("enroll-label")), msg);
+ g_free (msg);
+}
+
+static void
+finger_combobox_changed (GtkComboBox *combobox, EnrollData *data)
+{
+ GtkBuilder *dialog = data->dialog;
+ char *msg;
+
+ data->finger = selected_finger (data->dialog);
+
+ msg = g_strdup_printf (TR(finger_str_to_msg (data->finger, data->is_swipe)), data->name);
+ gtk_label_set_text (GTK_LABEL (WID("enroll-label")), msg);
+ g_free (msg);
+}
+
+static void
+assistant_cancelled (GtkAssistant *ass, EnrollData *data)
+{
+ GtkWidget *enable, *disable;
+
+ enable = data->enable;
+ disable = data->disable;
+
+ enroll_data_destroy (data);
+ set_fingerprint_label (enable, disable);
+}
+
+static void
+enroll_result (GObject *object, const char *result, gboolean done, EnrollData *data)
+{
+ GtkBuilder *dialog = data->dialog;
+ char *msg;
+
+ if (g_str_equal (result, "enroll-completed") || g_str_equal (result, "enroll-stage-passed")) {
+ char *name, *path;
+
+ data->num_stages_done++;
+ name = g_strdup_printf ("image%d", data->num_stages_done);
+ path = g_build_filename (MATECC_PIXMAP_DIR, "print_ok.png", NULL);
+ gtk_image_set_from_file (GTK_IMAGE (WID (name)), path);
+ g_free (name);
+ g_free (path);
+ }
+ if (g_str_equal (result, "enroll-completed")) {
+ gtk_label_set_text (GTK_LABEL (WID ("status-label")), _("Done!"));
+ gtk_assistant_set_page_complete (GTK_ASSISTANT (data->ass), WID ("page2"), TRUE);
+ }
+
+ if (done != FALSE) {
+ dbus_g_proxy_call(data->device, "EnrollStop", NULL, G_TYPE_INVALID, G_TYPE_INVALID);
+ data->state = STATE_CLAIMED;
+ if (g_str_equal (result, "enroll-completed") == FALSE) {
+ /* The enrollment failed, restart it */
+ dbus_g_proxy_call(data->device, "EnrollStart", NULL, G_TYPE_STRING, data->finger, G_TYPE_INVALID, G_TYPE_INVALID);
+ data->state = STATE_ENROLLING;
+ result = "enroll-retry-scan";
+ } else {
+ return;
+ }
+ }
+
+ msg = g_strdup_printf (TR(enroll_result_str_to_msg (result, data->is_swipe)), data->name);
+ gtk_label_set_text (GTK_LABEL (WID ("status-label")), msg);
+ g_free (msg);
+}
+
+static void
+assistant_prepare (GtkAssistant *ass, GtkWidget *page, EnrollData *data)
+{
+ const char *name;
+
+ name = g_object_get_data (G_OBJECT (page), "name");
+ if (name == NULL)
+ return;
+
+ if (g_str_equal (name, "enroll")) {
+ DBusGProxy *p;
+ GError *error = NULL;
+ GtkBuilder *dialog = data->dialog;
+ char *path;
+ guint i;
+ GValue value = { 0, };
+
+ if (!dbus_g_proxy_call (data->device, "Claim", &error, G_TYPE_STRING, "", G_TYPE_INVALID, G_TYPE_INVALID)) {
+ GtkWidget *d;
+ char *msg;
+
+ /* translators:
+ * The variable is the name of the device, for example:
+ * "Could you not access "Digital Persona U.are.U 4000/4000B" device */
+ msg = g_strdup_printf (_("Could not access '%s' device"), data->name);
+ d = get_error_dialog (msg, dbus_g_error_get_name (error), GTK_WINDOW (data->ass));
+ g_error_free (error);
+ gtk_dialog_run (GTK_DIALOG (d));
+ gtk_widget_destroy (d);
+ g_free (msg);
+
+ enroll_data_destroy (data);
+
+ return;
+ }
+ data->state = STATE_CLAIMED;
+
+ p = dbus_g_proxy_new_from_proxy (data->device, "org.freedesktop.DBus.Properties", NULL);
+ if (!dbus_g_proxy_call (p, "Get", NULL, G_TYPE_STRING, "net.reactivated.Fprint.Device", G_TYPE_STRING, "num-enroll-stages", G_TYPE_INVALID,
+ G_TYPE_VALUE, &value, G_TYPE_INVALID) || g_value_get_int (&value) < 1) {
+ GtkWidget *d;
+ char *msg;
+
+ /* translators:
+ * The variable is the name of the device, for example:
+ * "Could you not access "Digital Persona U.are.U 4000/4000B" device */
+ msg = g_strdup_printf (_("Could not access '%s' device"), data->name);
+ d = get_error_dialog (msg, "net.reactivated.Fprint.Error.Internal", GTK_WINDOW (data->ass));
+ gtk_dialog_run (GTK_DIALOG (d));
+ gtk_widget_destroy (d);
+ g_free (msg);
+
+ enroll_data_destroy (data);
+
+ g_object_unref (p);
+ return;
+ }
+ g_object_unref (p);
+
+ data->num_enroll_stages = g_value_get_int (&value);
+
+ /* Hide the extra "bulbs" if not needed */
+ for (i = MAX_ENROLL_STAGES; i > data->num_enroll_stages; i--) {
+ char *name;
+
+ name = g_strdup_printf ("image%d", i);
+ gtk_widget_hide (WID (name));
+ g_free (name);
+ }
+ /* And set the right image */
+ {
+ char *filename;
+
+ filename = g_strdup_printf ("%s.png", data->finger);
+ path = g_build_filename (MATECC_PIXMAP_DIR, filename, NULL);
+ g_free (filename);
+ }
+ for (i = 1; i <= data->num_enroll_stages; i++) {
+ char *name;
+ name = g_strdup_printf ("image%d", i);
+ gtk_image_set_from_file (GTK_IMAGE (WID (name)), path);
+ g_free (name);
+ }
+ g_free (path);
+
+ dbus_g_proxy_add_signal(data->device, "EnrollStatus", G_TYPE_STRING, G_TYPE_BOOLEAN, NULL);
+ dbus_g_proxy_connect_signal(data->device, "EnrollStatus", G_CALLBACK(enroll_result), data, NULL);
+
+ if (!dbus_g_proxy_call(data->device, "EnrollStart", &error, G_TYPE_STRING, data->finger, G_TYPE_INVALID, G_TYPE_INVALID)) {
+ GtkWidget *d;
+ char *msg;
+
+ /* translators:
+ * The variable is the name of the device, for example:
+ * "Could you not access "Digital Persona U.are.U 4000/4000B" device */
+ msg = g_strdup_printf (_("Could not start finger capture on '%s' device"), data->name);
+ d = get_error_dialog (msg, dbus_g_error_get_name (error), GTK_WINDOW (data->ass));
+ g_error_free (error);
+ gtk_dialog_run (GTK_DIALOG (d));
+ gtk_widget_destroy (d);
+ g_free (msg);
+
+ enroll_data_destroy (data);
+
+ return;
+ }
+ data->state = STATE_ENROLLING;;
+ } else {
+ if (data->state == STATE_ENROLLING) {
+ dbus_g_proxy_call(data->device, "EnrollStop", NULL, G_TYPE_INVALID, G_TYPE_INVALID);
+ data->state = STATE_CLAIMED;
+ }
+ if (data->state == STATE_CLAIMED) {
+ dbus_g_proxy_call(data->device, "Release", NULL, G_TYPE_INVALID, G_TYPE_INVALID);
+ data->state = STATE_NONE;
+ }
+ }
+}
+
+static void
+enroll_fingerprints (GtkWindow *parent, GtkWidget *enable, GtkWidget *disable)
+{
+ DBusGProxy *device, *p;
+ GHashTable *props;
+ GtkBuilder *dialog;
+ EnrollData *data;
+ GtkWidget *ass;
+ char *msg;
+
+ device = NULL;
+
+ if (manager == NULL) {
+ create_manager ();
+ if (manager != NULL)
+ device = get_first_device ();
+ } else {
+ device = get_first_device ();
+ }
+
+ if (manager == NULL || device == NULL) {
+ GtkWidget *d;
+
+ d = get_error_dialog (_("Could not access any fingerprint readers"),
+ _("Please contact your system administrator for help."),
+ parent);
+ gtk_dialog_run (GTK_DIALOG (d));
+ gtk_widget_destroy (d);
+ return;
+ }
+
+ data = g_new0 (EnrollData, 1);
+ data->device = device;
+ data->enable = enable;
+ data->disable = disable;
+
+ /* Get some details about the device */
+ p = dbus_g_proxy_new_from_proxy (device, "org.freedesktop.DBus.Properties", NULL);
+ if (dbus_g_proxy_call (p, "GetAll", NULL, G_TYPE_STRING, "net.reactivated.Fprint.Device", G_TYPE_INVALID,
+ dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), &props, G_TYPE_INVALID)) {
+ const char *scan_type;
+ data->name = g_value_dup_string (g_hash_table_lookup (props, "name"));
+ scan_type = g_value_dup_string (g_hash_table_lookup (props, "scan-type"));
+ if (g_str_equal (scan_type, "swipe"))
+ data->is_swipe = TRUE;
+ g_hash_table_destroy (props);
+ }
+ g_object_unref (p);
+
+ dialog = gtk_builder_new ();
+ gtk_builder_add_from_file (dialog, MATECC_UI_DIR "/mate-about-me-fingerprint.ui", NULL);
+ data->dialog = dialog;
+
+ ass = WID ("assistant");
+ gtk_window_set_title (GTK_WINDOW (ass), _("Enable Fingerprint Login"));
+ gtk_window_set_transient_for (GTK_WINDOW (ass), parent);
+ gtk_window_set_position (GTK_WINDOW (ass), GTK_WIN_POS_CENTER_ON_PARENT);
+ g_signal_connect (G_OBJECT (ass), "cancel",
+ G_CALLBACK (assistant_cancelled), data);
+ g_signal_connect (G_OBJECT (ass), "close",
+ G_CALLBACK (assistant_cancelled), data);
+ g_signal_connect (G_OBJECT (ass), "prepare",
+ G_CALLBACK (assistant_prepare), data);
+
+ /* Page 1 */
+ gtk_combo_box_set_active (GTK_COMBO_BOX (WID ("finger_combobox")), 0);
+
+ g_signal_connect (G_OBJECT (WID ("radiobutton1")), "toggled",
+ G_CALLBACK (finger_radio_button_toggled), data);
+ g_signal_connect (G_OBJECT (WID ("radiobutton2")), "toggled",
+ G_CALLBACK (finger_radio_button_toggled), data);
+ g_signal_connect (G_OBJECT (WID ("radiobutton3")), "toggled",
+ G_CALLBACK (finger_radio_button_toggled), data);
+ g_signal_connect (G_OBJECT (WID ("finger_combobox")), "changed",
+ G_CALLBACK (finger_combobox_changed), data);
+
+ data->finger = selected_finger (dialog);
+
+ g_object_set_data (G_OBJECT (WID("page1")), "name", "intro");
+
+ /* translators:
+ * The variable is the name of the device, for example:
+ * "To enable fingerprint login, you need to save one of your fingerprints, using the
+ * 'Digital Persona U.are.U 4000/4000B' device." */
+ msg = g_strdup_printf (_("To enable fingerprint login, you need to save one of your fingerprints, using the '%s' device."),
+ data->name);
+ gtk_label_set_text (GTK_LABEL (WID("intro-label")), msg);
+ g_free (msg);
+
+ gtk_assistant_set_page_complete (GTK_ASSISTANT (ass), WID("page1"), TRUE);
+
+ /* Page 2 */
+ if (data->is_swipe != FALSE)
+ gtk_assistant_set_page_title (GTK_ASSISTANT (ass), WID("page2"), _("Swipe finger on reader"));
+ else
+ gtk_assistant_set_page_title (GTK_ASSISTANT (ass), WID("page2"), _("Place finger on reader"));
+
+ g_object_set_data (G_OBJECT (WID("page2")), "name", "enroll");
+
+ msg = g_strdup_printf (TR(finger_str_to_msg (data->finger, data->is_swipe)), data->name);
+ gtk_label_set_text (GTK_LABEL (WID("enroll-label")), msg);
+ g_free (msg);
+
+ /* Page 3 */
+ g_object_set_data (G_OBJECT (WID("page3")), "name", "summary");
+
+ data->ass = ass;
+ gtk_widget_show_all (ass);
+}
+
+void
+fingerprint_button_clicked (GtkBuilder *dialog,
+ GtkWidget *enable,
+ GtkWidget *disable)
+{
+ bindtextdomain ("fprintd", MATELOCALEDIR);
+ bind_textdomain_codeset ("fprintd", "UTF-8");
+
+ if (is_disable != FALSE) {
+ delete_fingerprints_question (dialog, enable, disable);
+ } else {
+ enroll_fingerprints (GTK_WINDOW (WID ("about-me-dialog")), enable, disable);
+ }
+}
+
diff --git a/capplets/about-me/mate-about-me-fingerprint.h b/capplets/about-me/mate-about-me-fingerprint.h
new file mode 100644
index 00000000..c60ca358
--- /dev/null
+++ b/capplets/about-me/mate-about-me-fingerprint.h
@@ -0,0 +1,27 @@
+/* mate-about-me-fingerprint.h
+ * Copyright (C) 2008 Bastien Nocera <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#include <gtk/gtk.h>
+
+void set_fingerprint_label (GtkWidget *enable,
+ GtkWidget *disable);
+void fingerprint_button_clicked (GtkBuilder *dialog,
+ GtkWidget *enable,
+ GtkWidget *disable);
+
diff --git a/capplets/about-me/mate-about-me-fingerprint.ui b/capplets/about-me/mate-about-me-fingerprint.ui
new file mode 100644
index 00000000..7f154336
--- /dev/null
+++ b/capplets/about-me/mate-about-me-fingerprint.ui
@@ -0,0 +1,276 @@
+<?xml version="1.0"?>
+<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-naming-policy toplevel-contextual -->
+ <object class="GtkListStore" id="model1">
+ <columns>
+ <!-- column-name gchararray -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Left thumb</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Left middle finger</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Left ring finger</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Left little finger</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Right thumb</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Right middle finger</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Right ring finger</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Right little finger</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkAssistant" id="assistant">
+ <property name="border_width">12</property>
+ <property name="title" translatable="yes">Enable Fingerprint Login</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkVBox" id="page1">
+ <property name="visible">True</property>
+ <property name="border_width">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkHBox" id="hbox74">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkImage" id="image">
+ <property name="visible">True</property>
+ <property name="stock">gtk-dialog-info</property>
+ <property name="icon-size">6</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="intro-label">
+ <property name="visible">True</property>
+ <property name="label">To enable fingerprint login, you need to save one of your fingerprints, using the Acme Foobar 5000.</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox70">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkRadioButton" id="radiobutton1">
+ <property name="label" translatable="yes">Right index finger</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="radiobutton2">
+ <property name="label" translatable="yes">Left index finger</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">radiobutton1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox77">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkRadioButton" id="radiobutton3">
+ <property name="label" translatable="yes">Other finger: </property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">radiobutton1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="finger_combobox">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="model">model1</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="title" translatable="yes">Select finger</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="page2">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="enroll-label">
+ <property name="visible">True</property>
+ <property name="label">In order to save your fingerprints, you need to swipe your thumb on the "Acme foobar" device.</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="enroll_hbox">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="stock">gtk-no</property>
+ <property name="icon-size">6</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="stock">gtk-no</property>
+ <property name="icon-size">6</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="image3">
+ <property name="visible">True</property>
+ <property name="stock">gtk-no</property>
+ <property name="icon-size">6</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="image4">
+ <property name="visible">True</property>
+ <property name="stock">gtk-no</property>
+ <property name="icon-size">6</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="image5">
+ <property name="visible">True</property>
+ <property name="stock">gtk-no</property>
+ <property name="icon-size">6</property>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="status-label">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="title">Swipe finger on reader</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="page3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Your fingerprint was successfully saved. You should now be able to log in using your fingerprint reader.</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="page_type">summary</property>
+ <property name="title" translatable="yes">Done!</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/capplets/about-me/mate-about-me-password.c b/capplets/about-me/mate-about-me-password.c
new file mode 100644
index 00000000..0699c28d
--- /dev/null
+++ b/capplets/about-me/mate-about-me-password.c
@@ -0,0 +1,1136 @@
+/* mate-about-me.c
+ * Copyright (C) 2002 Diego Gonzalez
+ * Copyright (C) 2006 Johannes H. Jensen
+ *
+ * Written by: Diego Gonzalez <[email protected]>
+ * Modified by: Johannes H. Jensen <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Parts of this code come from Mate-System-Tools.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Are all of these needed? */
+#include <gdk/gdkkeysyms.h>
+#include <pwd.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/wait.h>
+
+#if __sun
+#include <sys/types.h>
+#include <signal.h>
+#endif
+
+#include "capplet-util.h"
+#include "eel-alert-dialog.h"
+
+/* Passwd states */
+typedef enum {
+ PASSWD_STATE_NONE, /* Passwd is not asking for anything */
+ PASSWD_STATE_AUTH, /* Passwd is asking for our current password */
+ PASSWD_STATE_NEW, /* Passwd is asking for our new password */
+ PASSWD_STATE_RETYPE, /* Passwd is asking for our retyped new password */
+ PASSWD_STATE_ERR /* Passwd reported an error but has not yet exited */
+} PasswdState;
+
+typedef struct {
+ GtkBuilder *ui;
+
+ /* Commonly used widgets */
+ GtkEntry *current_password;
+ GtkEntry *new_password;
+ GtkEntry *retyped_password;
+ GtkImage *dialog_image;
+ GtkLabel *status_label;
+
+ /* Whether we have authenticated */
+ gboolean authenticated;
+
+ /* Communication with the passwd program */
+ GPid backend_pid;
+
+ GIOChannel *backend_stdin;
+ GIOChannel *backend_stdout;
+
+ GQueue *backend_stdin_queue; /* Write queue to backend_stdin */
+
+ /* GMainLoop IDs */
+ guint backend_child_watch_id; /* g_child_watch_add (PID) */
+ guint backend_stdout_watch_id; /* g_io_add_watch (stdout) */
+
+ /* State of the passwd program */
+ PasswdState backend_state;
+
+} PasswordDialog;
+
+/* Buffer size for backend output */
+#define BUFSIZE 64
+
+/*
+ * Error handling {{
+ */
+#define PASSDLG_ERROR (mate_about_me_password_error_quark())
+
+GQuark mate_about_me_password_error_quark(void)
+{
+ static GQuark q = 0;
+
+ if (q == 0) {
+ q = g_quark_from_static_string("mate_about_me_password_error");
+ }
+
+ return q;
+}
+
+/* error codes */
+enum {
+ PASSDLG_ERROR_NONE,
+ PASSDLG_ERROR_NEW_PASSWORD_EMPTY,
+ PASSDLG_ERROR_RETYPED_PASSWORD_EMPTY,
+ PASSDLG_ERROR_PASSWORDS_NOT_EQUAL,
+ PASSDLG_ERROR_BACKEND, /* Backend error */
+ PASSDLG_ERROR_USER, /* Generic user error */
+ PASSDLG_ERROR_FAILED /* Fatal failure, error->message should explain */
+};
+
+/*
+ * }} Error handling
+ */
+
+/*
+ * Prototypes {{
+ */
+static void
+stop_passwd (PasswordDialog *pdialog);
+
+static void
+free_passwd_resources (PasswordDialog *pdialog);
+
+static gboolean
+io_watch_stdout (GIOChannel *source, GIOCondition condition, PasswordDialog *pdialog);
+
+static void
+passdlg_set_auth_state (PasswordDialog *pdialog, gboolean state);
+
+static void
+passdlg_set_status (PasswordDialog *pdialog, gchar *msg);
+
+static void
+passdlg_set_busy (PasswordDialog *pdialog, gboolean busy);
+
+static void
+passdlg_clear (PasswordDialog *pdialog);
+
+static guint
+passdlg_refresh_password_state (PasswordDialog *pdialog);
+
+/*
+ * }} Prototypes
+ */
+
+/*
+ * Spawning and closing of backend {{
+ */
+
+/* Child watcher */
+static void
+child_watch_cb (GPid pid, gint status, PasswordDialog *pdialog)
+{
+ if (WIFEXITED (status)) {
+ if (WEXITSTATUS (status) >= 255) {
+ g_warning (_("Child exited unexpectedly"));
+ }
+ }
+
+ free_passwd_resources (pdialog);
+}
+
+/* Spawn passwd backend
+ * Returns: TRUE on success, FALSE otherwise and sets error appropriately */
+static gboolean
+spawn_passwd (PasswordDialog *pdialog, GError **error)
+{
+ gchar *argv[2];
+ gchar *envp[1];
+ gint my_stdin, my_stdout, my_stderr;
+
+ argv[0] = "/usr/bin/passwd"; /* Is it safe to rely on a hard-coded path? */
+ argv[1] = NULL;
+
+ envp[0] = NULL; /* If we pass an empty array as the environment,
+ * will the childs environment be empty, and the
+ * locales set to the C default? From the manual:
+ * "If envp is NULL, the child inherits its
+ * parent'senvironment."
+ * If I'm wrong here, we somehow have to set
+ * the locales here.
+ */
+
+ if (!g_spawn_async_with_pipes (NULL, /* Working directory */
+ argv, /* Argument vector */
+ envp, /* Environment */
+ G_SPAWN_DO_NOT_REAP_CHILD, /* Flags */
+ NULL, /* Child setup */
+ NULL, /* Data to child setup */
+ &pdialog->backend_pid, /* PID */
+ &my_stdin, /* Stdin */
+ &my_stdout, /* Stdout */
+ &my_stderr, /* Stderr */
+ error)) { /* GError */
+
+ /* An error occured */
+ free_passwd_resources (pdialog);
+
+ return FALSE;
+ }
+
+ /* 2>&1 */
+ if (dup2 (my_stderr, my_stdout) == -1) {
+ /* Failed! */
+ g_set_error (error,
+ PASSDLG_ERROR,
+ PASSDLG_ERROR_BACKEND,
+ strerror (errno));
+
+ /* Clean up */
+ stop_passwd (pdialog);
+
+ return FALSE;
+ }
+
+ /* Open IO Channels */
+ pdialog->backend_stdin = g_io_channel_unix_new (my_stdin);
+ pdialog->backend_stdout = g_io_channel_unix_new (my_stdout);
+
+ /* Set raw encoding */
+ /* Set nonblocking mode */
+ if (g_io_channel_set_encoding (pdialog->backend_stdin, NULL, error) != G_IO_STATUS_NORMAL ||
+ g_io_channel_set_encoding (pdialog->backend_stdout, NULL, error) != G_IO_STATUS_NORMAL ||
+ g_io_channel_set_flags (pdialog->backend_stdin, G_IO_FLAG_NONBLOCK, error) != G_IO_STATUS_NORMAL ||
+ g_io_channel_set_flags (pdialog->backend_stdout, G_IO_FLAG_NONBLOCK, error) != G_IO_STATUS_NORMAL ) {
+
+ /* Clean up */
+ stop_passwd (pdialog);
+ return FALSE;
+ }
+
+ /* Turn off buffering */
+ g_io_channel_set_buffered (pdialog->backend_stdin, FALSE);
+ g_io_channel_set_buffered (pdialog->backend_stdout, FALSE);
+
+ /* Add IO Channel watcher */
+ pdialog->backend_stdout_watch_id = g_io_add_watch (pdialog->backend_stdout,
+ G_IO_IN | G_IO_PRI,
+ (GIOFunc) io_watch_stdout, pdialog);
+
+ /* Add child watcher */
+ pdialog->backend_child_watch_id = g_child_watch_add (pdialog->backend_pid, (GChildWatchFunc) child_watch_cb, pdialog);
+
+ /* Success! */
+
+ return TRUE;
+}
+
+/* Stop passwd backend */
+static void
+stop_passwd (PasswordDialog *pdialog)
+{
+ /* This is the standard way of returning from the dialog with passwd.
+ * If we return this way we can safely kill passwd as it has completed
+ * its task.
+ */
+
+ if (pdialog->backend_pid != -1) {
+ kill (pdialog->backend_pid, 9);
+ }
+
+ /* We must run free_passwd_resources here and not let our child
+ * watcher do it, since it will access invalid memory after the
+ * dialog has been closed and cleaned up.
+ *
+ * If we had more than a single thread we'd need to remove
+ * the child watch before trying to kill the child.
+ */
+ free_passwd_resources (pdialog);
+}
+
+/* Clean up passwd resources */
+static void
+free_passwd_resources (PasswordDialog *pdialog)
+{
+ GError *error = NULL;
+
+ /* Remove the child watcher */
+ if (pdialog->backend_child_watch_id != 0) {
+
+ g_source_remove (pdialog->backend_child_watch_id);
+
+ pdialog->backend_child_watch_id = 0;
+ }
+
+
+ /* Close IO channels (internal file descriptors are automatically closed) */
+ if (pdialog->backend_stdin != NULL) {
+
+ if (g_io_channel_shutdown (pdialog->backend_stdin, TRUE, &error) != G_IO_STATUS_NORMAL) {
+ g_warning (_("Could not shutdown backend_stdin IO channel: %s"), error->message);
+ g_error_free (error);
+ error = NULL;
+ }
+
+ g_io_channel_unref (pdialog->backend_stdin);
+
+ pdialog->backend_stdin = NULL;
+ }
+
+ if (pdialog->backend_stdout != NULL) {
+
+ if (g_io_channel_shutdown (pdialog->backend_stdout, TRUE, &error) != G_IO_STATUS_NORMAL) {
+ g_warning (_("Could not shutdown backend_stdout IO channel: %s"), error->message);
+ g_error_free (error);
+ error = NULL;
+ }
+
+ g_io_channel_unref (pdialog->backend_stdout);
+
+ pdialog->backend_stdout = NULL;
+ }
+
+ /* Remove IO watcher */
+ if (pdialog->backend_stdout_watch_id != 0) {
+
+ g_source_remove (pdialog->backend_stdout_watch_id);
+
+ pdialog->backend_stdout_watch_id = 0;
+ }
+
+ /* Close PID */
+ if (pdialog->backend_pid != -1) {
+
+ g_spawn_close_pid (pdialog->backend_pid);
+
+ pdialog->backend_pid = -1;
+ }
+
+ /* Clear backend state */
+ pdialog->backend_state = PASSWD_STATE_NONE;
+}
+
+/*
+ * }} Spawning and closing of backend
+ */
+
+/*
+ * Backend communication code {{
+ */
+
+/* Write the first element of queue through channel */
+static void
+io_queue_pop (GQueue *queue, GIOChannel *channel)
+{
+ gchar *buf;
+ gsize bytes_written;
+ GError *error = NULL;
+
+ buf = g_queue_pop_head (queue);
+
+ if (buf != NULL) {
+
+ if (g_io_channel_write_chars (channel, buf, -1, &bytes_written, &error) != G_IO_STATUS_NORMAL) {
+ g_warning ("Could not write queue element \"%s\" to channel: %s", buf, error->message);
+ g_error_free (error);
+ }
+
+ g_free (buf);
+ }
+}
+
+/* Goes through the argument list, checking if one of them occurs in str
+ * Returns: TRUE as soon as an element is found to match, FALSE otherwise */
+static gboolean
+is_string_complete (gchar *str, ...)
+{
+ va_list ap;
+ gchar *arg;
+
+ if (strlen (str) == 0) {
+ return FALSE;
+ }
+
+ va_start (ap, str);
+
+ while ((arg = va_arg (ap, char *)) != NULL) {
+ if (g_strrstr (str, arg) != NULL) {
+ va_end (ap);
+ return TRUE;
+ }
+ }
+
+ va_end (ap);
+
+ return FALSE;
+}
+
+/* Authentication attempt succeeded. Update the GUI accordingly. */
+static void
+authenticated_user (PasswordDialog *pdialog)
+{
+ pdialog->backend_state = PASSWD_STATE_NEW;
+
+ if (pdialog->authenticated) {
+ /* This is a re-authentication
+ * It succeeded, so pop our new password from the queue */
+ io_queue_pop (pdialog->backend_stdin_queue, pdialog->backend_stdin);
+ }
+
+ /* Update UI state */
+ passdlg_set_auth_state (pdialog, TRUE);
+ passdlg_set_status (pdialog, _("Authenticated!"));
+
+ /* Check to see if the passwords are valid
+ * (They might be non-empty if the user had to re-authenticate,
+ * and thus we need to enable the change-password-button) */
+ passdlg_refresh_password_state (pdialog);
+}
+
+/*
+ * IO watcher for stdout, called whenever there is data to read from the backend.
+ * This is where most of the actual IO handling happens.
+ */
+static gboolean
+io_watch_stdout (GIOChannel *source, GIOCondition condition, PasswordDialog *pdialog)
+{
+ static GString *str = NULL; /* Persistent buffer */
+
+ gchar buf[BUFSIZE]; /* Temporary buffer */
+ gsize bytes_read;
+ GError *error = NULL;
+
+ gchar *msg = NULL; /* Status error message */
+ GtkBuilder *dialog;
+
+ gboolean reinit = FALSE;
+
+ /* Initialize buffer */
+ if (str == NULL) {
+ str = g_string_new ("");
+ }
+
+ dialog = pdialog->ui;
+
+ if (g_io_channel_read_chars (source, buf, BUFSIZE, &bytes_read, &error) != G_IO_STATUS_NORMAL) {
+ g_warning ("IO Channel read error: %s", error->message);
+ g_error_free (error);
+
+ return TRUE;
+ }
+
+ str = g_string_append_len (str, buf, bytes_read);
+
+ /* In which state is the backend? */
+ switch (pdialog->backend_state) {
+ case PASSWD_STATE_AUTH:
+ /* Passwd is asking for our current password */
+
+ if (is_string_complete (str->str, "assword: ", "failure", "wrong", "error", NULL)) {
+ /* Which response did we get? */
+ passdlg_set_busy (pdialog, FALSE);
+
+ if (g_strrstr (str->str, "assword: ") != NULL) {
+ /* Authentication successful */
+
+ authenticated_user (pdialog);
+
+ } else {
+ /* Authentication failed */
+
+ if (pdialog->authenticated) {
+ /* This is a re-auth, and it failed.
+ * The password must have been changed in the meantime!
+ * Ask the user to re-authenticate
+ */
+
+ /* Update status message and auth state */
+ passdlg_set_status (pdialog, _("Your password has been changed since you initially authenticated! Please re-authenticate."));
+ } else {
+ passdlg_set_status (pdialog, _("That password was incorrect."));
+ }
+
+ /* Focus current password */
+ gtk_widget_grab_focus (GTK_WIDGET (pdialog->current_password));
+ }
+
+ reinit = TRUE;
+ }
+ break;
+ case PASSWD_STATE_NEW:
+ /* Passwd is asking for our new password */
+
+ if (is_string_complete (str->str, "assword: ", NULL)) {
+ /* Advance to next state */
+ pdialog->backend_state = PASSWD_STATE_RETYPE;
+
+ /* Pop retyped password from queue and into IO channel */
+ io_queue_pop (pdialog->backend_stdin_queue, pdialog->backend_stdin);
+
+ reinit = TRUE;
+ }
+ break;
+ case PASSWD_STATE_RETYPE:
+ /* Passwd is asking for our retyped new password */
+
+ if (is_string_complete (str->str, "successfully",
+ "short",
+ "longer",
+ "palindrome",
+ "dictionary",
+ "simpl", /* catches both simple and simplistic */
+ "similar",
+ "different",
+ "case",
+ "wrapped",
+ "recovered",
+ "recent"
+ "unchanged",
+ "match",
+ "1 numeric or special",
+ "failure",
+ NULL)) {
+
+ /* What response did we get? */
+ passdlg_set_busy (pdialog, FALSE);
+
+ if (g_strrstr (str->str, "successfully") != NULL) {
+ /* Hooray! */
+
+ passdlg_clear (pdialog);
+ passdlg_set_status (pdialog, _("Your password has been changed."));
+ } else {
+ /* Ohnoes! */
+
+ /* Focus new password */
+ gtk_widget_grab_focus (GTK_WIDGET (pdialog->new_password));
+
+ if (g_strrstr (str->str, "recovered") != NULL) {
+ /* What does this indicate?
+ * "Authentication information cannot be recovered?" from libpam? */
+ msg = g_strdup_printf (_("System error: %s."), str->str);
+ } else if (g_strrstr (str->str, "short") != NULL ||
+ g_strrstr (str->str, "longer") != NULL) {
+ msg = g_strdup (_("The password is too short."));
+ } else if (g_strrstr (str->str, "palindrome") != NULL ||
+ g_strrstr (str->str, "simpl") != NULL ||
+ g_strrstr (str->str, "dictionary") != NULL) {
+ msg = g_strdup (_("The password is too simple."));
+ } else if (g_strrstr (str->str, "similar") != NULL ||
+ g_strrstr (str->str, "different") != NULL ||
+ g_strrstr (str->str, "case") != NULL ||
+ g_strrstr (str->str, "wrapped") != NULL) {
+ msg = g_strdup (_("The old and new passwords are too similar."));
+ } else if (g_strrstr (str->str, "1 numeric or special") != NULL) {
+ msg = g_strdup (_("The new password must contain numeric or special character(s)."));
+ } else if (g_strrstr (str->str, "unchanged") != NULL ||
+ g_strrstr (str->str, "match") != NULL) {
+ msg = g_strdup (_("The old and new passwords are the same."));
+ } else if (g_strrstr (str->str, "recent") != NULL) {
+ msg = g_strdup (_("The new password has already been used recently."));
+ } else if (g_strrstr (str->str, "failure") != NULL) {
+ /* Authentication failure */
+ msg = g_strdup (_("Your password has been changed since you initially authenticated! Please re-authenticate."));
+
+ passdlg_set_auth_state (pdialog, FALSE);
+ }
+ }
+
+ reinit = TRUE;
+
+ if (msg != NULL) {
+ /* An error occured! */
+ passdlg_set_status (pdialog, msg);
+ g_free (msg);
+
+ /* At this point, passwd might have exited, in which case
+ * child_watch_cb should clean up for us and remove this watcher.
+ * On some error conditions though, passwd just re-prompts us
+ * for our new password. */
+
+ pdialog->backend_state = PASSWD_STATE_ERR;
+ }
+
+ /* child_watch_cb should clean up for us now */
+ }
+ break;
+ case PASSWD_STATE_NONE:
+ /* Passwd is not asking for anything yet */
+ if (is_string_complete (str->str, "assword: ", NULL)) {
+
+ /* If the user does not have a password set,
+ * passwd will immediately ask for the new password,
+ * so skip the AUTH phase */
+ if (is_string_complete (str->str, "new", "New", NULL)) {
+ gchar *pw;
+
+ pdialog->backend_state = PASSWD_STATE_NEW;
+
+ passdlg_set_busy (pdialog, FALSE);
+ authenticated_user (pdialog);
+
+ /* since passwd didn't ask for our old password
+ * in this case, simply remove it from the queue */
+ pw = g_queue_pop_head (pdialog->backend_stdin_queue);
+ g_free (pw);
+ } else {
+
+ pdialog->backend_state = PASSWD_STATE_AUTH;
+
+ /* Pop the IO queue, i.e. send current password */
+ io_queue_pop (pdialog->backend_stdin_queue, pdialog->backend_stdin);
+ }
+
+ reinit = TRUE;
+ }
+ break;
+ default:
+ /* Passwd has returned an error */
+ reinit = TRUE;
+ break;
+ }
+
+ if (reinit) {
+ g_string_free (str, TRUE);
+ str = NULL;
+ }
+
+ /* Continue calling us */
+ return TRUE;
+}
+
+/*
+ * }} Backend communication code
+ */
+
+/* Adds the current password to the IO queue */
+static void
+authenticate (PasswordDialog *pdialog)
+{
+ gchar *s;
+
+ s = g_strdup_printf ("%s\n", gtk_entry_get_text (pdialog->current_password));
+
+ g_queue_push_tail (pdialog->backend_stdin_queue, s);
+}
+
+/* Adds the new password twice to the IO queue */
+static void
+update_password (PasswordDialog *pdialog)
+{
+ gchar *s;
+
+ s = g_strdup_printf ("%s\n", gtk_entry_get_text (pdialog->new_password));
+
+ g_queue_push_tail (pdialog->backend_stdin_queue, s);
+ /* We need to allocate new space because io_queue_pop() g_free()s
+ * every element of the queue after it's done */
+ g_queue_push_tail (pdialog->backend_stdin_queue, g_strdup (s));
+}
+
+/* Sets dialog busy state according to busy
+ *
+ * When busy:
+ * Sets the cursor to busy
+ * Disables the interface to prevent that the user interferes
+ * Reverts all this when non-busy
+ *
+ * Note that this function takes into account the
+ * authentication state of the dialog. So setting the
+ * dialog to busy and then back to normal should leave
+ * the dialog unchanged.
+ */
+static void
+passdlg_set_busy (PasswordDialog *pdialog, gboolean busy)
+{
+ GtkBuilder *dialog;
+ GtkWidget *toplevel;
+ GdkCursor *cursor = NULL;
+ GdkDisplay *display;
+
+ dialog = pdialog->ui;
+
+ /* Set cursor */
+ toplevel = WID ("change-password");
+ display = gtk_widget_get_display (toplevel);
+ if (busy) {
+ cursor = gdk_cursor_new_for_display (display, GDK_WATCH);
+ }
+
+ gdk_window_set_cursor (gtk_widget_get_window (toplevel), cursor);
+ gdk_display_flush (display);
+
+ if (busy) {
+ gdk_cursor_unref (cursor);
+ }
+
+ /* Disable/Enable UI */
+ if (pdialog->authenticated) {
+ /* Authenticated state */
+
+ /* Enable/disable new password section */
+ g_object_set (pdialog->new_password, "sensitive", !busy, NULL);
+ g_object_set (pdialog->retyped_password, "sensitive", !busy, NULL);
+ g_object_set (WID ("new-password-label"), "sensitive", !busy, NULL);
+ g_object_set (WID ("retyped-password-label"), "sensitive", !busy, NULL);
+
+ /* Enable/disable change password button */
+ g_object_set (WID ("change-password-button"), "sensitive", !busy, NULL);
+
+ } else {
+ /* Not-authenticated state */
+
+ /* Enable/disable auth section state */
+ g_object_set (pdialog->current_password, "sensitive", !busy, NULL);
+ g_object_set (WID ("authenticate-button"), "sensitive", !busy, NULL);
+ g_object_set (WID ("current-password-label"), "sensitive", !busy, NULL);
+ }
+}
+
+/* Launch an error dialog */
+static void
+passdlg_error_dialog (GtkWindow *parent, const gchar *title,
+ const gchar *msg, const gchar *details)
+{
+ GtkWidget *dialog;
+
+ dialog = gtk_message_dialog_new (parent, GTK_DIALOG_MODAL,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+ msg);
+ if (title)
+ gtk_window_set_title (GTK_WINDOW (dialog), title);
+
+ if (details)
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ details);
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+}
+
+/* Set authenticated state of dialog according to state
+ *
+ * When in authenticated state:
+ * Disables authentication-part of interface
+ * Enables new-password-part of interface
+ * When in not-authenticated state:
+ * Enables authentication-part of interface
+ * Disables new-password-part of interface
+ * Disables the change-password-button
+ */
+static void
+passdlg_set_auth_state (PasswordDialog *pdialog, gboolean state)
+{
+ GtkBuilder *dialog;
+
+ dialog = pdialog->ui;
+
+ /* Widgets which require a not-authenticated state to be accessible */
+ g_object_set (pdialog->current_password, "sensitive", !state, NULL);
+ g_object_set (WID ("current-password-label"), "sensitive", !state, NULL);
+ g_object_set (WID ("authenticate-button"), "sensitive", !state, NULL);
+
+ /* Widgets which require authentication to be accessible */
+ g_object_set (pdialog->new_password, "sensitive", state, NULL);
+ g_object_set (pdialog->retyped_password, "sensitive", state, NULL);
+ g_object_set (WID ("new-password-label"), "sensitive", state, NULL);
+ g_object_set (WID ("retyped-password-label"), "sensitive", state, NULL);
+
+ if (!state) {
+ /* Disable change-password-button when in not-authenticated state */
+ g_object_set (WID ("change-password-button"), "sensitive", FALSE, NULL);
+ }
+
+ pdialog->authenticated = state;
+
+ if (state) {
+ /* Authenticated state */
+
+ /* Focus new password */
+ gtk_widget_grab_focus (GTK_WIDGET (pdialog->new_password));
+
+ /* Set open lock image */
+ gtk_image_set_from_icon_name (GTK_IMAGE (pdialog->dialog_image), "changes-allow", GTK_ICON_SIZE_DIALOG);
+ } else {
+ /* Not authenticated state */
+
+ /* Focus current password */
+ gtk_widget_grab_focus (GTK_WIDGET (pdialog->current_password));
+
+ /* Set closed lock image */
+ gtk_image_set_from_icon_name (GTK_IMAGE (pdialog->dialog_image), "changes-prevent", GTK_ICON_SIZE_DIALOG);
+ }
+}
+
+/* Set status field message */
+static void
+passdlg_set_status (PasswordDialog *pdialog, gchar *msg)
+{
+ g_object_set (pdialog->status_label, "label", msg, NULL);
+}
+
+/* Clear dialog (except the status message) */
+static void
+passdlg_clear (PasswordDialog *pdialog)
+{
+ /* Set non-authenticated state */
+ passdlg_set_auth_state (pdialog, FALSE);
+
+ /* Clear password entries */
+ gtk_entry_set_text (pdialog->current_password, "");
+ gtk_entry_set_text (pdialog->new_password, "");
+ gtk_entry_set_text (pdialog->retyped_password, "");
+}
+
+/* Start backend and handle errors
+ * If backend is already running, stop it
+ * If an error occurs, show error dialog */
+static gboolean
+passdlg_spawn_passwd (PasswordDialog *pdialog)
+{
+ GError *error = NULL;
+ gchar *details;
+
+ /* If backend is running, stop it */
+ stop_passwd (pdialog);
+
+ /* Spawn backend */
+ if (!spawn_passwd (pdialog, &error)) {
+ GtkWidget *parent = GTK_WIDGET (gtk_builder_get_object (pdialog->ui, "change-password"));
+
+ /* translators: Unable to launch <program>: <error message> */
+ details = g_strdup_printf (_("Unable to launch %s: %s"),
+ "/usr/bin/passwd", error->message);
+
+ passdlg_error_dialog (GTK_WINDOW (parent),
+ _("Unable to launch backend"),
+ _("A system error has occurred"),
+ details);
+
+ g_free (details);
+ g_error_free (error);
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/* Called when the "Authenticate" button is clicked */
+static void
+passdlg_authenticate (GtkButton *button, PasswordDialog *pdialog)
+{
+ /* Set busy as this can be a long process */
+ passdlg_set_busy (pdialog, TRUE);
+
+ /* Update status message */
+ passdlg_set_status (pdialog, _("Checking password..."));
+
+ /* Spawn backend */
+ if (!passdlg_spawn_passwd (pdialog)) {
+ passdlg_set_busy (pdialog, FALSE);
+ return;
+ }
+
+ authenticate (pdialog);
+
+ /* Our IO watcher should now handle the rest */
+}
+
+/* Validate passwords
+ * Returns:
+ * PASSDLG_ERROR_NONE (0) if passwords are valid
+ * PASSDLG_ERROR_NEW_PASSWORD_EMPTY
+ * PASSDLG_ERROR_RETYPED_PASSWORD_EMPTY
+ * PASSDLG_ERROR_PASSWORDS_NOT_EQUAL
+ */
+static guint
+passdlg_validate_passwords (PasswordDialog *pdialog)
+{
+ GtkBuilder *dialog;
+ const gchar *new_password, *retyped_password;
+ glong nlen, rlen;
+
+ dialog = pdialog->ui;
+
+ new_password = gtk_entry_get_text (pdialog->new_password);
+ retyped_password = gtk_entry_get_text (pdialog->retyped_password);
+
+ nlen = g_utf8_strlen (new_password, -1);
+ rlen = g_utf8_strlen (retyped_password, -1);
+
+ if (nlen == 0) {
+ /* New password empty */
+ return PASSDLG_ERROR_NEW_PASSWORD_EMPTY;
+ }
+
+ if (rlen == 0) {
+ /* Retyped password empty */
+ return PASSDLG_ERROR_RETYPED_PASSWORD_EMPTY;
+ }
+
+ if (nlen != rlen || strncmp (new_password, retyped_password, nlen) != 0) {
+ /* Passwords not equal */
+ return PASSDLG_ERROR_PASSWORDS_NOT_EQUAL;
+ }
+
+ /* Success */
+ return PASSDLG_ERROR_NONE;
+}
+
+/* Refresh the valid password UI state, i.e. re-validate
+ * and enable/disable the Change Password button.
+ * Returns: Return value of passdlg_validate_passwords */
+static guint
+passdlg_refresh_password_state (PasswordDialog *pdialog)
+{
+ GtkBuilder *dialog;
+ guint ret;
+ gboolean valid = FALSE;
+
+ dialog = pdialog->ui;
+
+ ret = passdlg_validate_passwords (pdialog);
+
+ if (ret == PASSDLG_ERROR_NONE) {
+ valid = TRUE;
+ }
+
+ g_object_set (WID ("change-password-button"), "sensitive", valid, NULL);
+
+ return ret;
+}
+
+/* Called whenever any of the new password fields have changed */
+static void
+passdlg_check_password (GtkEntry *entry, PasswordDialog *pdialog)
+{
+ guint ret;
+
+ ret = passdlg_refresh_password_state (pdialog);
+
+ switch (ret) {
+ case PASSDLG_ERROR_NONE:
+ passdlg_set_status (pdialog, _("Click <b>Change password</b> to change your password."));
+ break;
+ case PASSDLG_ERROR_NEW_PASSWORD_EMPTY:
+ passdlg_set_status (pdialog, _("Please type your password in the <b>New password</b> field."));
+ break;
+ case PASSDLG_ERROR_RETYPED_PASSWORD_EMPTY:
+ passdlg_set_status (pdialog, _("Please type your password again in the <b>Retype new password</b> field."));
+ break;
+ case PASSDLG_ERROR_PASSWORDS_NOT_EQUAL:
+ passdlg_set_status (pdialog, _("The two passwords are not equal."));
+ break;
+ default:
+ g_warning ("Unknown passdlg_check_password error: %d", ret);
+ break;
+ }
+}
+
+/* Called when the "Change password" dialog-button is clicked
+ * Returns: TRUE if we want to keep the dialog running, FALSE otherwise */
+static gboolean
+passdlg_process_response (PasswordDialog *pdialog, gint response_id)
+{
+
+ if (response_id == GTK_RESPONSE_OK) {
+ /* Set busy as this can be a long process */
+ passdlg_set_busy (pdialog, TRUE);
+
+ /* Stop passwd if an error occured and it is still running */
+ if (pdialog->backend_state == PASSWD_STATE_ERR) {
+
+ /* Stop passwd, free resources */
+ stop_passwd (pdialog);
+ }
+
+ /* Check that the backend is still running, or that an error
+ * hass occured but it has not yet exited */
+ if (pdialog->backend_pid == -1) {
+ /* If it is not, re-run authentication */
+
+ /* Spawn backend */
+ if (!passdlg_spawn_passwd (pdialog)) {
+ return TRUE;
+ }
+
+ /* Add current and new passwords to queue */
+ authenticate (pdialog);
+ update_password (pdialog);
+ } else {
+ /* Only add new passwords to queue */
+ update_password (pdialog);
+
+ /* Pop new password through the backend */
+ io_queue_pop (pdialog->backend_stdin_queue, pdialog->backend_stdin);
+ }
+
+ /* Our IO watcher should now handle the rest */
+
+ /* Keep the dialog running */
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/* Activates (moves focus or activates) widget w */
+static void
+passdlg_activate (GtkEntry *entry, GtkWidget *w)
+{
+ if (GTK_IS_BUTTON (w)) {
+ gtk_widget_activate (w);
+ } else {
+ gtk_widget_grab_focus (w);
+ }
+}
+
+/* Initialize password dialog */
+static void
+passdlg_init (PasswordDialog *pdialog, GtkWindow *parent)
+{
+ GtkBuilder *dialog;
+ GtkWidget *wpassdlg;
+ GtkAccelGroup *group;
+
+ /* Initialize dialog */
+ dialog = gtk_builder_new ();
+ gtk_builder_add_from_file (dialog, MATECC_UI_DIR "/mate-about-me-password.ui", NULL);
+ pdialog->ui = dialog;
+
+ wpassdlg = WID ("change-password");
+ capplet_set_icon (wpassdlg, "user-info");
+
+ group = gtk_accel_group_new ();
+
+ /*
+ * Initialize backend
+ */
+
+ /* Initialize backend_pid. -1 means the backend is not running */
+ pdialog->backend_pid = -1;
+
+ /* Initialize IO Channels */
+ pdialog->backend_stdin = NULL;
+ pdialog->backend_stdout = NULL;
+
+ /* Initialize write queue */
+ pdialog->backend_stdin_queue = g_queue_new ();
+
+ /* Initialize watchers */
+ pdialog->backend_child_watch_id = 0;
+ pdialog->backend_stdout_watch_id = 0;
+
+ /* Initialize backend state */
+ pdialog->backend_state = PASSWD_STATE_NONE;
+
+ /*
+ * Initialize UI
+ */
+
+ /* Initialize pdialog widgets */
+ pdialog->current_password = GTK_ENTRY (WID ("current-password"));
+ pdialog->new_password = GTK_ENTRY (WID ("new-password"));
+ pdialog->retyped_password = GTK_ENTRY (WID ("retyped-password"));
+ pdialog->dialog_image = GTK_IMAGE (WID ("dialog-image"));
+ pdialog->status_label = GTK_LABEL (WID ("status-label"));
+
+ /* Initialize accelerators */
+ gtk_widget_add_accelerator (GTK_WIDGET (pdialog->current_password),
+ "activate", group,
+ GDK_Return, 0,
+ 0);
+
+ gtk_widget_add_accelerator (GTK_WIDGET (pdialog->new_password),
+ "activate", group,
+ GDK_Return, 0,
+ 0);
+
+ /* Activate authenticate-button when enter is pressed in current-password */
+ g_signal_connect (G_OBJECT (pdialog->current_password), "activate",
+ G_CALLBACK (passdlg_activate), WID ("authenticate-button"));
+
+ /* Activate retyped-password when enter is pressed in new-password */
+ g_signal_connect (G_OBJECT (pdialog->new_password), "activate",
+ G_CALLBACK (passdlg_activate), pdialog->retyped_password);
+
+ /* Clear status message */
+ passdlg_set_status (pdialog, "");
+
+ /* Set non-authenticated state */
+ passdlg_set_auth_state (pdialog, FALSE);
+
+ /* Connect signal handlers */
+ g_signal_connect (G_OBJECT (WID ("authenticate-button")), "clicked",
+ G_CALLBACK (passdlg_authenticate), pdialog);
+
+ /* Verify new passwords on-the-fly */
+ g_signal_connect (G_OBJECT (WID ("new-password")), "changed",
+ G_CALLBACK (passdlg_check_password), pdialog);
+ g_signal_connect (G_OBJECT (WID ("retyped-password")), "changed",
+ G_CALLBACK (passdlg_check_password), pdialog);
+
+ /* Set misc dialog properties */
+ gtk_window_set_resizable (GTK_WINDOW (wpassdlg), FALSE);
+ gtk_window_set_transient_for (GTK_WINDOW (wpassdlg), GTK_WINDOW (parent));
+}
+
+/* Main */
+void
+mate_about_me_password (GtkWindow *parent)
+{
+ PasswordDialog *pdialog;
+ GtkBuilder *dialog;
+ GtkWidget *wpassdlg;
+
+ gint result;
+ gboolean response;
+
+ /* Initialize dialog */
+ pdialog = g_new0 (PasswordDialog, 1);
+ passdlg_init (pdialog, parent);
+
+ dialog = pdialog->ui;
+ wpassdlg = WID ("change-password");
+
+ /* Go! */
+ gtk_widget_show_all (wpassdlg);
+
+ do {
+ result = gtk_dialog_run (GTK_DIALOG (wpassdlg));
+ response = passdlg_process_response (pdialog, result);
+ } while (response);
+
+ /* Clean up */
+ stop_passwd (pdialog);
+ gtk_widget_destroy (wpassdlg);
+ g_queue_free (pdialog->backend_stdin_queue);
+ g_object_unref (dialog);
+ g_free (pdialog);
+}
diff --git a/capplets/about-me/mate-about-me-password.h b/capplets/about-me/mate-about-me-password.h
new file mode 100644
index 00000000..39f67cd8
--- /dev/null
+++ b/capplets/about-me/mate-about-me-password.h
@@ -0,0 +1,9 @@
+#ifndef __MATE_ABOUT_ME_PASSWORD_H__
+#define __MATE_ABOUT_ME_PASSWORD_H__
+
+#include <gtk/gtk.h>
+
+void
+mate_about_me_password (GtkWindow *parent);
+
+#endif /* __MATE_ABOUT_ME_PASSWORD_H__ */
diff --git a/capplets/about-me/mate-about-me-password.ui b/capplets/about-me/mate-about-me-password.ui
new file mode 100644
index 00000000..b9c433a5
--- /dev/null
+++ b/capplets/about-me/mate-about-me-password.ui
@@ -0,0 +1,319 @@
+<?xml version="1.0"?>
+<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-naming-policy toplevel-contextual -->
+ <object class="GtkDialog" id="change-password">
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes">Change password</property>
+ <property name="resizable">False</property>
+ <property name="type_hint">dialog</property>
+ <property name="has_separator">False</property>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkHBox" id="container-hbox">
+ <property name="visible">True</property>
+ <property name="border_width">6</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkImage" id="dialog-image">
+ <property name="visible">True</property>
+ <property name="yalign">0</property>
+ <property name="icon_name">gtk-dialog-authentication</property>
+ <property name="icon-size">6</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="main-vbox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="header-label">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Change your password</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="1.2"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="description-label">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="label" translatable="yes">To change your password, enter your current password in the field below and click &lt;b&gt;Authenticate&lt;/b&gt;.
+After you have authenticated, enter your new password, retype it for verification and click &lt;b&gt;Change password&lt;/b&gt;.</property>
+ <property name="use_markup">True</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="entry-hbox">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkVBox" id="entry-labels-vbox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkLabel" id="current-password-label">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Current _password:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">current-password</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="new-password-label">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_New password:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">new-password</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="retyped-password-label">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Retype new password:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">retyped-password</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="entry-vbox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkHBox" id="auth-hbox">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkEntry" id="current-password">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="authenticate-button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="xscale">0</property>
+ <property name="yscale">0</property>
+ <child>
+ <object class="GtkHBox" id="hbox73">
+ <property name="visible">True</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="stock">gtk-apply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1070">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Authenticate</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="new-password">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="retyped-password">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="activates_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="status-label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Please type your password again in the &lt;b&gt;Retype new password&lt;/b&gt; field.</property>
+ <property name="use_markup">True</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action-area">
+ <property name="visible">True</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="cancel-button">
+ <property name="label">gtk-close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="change-password-button">
+ <property name="label" translatable="yes">Change pa_ssword</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-7">cancel-button</action-widget>
+ <action-widget response="-5">change-password-button</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/capplets/about-me/mate-about-me.c b/capplets/about-me/mate-about-me.c
new file mode 100644
index 00000000..0935ab51
--- /dev/null
+++ b/capplets/about-me/mate-about-me.c
@@ -0,0 +1,1005 @@
+/* mate-about-me.c
+ * Copyright (C) 2002 Diego Gonzalez
+ *
+ * Written by: Diego Gonzalez <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <glib/gstdio.h>
+#include <gio/gio.h>
+#include <mateconf/mateconf-client.h>
+#include <unistd.h>
+#include <libebook/e-book.h>
+#include <dbus/dbus-glib-bindings.h>
+
+#define MATE_DESKTOP_USE_UNSTABLE_API
+#include <libmateui/mate-desktop-thumbnail.h>
+
+#include "e-image-chooser.h"
+#include "mate-about-me-password.h"
+#include "mate-about-me-fingerprint.h"
+#include "marshal.h"
+
+#include "capplet-util.h"
+
+#define MAX_HEIGHT 150
+#define MAX_WIDTH 150
+
+#define EMAIL_SLOTS 4
+
+typedef struct {
+ EContact *contact;
+ EBook *book;
+
+ GtkBuilder *dialog;
+ GtkWidget *enable_fingerprint_button;
+ GtkWidget *disable_fingerprint_button;
+ GtkWidget *image_chooser;
+
+ GdkScreen *screen;
+ GtkIconTheme *theme;
+ MateDesktopThumbnailFactory *thumbs;
+
+ EContactAddress *addr1;
+ EContactAddress *addr2;
+ gchar *email[EMAIL_SLOTS];
+ const gchar *email_types[EMAIL_SLOTS];
+
+ gboolean have_image;
+ gboolean image_changed;
+ gboolean create_self;
+
+ gchar *person;
+ gchar *login;
+ gchar *username;
+
+ guint commit_timeout_id;
+} MateAboutMe;
+
+static MateAboutMe *me = NULL;
+
+struct WidToCid {
+ gchar *wid;
+ guint cid;
+};
+
+enum {
+ ADDRESS_STREET = 1,
+ ADDRESS_POBOX,
+ ADDRESS_LOCALITY,
+ ADDRESS_CODE,
+ ADDRESS_REGION,
+ ADDRESS_COUNTRY
+};
+
+#define EMAIL_WORK 0
+#define EMAIL_HOME 1
+#define ADDRESS_HOME 21
+#define ADDRESS_WORK 27
+
+struct WidToCid ids[] = {
+
+ { "email-work-e", 0 }, /* 00 */
+ { "email-home-e", 1 }, /* 01 */
+
+ { "phone-home-e", E_CONTACT_PHONE_HOME }, /* 02 */
+ { "phone-mobile-e", E_CONTACT_PHONE_MOBILE }, /* 03 */
+ { "phone-work-e", E_CONTACT_PHONE_BUSINESS }, /* 04 */
+ { "phone-work-fax-e", E_CONTACT_PHONE_BUSINESS_FAX }, /* 05 */
+
+ { "im-jabber-e", E_CONTACT_IM_JABBER_HOME_1 }, /* 06 */
+ { "im-msn-e", E_CONTACT_IM_MSN_HOME_1 }, /* 07 */
+ { "im-icq-e", E_CONTACT_IM_ICQ_HOME_1 }, /* 08 */
+ { "im-yahoo-e", E_CONTACT_IM_YAHOO_HOME_1 }, /* 09 */
+ { "im-aim-e", E_CONTACT_IM_AIM_HOME_1 }, /* 10 */
+ { "im-groupwise-e", E_CONTACT_IM_GROUPWISE_HOME_1 }, /* 11 */
+
+ { "web-homepage-e", E_CONTACT_HOMEPAGE_URL }, /* 12 */
+ { "web-calendar-e", E_CONTACT_CALENDAR_URI }, /* 13 */
+ { "web-weblog-e", E_CONTACT_BLOG_URL }, /* 14 */
+
+ { "job-profession-e", E_CONTACT_ROLE }, /* 15 */
+ { "job-title-e", E_CONTACT_TITLE }, /* 16 */
+ { "job-dept-e", E_CONTACT_ORG_UNIT }, /* 17 */
+ { "job-assistant-e", E_CONTACT_ASSISTANT }, /* 18 */
+ { "job-company-e", E_CONTACT_ORG }, /* 19 */
+ { "job-manager-e", E_CONTACT_MANAGER }, /* 20 */
+
+ { "addr-street-1", ADDRESS_STREET }, /* 21 */
+ { "addr-po-1", ADDRESS_POBOX }, /* 22 */
+ { "addr-locality-1", ADDRESS_LOCALITY }, /* 23 */
+ { "addr-code-1", ADDRESS_CODE }, /* 24 */
+ { "addr-region-1", ADDRESS_REGION }, /* 25 */
+ { "addr-country-1", ADDRESS_COUNTRY }, /* 26 */
+
+ { "addr-street-2", ADDRESS_STREET }, /* 27 */
+ { "addr-po-2", ADDRESS_POBOX }, /* 28 */
+ { "addr-locality-2", ADDRESS_LOCALITY }, /* 29 */
+ { "addr-code-2", ADDRESS_CODE }, /* 30 */
+ { "addr-region-2", ADDRESS_REGION }, /* 31 */
+ { "addr-country-2", ADDRESS_COUNTRY }, /* 32 */
+
+ { NULL, 0 }
+};
+
+#define ATTRIBUTE_HOME "HOME"
+#define ATTRIBUTE_WORK "WORK"
+#define ATTRIBUTE_OTHER "OTHER"
+
+static void about_me_set_address_field (EContactAddress *, guint, gchar *);
+
+
+/*** Utility functions ***/
+static void
+about_me_error (GtkWindow *parent, gchar *str)
+{
+ GtkWidget *dialog;
+
+ dialog = gtk_message_dialog_new (parent,
+ GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_OK, str);
+
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+}
+
+/********************/
+static void
+about_me_destroy (void)
+{
+ e_contact_address_free (me->addr1);
+ e_contact_address_free (me->addr2);
+
+ if (me->contact)
+ g_object_unref (me->contact);
+ if (me->book)
+ g_object_unref (me->book);
+ if (me->dialog)
+ g_object_unref (me->dialog);
+
+ g_free (me->email[0]);
+ g_free (me->email[1]);
+ g_free (me->email[2]);
+ g_free (me->email[3]);
+
+ g_free (me->person);
+ g_free (me->login);
+ g_free (me->username);
+ g_free (me);
+ me = NULL;
+}
+
+static void
+about_me_update_email (MateAboutMe *me)
+{
+ GList *attrs = NULL;
+ gint i;
+
+ for (i = 0; i < EMAIL_SLOTS; ++i) {
+ if (me->email[i] != NULL) {
+ EVCardAttribute *attr;
+ const gchar *type = me->email_types[i];
+
+ attr = e_vcard_attribute_new (NULL, EVC_EMAIL);
+
+ e_vcard_attribute_add_param_with_value (attr,
+ e_vcard_attribute_param_new (EVC_TYPE),
+ type ? type : ATTRIBUTE_OTHER);
+
+ e_vcard_attribute_add_value (attr, me->email[i]);
+ attrs = g_list_append (attrs, attr);
+ }
+ }
+
+ e_contact_set_attributes (me->contact, E_CONTACT_EMAIL, attrs);
+
+ g_list_foreach (attrs, (GFunc) e_vcard_attribute_free, NULL);
+ g_list_free (attrs);
+}
+
+static void
+about_me_commit (MateAboutMe *me)
+{
+ EContactName *name;
+
+ char *strings[4], **stringptr;
+ char *fileas;
+
+ name = NULL;
+
+ if (me->create_self) {
+ if (me->username == NULL)
+ fileas = g_strdup ("Myself");
+ else {
+ name = e_contact_name_from_string (me->username);
+
+ stringptr = strings;
+ if (name->family && *name->family)
+ *(stringptr++) = name->family;
+ if (name->given && *name->given)
+ *(stringptr++) = name->given;
+ *stringptr = NULL;
+ fileas = g_strjoinv (", ", strings);
+ }
+
+ e_contact_set (me->contact, E_CONTACT_FILE_AS, fileas);
+ e_contact_set (me->contact, E_CONTACT_NICKNAME, me->login);
+ e_contact_set (me->contact, E_CONTACT_FULL_NAME, me->username);
+
+ e_contact_name_free (name);
+ g_free (fileas);
+ }
+
+ about_me_update_email (me);
+
+ if (me->create_self) {
+ e_book_add_contact (me->book, me->contact, NULL);
+ e_book_set_self (me->book, me->contact, NULL);
+ } else {
+ if (!e_book_commit_contact (me->book, me->contact, NULL))
+ g_warning ("Could not save contact information");
+ }
+
+ me->create_self = FALSE;
+}
+
+static gboolean
+about_me_commit_from_timeout (MateAboutMe *me)
+{
+ about_me_commit (me);
+
+ return FALSE;
+}
+
+static gboolean
+about_me_focus_out (GtkWidget *widget, GdkEventFocus *event, MateAboutMe *unused)
+{
+ gchar *str;
+ const gchar *wid;
+ gint i;
+
+ if (me == NULL)
+ return FALSE;
+
+ wid = gtk_buildable_get_name (GTK_BUILDABLE (widget));
+
+ if (wid == NULL)
+ return FALSE;
+
+ for (i = 0; ids[i].wid != NULL; i++)
+ if (strcmp (ids[i].wid, wid) == 0)
+ break;
+
+ if (GTK_IS_ENTRY (widget)) {
+ str = gtk_editable_get_chars (GTK_EDITABLE (widget), 0, -1);
+ } else if (GTK_IS_TEXT_VIEW (widget)) {
+ GtkTextBuffer *buffer;
+ GtkTextIter iter_start;
+ GtkTextIter iter_end;
+
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
+ gtk_text_buffer_get_start_iter (buffer, &iter_start);
+ iter_end = iter_start;
+ gtk_text_iter_forward_to_end (&iter_end);
+ str = gtk_text_iter_get_text (&iter_start, &iter_end);
+ } else {
+ return FALSE;
+ }
+
+ if (i == EMAIL_HOME || i == EMAIL_WORK) {
+
+ g_free (me->email[ids[i].cid]);
+ if (str[0] == '\0')
+ me->email[ids[i].cid] = NULL;
+ else
+ me->email[ids[i].cid] = g_strdup (str);
+ me->email_types[ids[i].cid] = (i == EMAIL_HOME) ? ATTRIBUTE_HOME : ATTRIBUTE_WORK;
+ /* FIXME: i'm getting an empty address field in evolution */
+ } else if (i >= ADDRESS_HOME && i < ADDRESS_WORK) {
+ about_me_set_address_field (me->addr1, ids[i].cid, str);
+ e_contact_set (me->contact, E_CONTACT_ADDRESS_HOME, me->addr1);
+ } else if (i >= ADDRESS_WORK) {
+ about_me_set_address_field (me->addr2, ids[i].cid, str);
+ e_contact_set (me->contact, E_CONTACT_ADDRESS_WORK, me->addr2);
+ } else {
+ e_contact_set (me->contact, ids[i].cid, str);
+ }
+
+ g_free (str);
+
+ if (me->commit_timeout_id) {
+ g_source_remove (me->commit_timeout_id);
+ }
+
+ me->commit_timeout_id = g_timeout_add (600, (GSourceFunc) about_me_commit_from_timeout, me);
+
+ return FALSE;
+}
+
+/*
+ * Helpers
+ */
+
+static gchar *
+about_me_get_address_field (EContactAddress *addr, guint cid)
+{
+ gchar *str;
+
+ if (addr == NULL) {
+ return NULL;
+ }
+
+ switch (cid) {
+ case ADDRESS_STREET:
+ str = addr->street;
+ break;
+ case ADDRESS_POBOX:
+ str = addr->po;
+ break;
+ case ADDRESS_LOCALITY:
+ str = addr->locality;
+ break;
+ case ADDRESS_CODE:
+ str = addr->code;
+ break;
+ case ADDRESS_REGION:
+ str = addr->region;
+ break;
+ case ADDRESS_COUNTRY:
+ str = addr->country;
+ break;
+ default:
+ str = NULL;
+ break;
+ }
+
+ return str;
+}
+
+static void
+about_me_set_address_field (EContactAddress *addr, guint cid, gchar *str)
+{
+ switch (cid) {
+ case ADDRESS_STREET:
+ g_free (addr->street);
+ addr->street = g_strdup (str);
+ break;
+ case ADDRESS_POBOX:
+ g_free (addr->po);
+ addr->po = g_strdup (str);
+ break;
+ case ADDRESS_LOCALITY:
+ g_free (addr->locality);
+ addr->locality = g_strdup (str);
+ break;
+ case ADDRESS_CODE:
+ g_free (addr->code);
+ addr->code = g_strdup (str);
+ break;
+ case ADDRESS_REGION:
+ g_free (addr->region);
+ addr->region = g_strdup (str);
+ break;
+ case ADDRESS_COUNTRY:
+ g_free (addr->country);
+ addr->country = g_strdup (str);
+ break;
+ }
+}
+
+static void
+about_me_setup_email (MateAboutMe *me)
+{
+ GList *attrs, *la;
+ gboolean has_home = FALSE, has_work = FALSE;
+ guint i;
+
+ attrs = e_contact_get_attributes (me->contact, E_CONTACT_EMAIL);
+
+ for (la = attrs, i = 0; la; la = la->next, ++i) {
+ EVCardAttribute *a = la->data;
+
+ me->email[i] = e_vcard_attribute_get_value (a);
+ if (e_vcard_attribute_has_type (a, ATTRIBUTE_HOME)) {
+ me->email_types[i] = ATTRIBUTE_HOME;
+ if (!has_home) {
+ ids[EMAIL_HOME].cid = i;
+ has_home = TRUE;
+ }
+ } else if (e_vcard_attribute_has_type (a, ATTRIBUTE_WORK)) {
+ me->email_types[i] = ATTRIBUTE_WORK;
+ if (!has_work) {
+ ids[EMAIL_WORK].cid = i;
+ has_work = TRUE;
+ }
+ } else {
+ me->email_types[i] = ATTRIBUTE_OTHER;
+ }
+
+ e_vcard_attribute_free (a);
+ }
+
+ g_list_free (attrs);
+
+ if (ids[EMAIL_HOME].cid == ids[EMAIL_WORK].cid) {
+ if (has_home)
+ ids[EMAIL_WORK].cid = 1;
+ else
+ ids[EMAIL_HOME].cid = 0;
+ }
+
+ me->email_types[ids[EMAIL_WORK].cid] = ATTRIBUTE_WORK;
+ me->email_types[ids[EMAIL_HOME].cid] = ATTRIBUTE_HOME;
+}
+
+/**
+ * about_me_load_string_field:
+ *
+ * wid: UI widget name
+ * cid: id of the field (EDS id)
+ * aid: position in the array WidToCid
+ **/
+
+static void
+about_me_load_string_field (MateAboutMe *me, const gchar *wid, guint cid, guint aid)
+{
+ GtkWidget *widget;
+ GtkBuilder *dialog;
+ const gchar *str;
+
+ dialog = me->dialog;
+
+ widget = WID (wid);
+
+ if (me->create_self == TRUE) {
+ g_signal_connect (widget, "focus-out-event", G_CALLBACK (about_me_focus_out), me);
+ return;
+ }
+
+ if (aid == EMAIL_HOME || aid == EMAIL_WORK) {
+ str = e_contact_get_const (me->contact, E_CONTACT_EMAIL_1 + cid);
+ } else if (aid >= ADDRESS_HOME && aid < ADDRESS_WORK) {
+ str = about_me_get_address_field (me->addr1, cid);
+ } else if (aid >= ADDRESS_WORK) {
+ str = about_me_get_address_field (me->addr2, cid);
+ } else {
+ str = e_contact_get_const (me->contact, cid);
+ }
+
+ str = str ? str : "";
+
+ if (GTK_IS_ENTRY (widget)) {
+ gtk_entry_set_text (GTK_ENTRY (widget), str);
+ } else if (GTK_IS_TEXT_VIEW (widget)) {
+ GtkTextBuffer *buffer;
+
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
+ gtk_text_buffer_set_text (buffer, str, -1);
+ }
+
+ g_signal_connect (widget, "focus-out-event", G_CALLBACK (about_me_focus_out), me);
+}
+
+static void
+about_me_load_photo (MateAboutMe *me, EContact *contact)
+{
+ GtkBuilder *dialog;
+ EContactPhoto *photo;
+
+ dialog = me->dialog;
+
+ if (me->person)
+ e_image_chooser_set_from_file (E_IMAGE_CHOOSER (me->image_chooser), me->person);
+
+ photo = e_contact_get (contact, E_CONTACT_PHOTO);
+
+ if (photo && photo->type == E_CONTACT_PHOTO_TYPE_INLINED) {
+ me->have_image = TRUE;
+ e_image_chooser_set_image_data (E_IMAGE_CHOOSER (me->image_chooser),
+ (char *) photo->data.inlined.data, photo->data.inlined.length);
+ e_contact_photo_free (photo);
+ } else {
+ me->have_image = FALSE;
+ }
+}
+
+static void
+about_me_update_photo (MateAboutMe *me)
+{
+ GtkBuilder *dialog;
+ EContactPhoto *photo;
+ gchar *file;
+ GError *error;
+
+ guchar *data;
+ gsize length;
+
+ dialog = me->dialog;
+
+
+ if (me->image_changed && me->have_image) {
+ GdkPixbufLoader *loader = gdk_pixbuf_loader_new ();
+ GdkPixbuf *pixbuf, *scaled;
+ int height, width;
+ gboolean do_scale = FALSE;
+ float scale;
+
+ e_image_chooser_get_image_data (E_IMAGE_CHOOSER (me->image_chooser), (char **) &data, &length);
+
+ /* Before updating the image in EDS scale it to a reasonable size
+ so that the user doesn't get an application that does not respond
+ or that takes 100% CPU */
+ gdk_pixbuf_loader_write (loader, data, length, NULL);
+ gdk_pixbuf_loader_close (loader, NULL);
+
+ pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
+
+ if (pixbuf)
+ g_object_ref (pixbuf);
+
+ g_object_unref (loader);
+
+ height = gdk_pixbuf_get_height (pixbuf);
+ width = gdk_pixbuf_get_width (pixbuf);
+
+ if (height >= width && height > MAX_HEIGHT) {
+ scale = (float)MAX_HEIGHT/height;
+ do_scale = TRUE;
+ } else if (width > height && width > MAX_WIDTH) {
+ scale = (float)MAX_WIDTH/width;
+ do_scale = TRUE;
+ }
+
+ if (do_scale) {
+ char *scaled_data = NULL;
+ gsize scaled_length;
+
+ scaled = gdk_pixbuf_scale_simple (pixbuf, width*scale, height*scale, GDK_INTERP_BILINEAR);
+ gdk_pixbuf_save_to_buffer (scaled, &scaled_data, &scaled_length, "png", NULL,
+ "compression", "9", NULL);
+
+ g_free (data);
+ data = (guchar *) scaled_data;
+ length = scaled_length;
+ }
+
+ photo = g_new0 (EContactPhoto, 1);
+ photo->type = E_CONTACT_PHOTO_TYPE_INLINED;
+ photo->data.inlined.data = data;
+ photo->data.inlined.length = length;
+ e_contact_set (me->contact, E_CONTACT_PHOTO, photo);
+
+ /* Save the image for MDM */
+ /* FIXME: I would have to read the default used by the mdmgreeter program */
+ error = NULL;
+ file = g_build_filename (g_get_home_dir (), ".face", NULL);
+ if (g_file_set_contents (file,
+ (gchar *) photo->data.inlined.data,
+ photo->data.inlined.length,
+ &error) != FALSE) {
+ g_chmod (file, 0644);
+ } else {
+ g_warning ("Could not create %s: %s", file, error->message);
+ g_error_free (error);
+ }
+
+ g_free (file);
+
+ e_contact_photo_free (photo);
+
+ } else if (me->image_changed && !me->have_image) {
+ /* Update the image in the card */
+ e_contact_set (me->contact, E_CONTACT_PHOTO, NULL);
+
+ file = g_build_filename (g_get_home_dir (), ".face", NULL);
+
+ g_unlink (file);
+
+ g_free (file);
+ }
+
+ about_me_commit (me);
+}
+
+static void
+about_me_load_info (MateAboutMe *me)
+{
+ gint i;
+
+ if (me->create_self == FALSE) {
+ me->addr1 = e_contact_get (me->contact, E_CONTACT_ADDRESS_HOME);
+ if (me->addr1 == NULL)
+ me->addr1 = g_new0 (EContactAddress, 1);
+ me->addr2 = e_contact_get (me->contact, E_CONTACT_ADDRESS_WORK);
+ if (me->addr2 == NULL)
+ me->addr2 = g_new0 (EContactAddress, 1);
+ } else {
+ me->addr1 = g_new0 (EContactAddress, 1);
+ me->addr2 = g_new0 (EContactAddress, 1);
+ }
+
+ for (i = 0; ids[i].wid != NULL; i++) {
+ about_me_load_string_field (me, ids[i].wid, ids[i].cid, i);
+ }
+
+ set_fingerprint_label (me->enable_fingerprint_button,
+ me->disable_fingerprint_button);
+}
+
+static void
+about_me_update_preview (GtkFileChooser *chooser,
+ MateAboutMe *me)
+{
+ gchar *uri;
+
+ uri = gtk_file_chooser_get_preview_uri (chooser);
+
+ if (uri) {
+ GtkWidget *image;
+ GdkPixbuf *pixbuf = NULL;
+ GFile *file;
+ GFileInfo *file_info;
+
+ if (!me->thumbs)
+ me->thumbs = mate_desktop_thumbnail_factory_new (MATE_DESKTOP_THUMBNAIL_SIZE_NORMAL);
+
+ file = g_file_new_for_uri (uri);
+ file_info = g_file_query_info (file,
+ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+ G_FILE_QUERY_INFO_NONE,
+ NULL, NULL);
+ g_object_unref (file);
+
+ if (file_info != NULL) {
+ const gchar *content_type;
+
+ content_type = g_file_info_get_content_type (file_info);
+ if (content_type) {
+ gchar *mime_type;
+
+ mime_type = g_content_type_get_mime_type (content_type);
+
+ pixbuf = mate_desktop_thumbnail_factory_generate_thumbnail (me->thumbs,
+ uri,
+ mime_type);
+ g_free (mime_type);
+ }
+ g_object_unref (file_info);
+ }
+
+ image = gtk_file_chooser_get_preview_widget (chooser);
+
+ if (pixbuf != NULL) {
+ gtk_image_set_from_pixbuf (GTK_IMAGE (image), pixbuf);
+ g_object_unref (pixbuf);
+ } else {
+ gtk_image_set_from_stock (GTK_IMAGE (image),
+ "gtk-dialog-question",
+ GTK_ICON_SIZE_DIALOG);
+ }
+ }
+ gtk_file_chooser_set_preview_widget_active (chooser, TRUE);
+}
+
+static void
+about_me_image_clicked_cb (GtkWidget *button, MateAboutMe *me)
+{
+ GtkFileChooser *chooser_dialog;
+ gint response;
+ GtkBuilder *dialog;
+ GtkWidget *image;
+ const gchar *chooser_dir = DATADIR"/pixmaps/faces";
+ const gchar *pics_dir;
+ GtkFileFilter *filter;
+
+ dialog = me->dialog;
+
+ chooser_dialog = GTK_FILE_CHOOSER (
+ gtk_file_chooser_dialog_new (_("Select Image"), GTK_WINDOW (WID ("about-me-dialog")),
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ _("No Image"), GTK_RESPONSE_NO,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+ NULL));
+ gtk_window_set_modal (GTK_WINDOW (chooser_dialog), TRUE);
+ gtk_dialog_set_default_response (GTK_DIALOG (chooser_dialog), GTK_RESPONSE_ACCEPT);
+
+ gtk_file_chooser_add_shortcut_folder (chooser_dialog, chooser_dir, NULL);
+ pics_dir = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES);
+ if (pics_dir != NULL)
+ gtk_file_chooser_add_shortcut_folder (chooser_dialog, pics_dir, NULL);
+
+ if (!g_file_test (chooser_dir, G_FILE_TEST_IS_DIR))
+ chooser_dir = g_get_home_dir ();
+
+ gtk_file_chooser_set_current_folder (chooser_dialog, chooser_dir);
+ gtk_file_chooser_set_use_preview_label (chooser_dialog, FALSE);
+
+ image = gtk_image_new ();
+ gtk_file_chooser_set_preview_widget (chooser_dialog, image);
+ gtk_widget_set_size_request (image, 128, -1);
+
+ gtk_widget_show (image);
+
+ g_signal_connect (chooser_dialog, "update-preview",
+ G_CALLBACK (about_me_update_preview), me);
+
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (filter, _("Images"));
+ gtk_file_filter_add_pixbuf_formats (filter);
+ gtk_file_chooser_add_filter (chooser_dialog, filter);
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (filter, _("All Files"));
+ gtk_file_filter_add_pattern(filter, "*");
+ gtk_file_chooser_add_filter (chooser_dialog, filter);
+
+ response = gtk_dialog_run (GTK_DIALOG (chooser_dialog));
+
+ if (response == GTK_RESPONSE_ACCEPT) {
+ gchar* filename;
+
+ filename = gtk_file_chooser_get_filename (chooser_dialog);
+ me->have_image = TRUE;
+ me->image_changed = TRUE;
+
+ e_image_chooser_set_from_file (E_IMAGE_CHOOSER (me->image_chooser), filename);
+ g_free (filename);
+ about_me_update_photo (me);
+ } else if (response == GTK_RESPONSE_NO) {
+ me->have_image = FALSE;
+ me->image_changed = TRUE;
+ e_image_chooser_set_from_file (E_IMAGE_CHOOSER (me->image_chooser), me->person);
+ about_me_update_photo (me);
+ }
+
+ gtk_widget_destroy (GTK_WIDGET (chooser_dialog));
+}
+
+static void
+about_me_image_changed_cb (GtkWidget *widget, MateAboutMe *me)
+{
+ me->have_image = TRUE;
+ me->image_changed = TRUE;
+ about_me_update_photo (me);
+}
+
+/* About Me Dialog Callbacks */
+
+static void
+about_me_icon_theme_changed (GtkWindow *window,
+ GtkIconTheme *theme)
+{
+ GtkIconInfo *icon;
+
+ icon = gtk_icon_theme_lookup_icon (me->theme, "stock_person", 80, 0);
+ if (icon == NULL) {
+ g_debug ("Icon not found");
+ }
+ g_free (me->person);
+ me->person = g_strdup (gtk_icon_info_get_filename (icon));
+
+ gtk_icon_info_free (icon);
+
+ if (me->have_image)
+ e_image_chooser_set_from_file (E_IMAGE_CHOOSER (me->image_chooser), me->person);
+}
+
+static void
+about_me_button_clicked_cb (GtkDialog *dialog, gint response_id, MateAboutMe *me)
+{
+ if (response_id == GTK_RESPONSE_HELP)
+ g_print ("Help goes here");
+ else {
+ if (me->commit_timeout_id) {
+ g_source_remove (me->commit_timeout_id);
+ about_me_commit (me);
+ }
+
+ about_me_destroy ();
+ gtk_main_quit ();
+ }
+}
+
+static void
+about_me_passwd_clicked_cb (GtkWidget *button, MateAboutMe *me)
+{
+ GtkBuilder *dialog;
+
+ dialog = me->dialog;
+ mate_about_me_password (GTK_WINDOW (WID ("about-me-dialog")));
+}
+
+static void
+about_me_fingerprint_button_clicked_cb (GtkWidget *button, MateAboutMe *me)
+{
+ fingerprint_button_clicked (me->dialog,
+ me->enable_fingerprint_button,
+ me->disable_fingerprint_button);
+}
+
+static gint
+about_me_setup_dialog (void)
+{
+ GtkWidget *widget;
+ GtkWidget *main_dialog;
+ GtkIconInfo *icon;
+ GtkBuilder *dialog;
+ GError *error = NULL;
+ GList *chain;
+ gchar *str;
+
+ me = g_new0 (MateAboutMe, 1);
+
+ dialog = gtk_builder_new ();
+ gtk_builder_add_from_file (dialog, MATECC_UI_DIR "/mate-about-me-dialog.ui", NULL);
+
+ me->image_chooser = e_image_chooser_new ();
+ gtk_container_add (GTK_CONTAINER (WID ("button-image")), me->image_chooser);
+
+ if (dialog == NULL) {
+ about_me_destroy ();
+ return -1;
+ }
+
+ me->dialog = dialog;
+
+ /* Connect the close button signal */
+ main_dialog = WID ("about-me-dialog");
+ g_signal_connect (main_dialog, "response",
+ G_CALLBACK (about_me_button_clicked_cb), me);
+
+ gtk_window_set_resizable (GTK_WINDOW (main_dialog), FALSE);
+ capplet_set_icon (main_dialog, "user-info");
+
+ /* Setup theme details */
+ me->screen = gtk_window_get_screen (GTK_WINDOW (main_dialog));
+ me->theme = gtk_icon_theme_get_for_screen (me->screen);
+
+ icon = gtk_icon_theme_lookup_icon (me->theme, "stock_person", 80, 0);
+ if (icon != NULL) {
+ me->person = g_strdup (gtk_icon_info_get_filename (icon));
+ gtk_icon_info_free (icon);
+ }
+
+ g_signal_connect_object (me->theme, "changed",
+ G_CALLBACK (about_me_icon_theme_changed),
+ main_dialog,
+ G_CONNECT_SWAPPED);
+
+ /* Get the self contact */
+ if (!e_book_get_self (&me->contact, &me->book, &error)) {
+ if (error->code == E_BOOK_ERROR_PROTOCOL_NOT_SUPPORTED) {
+ about_me_error (NULL, _("There was an error while trying to get the addressbook information\n" \
+ "Evolution Data Server can't handle the protocol"));
+ g_clear_error (&error);
+ about_me_destroy ();
+ return -1;
+ }
+
+ g_clear_error (&error);
+
+ me->create_self = TRUE;
+ me->contact = e_contact_new ();
+
+ if (me->book == NULL) {
+ me->book = e_book_new_system_addressbook (&error);
+ if (me->book == NULL || error != NULL) {
+ g_error ("%s", error->message);
+ g_clear_error (&error);
+ }
+
+ if (e_book_open (me->book, FALSE, NULL) == FALSE) {
+ about_me_error (GTK_WINDOW (main_dialog),
+ _("Unable to open address book"));
+ g_clear_error (&error);
+ }
+ }
+ } else {
+ about_me_setup_email (me);
+ }
+
+ me->login = g_strdup (g_get_user_name ());
+ me->username = g_strdup (g_get_real_name ());
+
+ /* Contact Tab */
+ about_me_load_photo (me, me->contact);
+
+ widget = WID ("fullname");
+ str = g_strdup_printf ("<b><span size=\"xx-large\">%s</span></b>", me->username);
+
+ gtk_label_set_markup (GTK_LABEL (widget), str);
+ g_free (str);
+
+ widget = WID ("login");
+ gtk_label_set_text (GTK_LABEL (widget), me->login);
+
+ str = g_strdup_printf (_("About %s"), me->username);
+ gtk_window_set_title (GTK_WINDOW (main_dialog), str);
+ g_free (str);
+
+ widget = WID ("password");
+ g_signal_connect (widget, "clicked",
+ G_CALLBACK (about_me_passwd_clicked_cb), me);
+
+ widget = WID ("button-image");
+ g_signal_connect (widget, "clicked",
+ G_CALLBACK (about_me_image_clicked_cb), me);
+
+ me->enable_fingerprint_button = WID ("enable_fingerprint_button");
+ me->disable_fingerprint_button = WID ("disable_fingerprint_button");
+
+ g_signal_connect (me->enable_fingerprint_button, "clicked",
+ G_CALLBACK (about_me_fingerprint_button_clicked_cb), me);
+ g_signal_connect (me->disable_fingerprint_button, "clicked",
+ G_CALLBACK (about_me_fingerprint_button_clicked_cb), me);
+
+ g_signal_connect (me->image_chooser, "changed",
+ G_CALLBACK (about_me_image_changed_cb), me);
+
+ /* Address tab: set up the focus chains */
+ chain = g_list_prepend (NULL, WID ("addr-country-1"));
+ chain = g_list_prepend (chain, WID ("addr-po-1"));
+ chain = g_list_prepend (chain, WID ("addr-region-1"));
+ chain = g_list_prepend (chain, WID ("addr-code-1"));
+ chain = g_list_prepend (chain, WID ("addr-locality-1"));
+ chain = g_list_prepend (chain, WID ("addr-scrolledwindow-1"));
+ widget = WID ("addr-table-1");
+ gtk_container_set_focus_chain (GTK_CONTAINER (widget), chain);
+ g_list_free (chain);
+
+ chain = g_list_prepend (NULL, WID ("addr-country-2"));
+ chain = g_list_prepend (chain, WID ("addr-po-2"));
+ chain = g_list_prepend (chain, WID ("addr-region-2"));
+ chain = g_list_prepend (chain, WID ("addr-code-2"));
+ chain = g_list_prepend (chain, WID ("addr-locality-2"));
+ chain = g_list_prepend (chain, WID ("addr-scrolledwindow-2"));
+ widget = WID ("addr-table-2");
+ gtk_container_set_focus_chain (GTK_CONTAINER (widget), chain);
+ g_list_free (chain);
+
+ about_me_load_info (me);
+
+ gtk_widget_show_all (main_dialog);
+
+ return 0;
+}
+
+int
+main (int argc, char **argv)
+{
+ int rc = 0;
+
+ capplet_init (NULL, &argc, &argv);
+
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ dbus_g_object_register_marshaller (fprintd_marshal_VOID__STRING_BOOLEAN,
+ G_TYPE_NONE, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_INVALID);
+
+ rc = about_me_setup_dialog ();
+
+ if (rc != -1) {
+ gtk_main ();
+ }
+
+ return rc;
+}
diff --git a/capplets/about-me/mate-about-me.desktop.in.in b/capplets/about-me/mate-about-me.desktop.in.in
new file mode 100644
index 00000000..e8393304
--- /dev/null
+++ b/capplets/about-me/mate-about-me.desktop.in.in
@@ -0,0 +1,14 @@
+[Desktop Entry]
+_Name=About Me
+_Comment=Set your personal information
+Exec=mate-about-me
+Icon=user-info
+Terminal=false
+Type=Application
+StartupNotify=true
+Categories=MATE;GTK;Settings;X-MATE-PersonalSettings;
+OnlyShowIn=MATE;
+X-MATE-Bugzilla-Bugzilla=MATE
+X-MATE-Bugzilla-Product=mate-control-center
+X-MATE-Bugzilla-Component=about-me
+X-MATE-Bugzilla-Version=@VERSION@