summaryrefslogtreecommitdiff
path: root/gui/gdmlogin.c
diff options
context:
space:
mode:
Diffstat (limited to 'gui/gdmlogin.c')
-rw-r--r--gui/gdmlogin.c1636
1 files changed, 1011 insertions, 625 deletions
diff --git a/gui/gdmlogin.c b/gui/gdmlogin.c
index 03411238..eb9c1537 100644
--- a/gui/gdmlogin.c
+++ b/gui/gdmlogin.c
@@ -1,5 +1,5 @@
/* GDM - The Gnome Display Manager
- * Copyright (C) 1998, 1999 Martin Kasper Petersen <mkp@SunSITE.auc.dk>
+ * Copyright (C) 1998, 1999 Martin Kasper Petersen <mkp@mkp.net>
*
* 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
@@ -16,14 +16,6 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-/* gdmlogin is a stripped down greeter for environments where:
- *
- * 1. Users are not trusted (i.e. gdmlogin is less vulnerable to DoS
- * attacks )
- *
- * 2. Usernames should not be exposed
- */
-
#include <config.h>
#include <gnome.h>
#include <stdio.h>
@@ -39,43 +31,52 @@
#include <pwd.h>
#include <sys/utsname.h>
+#include "gdmlogin.h"
#include "gdm.h"
static const gchar RCSid[]="$Id$";
-extern gboolean gdm_file_check(gchar *caller, uid_t user, gchar *dir, gchar *file, gboolean absentok);
-
-gint GdmDebug;
-gint GdmIconify;
-gint GdmShutdownMenu;
-gint GdmVerboseAuth;
-gint GdmQuiver;
-gint GdmChooserMenu;
-gint GdmRelaxPerms;
-gint GdmUserMaxFile;
-gchar *GdmLogoFilename;
-gchar *GdmMessageText;
-gchar *GdmMessageFont;
-gchar *GdmConfigFilename=GDM_CONFIG_FILE;
-gchar *GdmMessageFont;
-gchar *GdmGtkRC;
-gchar *GdmIconFile;
-gchar *GdmSessionDir;
-gchar *GdmLocaleFile;
-gchar *GdmDefaultLocale;
-
-GtkWidget *login;
-GtkWidget *label;
-GtkWidget *entry;
-GtkWidget *msg;
-GtkWidget *win;
-GtkWidget *sessmenu;
-GtkWidget *langmenu;
-GdkWindow *rootwin;
+extern gboolean gdm_file_check (gchar *caller, uid_t user, gchar *dir,
+ gchar *file, gboolean absentok,
+ gint maxsize, gint perms);
+
+static gint GdmBrowser;
+static gint GdmDebug;
+static gint GdmIconMaxHeight;
+static gint GdmIconMaxWidth;
+static gint GdmQuiver;
+static gint GdmRelaxPerms;
+static gint GdmSystemMenu;
+static gint GdmUserMaxFile;
+static gchar *GdmLogo;
+static gchar *GdmWelcome;
+static gchar *GdmFont;
+static gchar *GdmGtkRC;
+static gchar *GdmIcon;
+static gchar *GdmSessionDir;
+static gchar *GdmLocaleFile;
+static gchar *GdmDefaultLocale;
+static gchar *GdmExclude;
+static gchar *GdmGlobalFaceDir;
+static gchar *GdmDefaultFace;
+
+static GtkWidget *login;
+static GtkWidget *label;
+static GtkWidget *entry;
+static GtkWidget *msg;
+static GtkWidget *win;
+static GtkWidget *sessmenu;
+static GtkWidget *langmenu;
+static GdkWindow *rootwin;
+
+static GnomeIconList *browser;
+static GdkImlibImage *defface;
/* Eew. Loads of global vars. It's hard to be event controlled while maintaining state */
-GSList *sessions=NULL;
-GSList *languages=NULL;
+GSList *sessions = NULL;
+GSList *languages = NULL;
+GList *users = NULL;
+GSList *exclude = NULL;
gchar *defsess=NULL;
gchar *cursess=NULL;
@@ -88,89 +89,82 @@ gchar *language=NULL;
gboolean savesess;
gboolean savelang;
-
-
-/* Log debug messages */
-void
-static gdm_debug(const gchar *format, ...)
-{
- va_list args;
- gchar *s;
-
- if(GdmDebug) {
- va_start(args, format);
- s=g_strdup_vprintf(format, args);
- va_end(args);
-
- syslog(LOG_DEBUG, s);
-
- g_free(s);
- }
-}
-
+gint maxwidth;
static void
-gdm_login_done(void)
+gdm_login_done (void)
{
+ gdk_keyboard_ungrab (CurrentTime);
+
closelog();
gtk_main_quit();
- exit(DISPLAY_SUCCESS);
+
+ exit (DISPLAY_SUCCESS);
}
-typedef struct _cursoroffset {gint x,y;} CursorOffset;
+typedef struct _cursoroffset { gint x,y; } CursorOffset;
static void
-gdm_login_icon_pressed(GtkWidget *widget, GdkEventButton *event)
+gdm_login_icon_pressed (GtkWidget *widget, GdkEventButton *event)
{
CursorOffset *p;
+
+ if (!widget || !event)
+ return;
- if(event->type == GDK_2BUTTON_PRESS) {
- gtk_widget_destroy(win);
- gdk_window_show(login->window);
+ if (event->type == GDK_2BUTTON_PRESS) {
+ gtk_widget_destroy (GTK_WIDGET (win));
+ gdk_window_show (login->window);
return;
}
if (event->type != GDK_BUTTON_PRESS)
return;
- p=gtk_object_get_user_data(GTK_OBJECT (widget));
- p->x=(gint)event->x;
- p->y=(gint)event->y;
+ p = gtk_object_get_user_data (GTK_OBJECT (widget));
+ p->x = (gint) event->x;
+ p->y = (gint) event->y;
- gtk_grab_add(widget);
- gdk_pointer_grab(widget->window, TRUE,
- GDK_BUTTON_RELEASE_MASK |
- GDK_BUTTON_MOTION_MASK |
- GDK_POINTER_MOTION_HINT_MASK,
- NULL, NULL, 0);
+ gtk_grab_add (widget);
+ gdk_pointer_grab (widget->window, TRUE,
+ GDK_BUTTON_RELEASE_MASK |
+ GDK_BUTTON_MOTION_MASK |
+ GDK_POINTER_MOTION_HINT_MASK,
+ NULL, NULL, 0);
}
static void
-gdm_login_icon_released(GtkWidget *widget)
+gdm_login_icon_released (GtkWidget *widget)
{
- gtk_grab_remove(widget);
- gdk_pointer_ungrab(0);
+ if(!widget)
+ return;
+
+ gtk_grab_remove (widget);
+ gdk_pointer_ungrab (0);
}
static void
-gdm_login_icon_motion(GtkWidget *widget, GdkEventMotion *event)
+gdm_login_icon_motion (GtkWidget *widget, GdkEventMotion *event)
{
gint xp, yp;
CursorOffset *p;
GdkModifierType mask;
- p=gtk_object_get_user_data(GTK_OBJECT (widget));
- gdk_window_get_pointer(rootwin, &xp, &yp, &mask);
- gtk_widget_set_uposition(widget, xp-p->x, yp-p->y);
+ if(!widget || !event)
+ return;
+
+ p = gtk_object_get_user_data (GTK_OBJECT (widget));
+ gdk_window_get_pointer (rootwin, &xp, &yp, &mask);
+ gtk_widget_set_uposition (GTK_WIDGET (widget), xp-p->x, yp-p->y);
}
static gboolean
-gdm_login_iconify_handler(GtkWidget *widget, gpointer data)
+gdm_login_iconify_handler (GtkWidget *widget, gpointer data)
{
GtkWidget *fixed;
GtkWidget *icon;
@@ -179,143 +173,151 @@ gdm_login_iconify_handler(GtkWidget *widget, gpointer data)
CursorOffset *icon_pos;
gint rw, rh, iw, ih;
- gdk_window_hide(login->window);
- style=gtk_widget_get_default_style();
- gc=style->black_gc;
- win=gtk_window_new(GTK_WINDOW_POPUP);
+ gdk_window_hide (login->window);
+ style = gtk_widget_get_default_style();
+ gc = style->black_gc;
+ win = gtk_window_new (GTK_WINDOW_POPUP);
- gtk_widget_set_events(win,
- gtk_widget_get_events(win) |
- GDK_BUTTON_PRESS_MASK |
- GDK_BUTTON_MOTION_MASK |
- GDK_POINTER_MOTION_HINT_MASK);
+ gtk_widget_set_events (win,
+ gtk_widget_get_events (GTK_WIDGET (win)) |
+ GDK_BUTTON_PRESS_MASK |
+ GDK_BUTTON_MOTION_MASK |
+ GDK_POINTER_MOTION_HINT_MASK);
- gtk_widget_realize(win);
+ gtk_widget_realize (GTK_WIDGET (win));
- fixed=gtk_fixed_new();
- gtk_container_add(GTK_CONTAINER (win), fixed);
- gtk_widget_show(fixed);
+ fixed = gtk_fixed_new();
+ gtk_container_add (GTK_CONTAINER (win), fixed);
+ gtk_widget_show (fixed);
- icon=gnome_pixmap_new_from_file (GdmIconFile);
+ icon = gnome_pixmap_new_from_file (GdmIcon);
gdk_window_get_size ((GdkWindow *) GNOME_PIXMAP (icon)->pixmap, &iw, &ih);
- gtk_fixed_put(GTK_FIXED (fixed), icon, 0, 0);
- gtk_widget_show(icon);
+ gtk_fixed_put(GTK_FIXED (fixed), GTK_WIDGET (icon), 0, 0);
+ gtk_widget_show(GTK_WIDGET (icon));
- gtk_signal_connect(GTK_OBJECT (win), "button_press_event",
- GTK_SIGNAL_FUNC (gdm_login_icon_pressed),NULL);
- gtk_signal_connect(GTK_OBJECT (win), "button_release_event",
- GTK_SIGNAL_FUNC (gdm_login_icon_released),NULL);
- gtk_signal_connect(GTK_OBJECT (win), "motion_notify_event",
- GTK_SIGNAL_FUNC (gdm_login_icon_motion),NULL);
+ gtk_signal_connect (GTK_OBJECT (win), "button_press_event",
+ GTK_SIGNAL_FUNC (gdm_login_icon_pressed),NULL);
+ gtk_signal_connect (GTK_OBJECT (win), "button_release_event",
+ GTK_SIGNAL_FUNC (gdm_login_icon_released),NULL);
+ gtk_signal_connect (GTK_OBJECT (win), "motion_notify_event",
+ GTK_SIGNAL_FUNC (gdm_login_icon_motion),NULL);
- icon_pos=g_new(CursorOffset, 1);
- gtk_object_set_user_data(GTK_OBJECT(win), icon_pos);
+ icon_pos = g_new (CursorOffset, 1);
+ gtk_object_set_user_data (GTK_OBJECT (win), icon_pos);
- gtk_widget_show(win);
+ gtk_widget_show (GTK_WIDGET (win));
- rw=gdk_screen_width();
- rh=gdk_screen_height();
+ rw = gdk_screen_width();
+ rh = gdk_screen_height();
- gtk_widget_set_uposition(win, rw-iw, rh-ih);
+ gtk_widget_set_uposition (GTK_WIDGET (win), rw-iw, rh-ih);
return(TRUE);
}
static void
-gdm_login_abort(const gchar *format, ...)
+gdm_login_abort (const gchar *format, ...)
{
va_list args;
gchar *s;
- va_start(args, format);
- s=g_strdup_vprintf(format, args);
- va_end(args);
+ if (!format)
+ exit (DISPLAY_ABORT);
+
+ va_start (args, format);
+ s = g_strdup_vprintf (format, args);
+ va_end (args);
- syslog(LOG_ERR, s);
+ syslog (LOG_ERR, s);
closelog();
- exit(DISPLAY_ABORT);
+
+ exit (DISPLAY_ABORT);
}
+/* I *really* need to rewrite this crap */
static gchar *
-gdm_parse_enriched_string(gchar *s)
+gdm_parse_enriched_string (gchar *s)
{
gchar cmd, *buffer, *start;
gchar hostbuf[256];
gchar *hostname, *temp1, *temp2, *display;
struct utsname name;
- display=getenv("DISPLAY");
+ if (!s)
+ return(NULL);
+
+ display = getenv ("DISPLAY");
if(!display)
return(NULL);
- temp1=strchr(display, '.');
- temp2=strchr(display, ':');
+ temp1 = strchr (display, '.');
+ temp2 = strchr (display, ':');
- if(temp1)
- *temp1='\0';
- else if(temp2)
- *temp2='\0';
+ if (temp1)
+ *temp1 = '\0';
+ else if (temp2)
+ *temp2 = '\0';
else
- return(NULL); /* Display isn't */
+ return (NULL);
- gethostname(hostbuf, 255);
- hostname=g_strdup(hostbuf);
-
- if(!hostname)
- hostname=g_strdup("Gnome");
+ gethostname (hostbuf, 255);
+ hostname = g_strdup (hostbuf);
+
+ if (!hostname)
+ hostname = g_strdup ("Gnome");
- uname(&name);
+ uname (&name);
- if(strlen(s) > 1023) {
- syslog(LOG_ERR, _("gdm_parse_enriched_string: String too long!"));
- return(g_strconcat(_("Welcome to "), hostname, NULL));
+ if (strlen (s) > 1023) {
+ syslog (LOG_ERR, _("gdm_parse_enriched_string: String too long!"));
+ return (g_strconcat (_("Welcome to "), hostname, NULL));
}
- if(!(buffer = g_malloc(4096))) {
- syslog(LOG_ERR, _("gdm_parse_enriched_string: Could not malloc temporary buffer!"));
- return(NULL);
+ if (!(buffer = g_malloc (4096))) {
+ syslog (LOG_ERR, _("gdm_parse_enriched_string: Could not malloc temporary buffer!"));
+ return (NULL);
}
start = buffer;
- while(*s) {
+ while (*s) {
- if(*s=='%' && (cmd = s[1]) != 0) {
+ if (*s=='%' && (cmd = s[1]) != 0) {
s+=2;
- switch(cmd) {
+ switch (cmd) {
case 'h':
- memcpy(buffer, hostname, strlen(hostname));
- buffer+=strlen(hostname);
+ memcpy (buffer, hostname, strlen (hostname));
+ buffer += strlen (hostname);
break;
case 'd':
- memcpy(buffer, display, strlen(display));
- buffer+=strlen(display);
+ memcpy (buffer, display, strlen (display));
+ buffer += strlen (display);
break;
case 's':
- memcpy(buffer, name.sysname, strlen(name.sysname));
- buffer+=strlen(name.sysname);
+ memcpy (buffer, name.sysname, strlen (name.sysname));
+ buffer += strlen (name.sysname);
break;
case 'r':
- memcpy(buffer, name.release, strlen(name.release));
- buffer+=strlen(name.release);
+ memcpy (buffer, name.release, strlen (name.release));
+ buffer += strlen (name.release);
break;
case 'm':
- memcpy(buffer, name.machine, strlen(name.machine));
- buffer+=strlen(name.machine);
+ memcpy (buffer, name.machine, strlen (name.machine));
+ buffer += strlen (name.machine);
break;
case '%':
- *buffer++='%';
+ *buffer++ = '%';
break;
default:
@@ -323,144 +325,131 @@ gdm_parse_enriched_string(gchar *s)
};
}
else
- *buffer++=*s++;
+ *buffer++ = *s++;
}
- *buffer=0;
-
- return(g_strdup(start));
-}
+ *buffer = 0;
-
-static void
-gdm_login_about(void)
-{
- const gchar *authors[]={"Martin Kasper Petersen <mkp@mkp.net>", NULL};
-
- GtkWidget *about;
-
- about=gnome_about_new("Gnome Display Manager",
- "" VERSION "",
- "Copyright Martin K. Petersen (C) 1998, 1999",
- authors,
- _("gdm manages local and remote displays and provides the user with a login window."),
- NULL);
-
- gtk_widget_show(about);
+ return (g_strdup (start));
}
static gboolean
-gdm_login_query(gchar *msg)
+gdm_login_query (gchar *msg)
{
GtkWidget *req;
- req=gnome_message_box_new(msg,
- GNOME_MESSAGE_BOX_QUESTION,
- GNOME_STOCK_BUTTON_YES,
- GNOME_STOCK_BUTTON_NO,
- NULL);
+ req = gnome_message_box_new (msg,
+ GNOME_MESSAGE_BOX_QUESTION,
+ GNOME_STOCK_BUTTON_YES,
+ GNOME_STOCK_BUTTON_NO,
+ NULL);
- gtk_window_set_modal(GTK_WINDOW(req), TRUE);
- gtk_window_set_position(GTK_WINDOW(req), GTK_WIN_POS_CENTER);
+ gtk_window_set_modal (GTK_WINDOW (req), TRUE);
+ gtk_window_set_position (GTK_WINDOW (req), GTK_WIN_POS_CENTER);
- return(!gnome_dialog_run(GNOME_DIALOG(req)));
+ return (!gnome_dialog_run (GNOME_DIALOG(req)));
}
static gboolean
-gdm_login_reboot_handler(void)
+gdm_login_reboot_handler (void)
{
- if(gdm_login_query(_("Are you sure you want to reboot the machine?"))) {
+ if (gdm_login_query (_("Are you sure you want to reboot the machine?"))) {
closelog();
- exit(DISPLAY_REBOOT);
+
+ exit (DISPLAY_REBOOT);
}
- return(TRUE);
+ return (TRUE);
}
static gboolean
-gdm_login_halt_handler(void)
+gdm_login_halt_handler (void)
{
- if(gdm_login_query(_("Are you sure you want to halt the machine?"))) {
+ if (gdm_login_query (_("Are you sure you want to halt the machine?"))) {
closelog();
- exit(DISPLAY_HALT);
+
+ exit (DISPLAY_HALT);
}
- return(TRUE);
+ return (TRUE);
}
static void
-gdm_login_parse_config(void)
+gdm_login_parse_config (void)
{
gchar *display;
struct stat unused;
- if(stat(GDM_CONFIG_FILE, &unused) == -1)
- gdm_login_abort(_("gdm_login_parse_config: No configuration file: %s. Aborting."), GDM_CONFIG_FILE);
+ if (stat (GDM_CONFIG_FILE, &unused) == -1)
+ gdm_login_abort (_("gdm_login_parse_config: No configuration file: %s. Aborting."), GDM_CONFIG_FILE);
gnome_config_push_prefix ("=" GDM_CONFIG_FILE "=/");
- GdmLogoFilename=gnome_config_get_string("appearance/logoimage");
- GdmMessageFont=gnome_config_get_string("appearance/msgfont=-adobe-helvetica-bold-r-normal-*-*-180-*-*-*-*-*-*");
- GdmGtkRC=gnome_config_get_string("appearance/gtkrc");
- GdmIconify=gnome_config_get_int("appearance/iconify=1");
- GdmIconFile=gnome_config_get_string("appearance/iconfile=gdm.xpm");
- GdmQuiver=gnome_config_get_int("appearance/quiver=1");
-
- GdmChooserMenu=gnome_config_get_int("system/choosermenu=0");
- GdmShutdownMenu=gnome_config_get_int("system/shutdownmenu=0");
- GdmUserMaxFile=gnome_config_get_int("system/UserFileCutoffSize=65536");
- GdmRelaxPerms=gnome_config_get_int("system/relaxpermissions=0");
-
- GdmLocaleFile=g_strdup(gnome_config_get_string("system/LocaleFile"));
- GdmDefaultLocale=g_strdup(gnome_config_get_string("system/DefaultLocale=english"));
- GdmSessionDir=gnome_config_get_string("daemon/sessiondir");
+ GdmBrowser = gnome_config_get_int (GDM_KEY_BROWSER);
+ GdmLogo = gnome_config_get_string (GDM_KEY_LOGO);
+ GdmFont = gnome_config_get_string (GDM_KEY_FONT);
+ GdmIcon = gnome_config_get_string (GDM_KEY_ICON);
+ GdmQuiver = gnome_config_get_int (GDM_KEY_QUIVER);
+ GdmSystemMenu = gnome_config_get_int (GDM_KEY_SYSMENU);
+ GdmUserMaxFile = gnome_config_get_int (GDM_KEY_MAXFILE);
+ GdmRelaxPerms = gnome_config_get_int (GDM_KEY_RELAXPERM);
+ GdmLocaleFile = gnome_config_get_string (GDM_KEY_LOCFILE);
+ GdmDefaultLocale = gnome_config_get_string (GDM_KEY_LOCALE);
+ GdmSessionDir = gnome_config_get_string (GDM_KEY_SESSDIR);
+ GdmWelcome=gnome_config_get_string (GDM_KEY_WELCOME);
+ GdmGtkRC = gnome_config_get_string (GDM_KEY_GTKRC);
+ GdmExclude = gnome_config_get_string (GDM_KEY_EXCLUDE);
+ GdmGlobalFaceDir = gnome_config_get_string (GDM_KEY_FACEDIR);
+ GdmDefaultFace = gnome_config_get_string (GDM_KEY_FACE);
+ GdmDebug = gnome_config_get_int (GDM_KEY_DEBUG);
+ GdmUserMaxFile = gnome_config_get_int (GDM_KEY_MAXFILE);
+ GdmRelaxPerms = gnome_config_get_int (GDM_KEY_RELAXPERM);
+ GdmIconMaxWidth = gnome_config_get_int (GDM_KEY_ICONWIDTH);
+ GdmIconMaxHeight = gnome_config_get_int (GDM_KEY_ICONHEIGHT);
+
+ gnome_config_pop_prefix();
+
+ if (stat (GdmLocaleFile, &unused) == -1)
+ gdm_login_abort ("gdm_login_parse_config: Could not open locale file %s. Aborting!", GdmLocaleFile);
- GdmMessageText=gnome_config_get_string(_("messages/welcome=Welcome to %h"));
-
- GdmDebug=gnome_config_get_int("debug/enable=0");
-
- gnome_config_pop_prefix ();
-
- if(stat(GdmLocaleFile, &unused) == -1)
- gdm_login_abort("gdm_login_parse_config: Could not open locale file %s. Aborting!", GdmLocaleFile);
/* Disable System menu on non-local displays */
- display=getenv("DISPLAY");
+ display = getenv ("DISPLAY");
- if(!display)
- gdm_login_abort("gdm_login_parse_config: DISPLAY variable not set!");
+ if (!display)
+ gdm_login_abort ("gdm_login_parse_config: DISPLAY variable not set!");
- if(strncmp(display, ":", 1))
- GdmShutdownMenu=0;
+ if (strncmp (display, ":", 1))
+ GdmSystemMenu = 0;
}
static gboolean
-gdm_login_list_lookup(GSList *l, gchar *data)
+gdm_login_list_lookup (GSList *l, gchar *data)
{
- GSList *list=l;
+ GSList *list = l;
- if(!list || !data)
+ if (!list || !data)
return(FALSE);
- while(list) {
+ while (list) {
- if(!strcasecmp(list->data, data))
- return(TRUE);
+ if (!strcasecmp (list->data, data))
+ return (TRUE);
- list=list->next;
+ list = list->next;
}
- return(FALSE);
+ return (FALSE);
}
static void
-gdm_login_sesslang_lookup(void) /* Input validation sucks */
+gdm_login_sesslang_lookup (void) /* Input validation sucks */
{
struct passwd *pwent;
gboolean fileok;
@@ -468,115 +457,119 @@ gdm_login_sesslang_lookup(void) /* Input validation sucks */
gchar *dir=NULL, *cfg=NULL;
gchar *usrlang=NULL, *usrsess=NULL;
- gtk_widget_set_sensitive(sessmenu, FALSE);
- gtk_widget_set_sensitive(langmenu, FALSE);
+ if(!curuser)
+ gdm_login_abort("gdm_login_sesslang_lookup: curuser==NULL. Mail <mkp@mkp.net> with " \
+ "information on your PAM setup");
+
+ gtk_widget_set_sensitive (GTK_WIDGET (sessmenu), FALSE);
+ gtk_widget_set_sensitive (GTK_WIDGET (langmenu), FALSE);
/* Lookup verified user */
- pwent=getpwnam(curuser);
+ pwent = getpwnam (curuser);
- dir=g_strconcat(pwent->pw_dir, "/.gnome", NULL);
- fileok=gdm_file_check("gdm_login_sesslang_lookup", pwent->pw_uid, dir, "gdm", TRUE);
- g_free(dir);
+ dir = g_strconcat (pwent->pw_dir, "/.gnome", NULL);
+ fileok = gdm_file_check ("gdm_login_sesslang_lookup", pwent->pw_uid, dir, "gdm", TRUE, GdmUserMaxFile, GdmRelaxPerms);
+ g_free (dir);
- if(!fileok) { /* User's settings can't be retrieved */
+ if (!fileok) { /* User's settings can't be retrieved */
/* If cursess==last use system default session */
- if(!strcasecmp(cursess, lastsess))
- session=defsess;
+ if (!strcasecmp (cursess, lastsess))
+ session = defsess;
else
- session=cursess;
+ session = cursess;
/* If curlang==last use default */
- if(!strcasecmp(curlang, lastlang))
- language=GdmDefaultLocale;
+ if (!strcasecmp (curlang, lastlang))
+ language = GdmDefaultLocale;
else
- language=curlang;
+ language = curlang;
- savesess=FALSE;
- savelang=FALSE;
+ savesess = FALSE;
+ savelang = FALSE;
return;
}
/* Find user's last session and language if available */
- cfg=g_strconcat("=", pwent->pw_dir, "/.gnome/gdm=/session/last", NULL);
- usrsess=gnome_config_get_string(cfg);
- g_free(cfg);
+ cfg = g_strconcat ("=", pwent->pw_dir, "/.gnome/gdm=/session/last", NULL);
+ usrsess = gnome_config_get_string (cfg);
+ g_free (cfg);
- cfg=g_strconcat("=", pwent->pw_dir, "/.gnome/gdm=/session/lang", NULL);
- usrlang=gnome_config_get_string(cfg);
- g_free(cfg);
+ cfg = g_strconcat ("=", pwent->pw_dir, "/.gnome/gdm=/session/lang", NULL);
+ usrlang = gnome_config_get_string (cfg);
+ g_free (cfg);
/* If ``Last'' session is selected */
- if(!strcasecmp(cursess, lastsess)) {
+ if (!strcasecmp (cursess, lastsess)) {
/* User has no saved session. Use default. */
- if(!usrsess) {
- session=defsess;
- savesess=TRUE;
+ if (!usrsess) {
+ session = defsess;
+ savesess = TRUE;
}
/* User's saved session exists on this box */
- else if(gdm_login_list_lookup(sessions, usrsess)) {
- session=usrsess;
- savesess=FALSE;
+ else if (gdm_login_list_lookup (sessions, usrsess)) {
+ session = usrsess;
+ savesess = FALSE;
}
/* User's saved session type unknown */
else {
- session=defsess;
- g_snprintf(msg, 1023,
- _("Your preferred session type %s is not installed on this machine.\n" \
- "Do you wish to make %s the default for future sessions?"),
- usrsess, defsess);
- savesess=gdm_login_query(msg);
+ session = defsess;
+ g_snprintf (msg, 1023,
+ _("Your preferred session type %s is not installed on this machine.\n" \
+ "Do you wish to make %s the default for future sessions?"),
+ usrsess, defsess);
+ savesess = gdm_login_query (msg);
}
}
/* One of the other available session types is selected */
else {
- session=cursess;
+ session = cursess;
/* User has no saved session type. Use current */
- if(!usrsess)
- savesess=TRUE;
+ if (!usrsess)
+ savesess = TRUE;
/* User's saved session is also the chosen one */
- else if(!strcasecmp(usrsess, cursess))
- savesess=FALSE;
+ else if (!strcasecmp (usrsess, cursess))
+ savesess = FALSE;
/* User selected a new session type */
else {
- g_snprintf(msg, 1023,
- _("You have chosen %s for this session, but your default setting is %s.\n" \
- "Do you wish to make %s the default for future sessions?"),
- cursess, usrsess, cursess);
- savesess=gdm_login_query(msg);
+ g_snprintf (msg, 1023,
+ _("You have chosen %s for this session, but your default setting is %s.\n" \
+ "Do you wish to make %s the default for future sessions?"),
+ cursess, usrsess, cursess);
+ savesess = gdm_login_query (msg);
}
}
/* If ``Last'' language is selected */
- if(!strcasecmp(curlang, lastlang)) {
+ if (!strcasecmp (curlang, lastlang)) {
/* User has no saved language. Use default. */
- if(!usrlang) {
- language=GdmDefaultLocale;
- savelang=TRUE;
+ if (!usrlang) {
+ language = GdmDefaultLocale;
+ savelang = TRUE;
}
else {
- language=usrlang;
- savelang=FALSE;
+ language = usrlang;
+ savelang = FALSE;
}
}
/* One of the available languages is selected */
else {
- language=curlang;
+ language = curlang;
/* User has no saved language. Use current */
- if(!usrlang)
- savelang=TRUE;
+ if (!usrlang)
+ savelang = TRUE;
/* User selected a new language */
else {
- g_snprintf(msg, 1023,
- _("You have chosen %s for this session, but your default setting is %s.\n" \
- "Do you wish to make %s the default for future sessions?"),
- curlang, usrlang, curlang);
- savelang=gdm_login_query(msg);
+ g_snprintf (msg, 1023,
+ _("You have chosen %s for this session, but your default setting is %s.\n" \
+ "Do you wish to make %s the default for future sessions?"),
+ curlang, usrlang, curlang);
+ savelang = gdm_login_query (msg);
}
}
@@ -587,42 +580,39 @@ gdm_login_sesslang_lookup(void) /* Input validation sucks */
static gboolean
gdm_login_entry_handler (GtkWidget *widget, GdkEventKey *event)
{
- if(!event)
+ if (!event)
return(TRUE);
- switch(event->keyval) {
+ switch (event->keyval) {
case GDK_Return:
- gtk_widget_set_sensitive(entry, FALSE);
+ gtk_widget_set_sensitive (GTK_WIDGET (entry), FALSE);
+ gtk_widget_set_sensitive (GTK_WIDGET (browser), FALSE);
/* Save login. I'm making the assumption that login is always
* the first thing entered. This might not be true for all PAM
* setups. Needs thinking!
*/
- if(!curuser)
- curuser=g_strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
+ if (!curuser)
+ curuser = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
- g_print("%s\n", gtk_entry_get_text(GTK_ENTRY(entry)));
+ g_print ("%s\n", gtk_entry_get_text (GTK_ENTRY (entry)));
break;
case GDK_Up:
case GDK_Down:
case GDK_Tab:
- gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event");
- break;
-
+ gtk_signal_emit_stop_by_name (GTK_OBJECT (entry), "key_press_event");
break;
- case GDK_F1:
- gdm_login_about();
break;
default:
break;
}
- return(TRUE);
+ return (TRUE);
}
@@ -631,17 +621,17 @@ gdm_login_session_handler (GtkWidget *widget)
{
gchar *s;
- gtk_label_get(GTK_LABEL(GTK_BIN(widget)->child), &cursess);
- s=g_strdup_printf(_("%s session selected"), cursess);
- gtk_label_set(GTK_LABEL(msg), s);
- g_free(s);
+ gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &cursess);
+ s = g_strdup_printf (_("%s session selected"), cursess);
+ gtk_label_set (GTK_LABEL (msg), s);
+ g_free (s);
}
static void
-gdm_login_session_init(GtkWidget *menu)
+gdm_login_session_init (GtkWidget *menu)
{
- GSList *sessgrp=NULL;
+ GSList *sessgrp = NULL;
GtkWidget *item;
DIR *sessdir;
struct dirent *dent;
@@ -650,71 +640,71 @@ gdm_login_session_init(GtkWidget *menu)
lastsess=_("Last");
- cursess=lastsess;
- item = gtk_radio_menu_item_new_with_label(NULL, lastsess);
- sessgrp = gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(item));
- gtk_menu_append(GTK_MENU(menu), item);
- gtk_signal_connect(GTK_OBJECT(item), "activate", gdm_login_session_handler, NULL);
- gtk_widget_show(item);
+ cursess = lastsess;
+ item = gtk_radio_menu_item_new_with_label (NULL, lastsess);
+ sessgrp = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item));
+ gtk_menu_append (GTK_MENU (menu), item);
+ gtk_signal_connect (GTK_OBJECT (item), "activate", gdm_login_session_handler, NULL);
+ gtk_widget_show (GTK_WIDGET (item));
item = gtk_menu_item_new();
- gtk_menu_append(GTK_MENU(menu), item);
- gtk_widget_show(item);
+ gtk_menu_append (GTK_MENU (menu), item);
+ gtk_widget_show (GTK_WIDGET (item));
/* Check that session dir is readable */
- if (access(GdmSessionDir, R_OK|X_OK))
- gdm_login_abort(_("gdm_login_session_init: Session script directory not found!"));
+ if (access (GdmSessionDir, R_OK|X_OK))
+ gdm_login_abort (_("gdm_login_session_init: Session script directory not found!"));
/* Read directory entries in session dir */
- sessdir=opendir(GdmSessionDir);
- dent=readdir(sessdir);
+ sessdir = opendir (GdmSessionDir);
+ dent = readdir (sessdir);
- while(dent != NULL) {
+ while (dent != NULL) {
gchar *s;
- s=g_strconcat(GdmSessionDir, "/", dent->d_name, NULL);
- lstat(s, &statbuf);
+ s = g_strconcat (GdmSessionDir, "/", dent->d_name, NULL);
+ lstat (s, &statbuf);
/* If default session link exists, find out what it points to */
- if(S_ISLNK(statbuf.st_mode) && !strcasecmp(dent->d_name, "default")) {
+ if (S_ISLNK (statbuf.st_mode) && !strcasecmp (dent->d_name, "default")) {
gchar t[_POSIX_PATH_MAX];
- linklen=readlink(s, t, _POSIX_PATH_MAX);
- t[linklen]=0;
- defsess=g_strdup(t);
+ linklen = readlink (s, t, _POSIX_PATH_MAX);
+ t[linklen] = 0;
+ defsess = g_strdup (t);
}
/* If session script is readable/executable add it to the list */
- if(S_ISREG(statbuf.st_mode)) {
+ if (S_ISREG (statbuf.st_mode)) {
- if((statbuf.st_mode & (S_IRUSR|S_IXUSR)) == (S_IRUSR|S_IXUSR) &&
- (statbuf.st_mode & (S_IRGRP|S_IXGRP)) == (S_IRGRP|S_IXGRP) &&
- (statbuf.st_mode & (S_IROTH|S_IXOTH)) == (S_IROTH|S_IXOTH))
+ if ((statbuf.st_mode & (S_IRUSR|S_IXUSR)) == (S_IRUSR|S_IXUSR) &&
+ (statbuf.st_mode & (S_IRGRP|S_IXGRP)) == (S_IRGRP|S_IXGRP) &&
+ (statbuf.st_mode & (S_IROTH|S_IXOTH)) == (S_IROTH|S_IXOTH))
{
- item=gtk_radio_menu_item_new_with_label(sessgrp, dent->d_name);
- sessgrp=gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM (item));
- sessions=g_slist_append(sessions, dent->d_name);
- gtk_menu_append(GTK_MENU(menu), item);
- gtk_signal_connect(GTK_OBJECT (item), "activate",
- GTK_SIGNAL_FUNC (gdm_login_session_handler), NULL);
- gtk_widget_show(item);
+ item = gtk_radio_menu_item_new_with_label (sessgrp, dent->d_name);
+ sessgrp = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item));
+ sessions = g_slist_append (sessions, dent->d_name);
+ gtk_menu_append (GTK_MENU (menu), item);
+ gtk_signal_connect (GTK_OBJECT (item), "activate",
+ GTK_SIGNAL_FUNC (gdm_login_session_handler), NULL);
+ gtk_widget_show (GTK_WIDGET (item));
}
else
- syslog(LOG_ERR, "Wrong permissions on %s/%s. Should be readable/executable for all.",
- GdmSessionDir, dent->d_name);
+ syslog (LOG_ERR, "Wrong permissions on %s/%s. Should be readable/executable for all.",
+ GdmSessionDir, dent->d_name);
}
- dent=readdir(sessdir);
- g_free(s);
+ dent = readdir (sessdir);
+ g_free (s);
}
- if(!g_slist_length(sessgrp))
- gdm_login_abort(_("No session scripts found. Aborting!"));
+ if (!g_slist_length (sessgrp))
+ gdm_login_abort (_("No session scripts found. Aborting!"));
- if(!defsess) {
- gtk_label_get(GTK_LABEL(GTK_BIN(g_slist_nth_data(sessgrp, 0))->child), &defsess);
- syslog(LOG_WARNING, _("No default session link found. Using %s.\n"), defsess);
+ if (!defsess) {
+ gtk_label_get (GTK_LABEL (GTK_BIN (g_slist_nth_data (sessgrp, 0))->child), &defsess);
+ syslog (LOG_WARNING, _("No default session link found. Using %s.\n"), defsess);
}
}
@@ -724,374 +714,765 @@ gdm_login_language_handler (GtkWidget *widget)
{
gchar *s;
- gtk_label_get(GTK_LABEL(GTK_BIN(widget)->child), &curlang);
- s=g_strdup_printf(_("%s language selected"), curlang);
- gtk_label_set(GTK_LABEL(msg), s);
- g_free(s);
+ if (!widget)
+ return;
+
+ gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &curlang);
+ s = g_strdup_printf (_("%s language selected"), curlang);
+ gtk_label_set (GTK_LABEL (msg), s);
+ g_free (s);
}
static void
-gdm_login_language_init(GtkWidget *menu)
+gdm_login_language_init (GtkWidget *menu)
{
GtkWidget *item, *ammenu, *nzmenu, *omenu;
FILE *langlist;
char curline[256];
char *ctmp, *ctmp1, *ctmp2;
- lastlang=_("Last");
- curlang=lastlang;
-
- item=gtk_radio_menu_item_new_with_label(NULL, lastlang);
- languages=gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(item));
- gtk_menu_append(GTK_MENU(menu), item);
- gtk_signal_connect(GTK_OBJECT(item), "activate", gdm_login_language_handler, NULL);
- gtk_widget_show(item);
-
- item=gtk_menu_item_new();
- gtk_menu_append(GTK_MENU(menu), item);
- gtk_widget_show(item);
-
- item=gtk_menu_item_new_with_label(_("A-M"));
- ammenu=gtk_menu_new();
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), ammenu);
- gtk_menu_append(GTK_MENU(menu), item);
- gtk_widget_show(item);
-
- item=gtk_menu_item_new_with_label(_("N-Z"));
- nzmenu=gtk_menu_new();
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), nzmenu);
- gtk_menu_append(GTK_MENU(menu), item);
- gtk_widget_show(item);
+ if (!menu)
+ return;
- item=gtk_menu_item_new_with_label(_("Other"));
- omenu=gtk_menu_new();
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), omenu);
- gtk_menu_append(GTK_MENU(menu), item);
- gtk_widget_show(item);
+ lastlang = _("Last");
+ curlang = lastlang;
- langlist = fopen(GdmLocaleFile, "r");
+ item = gtk_radio_menu_item_new_with_label (NULL, lastlang);
+ languages = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item));
+ gtk_menu_append (GTK_MENU(menu), item);
+ gtk_signal_connect (GTK_OBJECT (item), "activate",
+ GTK_SIGNAL_FUNC (gdm_login_language_handler),
+ NULL);
+ gtk_widget_show (GTK_WIDGET (item));
- if(!langlist)
+ item = gtk_menu_item_new();
+ gtk_menu_append (GTK_MENU (menu), item);
+ gtk_widget_show (GTK_WIDGET (item));
+
+ item = gtk_menu_item_new_with_label (_("A-M"));
+ ammenu = gtk_menu_new();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), GTK_WIDGET (ammenu));
+ gtk_menu_append (GTK_MENU (menu), item);
+ gtk_widget_show (GTK_WIDGET (item));
+
+ item = gtk_menu_item_new_with_label (_("N-Z"));
+ nzmenu = gtk_menu_new();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), nzmenu);
+ gtk_menu_append (GTK_MENU (menu), item);
+ gtk_widget_show(GTK_WIDGET (item));
+
+ item = gtk_menu_item_new_with_label (_("Other"));
+ omenu = gtk_menu_new();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), omenu);
+ gtk_menu_append (GTK_MENU (menu), item);
+ gtk_widget_show (GTK_WIDGET (item));
+
+ langlist = fopen (GdmLocaleFile, "r");
+
+ if (!langlist)
return;
- while(fgets(curline, sizeof(curline), langlist)) {
+ while (fgets (curline, sizeof (curline), langlist)) {
- if(!isalpha(curline[0]))
+ if (!isalpha (curline[0]))
continue;
- ctmp1 = strchr(curline, ' ');
- ctmp2 = strchr(curline, '\t');
- ctmp = curline + strlen(curline) - 1;
+ ctmp1 = strchr (curline, ' ');
+ ctmp2 = strchr (curline, '\t');
+ ctmp = curline + strlen (curline) - 1;
- if(ctmp1 && (ctmp1 < ctmp))
+ if (ctmp1 && (ctmp1 < ctmp))
ctmp = ctmp1;
- if(ctmp2 && (ctmp2 < ctmp))
+ if (ctmp2 && (ctmp2 < ctmp))
ctmp = ctmp2;
*ctmp = '\0';
- curline[0] = toupper(curline[0]);
+ curline[0] = toupper (curline[0]);
- item=gtk_radio_menu_item_new_with_label(languages, curline);
- languages=gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(item));
+ item = gtk_radio_menu_item_new_with_label (languages, curline);
+ languages = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item));
- if(curline[0] >= 'A' && curline[0] <= 'M')
- gtk_menu_append(GTK_MENU(ammenu), item);
- else if(curline[0] >= 'N' && curline[0] <= 'Z')
- gtk_menu_append(GTK_MENU(nzmenu), item);
+ if (curline[0] >= 'A' && curline[0] <= 'M')
+ gtk_menu_append (GTK_MENU (ammenu), item);
+ else if (curline[0] >= 'N' && curline[0] <= 'Z')
+ gtk_menu_append (GTK_MENU (nzmenu), item);
else
- gtk_menu_append(GTK_MENU(omenu), item);
+ gtk_menu_append (GTK_MENU (omenu), item);
- gtk_signal_connect(GTK_OBJECT(item), "activate", gdm_login_language_handler, NULL);
- gtk_widget_show(item);
+ gtk_signal_connect (GTK_OBJECT (item), "activate",
+ GTK_SIGNAL_FUNC (gdm_login_language_handler),
+ NULL);
+ gtk_widget_show (GTK_WIDGET (item));
}
- fclose(langlist);
+ fclose (langlist);
}
static gboolean
-gdm_login_ctrl_handler(GIOChannel *source, GIOCondition cond, gint fd)
+gdm_login_ctrl_handler (GIOChannel *source, GIOCondition cond, gint fd)
{
gchar buf[PIPE_SIZE];
gint len;
gint i, x, y;
- if(cond != G_IO_IN)
- return(TRUE);
+ if (cond != G_IO_IN)
+ return (TRUE);
- g_io_channel_read(source, buf, 1, &len);
+ g_io_channel_read (source, buf, 1, &len);
- if(len!=1)
- return(TRUE);
+ if (len!=1)
+ return (TRUE);
- switch(buf[0]) {
+ switch (buf[0]) {
case GDM_PROMPT:
- g_io_channel_read(source, buf, PIPE_SIZE-1, &len);
- buf[len-1]='\0';
- gtk_label_set(GTK_LABEL(label), buf);
- gtk_widget_show(label);
- gtk_entry_set_text(GTK_ENTRY(entry), "");
- gtk_entry_set_visibility(GTK_ENTRY(entry), TRUE);
- gtk_widget_set_sensitive(entry, TRUE);
- gtk_widget_grab_focus(entry);
- gtk_widget_show(entry);
+ g_io_channel_read (source, buf, PIPE_SIZE-1, &len);
+ buf[len-1] = '\0';
+ gtk_label_set (GTK_LABEL (label), buf);
+ gtk_widget_show (GTK_WIDGET (label));
+ gtk_entry_set_text (GTK_ENTRY (entry), "");
+ gtk_entry_set_visibility (GTK_ENTRY (entry), TRUE);
+ gtk_widget_set_sensitive (GTK_WIDGET (entry), TRUE);
+ gtk_widget_grab_focus (GTK_WIDGET (entry));
+ gtk_widget_show (GTK_WIDGET (entry));
break;
case GDM_NOECHO:
- g_io_channel_read(source, buf, PIPE_SIZE-1, &len);
- buf[len-1]='\0';
- gtk_label_set(GTK_LABEL(label), buf);
- gtk_widget_show(label);
- gtk_entry_set_text(GTK_ENTRY(entry), "");
- gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
- gtk_widget_set_sensitive(entry, TRUE);
- gtk_widget_grab_focus(entry);
- gtk_widget_show(entry);
+ g_io_channel_read (source, buf, PIPE_SIZE-1, &len);
+ buf[len-1] = '\0';
+ gtk_label_set (GTK_LABEL(label), buf);
+ gtk_widget_show (GTK_WIDGET (label));
+ gtk_entry_set_text (GTK_ENTRY (entry), "");
+ gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE);
+ gtk_widget_set_sensitive (GTK_WIDGET (entry), TRUE);
+ gtk_widget_grab_focus (GTK_WIDGET (entry));
+ gtk_widget_show (GTK_WIDGET (entry));
break;
case GDM_MSGERR:
- g_io_channel_read(source, buf, PIPE_SIZE-1, &len);
- buf[len-1]='\0';
- gtk_label_set(GTK_LABEL(msg), buf);
- gtk_widget_show(msg);
- g_print("\n");
+ g_io_channel_read (source, buf, PIPE_SIZE-1, &len);
+ buf[len-1] = '\0';
+ gtk_label_set (GTK_LABEL(msg), buf);
+ gtk_widget_show (GTK_WIDGET (msg));
+ g_print ("\n");
break;
case GDM_SESS:
- g_io_channel_read(source, buf, PIPE_SIZE-1, &len); /* Empty */
+ g_io_channel_read (source, buf, PIPE_SIZE-1, &len); /* Empty */
gdm_login_sesslang_lookup(); /* Lookup session and language */
- g_print("%s\n", session);
+ g_print ("%s\n", session);
break;
case GDM_LANG:
- g_io_channel_read(source, buf, PIPE_SIZE-1, &len); /* Empty */
- g_print("%s\n", language);
+ g_io_channel_read (source, buf, PIPE_SIZE-1, &len); /* Empty */
+ g_print ("%s\n", language);
break;
case GDM_SSESS:
- g_io_channel_read(source, buf, PIPE_SIZE-1, &len); /* Empty */
+ g_io_channel_read (source, buf, PIPE_SIZE-1, &len); /* Empty */
- if(savesess)
- g_print("Y\n");
+ if (savesess)
+ g_print ("Y\n");
else
- g_print("\n");
+ g_print ("\n");
break;
case GDM_SLANG:
- g_io_channel_read(source, buf, PIPE_SIZE-1, &len); /* Empty */
+ g_io_channel_read (source, buf, PIPE_SIZE-1, &len); /* Empty */
- if(savelang)
- g_print("Y\n");
+ if (savelang)
+ g_print ("Y\n");
else
- g_print("\n");
+ g_print ("\n");
break;
case GDM_RESET:
- g_io_channel_read(source, buf, PIPE_SIZE-1, &len);
- buf[len-1]='\0';
+ g_io_channel_read (source, buf, PIPE_SIZE-1, &len);
+ buf[len-1] = '\0';
- if(GdmQuiver) {
- gdk_window_get_position(login->window, &x, &y);
+ if (GdmQuiver) {
+ gdk_window_get_position (login->window, &x, &y);
for (i=32 ; i > 0 ; i=i/2) {
- gdk_window_move(login->window, i+x, y);
- gdk_window_move(login->window, x, y);
- gdk_window_move(login->window, -i+x, y);
- gdk_window_move(login->window, x, y);
+ gdk_window_move (login->window, i+x, y);
+ gdk_window_move (login->window, x, y);
+ gdk_window_move (login->window, -i+x, y);
+ gdk_window_move (login->window, x, y);
}
}
- if(curuser) {
- g_free(curuser);
+ if (curuser) {
+ g_free (curuser);
curuser=NULL;
}
- g_print("\n");
+ gtk_widget_set_sensitive (GTK_WIDGET (entry), TRUE);
+ gtk_widget_set_sensitive (GTK_WIDGET (browser), TRUE);
+
+ g_print ("\n");
break;
case GDM_QUIT:
- exit(EXIT_SUCCESS);
+ exit (EXIT_SUCCESS);
break;
default:
break;
}
- return(TRUE);
+ return (TRUE);
+}
+
+
+static void
+gdm_login_browser_update (void)
+{
+ GList *list = users;
+
+ gnome_icon_list_clear (GNOME_ICON_LIST (browser));
+
+ while (list) {
+ GdmLoginUser *user = list->data;
+
+ gnome_icon_list_append_imlib (GNOME_ICON_LIST (browser), user->picture, user->login);
+ list = list->next;
+ }
+
+ gnome_icon_list_thaw (GNOME_ICON_LIST (browser));
+}
+
+
+static gboolean
+gdm_login_browser_select (GtkWidget *widget, gint selected, GdkEvent *event)
+{
+ GdmLoginUser *user;
+
+ if (!widget || !event)
+ return (TRUE);
+
+ switch (event->type) {
+
+ case GDK_BUTTON_PRESS:
+ case GDK_BUTTON_RELEASE:
+ user = g_list_nth_data (users, selected);
+
+ if (user && user->login)
+ gtk_entry_set_text (GTK_ENTRY (entry), user->login);
+
+ break;
+
+ case GDK_2BUTTON_PRESS:
+ user = g_list_nth_data (users, selected);
+
+ if (user && user->login)
+ gtk_entry_set_text (GTK_ENTRY (entry), user->login);
+
+ gtk_widget_set_sensitive (GTK_WIDGET (browser), FALSE);
+ g_print ("%s\n", gtk_entry_get_text (GTK_ENTRY (entry)));
+ break;
+
+ default:
+ break;
+ }
+
+ return (TRUE);
+}
+
+
+static gboolean
+gdm_login_browser_unselect (GtkWidget *widget, gint selected, GdkEvent *event)
+{
+ if (!widget || !event)
+ return (TRUE);
+
+ switch (event->type) {
+
+ case GDK_BUTTON_PRESS:
+ case GDK_BUTTON_RELEASE:
+ gtk_entry_set_text (GTK_ENTRY (entry), "");
+ break;
+
+ default:
+ break;
+ }
+
+ return (TRUE);
}
static void
-gdm_login_gui_init(void)
+gdm_login_gui_init (void)
{
+ GtkWidget *frame1, *frame2;
+ GtkWidget *mbox, *menu, *menubar, *item, *welcome;
+ GtkWidget *table, *stack, *hline1, *hline2;
+ GtkWidget *bbox = NULL;
+ GtkWidget *logoframe = NULL;
GtkStyle *style;
- GtkWidget *frame, *frame2, *hbox, *hline, *item, *lebox, *logo, *logobox;
- GtkWidget *logoframe, *mbox, *menu, *menubar, *vbox, *welcome;
gchar *greeting;
+ gint cols, rows;
if(GdmGtkRC)
- gtk_rc_parse(GdmGtkRC);
-
- rootwin=gdk_window_foreign_new (GDK_ROOT_WINDOW ());
-
- login=gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_container_border_width(GTK_CONTAINER(login), 0);
-
- frame=gtk_frame_new(NULL);
- gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT);
- gtk_container_border_width(GTK_CONTAINER(frame), 0);
- gtk_container_add(GTK_CONTAINER(login), frame);
- gtk_widget_show(frame);
-
- frame2=gtk_frame_new(NULL);
- gtk_frame_set_shadow_type(GTK_FRAME(frame2), GTK_SHADOW_IN);
- gtk_container_border_width(GTK_CONTAINER(frame2), 2);
- gtk_container_add(GTK_CONTAINER(frame), frame2);
- gtk_widget_show(frame2);
-
- mbox=gtk_vbox_new(FALSE,0);
- gtk_container_add(GTK_CONTAINER(frame2), mbox);
- gtk_widget_show(mbox);
-
- menubar=gtk_menu_bar_new();
- gtk_box_pack_start(GTK_BOX(mbox), menubar, FALSE, FALSE, 0);
-
- menu=gtk_menu_new();
- gdm_login_session_init(menu);
- sessmenu=gtk_menu_item_new_with_label(_("Session"));
- gtk_menu_bar_append(GTK_MENU_BAR(menubar), sessmenu);
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(sessmenu), menu);
- gtk_widget_show(sessmenu);
-
- menu=gtk_menu_new();
- gdm_login_language_init(menu);
- langmenu=gtk_menu_item_new_with_label(_("Language"));
- gtk_menu_bar_append(GTK_MENU_BAR(menubar), langmenu);
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(langmenu), menu);
- gtk_widget_show(langmenu);
-
- if(GdmShutdownMenu) {
- menu=gtk_menu_new();
- item=gtk_menu_item_new_with_label(_("Reboot..."));
- gtk_menu_append(GTK_MENU(menu), item);
- gtk_signal_connect(GTK_OBJECT (item), "activate",
- GTK_SIGNAL_FUNC(gdm_login_reboot_handler), NULL);
- gtk_widget_show(item);
+ gtk_rc_parse (GdmGtkRC);
+
+ rootwin = gdk_window_foreign_new (GDK_ROOT_WINDOW ());
+
+ login = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_widget_ref (login);
+ gtk_object_set_data_full (GTK_OBJECT (login), "login", login,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_window_set_title (GTK_WINDOW (login), "GDM Login");
+
+ frame1 = gtk_frame_new (NULL);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_OUT);
+ gtk_container_border_width (GTK_CONTAINER (frame1), 0);
+ gtk_container_add (GTK_CONTAINER (login), frame1);
+ gtk_object_set_data_full (GTK_OBJECT (login), "frame1", frame1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_ref (GTK_WIDGET (frame1));
+ gtk_widget_show (GTK_WIDGET (frame1));
+
+ frame2 = gtk_frame_new(NULL);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
+ gtk_container_border_width (GTK_CONTAINER (frame2), 2);
+ gtk_container_add (GTK_CONTAINER (frame1), frame2);
+ gtk_object_set_data_full (GTK_OBJECT (login), "frame2", frame2,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_ref (GTK_WIDGET (frame2));
+ gtk_widget_show (GTK_WIDGET (frame2));
+
+ mbox = gtk_vbox_new (FALSE, 0);
+ gtk_widget_ref (mbox);
+ gtk_object_set_data_full (GTK_OBJECT (login), "mbox", mbox,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (mbox);
+ gtk_container_add (GTK_CONTAINER (frame2), mbox);
+
+ menubar = gtk_menu_bar_new();
+ gtk_widget_ref (GTK_WIDGET (menubar));
+ gtk_box_pack_start (GTK_BOX (mbox), menubar, FALSE, FALSE, 0);
+
+ menu = gtk_menu_new();
+ gdm_login_session_init (menu);
+ sessmenu = gtk_menu_item_new_with_label (_("Session"));
+ gtk_menu_bar_append (GTK_MENU_BAR(menubar), sessmenu);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (sessmenu), menu);
+ gtk_widget_show (GTK_WIDGET (sessmenu));
+
+ menu = gtk_menu_new();
+ gdm_login_language_init (menu);
+ langmenu = gtk_menu_item_new_with_label (_("Language"));
+ gtk_menu_bar_append (GTK_MENU_BAR (menubar), langmenu);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (langmenu), menu);
+ gtk_widget_show (GTK_WIDGET (langmenu));
+
+ if (GdmSystemMenu) {
+ menu = gtk_menu_new();
+ item = gtk_menu_item_new_with_label (_("Reboot..."));
+ gtk_menu_append (GTK_MENU (menu), item);
+ gtk_signal_connect (GTK_OBJECT (item), "activate",
+ GTK_SIGNAL_FUNC (gdm_login_reboot_handler),
+ NULL);
+ gtk_widget_show (GTK_WIDGET (item));
- item=gtk_menu_item_new_with_label(_("Halt..."));
- gtk_menu_append(GTK_MENU(menu), item);
- gtk_signal_connect(GTK_OBJECT(item), "activate",
- GTK_SIGNAL_FUNC(gdm_login_halt_handler), NULL);
- gtk_widget_show(item);
+ item = gtk_menu_item_new_with_label (_("Halt..."));
+ gtk_menu_append (GTK_MENU (menu), item);
+ gtk_signal_connect (GTK_OBJECT (item), "activate",
+ GTK_SIGNAL_FUNC (gdm_login_halt_handler),
+ NULL);
+ gtk_widget_show (GTK_WIDGET (item));
- item=gtk_menu_item_new_with_label(_("System"));
- gtk_menu_bar_append(GTK_MENU_BAR(menubar), item);
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), menu);
- gtk_widget_show(item);
+ item = gtk_menu_item_new_with_label (_("System"));
+ gtk_menu_bar_append (GTK_MENU_BAR (menubar), item);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), menu);
+ gtk_widget_show (GTK_WIDGET (item));
}
- if(GdmChooserMenu) {
- item=gtk_menu_item_new_with_label(_("Host chooser"));
- gtk_menu_bar_append(GTK_MENU_BAR(menubar), item);
- gtk_widget_show(item);
- }
-
- if(GdmIconify) {
- if(access(GdmIconFile, R_OK)) {
- syslog(LOG_WARNING, _("Can't open icon file: %s. Suspending iconify feature!"), GdmIconFile);
- GdmIconify=0;
+ if (GdmIcon) {
+ if (access (GdmIcon, R_OK)) {
+ syslog (LOG_WARNING, _("Can't open icon file: %s. Suspending iconify feature!"), GdmIcon);
}
else {
- item=gtk_menu_item_new_with_label(_("Iconify"));
- gtk_menu_bar_append(GTK_MENU_BAR(menubar), item);
- gtk_signal_connect(GTK_OBJECT(item), "activate",
- GTK_SIGNAL_FUNC(gdm_login_iconify_handler), NULL);
- gtk_widget_show(item);
+ item = gtk_menu_item_new_with_label (_("Iconify"));
+ gtk_menu_bar_append (GTK_MENU_BAR (menubar), item);
+ gtk_signal_connect (GTK_OBJECT (item), "activate",
+ GTK_SIGNAL_FUNC (gdm_login_iconify_handler),
+ NULL);
+ gtk_widget_show (GTK_WIDGET (item));
}
}
- hbox=gtk_hbox_new(FALSE, 0);
- gtk_container_border_width(GTK_CONTAINER(hbox), 10);
- gtk_box_pack_end(GTK_BOX(mbox), hbox, FALSE, FALSE, 0);
- gtk_widget_show(hbox);
-
- if (GdmLogoFilename && !access(GdmLogoFilename, R_OK)) {
- logobox=gtk_vbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(hbox), logobox, FALSE, FALSE, 0);
+ if (GdmBrowser)
+ rows = 2;
+ else
+ rows = 1;
+
+ if (GdmLogo)
+ cols = 2;
+ else
+ cols = 1;
+
+ table = gtk_table_new (rows, cols, FALSE);
+ gtk_widget_ref (table);
+ gtk_object_set_data_full (GTK_OBJECT (login), "table", table,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (table);
+ gtk_box_pack_start (GTK_BOX (mbox), table, TRUE, TRUE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (table), 10);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 10);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 10);
+
+ if (GdmBrowser) {
+ GtkStyle *style;
+ GdkColor bbg = { 0, 0xFFFF, 0xFFFF, 0xFFFF };
+ GtkWidget *bframe;
+ GtkWidget *scrollbar;
+
+ /* Find background style for browser */
+ style = gtk_style_copy (login->style);
+ style->bg[GTK_STATE_NORMAL] = bbg;
+ gtk_widget_push_style (style);
+
+ /* Icon list */
+ if (maxwidth < GdmIconMaxWidth/2)
+ maxwidth = (gint) GdmIconMaxWidth/2;
+
+ browser = GNOME_ICON_LIST (gnome_icon_list_new (maxwidth+20, NULL, FALSE));
+ gnome_icon_list_freeze (GNOME_ICON_LIST (browser));
+ gnome_icon_list_set_separators (GNOME_ICON_LIST (browser), " /-_.");
+ gnome_icon_list_set_row_spacing (GNOME_ICON_LIST (browser), 2);
+ gnome_icon_list_set_col_spacing (GNOME_ICON_LIST (browser), 2);
+ gnome_icon_list_set_icon_border (GNOME_ICON_LIST (browser), 2);
+ gnome_icon_list_set_text_spacing (GNOME_ICON_LIST (browser), 2);
+ gnome_icon_list_set_selection_mode (GNOME_ICON_LIST (browser), GTK_SELECTION_SINGLE);
+ gtk_signal_connect (GTK_OBJECT (browser), "select_icon",
+ GTK_SIGNAL_FUNC (gdm_login_browser_select), NULL);
+ gtk_signal_connect (GTK_OBJECT (browser), "unselect_icon",
+ GTK_SIGNAL_FUNC (gdm_login_browser_unselect), NULL);
+ gtk_widget_pop_style();
+
+ /* Browser 3D frame */
+ bframe = gtk_frame_new (NULL);
+ gtk_frame_set_shadow_type (GTK_FRAME (bframe), GTK_SHADOW_IN);
+ gtk_container_add (GTK_CONTAINER(bframe), GTK_WIDGET (browser));
+
+ /* Browser scroll bar */
+ scrollbar = gtk_vscrollbar_new (browser->adj);
+
+ /* Box containing all browser functionality */
+ bbox = gtk_hbox_new (0, 0);
+ gtk_box_pack_start (GTK_BOX (bbox), GTK_WIDGET (bframe), 1, 1, 0);
+ gtk_box_pack_start (GTK_BOX (bbox), GTK_WIDGET (scrollbar), 0, 0, 0);
+ gtk_widget_show_all (GTK_WIDGET (bbox));
+ }
- logoframe=gtk_frame_new(NULL);
- gtk_frame_set_shadow_type(GTK_FRAME(logoframe), GTK_SHADOW_IN);
- gtk_box_pack_start(GTK_BOX(logobox), logoframe, FALSE, FALSE, 0);
- gtk_widget_show(logoframe);
+ if (GdmLogo && !access (GdmLogo, R_OK)) {
+ GtkWidget *logo;
- logo=gnome_pixmap_new_from_file(GdmLogoFilename);
- gtk_container_add(GTK_CONTAINER(logoframe), logo);
- gtk_widget_show(logo);
+ logoframe = gtk_frame_new (NULL);
+ gtk_widget_ref (logoframe);
+ gtk_object_set_data_full (GTK_OBJECT (login), "logoframe", logoframe,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (logoframe);
+ gtk_frame_set_shadow_type (GTK_FRAME (logoframe), GTK_SHADOW_IN);
- gtk_widget_show(logobox);
+ logo = gnome_pixmap_new_from_file (GdmLogo);
+ gtk_container_add (GTK_CONTAINER (logoframe), logo);
+ gtk_widget_show (GTK_WIDGET (logo));
}
- vbox=gtk_vbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
- gtk_container_border_width(GTK_CONTAINER(vbox), 10);
- gtk_widget_show(vbox);
+ stack = gtk_table_new (6, 1, FALSE);
+ gtk_widget_ref (stack);
+ gtk_object_set_data_full (GTK_OBJECT (login), "stack", stack,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (stack);
style = gtk_style_new();
- gdk_font_unref(style->font);
- style->font = gdk_font_load (GdmMessageFont);
- gtk_widget_push_style(style);
- greeting=gdm_parse_enriched_string(GdmMessageText);
- welcome=gtk_label_new(greeting);
+ gdk_font_unref (style->font);
+ style->font = gdk_font_load (GdmFont);
+ gtk_widget_push_style (style);
+
+ greeting = gdm_parse_enriched_string (GdmWelcome);
+ welcome = gtk_label_new (greeting);
+ gtk_widget_set_name(welcome, "Welcome");
g_free(greeting);
- gtk_box_pack_start(GTK_BOX(vbox), welcome, TRUE, FALSE, 10);
- gtk_widget_show(welcome);
- gtk_widget_pop_style();
-
- msg=gtk_label_new("Please enter your login");
- gtk_box_pack_end(GTK_BOX(vbox), msg, FALSE, TRUE, 0);
- gtk_widget_show(msg);
-
- hline=gtk_hseparator_new();
- gtk_box_pack_end(GTK_BOX(vbox), hline, FALSE, FALSE, 10);
- gtk_widget_show(hline);
-
- lebox=gtk_vbox_new(FALSE, 0);
- gtk_container_border_width(GTK_CONTAINER(lebox), 5);
- gtk_box_pack_end(GTK_BOX(vbox), lebox, FALSE, FALSE, 5);
- gtk_widget_show(lebox);
-
- label=gtk_label_new("Login:");
- gtk_box_pack_start(GTK_BOX(lebox), label, FALSE, FALSE, 5);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
- gtk_widget_show(label);
-
- entry=gtk_entry_new_with_max_length(32);
- gtk_box_pack_start(GTK_BOX(lebox), entry, FALSE, FALSE, 5);
- gtk_entry_set_text(GTK_ENTRY(entry), "");
- gtk_signal_connect_object(GTK_OBJECT(entry),
- "key_press_event",
- GTK_SIGNAL_FUNC(gdm_login_entry_handler),
- NULL);
- gtk_widget_show(entry);
-
- hline=gtk_hseparator_new();
- gtk_box_pack_end(GTK_BOX(vbox), hline, FALSE, FALSE, 10);
- gtk_widget_show(hline);
-
- gtk_widget_grab_focus(entry);
- gtk_window_set_focus(GTK_WINDOW (login), entry);
- gtk_window_set_policy(GTK_WINDOW (login), 1, 1, 1);
- gtk_window_position(GTK_WINDOW (login), GTK_WIN_POS_CENTER);
-
- gtk_widget_set_usize(GTK_WIDGET(login),
- (gint)gdk_screen_width() * 0.5,
- 0);
-
- gtk_widget_show_all(login);
+ gtk_widget_ref (welcome);
+ gtk_object_set_data_full (GTK_OBJECT (login), "welcome", welcome,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (welcome);
+ gtk_table_attach (GTK_TABLE (stack), welcome, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ gtk_widget_pop_style ();
+
+ hline1 = gtk_hseparator_new ();
+ gtk_widget_ref (hline1);
+ gtk_object_set_data_full (GTK_OBJECT (login), "hline1", hline1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (hline1);
+ gtk_table_attach (GTK_TABLE (stack), hline1, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 10);
+
+ label = gtk_label_new (_("Login:"));
+ gtk_widget_ref (label);
+ gtk_object_set_data_full (GTK_OBJECT (login), "label", label,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (stack), label, 0, 1, 2, 3,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+ gtk_misc_set_padding (GTK_MISC (label), 10, 5);
+
+ entry = gtk_entry_new_with_max_length (32);
+ gtk_widget_ref (entry);
+ gtk_object_set_data_full (GTK_OBJECT (login), "entry", entry,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_entry_set_text (GTK_ENTRY (entry), "");
+ gtk_widget_show (entry);
+ gtk_table_attach (GTK_TABLE (stack), entry, 0, 1, 3, 4,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 10, 0);
+ gtk_signal_connect_object (GTK_OBJECT(entry),
+ "key_press_event",
+ GTK_SIGNAL_FUNC (gdm_login_entry_handler),
+ NULL);
+
+ hline2 = gtk_hseparator_new ();
+ gtk_widget_ref (hline2);
+ gtk_object_set_data_full (GTK_OBJECT (login), "hline2", hline2,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (hline2);
+ gtk_table_attach (GTK_TABLE (stack), hline2, 0, 1, 4, 5,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 10);
+
+ msg = gtk_label_new (_("Please enter your login"));
+ gtk_widget_set_name(msg, "Message");
+ gtk_widget_ref (msg);
+ gtk_object_set_data_full (GTK_OBJECT (login), "msg", msg,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (msg);
+ gtk_table_attach (GTK_TABLE (stack), msg, 0, 1, 5, 6,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 10, 10);
+
+ /* Put it nicely together */
+
+ if (GdmBrowser && GdmLogo) {
+ gtk_table_attach (GTK_TABLE (table), bbox, 0, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+ gtk_table_attach (GTK_TABLE (table), logoframe, 0, 1, 1, 2,
+ (GtkAttachOptions) (0),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_table_attach (GTK_TABLE (table), stack, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
+ }
+ else if (GdmBrowser) {
+ gtk_table_attach (GTK_TABLE (table), bbox, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+ gtk_table_attach (GTK_TABLE (table), stack, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
+ }
+ else if (GdmLogo) {
+ gtk_table_attach (GTK_TABLE (table), logoframe, 0, 1, 0, 1,
+ (GtkAttachOptions) (0),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_table_attach (GTK_TABLE (table), stack, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
+ }
+ else
+ gtk_table_attach (GTK_TABLE (table), stack, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+ gtk_widget_grab_focus (GTK_WIDGET (entry));
+ gtk_window_set_focus (GTK_WINDOW (login), entry);
+ gtk_window_set_policy (GTK_WINDOW (login), 1, 1, 1);
+ gtk_window_position (GTK_WINDOW (login), GTK_WIN_POS_CENTER);
+
+ if (GdmBrowser)
+ gtk_widget_set_usize (GTK_WIDGET (login),
+ (gint) gdk_screen_width() * 0.6,
+ (gint) gdk_screen_height() * 0.8);
+ else
+ gtk_widget_set_usize (GTK_WIDGET (login),
+ (gint) gdk_screen_width() * 0.5,
+ 0);
+
+ gtk_widget_show_all (GTK_WIDGET (login));
+ gdk_keyboard_grab (rootwin, TRUE, CurrentTime);
+}
+
+
+static gint
+gdm_login_sort_func (gpointer d1, gpointer d2)
+{
+ GdmLoginUser *a = d1;
+ GdmLoginUser *b = d2;
+
+ if (!d1 || !d2)
+ return (0);
+
+ return (strcmp (a->login, b->login));
+}
+
+
+static GdmLoginUser *
+gdm_login_user_alloc (gchar *logname, uid_t uid, gchar *homedir)
+{
+ GdmLoginUser *user;
+ gboolean fileok;
+ gchar *gnomedir = NULL;
+ GdkImlibImage *img = NULL;
+
+ user = g_new0 (GdmLoginUser, 1);
+
+ if (!user)
+ return (NULL);
+
+ user->uid = uid;
+ user->login = g_strdup (logname);
+ user->homedir = g_strdup (homedir);
+
+ gnomedir = g_strconcat (homedir, "/.gnome", NULL);
+
+ fileok = gdm_file_check ("gdm_login_user_alloc", uid, gnomedir, "photo",
+ FALSE, GdmUserMaxFile, GdmRelaxPerms);
+
+ if (fileok) {
+ gchar *filename;
+
+ filename = g_strconcat (gnomedir, "/photo", NULL);
+ img = gdk_imlib_load_image (filename);
+ g_free (filename);
+ }
+ else {
+ gchar *filename;
+
+ filename = g_strconcat (GdmGlobalFaceDir, "/", logname, NULL);
+
+ if (access (filename, R_OK) == 0)
+ img = gdk_imlib_load_image (filename);
+
+ g_free (filename);
+ }
+
+ g_free (gnomedir);
+
+ if(img) {
+ gint w, h;
+
+ w = img->rgb_width;
+ h = img->rgb_height;
+
+ if (w>h && w > GdmIconMaxWidth) {
+ h = h * ((gfloat) GdmIconMaxWidth/w);
+ w = GdmIconMaxWidth;
+ }
+ else if (h>GdmIconMaxHeight) {
+ w = w * ((gfloat) GdmIconMaxHeight/h);
+ h = GdmIconMaxHeight;
+ }
+
+ maxwidth = MAX (maxwidth, w);
+ user->picture = gdk_imlib_clone_scaled_image (img, w, h);
+ gdk_imlib_destroy_image (img);
+ }
+ else
+ user->picture=defface;
+
+ return (user);
+}
+
+
+static gint
+gdm_login_check_exclude (gchar *logname)
+{
+ GSList *list = exclude;
+
+ while (list && list->data) {
+ if (! strcasecmp (logname, (gchar *) list->data))
+ return (TRUE);
+
+ list = list->next;
+ }
+
+ return (FALSE);
+}
+
+
+static gint
+gdm_login_check_shell (gchar *usersh)
+{
+ gint found = 0;
+ gchar *csh;
+
+ setusershell ();
+
+ while ((csh = getusershell ()) != NULL)
+ if (! strcmp (csh, usersh))
+ found = 1;
+
+ endusershell ();
+
+ return (found);
+}
+
+
+static void
+gdm_login_users_init (void)
+{
+ GdmLoginUser *user;
+ struct passwd *pwent;
+
+ if (access (GdmDefaultFace, R_OK)) {
+ syslog (LOG_WARNING, _("Can't open DefaultImage: %s. Suspending face browser!"), GdmDefaultFace);
+ GdmBrowser = 0;
+ return;
+ }
+ else
+ defface = gdk_imlib_load_image (GdmDefaultFace);
+
+ if (GdmExclude) {
+ gchar *s = strtok (GdmExclude, ",");
+ exclude = g_slist_append (exclude, g_strdup (s));
+
+ while ((s = strtok (NULL, ",")))
+ exclude = g_slist_append (exclude, g_strdup (s));
+ }
+
+ pwent = getpwent();
+
+ while (pwent != NULL) {
+
+ if (pwent->pw_shell &&
+ gdm_login_check_shell (pwent->pw_shell) &&
+ !gdm_login_check_exclude (pwent->pw_name)) {
+
+ user = gdm_login_user_alloc(pwent->pw_name,
+ pwent->pw_uid,
+ pwent->pw_dir);
+
+ if (user)
+ users = g_list_insert_sorted(users, user,
+ (GCompareFunc) gdm_login_sort_func);
+ }
+
+ pwent = getpwent();
+ }
}
@@ -1105,45 +1486,50 @@ main (int argc, char *argv[])
/* Avoid creating ~gdm/.gnome stuff */
gnome_do_not_create_directories = TRUE;
- openlog("gdmlogin", LOG_PID, LOG_DAEMON);
+ openlog ("gdmlogin", LOG_PID, LOG_DAEMON);
- gnome_init("gdmlogin", VERSION, argc, argv);
- gnome_sound_shutdown ();
- gnome_preferences_set_dialog_position(GTK_WIN_POS_CENTER);
+ gnome_init ("gdmlogin", VERSION, argc, argv);
+ gnome_sound_shutdown();
+ gnome_preferences_set_dialog_position (GTK_WIN_POS_CENTER);
gdm_login_parse_config();
+
+ if (GdmBrowser)
+ gdm_login_users_init ();
+
gdm_login_gui_init();
+ if (GdmBrowser)
+ gdm_login_browser_update();
+
hup.sa_handler = (void *) gdm_login_done;
hup.sa_flags = 0;
sigemptyset(&hup.sa_mask);
- if(sigaction(SIGHUP, &hup, NULL) < 0)
- gdm_login_abort(_("main: Error setting up HUP signal handler"));
+ if (sigaction (SIGHUP, &hup, NULL) < 0)
+ gdm_login_abort (_("main: Error setting up HUP signal handler"));
- if(sigaction(SIGINT, &hup, NULL) < 0)
- gdm_login_abort(_("main: Error setting up INT signal handler"));
+ if (sigaction (SIGINT, &hup, NULL) < 0)
+ gdm_login_abort (_("main: Error setting up INT signal handler"));
- if(sigaction(SIGTERM, &hup, NULL) < 0)
- gdm_login_abort(_("main: Error setting up TERM signal handler"));
+ if (sigaction (SIGTERM, &hup, NULL) < 0)
+ gdm_login_abort (_("main: Error setting up TERM signal handler"));
- sigfillset(&mask);
- sigdelset(&mask, SIGTERM);
- sigdelset(&mask, SIGHUP);
- sigdelset(&mask, SIGINT);
+ sigfillset (&mask);
+ sigdelset (&mask, SIGTERM);
+ sigdelset (&mask, SIGHUP);
+ sigdelset (&mask, SIGINT);
- if(sigprocmask(SIG_SETMASK, &mask, NULL) == -1) {
- syslog(LOG_ERR, "Could not set signal mask!");
- exit(EXIT_FAILURE);
- }
-
- ctrlch = g_io_channel_unix_new(STDIN_FILENO);
- g_io_channel_init(ctrlch);
- g_io_add_watch(ctrlch,
- G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
- (GIOFunc) gdm_login_ctrl_handler,
- NULL);
- g_io_channel_unref(ctrlch);
+ if (sigprocmask (SIG_SETMASK, &mask, NULL) == -1)
+ gdm_login_abort (_("Could not set signal mask!"));
+
+ ctrlch = g_io_channel_unix_new (STDIN_FILENO);
+ g_io_channel_init (ctrlch);
+ g_io_add_watch (ctrlch,
+ G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
+ (GIOFunc) gdm_login_ctrl_handler,
+ NULL);
+ g_io_channel_unref (ctrlch);
gtk_main();