diff options
Diffstat (limited to 'capplets/about-me')
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 Binary files differnew file mode 100644 index 00000000..1a9cb2c7 --- /dev/null +++ b/capplets/about-me/icons/left-index-finger.png 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 Binary files differnew file mode 100644 index 00000000..978942ee --- /dev/null +++ b/capplets/about-me/icons/left-little-finger.png 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 Binary files differnew file mode 100644 index 00000000..406925e9 --- /dev/null +++ b/capplets/about-me/icons/left-middle-finger.png 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 Binary files differnew file mode 100644 index 00000000..169ff687 --- /dev/null +++ b/capplets/about-me/icons/left-ring-finger.png 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 Binary files differnew file mode 100644 index 00000000..eaf875d0 --- /dev/null +++ b/capplets/about-me/icons/left-thumb.png 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 Binary files differnew file mode 100644 index 00000000..d67150b1 --- /dev/null +++ b/capplets/about-me/icons/print_error.png 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 Binary files differnew file mode 100644 index 00000000..4dd615e7 --- /dev/null +++ b/capplets/about-me/icons/print_ok.png 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 Binary files differnew file mode 100644 index 00000000..4aaeaac4 --- /dev/null +++ b/capplets/about-me/icons/right-index-finger.png 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 Binary files differnew file mode 100644 index 00000000..17946afc --- /dev/null +++ b/capplets/about-me/icons/right-little-finger.png 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 Binary files differnew file mode 100644 index 00000000..71bd41ba --- /dev/null +++ b/capplets/about-me/icons/right-middle-finger.png 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 Binary files differnew file mode 100644 index 00000000..aa73ae6e --- /dev/null +++ b/capplets/about-me/icons/right-ring-finger.png 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 Binary files differnew file mode 100644 index 00000000..1c967d61 --- /dev/null +++ b/capplets/about-me/icons/right-thumb.png 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 <b>Authenticate</b>. +After you have authenticated, enter your new password, retype it for verification and click <b>Change password</b>.</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 <b>Retype new password</b> 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@ |