summaryrefslogtreecommitdiff
path: root/gui
diff options
context:
space:
mode:
authorWilliam Jon McCann <mccann@jhu.edu>2005-07-22 03:04:47 +0000
committerWilliam Jon McCann <mccann@src.gnome.org>2005-07-22 03:04:47 +0000
commit994a73e700ee228dc7f3960b4abd2f8aa214fb42 (patch)
treeb9161238e87d7fe2c3519a38a0ae19bc0e19a778 /gui
parent57f9d8f2523fd4339efba755b768fdadbe201aef (diff)
downloadgdm-994a73e700ee228dc7f3960b4abd2f8aa214fb42.tar.gz
New file. Add glade file. Rewritten to be more HIG compliant, use
2005-07-21 William Jon McCann <mccann@jhu.edu> * gui/gdmphotosetup.glade: New file. * gui/Makefile.am: Add glade file. * gui/gdmphotosetup.c: Rewritten to be more HIG compliant, use GtkIconView, include preview in file selector, and be instant apply.
Diffstat (limited to 'gui')
-rw-r--r--gui/Makefile.am2
-rw-r--r--gui/gdmphotosetup.c714
-rw-r--r--gui/gdmphotosetup.glade321
3 files changed, 732 insertions, 305 deletions
diff --git a/gui/Makefile.am b/gui/Makefile.am
index a54ac07b..ead31e0d 100644
--- a/gui/Makefile.am
+++ b/gui/Makefile.am
@@ -219,7 +219,7 @@ System_DATA = $(System_in_files:.desktop.in=.desktop)
@INTLTOOL_DESKTOP_RULE@
Gladedir = $(datadir)/gdm
-Glade_DATA = gdmsetup.glade gdmchooser.glade
+Glade_DATA = gdmsetup.glade gdmchooser.glade gdmphotosetup.glade
Iconsdir = $(datadir)/pixmaps
diff --git a/gui/gdmphotosetup.c b/gui/gdmphotosetup.c
index 14c184b3..18d5e136 100644
--- a/gui/gdmphotosetup.c
+++ b/gui/gdmphotosetup.c
@@ -1,6 +1,9 @@
-/*
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
* GDMphotosetup - graphical .gnome2/photo setup program for users
- * (c)2001 Queen of England
+ *
+ * Copyright (C) 2001 Queen of England
+ * Copyright (C) 2005 William Jon McCann <mccann@jhu.edu>
*
* 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
@@ -21,212 +24,438 @@
#include "config.h"
#include <sys/types.h>
#include <signal.h>
-#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <glib.h>
+#include <glib/gi18n.h>
#include <glib/gstdio.h>
-#include <libgnome/libgnome.h>
+#include <gtk/gtk.h>
+#include <glade/glade.h>
+#include <libgnome/libgnome.h> /* for gnome_config */
#include <libgnomeui/libgnomeui.h>
#include <viciousui.h>
#include "gdm.h"
-static GtkWidget *preview;
-static GtkWidget *current_image;
-static char *current_pix;
-static char *photofile;
-static char *facedir;
-static int max_width, max_height;
-static int response = -999;
+static GladeXML *xml;
+static char *photofile;
+static char *facedir;
+static int max_width, max_height;
-static gboolean
-gdm_check (void)
+static void
+dialog_response (GtkWidget *dialog,
+ int res,
+ gpointer data)
{
- GtkWidget *dialog;
- FILE *fp = NULL;
- long pid;
- char *pidfile;
-
- pidfile = ve_config_get_string (ve_config_get (GDM_CONFIG_FILE),
- GDM_KEY_PIDFILE);
-
- pid = 0;
- if (pidfile != NULL)
- VE_IGNORE_EINTR (fp = fopen (pidfile, "r"));
- if (fp != NULL) {
- int r;
- VE_IGNORE_EINTR (r = fscanf (fp, "%ld", &pid));
- VE_IGNORE_EINTR (fclose (fp));
- if (r != 1)
- pid = 0;
- }
+ if (res == GTK_RESPONSE_HELP)
+ return;
+
+ gtk_main_quit ();
+}
- g_free (pidfile);
-
- errno = 0;
- if (pid <= 1 ||
- (kill (pid, 0) < 0 &&
- errno != EPERM)) {
- dialog = ve_hig_dialog_new
- (NULL /* parent */,
- GTK_DIALOG_MODAL /* flags */,
- GTK_MESSAGE_WARNING,
- GTK_BUTTONS_OK,
- FALSE /* markup */,
- _("GDM (The GNOME Display Manager) "
- "is not running."),
- "%s\n%s",
- _("You might in fact be using a different "
- "display manager, such as KDM "
- "(KDE Display Manager) or xdm."),
- _("If you still wish to use this feature, "
- "either start GDM yourself or ask your "
- "system administrator to start GDM."));
-
- gtk_widget_show_all (dialog);
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- return FALSE;
+static GdkPixbuf *
+scale_pixbuf (GdkPixbuf *pixbuf)
+{
+ float scale_factor_x = 1.0;
+ float scale_factor_y = 1.0;
+ float scale_factor = 1.0;
+ GdkPixbuf *scaled = NULL;
+
+ /* Determine which dimension requires the smallest scale. */
+ if (gdk_pixbuf_get_width (pixbuf) > max_width)
+ scale_factor_x = (float) max_width /
+ (float) gdk_pixbuf_get_width (pixbuf);
+
+ if (gdk_pixbuf_get_height (pixbuf) > max_height)
+ scale_factor_y = (float) max_height /
+ (float) gdk_pixbuf_get_height (pixbuf);
+
+ if (scale_factor_x > scale_factor_y)
+ scale_factor = scale_factor_y;
+ else
+ scale_factor = scale_factor_x;
+
+ /* Only scale if it needs to be scaled smaller */
+ if (scale_factor >= 1.0) {
+ scaled = g_object_ref (pixbuf);
+ } else {
+ int scale_x = (int) (gdk_pixbuf_get_width (pixbuf) *
+ scale_factor);
+ int scale_y = (int) (gdk_pixbuf_get_height (pixbuf) *
+ scale_factor);
+
+ /* Scale bigger dimension to max icon height/width */
+ scaled = gdk_pixbuf_scale_simple (pixbuf,
+ scale_x,
+ scale_y,
+ GDK_INTERP_BILINEAR);
}
- return TRUE;
+ return scaled;
}
static void
-dialog_response (GtkWidget *dialog, int res, gpointer data)
+set_preview_pixbuf (GtkImage *image,
+ GdkPixbuf *pixbuf)
{
- response = res;
- gtk_main_quit ();
+ GdkPixbuf *preview_pixbuf;
+
+ preview_pixbuf = scale_pixbuf (pixbuf);
+ gtk_image_set_from_pixbuf (GTK_IMAGE (image), preview_pixbuf);
+
+ gdk_pixbuf_unref (preview_pixbuf);
}
static void
-update_preview_cb (GtkFileChooser *file_chooser, gpointer data)
+update_preview_cb (GtkFileChooser *file_chooser,
+ GtkImage *image)
{
- char *filename = gtk_file_chooser_get_preview_filename (file_chooser);
+ GdkPixbuf *pixbuf;
+ gboolean have_preview;
+ char *filename;
- if (filename != NULL) {
- GdkPixbuf *pixbuf;
- gboolean have_preview;
+ g_return_if_fail (GTK_IS_FILE_CHOOSER (file_chooser));
+ g_return_if_fail (GTK_IS_IMAGE (image));
- pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
- have_preview = (pixbuf != NULL);
- g_free (filename);
+ filename = gtk_file_chooser_get_preview_filename (file_chooser);
- if (pixbuf) {
- GdkPixbuf *preview_pixbuf;
- float scale_factor_x = 1.0;
- float scale_factor_y = 1.0;
- float scale_factor = 1.0;
-
- /* Determine which dimension requires the smallest scale. */
- if (gdk_pixbuf_get_width (pixbuf) > max_width)
- scale_factor_x = (float) max_width /
- (float) gdk_pixbuf_get_width (pixbuf);
- if (gdk_pixbuf_get_height (pixbuf) > max_height)
- scale_factor_y = (float) max_height /
- (float) gdk_pixbuf_get_height (pixbuf);
-
- if (scale_factor_x > scale_factor_y)
- scale_factor = scale_factor_y;
- else
- scale_factor = scale_factor_x;
-
- /* Only scale if it needs to be scaled smaller */
- if (scale_factor >= 1.0) {
- preview_pixbuf = pixbuf;
- } else {
- int scale_x = (int) (gdk_pixbuf_get_width (pixbuf) *
- scale_factor);
- int scale_y = (int) (gdk_pixbuf_get_height (pixbuf) *
- scale_factor);
-
- /* Scale bigger dimension to max icon height/width */
- preview_pixbuf = gdk_pixbuf_scale_simple (pixbuf,
- scale_x, scale_y, GDK_INTERP_BILINEAR);
- }
-
- gtk_image_set_from_pixbuf (GTK_IMAGE (preview), preview_pixbuf);
-
- gdk_pixbuf_unref (pixbuf);
- if (scale_factor != 1.0)
- gdk_pixbuf_unref (preview_pixbuf);
-
- gtk_file_chooser_set_preview_widget_active (file_chooser,
- have_preview);
- }
+ if (! filename) {
+ gtk_file_chooser_set_preview_widget_active (file_chooser, FALSE);
+ return;
+ }
+
+ pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
+ have_preview = (pixbuf != NULL);
+ g_free (filename);
+
+ if (pixbuf) {
+ set_preview_pixbuf (image, pixbuf);
+ gdk_pixbuf_unref (pixbuf);
}
+
+ gtk_file_chooser_set_preview_widget_active (file_chooser, have_preview);
}
static void
-install_response (GtkWidget *file_dialog, gint response, gpointer data)
+set_face_from_filename (const char *filename)
{
- if (response == GTK_RESPONSE_ACCEPT) {
- gtk_image_set_from_pixbuf (GTK_IMAGE (current_image),
- gtk_image_get_pixbuf (GTK_IMAGE (preview)));
- current_pix = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_dialog));
+ GtkWidget *image;
+ GdkPixbuf *pixbuf;
+ GdkPixbuf *scaled;
+
+ image = glade_xml_get_widget (xml, "face_image");
+
+ pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
+ scaled = scale_pixbuf (pixbuf);
+ g_object_unref (pixbuf);
+ pixbuf = scaled;
+
+ if (! pixbuf)
+ return;
+
+ if (gdk_pixbuf_save (pixbuf, photofile, "png", NULL, NULL) != TRUE) {
+ GtkWidget *d;
+ char *tmp = g_filename_to_utf8 (photofile, -1, NULL, NULL, NULL);
+
+ d = ve_hig_dialog_new (NULL /* parent */,
+ GTK_DIALOG_MODAL /* flags */,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_OK,
+ FALSE /* markup */,
+ _("Cannot open file"),
+ _("File %s cannot be opened for "
+ "writing\n"), tmp);
+
+ gtk_dialog_run (GTK_DIALOG (d));
+ gtk_widget_destroy (d);
+
+ g_free (tmp);
} else {
- gtk_image_set_from_pixbuf (GTK_IMAGE (preview),
- gtk_image_get_pixbuf (GTK_IMAGE (current_image)));
+ /* Change to g_chmod after glib 2.8 release */
+ chmod (photofile, 0644);
}
+ gtk_image_set_from_file (GTK_IMAGE (image), photofile);
+}
+
+static void
+install_response (GtkWidget *file_dialog,
+ gint response,
+ gpointer data)
+{
+ char *name = NULL;
+
+ if (response == GTK_RESPONSE_ACCEPT) {
+ name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_dialog));
+ set_face_from_filename (name);
+ }
+
+ g_free (name);
+
gtk_widget_destroy (file_dialog);
}
+static GtkWidget *
+add_preview_widget (GtkWidget *widget)
+{
+ GtkWidget *vbox;
+ GtkWidget *image;
+
+ vbox = gtk_vbox_new (FALSE, 6);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
+
+ image = gtk_image_new ();
+ gtk_widget_set_size_request (image, 128, 128);
+
+ gtk_box_pack_start (GTK_BOX (vbox), image, FALSE, TRUE, 0);
+ gtk_widget_show_all (vbox);
+
+ gtk_file_chooser_set_preview_widget_active (GTK_FILE_CHOOSER (widget), FALSE);
+ gtk_file_chooser_set_preview_widget (GTK_FILE_CHOOSER (widget), vbox);
+
+ g_signal_connect (widget, "update-preview",
+ G_CALLBACK (update_preview_cb), image);
+}
+
static void
browse_button_cb (GtkWidget *widget, gpointer data)
{
- GtkWindow *parent = GTK_WINDOW (data);
- GtkFileFilter *filter;
- GtkWidget *file_dialog = gtk_file_chooser_dialog_new (_("Open File"),
- parent,
- GTK_FILE_CHOOSER_ACTION_OPEN,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
- NULL);
-
- if (current_pix != NULL && strcmp (photofile, current_pix))
- gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (file_dialog),
- current_pix);
- else if (facedir != NULL && g_file_test (facedir, G_FILE_TEST_IS_DIR))
+ GtkWindow *parent = GTK_WINDOW (data);
+ GtkFileFilter *all_img_filter;
+ GSList *formats;
+ GSList *l;
+ GtkWidget *file_dialog;
+ GSList *filters = NULL;
+ GtkWidget *vbox;
+
+ file_dialog = gtk_file_chooser_dialog_new (_("Select Image"),
+ parent,
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+ NULL);
+ gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (file_dialog), TRUE);
+
+ if (facedir && g_file_test (facedir, G_FILE_TEST_IS_DIR)) {
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (file_dialog),
- facedir);
- else
+ facedir);
+ gtk_file_chooser_add_shortcut_folder (GTK_FILE_CHOOSER (file_dialog),
+ facedir, NULL);
+ } else {
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (file_dialog),
- EXPANDED_DATADIR "/pixmaps");
+ EXPANDED_DATADIR "/pixmaps");
+ gtk_file_chooser_add_shortcut_folder (GTK_FILE_CHOOSER (file_dialog),
+ EXPANDED_DATADIR "/pixmaps", NULL);
+ }
+
+ all_img_filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (all_img_filter, _("All Images"));
+
+ formats = gdk_pixbuf_get_formats ();
+
+ /* Image filters */
+ for (l = formats; l != NULL; l = l->next) {
+ int i;
+ char *filter_name;
+ char *description, *extension;
+ GdkPixbufFormat *format;
+ GtkFileFilter *filter;
+ char **mime_types, **pattern, *tmp;
+
+ filter = gtk_file_filter_new ();
+
+ format = (GdkPixbufFormat*) l->data;
+ description = gdk_pixbuf_format_get_description (format);
+ extension = gdk_pixbuf_format_get_name (format);
+
+ /* Filter name: First description then file extension, eg. "The PNG-Format (*.png)".*/
+ filter_name = g_strdup_printf (_("%s (*.%s)"), description, extension);
+ g_free (description);
+ g_free (extension);
+
+ gtk_file_filter_set_name (filter, filter_name);
+ g_free (filter_name);
+
+ mime_types = gdk_pixbuf_format_get_mime_types ((GdkPixbufFormat *) l->data);
+ for (i = 0; mime_types[i] != NULL; i++) {
+ gtk_file_filter_add_mime_type (filter, mime_types[i]);
+ gtk_file_filter_add_mime_type (all_img_filter, mime_types[i]);
+ }
+ g_strfreev (mime_types);
+
+ pattern = gdk_pixbuf_format_get_extensions ((GdkPixbufFormat *) l->data);
+ for (i = 0; pattern[i] != NULL; i++) {
+ tmp = g_strconcat ("*.", pattern[i], NULL);
+ gtk_file_filter_add_pattern (filter, tmp);
+ gtk_file_filter_add_pattern (all_img_filter, tmp);
+ g_free (tmp);
+ }
+ g_strfreev (pattern);
+
+ filters = g_slist_prepend (filters, filter);
+ }
+ g_slist_free (formats);
+
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (file_dialog), all_img_filter);
+ gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (file_dialog), all_img_filter);
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("PNG and JPEG"));
- gtk_file_filter_add_mime_type (filter, "image/jpeg");
- gtk_file_filter_add_mime_type (filter, "image/png");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (file_dialog), filter);
+ for (l = filters; l != NULL; l = l->next) {
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (file_dialog),
+ GTK_FILE_FILTER (l->data));
+ }
+ g_slist_free (filters);
+
+ add_preview_widget (file_dialog);
- g_signal_connect (file_dialog, "update-preview",
- G_CALLBACK (update_preview_cb), NULL);
- g_signal_connect (G_OBJECT (file_dialog), "destroy",
- G_CALLBACK (gtk_widget_destroyed), &file_dialog);
- g_signal_connect (G_OBJECT (file_dialog), "response",
- G_CALLBACK (install_response), NULL);
+ g_signal_connect (G_OBJECT (file_dialog), "destroy",
+ G_CALLBACK (gtk_widget_destroyed), &file_dialog);
+ g_signal_connect (G_OBJECT (file_dialog), "response",
+ G_CALLBACK (install_response), NULL);
gtk_widget_show (file_dialog);
}
+static void
+maybe_migrate_old_config (void)
+{
+ char *name;
+
+ if (photofile && g_access (photofile, R_OK) == 0)
+ return;
+
+ /* if we don't have a face then look for old one */
+ name = gnome_config_get_string ("/gdmphotosetup/last/picture");
+ if (name && g_access (name, R_OK) != 0) {
+ GdkPixbuf *pixbuf;
+
+ pixbuf = gdk_pixbuf_new_from_file (name, NULL);
+ if (pixbuf) {
+ gdk_pixbuf_save (pixbuf, photofile, "png", NULL, NULL);
+ }
+
+ }
+
+ g_free (name);
+}
+
+static GtkTreeModel *
+create_model (void)
+{
+ GtkListStore *store;
+
+ store = gtk_list_store_new (2,
+ GDK_TYPE_PIXBUF,
+ G_TYPE_STRING);
+
+ return GTK_TREE_MODEL (store);
+}
+
+static void
+fill_model (GtkTreeModel *model)
+{
+ GdkPixbuf *pixbuf;
+ int i;
+ char *str, *str2;
+ GtkTreeIter iter;
+ GtkListStore *store = GTK_LIST_STORE (model);
+ GDir *dir;
+ const char *filename;
+
+ dir = g_dir_open (facedir, 0, NULL);
+ if (! dir)
+ return;
+
+ while ((filename = g_dir_read_name (dir)) != NULL) {
+ char *path;
+
+ path = g_build_filename (facedir, filename, NULL);
+ pixbuf = gdk_pixbuf_new_from_file (path, NULL);
+ if (! pixbuf)
+ continue;
+
+ gtk_list_store_prepend (store, &iter);
+
+ gtk_list_store_set (store, &iter,
+ 0, pixbuf,
+ 1, path,
+ -1);
+ }
+
+ g_dir_close (dir);
+}
+
+static void
+selection_foreach (GtkIconView *icon_view,
+ GtkTreePath *path,
+ gpointer data)
+{
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ char *filename;
+
+ model = gtk_icon_view_get_model (icon_view);
+ if (! model)
+ return;
+
+ gtk_tree_model_get_iter (model,
+ &iter,
+ path);
+ gtk_tree_model_get (model, &iter,
+ 1, &filename,
+ -1);
+
+ if (filename) {
+ set_face_from_filename (filename);
+ }
+
+ g_free (filename);
+}
+
+static void
+selection_changed (GtkIconView *icon_list,
+ gpointer data)
+{
+ gtk_icon_view_selected_foreach (icon_list,
+ selection_foreach,
+ data);
+}
+
+static void
+setup_icon_view (GtkWidget *iconview)
+{
+ GtkTreeModel *model;
+ GtkCellRenderer *cell;
+
+ gtk_icon_view_set_selection_mode (GTK_ICON_VIEW (iconview),
+ GTK_SELECTION_SINGLE);
+
+ model = create_model ();
+ gtk_icon_view_set_model (GTK_ICON_VIEW (iconview), model);
+ fill_model (model);
+
+ cell = gtk_cell_renderer_pixbuf_new ();
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (iconview), cell, FALSE);
+
+ gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (iconview),
+ cell, "pixbuf", 0, NULL);
+
+ g_signal_connect (iconview, "selection_changed",
+ G_CALLBACK (selection_changed), NULL);
+
+}
+
int
main (int argc, char *argv[])
{
- struct stat s;
- GtkWidget *dialog;
- GtkWidget *browse_button;
- GtkWidget *scrolled_window;
- GtkWidget *table;
- gboolean face_browser;
- char *greeter;
- char *remotegreeter;
- int max_size;
-
- photofile = g_strconcat (g_get_home_dir (), "/.face", NULL);
+ GtkWidget *dialog;
+ GtkWidget *browse_button;
+ GtkWidget *face_image;
+ GtkWidget *iconview;
+ gboolean face_browser;
+ char *greeter;
+ int max_size;
bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
@@ -237,173 +466,50 @@ main (int argc, char *argv[])
argc, argv,
NULL);
- current_pix = gnome_config_get_string ("/gdmphotosetup/last/picture");
+ photofile = g_build_filename (g_get_home_dir (), ".face", NULL);
+
+ maybe_migrate_old_config ();
gnome_config_push_prefix ("=" GDM_CONFIG_FILE "=/");
face_browser = gnome_config_get_bool (GDM_KEY_BROWSER);
max_size = gnome_config_get_int (GDM_KEY_MAXFILE);
- max_width = gnome_config_get_int (GDM_KEY_ICONWIDTH);
+ max_width = gnome_config_get_int (GDM_KEY_ICONWIDTH);
max_height = gnome_config_get_int (GDM_KEY_ICONHEIGHT);
greeter = gnome_config_get_string (GDM_KEY_GREETER);
- remotegreeter = gnome_config_get_string (GDM_KEY_REMOTEGREETER);
+
facedir = gnome_config_get_string (GDM_KEY_FACEDIR);
gnome_config_pop_prefix ();
- if ( ! gdm_check ()) {
- return 1;
- }
+ gtk_window_set_default_icon_name ("stock_person");
- /* HACK */
- /* only warn if gdmlogin is set for both local and remote greeter,
- * the themed greeter does a different setup thingie for
- * the face browser and it would be hard to figure out here ... */
- if ( ! face_browser &&
- strstr (greeter, "gdmlogin") != NULL &&
- strstr (remotegreeter, "gdmlogin") != NULL) {
- GtkWidget *d;
- d = ve_hig_dialog_new (NULL /* parent */,
- GTK_DIALOG_MODAL /* flags */,
- GTK_MESSAGE_WARNING,
- GTK_BUTTONS_OK,
- FALSE /* markup */,
- _("The face browser is not "
- "configured"),
- "%s",
- _("The face browser is not configured in the "
- "GDM configuration. Please ask your "
- "system administrator to enable "
- "this feature."));
+ xml = glade_xml_new (GDM_GLADE_DIR "/gdmphotosetup.glade", NULL, NULL);
- gtk_dialog_run (GTK_DIALOG (d));
- gtk_widget_destroy (d);
- }
- g_free (greeter);
- g_free (remotegreeter);
-
- dialog = gtk_dialog_new_with_buttons (_("Login Photo"),
- NULL /* parent */,
- 0 /* flags */,
- GTK_STOCK_CANCEL,
- GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK,
- GTK_RESPONSE_OK,
- NULL);
- gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
- gtk_label_new (_("Select a photograph to show "
- "in the facebrowser:")),
- FALSE, FALSE, 0);
-
- if (g_stat (current_pix, &s) < 0 || current_pix == NULL) {
- preview = gtk_image_new ();
- current_image = gtk_image_new ();
+ dialog = glade_xml_get_widget (xml, "face_dialog");
+ face_image = glade_xml_get_widget (xml, "face_image");
+ browse_button = glade_xml_get_widget (xml, "browse_button");
+ iconview = glade_xml_get_widget (xml, "face_iconview");
+
+ if (g_access (photofile, R_OK) == 0) {
+ gtk_image_set_from_file (GTK_IMAGE (face_image),
+ photofile);
} else {
- preview = gtk_image_new_from_file (current_pix);
- current_image = gtk_image_new_from_file (current_pix);
+ gtk_image_set_from_icon_name (GTK_IMAGE (face_image),
+ "stock_person",
+ GTK_ICON_SIZE_DIALOG);
}
+ setup_icon_view (iconview);
- table = gtk_table_new (1, 1, FALSE);
- scrolled_window = gtk_scrolled_window_new (NULL, NULL);
- gtk_widget_set_usize (scrolled_window, 128, 128);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-
- gtk_scrolled_window_add_with_viewport (
- GTK_SCROLLED_WINDOW (scrolled_window), preview);
- gtk_container_add (GTK_CONTAINER (table), scrolled_window);
-
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
- table, TRUE, TRUE, 0);
-
- browse_button = gtk_button_new_with_mnemonic (_("_Browse"));
-
- g_signal_connect (G_OBJECT (browse_button), "clicked",
+ g_signal_connect (browse_button, "clicked",
G_CALLBACK (browse_button_cb), dialog);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
- browse_button, FALSE, TRUE, 0);
-
- gtk_widget_show_all (dialog);
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (dialog_response), NULL);
- g_signal_connect (G_OBJECT (dialog), "response",
- G_CALLBACK (dialog_response),
- NULL);
-
- for (;;) {
- gtk_main ();
-
- if (response != GTK_RESPONSE_OK)
- break;
-
- if (ve_string_empty (current_pix) ||
- g_stat (current_pix, &s) < 0) {
-
- /*
- * This can happen if the user has a setting for their face
- * image, but the file does not exist.
- */
- GtkWidget *d;
- d = ve_hig_dialog_new (NULL /* parent */,
- GTK_DIALOG_MODAL /* flags */,
- GTK_MESSAGE_WARNING,
- GTK_BUTTONS_OK,
- FALSE /* markup */,
- _("No picture selected."),
- /* avoid warning */ "%s", "");
- gtk_dialog_run (GTK_DIALOG (d));
- gtk_widget_destroy (d);
- } else {
- GdkPixbuf *preview_pixbuf;
- char *cfg_file = g_strconcat (g_get_home_dir (),
- "/.gnome2/gdm",
- NULL);
-
- VE_IGNORE_EINTR (g_unlink (photofile));
- preview_pixbuf = gtk_image_get_pixbuf (GTK_IMAGE (current_image));
-
- if (gdk_pixbuf_save (preview_pixbuf, photofile, "png", NULL,
- NULL) != TRUE) {
-
- GtkWidget *d;
- char *tmp = ve_filename_to_utf8 (photofile);
-
- d = ve_hig_dialog_new (NULL /* parent */,
- GTK_DIALOG_MODAL /* flags */,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK,
- FALSE /* markup */,
- _("Cannot open file"),
- _("File %s cannot be opened for "
- "writing\n"), tmp);
-
- gtk_dialog_run (GTK_DIALOG (d));
- gtk_widget_destroy (d);
-
- g_free (tmp);
- g_free (cfg_file);
- g_free (photofile);
- continue;
- }
-
- /* Set configuration */
- gnome_config_set_string ("/gdmphotosetup/last/picture",
- photofile);
- gnome_config_set_string ("/gdm/face/picture", "");
- gnome_config_sync ();
-
- /* Change to g_chmod after glib 2.8 release */
- chmod (cfg_file, 0600);
- chmod (photofile, 0644);
-
- g_free (cfg_file);
- g_free (photofile);
- break;
- }
- }
+ gtk_widget_set_size_request (dialog, 500, 400);
- g_free (current_pix);
- gtk_widget_destroy (dialog);
+ gtk_widget_show_all (dialog);
+ gtk_main ();
return 0;
}
diff --git a/gui/gdmphotosetup.glade b/gui/gdmphotosetup.glade
new file mode 100644
index 00000000..5fff8174
--- /dev/null
+++ b/gui/gdmphotosetup.glade
@@ -0,0 +1,321 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+
+<widget class="GtkDialog" id="face_dialog">
+ <property name="border_width">6</property>
+ <property name="visible">True</property>
+ <property name="title" translatable="yes">User Image</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_NONE</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">False</property>
+ <property name="skip_pager_hint">False</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+ <property name="has_separator">False</property>
+
+ <child internal-child="vbox">
+ <widget class="GtkVBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">12</property>
+
+ <child internal-child="action_area">
+ <widget class="GtkHButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+ <child>
+ <widget class="GtkButton" id="helpbutton1">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-help</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">-11</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="closebutton1">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-close</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">-7</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkVBox" id="vbox1">
+ <property name="border_width">6</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">12</property>
+
+ <child>
+ <widget class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;User Image&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"> </property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkImage" id="face_image">
+ <property name="visible">True</property>
+ <property name="icon_size">6</property>
+ <property name="icon_name">stock_person</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Selection&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"> </property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkVBox" id="vbox5">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkHBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">6</property>
+
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+ <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="shadow_type">GTK_SHADOW_IN</property>
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+ <child>
+ <widget class="GtkIconView" id="face_iconview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="selection_mode">GTK_SELECTION_SINGLE</property>
+ <property name="orientation">GTK_ORIENTATION_VERTICAL</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkVBox" id="vbox5">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkButton" id="browse_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Browse</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+</glade-interface>