summaryrefslogtreecommitdiff
path: root/gui
diff options
context:
space:
mode:
author1 <mkp@mkp.net>1999-08-11 22:46:07 +0000
committerMartin Peterson <mkp@src.gnome.org>1999-08-11 22:46:07 +0000
commit05e9b4862f94181d3ceb456e7ec6dc77c0b1c23f (patch)
tree07a67e40fbe2d895ef8a9947dc4679a7809378a6 /gui
parentc8f25c94e4c3e63fcb8a84e497587c0e3e3607fa (diff)
downloadgdm-05e9b4862f94181d3ceb456e7ec6dc77c0b1c23f.tar.gz
Nailed down the bug that has been haunting me the past couple of days. gdm
1999-08-11 <mkp@mkp.net> * daemon/auth.c: Nailed down the bug that has been haunting me the past couple of days. gdm no longer corrupts ~user/.Xauthority if it contains ``foreign'' cookies. 1999-08-08 <mkp@mkp.net> Finally merged the Ottawa megapatch: * daemon/auth.c: Real XAuth implementation. Doesn't rely on /usr/bin/X11/xauth anymore. * gui/gdmlogin.c: Implemented browser functionality. * gui/gdmconfig.c: First shot at a graphical configuration tool. * gui/gdmface.c: Face selector capplet. 1999-08-07 <mkp@mkp.net> * Replaced gdm_putenv() with calls to setenv() as putenv() is broken by specification. 1999-08-02 <mkp@mkp.net> * md5.c, md5.h, cookie.c: Fixed MD5 endianness problem (Reported by <gewrgiou@imbc.gr>, bugzilla 3898).
Diffstat (limited to 'gui')
-rw-r--r--gui/Makefile.am9
-rw-r--r--gui/gdmchooser.c577
-rw-r--r--gui/gdmlogin.c1636
3 files changed, 1305 insertions, 917 deletions
diff --git a/gui/Makefile.am b/gui/Makefile.am
index 4a226477..1e96a2ce 100644
--- a/gui/Makefile.am
+++ b/gui/Makefile.am
@@ -10,15 +10,20 @@ INCLUDES = -I. -I.. -I$(top_srcdir)/daemon -I$(includedir) \
-DLOCALEDIR=\"$(datadir)/locale\" \
$(GNOME_INCLUDEDIR)
-bin_PROGRAMS = gdmchooser gdmlogin
+bin_PROGRAMS = gdmchooser gdmlogin gdmconfig
gdmchooser_SOURCES = \
gdmchooser.c \
gdmchooser.h
gdmlogin_SOURCES = \
- gdmlogin.c
+ gdmlogin.c \
+ gdmlogin.h
+
+gdmconfig_SOURCES = \
+ gdmconfig.c
gdmchooser_LDADD = $(GNOME_LIBDIR) $(GNOME_LIBS) $(GNOMEUI_LIBS) -lXdmcp -lX11 $(INTLLIBS)
gdmlogin_LDADD = ../daemon/filecheck.o $(GNOME_LIBDIR) $(GNOME_LIBS) $(GNOMEUI_LIBS) $(INTLLIBS)
+gdmconfig_LDADD = $(GNOME_LIBDIR) $(GNOME_LIBS) $(GNOMEUI_LIBS) $(INTLLIBS)
diff --git a/gui/gdmchooser.c b/gui/gdmchooser.c
index f31a7a86..949e0c89 100644
--- a/gui/gdmchooser.c
+++ b/gui/gdmchooser.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,22 +16,22 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+/* gdmchooser discovers hosts running XDMCP on the local network(s),
+ * presents a list of them and allows the user to choose one. The
+ * selected hostname will be printed on stdout.
+ */
+
#include <config.h>
#include <gnome.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
-#include <sys/stat.h>
#include <unistd.h>
-#include <X11/Xlib.h>
+#include <gdk/gdkx.h>
#include <X11/Xmd.h>
#include <X11/Xdmcp.h>
-#include <gdk/gdkx.h>
-#include <gdk/gdkkeysyms.h>
-#include <pwd.h>
#include <syslog.h>
-#include <ctype.h>
#include <signal.h>
#include <sys/socket.h>
#include <netinet/in.h>
@@ -44,16 +44,18 @@
#include <net/if.h>
#include "gdmchooser.h"
+#include "gdm.h"
static const gchar RCSid[]="$Id$";
-static void gdm_chooser_decode_packet(void);
static GdmChooserHost *gdm_chooser_host_alloc (gchar *hostname, gchar *description);
-static void gdm_chooser_abort(const gchar *format, ...);
-static void gdm_chooser_browser_update(void);
-static void gdm_chooser_xdmcp_init(void);
-static void gdm_chooser_host_dispose(GdmChooserHost *host);
+static void gdm_chooser_decode_packet (void);
+static void gdm_chooser_abort (const gchar *format, ...);
+static void gdm_chooser_browser_update (void);
+static void gdm_chooser_xdmcp_init (void);
+static void gdm_chooser_host_dispose (GdmChooserHost *host);
+/* Fixetyfix */
int XdmcpReallocARRAY8 (ARRAY8Ptr array, int length);
@@ -68,204 +70,204 @@ static XdmAuthRec authlist = {
};
-gint sockfd;
+static gint sockfd;
static XdmcpBuffer querybuf;
-GSList *bcaddr;
-
-gint GdmIconMaxHeight;
-gint GdmIconMaxWidth;
-gint GdmDebug;
-gint GdmRescanTime;
-gint GdmDeadTime;
-gchar *GdmHostIconDir;
-gchar *GdmHostDefaultIcon;
-gchar *GdmGtkRC;
-
-GtkWidget *chooser;
-GtkWidget *manage;
-GtkWidget *rescan;
-GtkWidget *cancel;
-
-gint maxwidth=0;
-guint tid;
-GIOChannel *channel;
-
-GList *hosts=NULL;
-GdkImlibImage *nohostimg;
-GnomeIconList *browser;
-
-GdmChooserHost *curhost;
+static GSList *bcaddr;
+
+static gint GdmIconMaxHeight;
+static gint GdmIconMaxWidth;
+static gint GdmDebug;
+static gint GdmScanTime;
+static gchar *GdmHostIconDir;
+static gchar *GdmHostDefaultIcon;
+static gchar *GdmGtkRC;
+
+static GtkWidget *chooser;
+static GtkWidget *manage;
+static GtkWidget *rescan;
+static GtkWidget *cancel;
+
+static gint maxwidth = 0;
+static guint tid = 0;
+static GIOChannel *channel;
+static GList *hosts = NULL;
+static GdkImlibImage *defhostimg;
+static GnomeIconList *browser;
+static GdmChooserHost *curhost;
static gint
gdm_chooser_sort_func(gpointer d1, gpointer d2)
{
- GdmChooserHost *a=d1;
- GdmChooserHost *b=d2;
+ GdmChooserHost *a = d1;
+ GdmChooserHost *b = d2;
+
+ if (!d1 || !d2)
+ return (0);
- return strcmp(a->name, b->name);
+ return (strcmp (a->name, b->name));
}
static void
-gdm_chooser_decode_packet(void)
+gdm_chooser_decode_packet (void)
{
struct sockaddr_in clnt_sa;
- gint sa_len=sizeof(clnt_sa);
+ gint sa_len = sizeof (clnt_sa);
static XdmcpBuffer buf;
XdmcpHeader header;
struct hostent *he;
- gchar *hostname, *status=NULL;
+ gchar *hostname = NULL;
+ gchar *status = NULL;
ARRAY8 auth, host, stat;
- if(!XdmcpFill(sockfd, &buf, &clnt_sa, &sa_len))
+ if (! XdmcpFill (sockfd, &buf, &clnt_sa, &sa_len))
return;
- if(!XdmcpReadHeader(&buf, &header))
+ if (! XdmcpReadHeader (&buf, &header))
return;
- if(header.version != XDM_PROTOCOL_VERSION)
+ if (header.version != XDM_PROTOCOL_VERSION)
return;
- if(header.opcode == WILLING) {
- if(!XdmcpReadARRAY8(&buf, &auth))
+ if (header.opcode == WILLING) {
+
+ if (! XdmcpReadARRAY8 (&buf, &auth))
goto done;
- if(!XdmcpReadARRAY8(&buf, &host))
+ if (! XdmcpReadARRAY8 (&buf, &host))
goto done;
- if(!XdmcpReadARRAY8(&buf, &stat))
+ if (! XdmcpReadARRAY8 (&buf, &stat))
goto done;
- status=g_strndup(stat.data, stat.length);
+ status = g_strndup (stat.data, stat.length);
- he=gethostbyaddr((gchar *) &clnt_sa.sin_addr,
- sizeof(struct in_addr),
- AF_INET);
+ he = gethostbyaddr ((gchar *) &clnt_sa.sin_addr,
+ sizeof (struct in_addr),
+ AF_INET);
- hostname=(he && he->h_name) ? he->h_name : inet_ntoa(clnt_sa.sin_addr);
+ hostname = (he && he->h_name) ? he->h_name : inet_ntoa (clnt_sa.sin_addr);
- hosts=g_list_insert_sorted(hosts,
- gdm_chooser_host_alloc(hostname, (gchar *) status),
- (GCompareFunc) gdm_chooser_sort_func);
+ hosts = g_list_insert_sorted (hosts,
+ gdm_chooser_host_alloc (hostname, (gchar *) status),
+ (GCompareFunc) gdm_chooser_sort_func);
done:
- XdmcpDisposeARRAY8(&auth);
- XdmcpDisposeARRAY8(&host);
- XdmcpDisposeARRAY8(&stat);
+ XdmcpDisposeARRAY8 (&auth);
+ XdmcpDisposeARRAY8 (&host);
+ XdmcpDisposeARRAY8 (&stat);
- g_free(status);
+ g_free (status);
return;
}
-
}
/* Find broadcast address for all active, non pointopoint interfaces */
static void
-gdm_chooser_find_bcaddr(void)
+gdm_chooser_find_bcaddr (void)
{
- gint i=0;
+ gint i = 0;
struct ifconf ifcfg;
struct ifreq ifr[MAXIF];
struct in_addr *ia;
- ifcfg.ifc_buf=(gchar *)&ifr;
- ifcfg.ifc_len=sizeof(ifr);
+ ifcfg.ifc_buf = (gchar *) &ifr;
+ ifcfg.ifc_len = sizeof (ifr);
- memset(ifr, 0, sizeof(ifr));
+ memset (ifr, 0, sizeof (ifr));
- if(ioctl(sockfd, SIOCGIFCONF, &ifcfg) < 0)
- gdm_chooser_abort("Could not get SIOCIFCONF");
+ if (ioctl (sockfd, SIOCGIFCONF, &ifcfg) < 0)
+ gdm_chooser_abort ("Could not get SIOCIFCONF");
- for(i=0 ; i < MAXIF ; i++)
- if(strlen(ifr[i].ifr_name)) {
+ for (i=0 ; i < MAXIF ; i++)
+ if (strlen (ifr[i].ifr_name)) {
struct ifreq *ifreq;
struct sockaddr_in *ba;
- ifreq=g_new0(struct ifreq, 1);
+ ifreq = g_new0 (struct ifreq, 1);
- strncpy(ifreq->ifr_name, ifr[i].ifr_name, sizeof(ifr[i].ifr_name));
+ strncpy (ifreq->ifr_name, ifr[i].ifr_name, sizeof (ifr[i].ifr_name));
- if(ioctl(sockfd, SIOCGIFFLAGS, ifreq) < 0)
- gdm_chooser_abort("Could not get SIOCGIFFLAGS for %s", ifr[i].ifr_name);
+ if (ioctl (sockfd, SIOCGIFFLAGS, ifreq) < 0)
+ gdm_chooser_abort ("Could not get SIOCGIFFLAGS for %s", ifr[i].ifr_name);
- if((ifreq->ifr_flags & IFF_UP) == 0)
+ if ((ifreq->ifr_flags & IFF_UP) == 0)
goto done;
- if((ifreq->ifr_flags & IFF_BROADCAST) == 0)
+ if ((ifreq->ifr_flags & IFF_BROADCAST) == 0)
goto done;
- if(ioctl(sockfd, SIOCGIFBRDADDR, ifreq) < 0) {
+ if (ioctl (sockfd, SIOCGIFBRDADDR, ifreq) < 0) {
goto done;
}
- ba=(struct sockaddr_in *)&ifreq->ifr_broadaddr;
+ ba = (struct sockaddr_in *) &ifreq->ifr_broadaddr;
- ia=g_new0(struct in_addr, 1);
+ ia = g_new0 (struct in_addr, 1);
ia->s_addr = ba->sin_addr.s_addr;
- bcaddr=g_slist_append(bcaddr, ia);
+ bcaddr = g_slist_append (bcaddr, ia);
done:
- g_free(ifreq);
+ g_free (ifreq);
}
}
static gboolean
-gdm_chooser_xdmcp_discover(void)
+gdm_chooser_xdmcp_discover (void)
{
struct sockaddr_in sock;
- GSList *bl=bcaddr;
+ GSList *bl = bcaddr;
struct in_addr *ia;
- GList *hl=hosts;
+ GList *hl = hosts;
- gtk_widget_set_sensitive (chooser, FALSE);
- gnome_icon_list_freeze(browser);
- gnome_icon_list_clear(browser);
+ gtk_widget_set_sensitive (GTK_WIDGET (chooser), FALSE);
+ gnome_icon_list_freeze (GNOME_ICON_LIST (browser));
+ gnome_icon_list_clear (GNOME_ICON_LIST (browser));
- while(hl) {
- gdm_chooser_host_dispose((GdmChooserHost *) hl->data);
- hl=hl->next;
+ while (hl) {
+ gdm_chooser_host_dispose ((GdmChooserHost *) hl->data);
+ hl = hl->next;
}
- g_list_free(hosts);
+ g_list_free (hosts);
- hosts=NULL;
+ hosts = NULL;
sock.sin_family = AF_INET;
sock.sin_port = htons (XDM_UDP_PORT);
- while(bl) {
- ia = (struct in_addr *)bl->data;
-
+ while (bl) {
+ ia = (struct in_addr *) bl->data;
sock.sin_addr.s_addr = ia->s_addr;
- XdmcpFlush (sockfd, &querybuf, &sock, sizeof(struct sockaddr_in));
- bl=bl->next;
+ XdmcpFlush (sockfd, &querybuf, &sock, sizeof (struct sockaddr_in));
+ bl = bl->next;
}
- tid=g_timeout_add(GdmRescanTime*1000,
- (GSourceFunc) gdm_chooser_browser_update, NULL);
+ tid = g_timeout_add (GdmScanTime*1000,
+ (GSourceFunc) gdm_chooser_browser_update, NULL);
- return(TRUE);
+ return (TRUE);
}
static void
-gdm_chooser_xdmcp_init(void)
+gdm_chooser_xdmcp_init (void)
{
static XdmcpHeader header;
- gint sockopts=1;
+ gint sockopts = 1;
/* Open socket for communication */
- if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
- gdm_chooser_abort("Could not create socket()!");
+ if ((sockfd = socket (AF_INET, SOCK_DGRAM, 0)) == -1)
+ gdm_chooser_abort ("Could not create socket()!");
- if(setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (char *)&sockopts, sizeof (sockopts)) < 0)
- gdm_chooser_abort("Could not set socket options!");
+ if (setsockopt (sockfd, SOL_SOCKET, SO_BROADCAST, (char *) &sockopts, sizeof (sockopts)) < 0)
+ gdm_chooser_abort ("Could not set socket options!");
gdm_chooser_find_bcaddr();
@@ -273,154 +275,151 @@ gdm_chooser_xdmcp_init(void)
header.opcode = (CARD16) BROADCAST_QUERY;
header.length = 1;
header.version = XDM_PROTOCOL_VERSION;
- XdmcpWriteHeader(&querybuf, &header);
- XdmcpWriteARRAY8(&querybuf, &authlist.authentication);
+ XdmcpWriteHeader (&querybuf, &header);
+ XdmcpWriteARRAY8 (&querybuf, &authlist.authentication);
- channel = g_io_channel_unix_new(sockfd);
- g_io_add_watch_full(channel, G_PRIORITY_DEFAULT,
+ channel = g_io_channel_unix_new (sockfd);
+ g_io_add_watch_full (channel, G_PRIORITY_DEFAULT,
G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
(GIOFunc) gdm_chooser_decode_packet,
- GINT_TO_POINTER(sockfd), NULL);
- g_io_channel_unref(channel);
+ GINT_TO_POINTER (sockfd), NULL);
+ g_io_channel_unref (channel);
gdm_chooser_xdmcp_discover();
}
static gboolean
-gdm_chooser_cancel(void)
+gdm_chooser_cancel (void)
{
closelog();
gtk_main_quit();
- return(TRUE);
+ return (TRUE);
}
static gboolean
-gdm_chooser_manage(void)
+gdm_chooser_manage (void)
{
- if(curhost)
- g_print("%s\n", curhost->name);
+ if (curhost)
+ g_print ("%s\n", curhost->name);
closelog();
gtk_main_quit();
- return(TRUE);
+ return (TRUE);
}
static void
-gdm_chooser_abort(const gchar *format, ...)
+gdm_chooser_abort (const gchar *format, ...)
{
va_list args;
gchar *s;
- va_start(args, format);
- s=g_strdup_vprintf(format, args);
- va_end(args);
+ va_start (args, format);
+ s = g_strdup_vprintf (format, args);
+ va_end (args);
- syslog(LOG_ERR, s);
+ syslog (LOG_ERR, s);
+ closelog ();
- closelog();
- exit(EXIT_FAILURE);
+ exit (EXIT_FAILURE);
}
static void
-gdm_chooser_parse_config(void)
+gdm_chooser_parse_config (void)
{
struct stat unused;
- if(stat(GDM_CONFIG_FILE, &unused) == -1)
- gdm_chooser_abort(_("gdm_chooser_parse_config: No configuration file: %s. Aborting."), GDM_CONFIG_FILE);
+ if (stat (GDM_CONFIG_FILE, &unused) == -1)
+ gdm_chooser_abort (_("gdm_chooser_parse_config: No configuration file: %s. Aborting."), GDM_CONFIG_FILE);
gnome_config_push_prefix ("=" GDM_CONFIG_FILE "=/");
- GdmGtkRC=gnome_config_get_string("appearance/gtkrc");
-
- GdmRescanTime=gnome_config_get_int("chooser/rescantime=3");
- GdmDeadTime=gnome_config_get_int("chooser/deadtime=3");
- GdmHostDefaultIcon=gnome_config_get_string("chooser/defaultimage=nohost.xpm");
- GdmHostIconDir=gnome_config_get_string("chooser/imagedir");
-
- GdmIconMaxWidth=gnome_config_get_int("system/UserIconMaxWidth=128");
- GdmIconMaxHeight=gnome_config_get_int("system/UserIconMaxHeight=128");
+ GdmGtkRC = gnome_config_get_string (GDM_KEY_GTKRC);
+ GdmScanTime = gnome_config_get_int (GDM_KEY_SCAN);
+ GdmHostDefaultIcon = gnome_config_get_string (GDM_KEY_HOST);
+ GdmHostIconDir = gnome_config_get_string (GDM_KEY_HOSTDIR);
+ GdmIconMaxWidth = gnome_config_get_int (GDM_KEY_ICONWIDTH);
+ GdmIconMaxHeight = gnome_config_get_int (GDM_KEY_ICONHEIGHT);
+ GdmDebug = gnome_config_get_int (GDM_KEY_DEBUG);
- GdmDebug=gnome_config_get_int("debug/enable=0");
-
- gnome_config_pop_prefix ();
+ gnome_config_pop_prefix();
}
static gboolean
-gdm_chooser_browser_select(GtkWidget *widget, gint selected, GdkEvent *event)
+gdm_chooser_browser_select (GtkWidget *widget, gint selected, GdkEvent *event)
{
- if(!event)
- return(TRUE);
- else
- switch(event->type) {
-
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- curhost=g_list_nth_data(hosts, selected);
- gtk_widget_set_sensitive (manage, TRUE);
- break;
-
- default:
- break;
- }
+ if (!widget || !event)
+ return (TRUE);
- return(TRUE);
+ switch (event->type) {
+
+ case GDK_BUTTON_PRESS:
+ case GDK_BUTTON_RELEASE:
+ curhost = g_list_nth_data (hosts, selected);
+ gtk_widget_set_sensitive (manage, TRUE);
+ break;
+
+ default:
+ break;
+ }
+
+ return (TRUE);
}
static gboolean
-gdm_chooser_browser_unselect(GtkWidget *widget, gint selected, GdkEvent *event)
+gdm_chooser_browser_unselect (GtkWidget *widget, gint selected, GdkEvent *event)
{
- if(event) {
- switch(event->type) {
-
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- curhost=NULL;
- gtk_widget_set_sensitive (manage, FALSE);
- break;
-
- default:
- break;
- }
+ if (!event)
+ return(TRUE);
+
+ switch (event->type) {
+
+ case GDK_BUTTON_PRESS:
+ case GDK_BUTTON_RELEASE:
+ curhost = NULL;
+ gtk_widget_set_sensitive (manage, FALSE);
+ break;
+
+ default:
+ break;
}
- return(TRUE);
+ return (TRUE);
}
static void
-gdm_chooser_browser_update(void)
+gdm_chooser_browser_update (void)
{
- GList *list=hosts;
+ GList *list = hosts;
- g_source_remove(tid);
+ g_source_remove (tid);
- while(list) {
+ while (list) {
GdmChooserHost *host;
gchar *temp;
- host=(GdmChooserHost *)list->data;
+ host = (GdmChooserHost *) list->data;
- temp=g_strconcat(host->name, "\n", host->desc, NULL);
- gnome_icon_list_append_imlib(browser, host->picture, temp);
- g_free(temp);
+ temp = g_strconcat (host->name, "\n", host->desc, NULL);
+ gnome_icon_list_append_imlib (GNOME_ICON_LIST (browser), host->picture, temp);
+ g_free (temp);
- list=list->next;
+ list = list->next;
}
- gnome_icon_list_thaw(browser);
+ gnome_icon_list_thaw (GNOME_ICON_LIST (browser));
- gtk_widget_set_sensitive(chooser, TRUE);
- gtk_widget_set_sensitive(manage, FALSE);
- gtk_widget_show_all(chooser);
+ gtk_widget_set_sensitive (GTK_WIDGET (chooser), TRUE);
+ gtk_widget_set_sensitive (GTK_WIDGET (manage), FALSE);
+ gtk_widget_show_all (GTK_WIDGET (chooser));
}
@@ -440,52 +439,52 @@ gdm_chooser_gui_init (void)
struct stat statbuf;
/* Enable theme */
- if(GdmGtkRC)
- gtk_rc_parse(GdmGtkRC);
+ if (GdmGtkRC)
+ gtk_rc_parse (GdmGtkRC);
/* Load default host image */
- if(stat(GdmHostDefaultIcon, &statbuf))
- gdm_chooser_abort(_("Can't open default host icon: %s"), GdmHostDefaultIcon);
+ if (stat (GdmHostDefaultIcon, &statbuf))
+ gdm_chooser_abort (_("Can't open default host icon: %s"), GdmHostDefaultIcon);
else {
- nohostimg=gdk_imlib_load_image(GdmHostDefaultIcon);
- maxwidth=nohostimg->rgb_width;
+ defhostimg = gdk_imlib_load_image (GdmHostDefaultIcon);
+ maxwidth = defhostimg->rgb_width;
}
/* Root Window */
- rootwin=gdk_window_foreign_new (GDK_ROOT_WINDOW ());
+ rootwin = gdk_window_foreign_new (GDK_ROOT_WINDOW ());
/* Main window */
- chooser = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ chooser = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_container_border_width (GTK_CONTAINER (chooser), 0);
/* 3D frame for main window */
- frame = gtk_frame_new(NULL);
- gtk_frame_set_shadow_type(GTK_FRAME (frame), GTK_SHADOW_OUT);
+ 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 (chooser), frame);
+ gtk_container_add (GTK_CONTAINER (chooser), frame);
/* Vertical box containing browser box and button pane */
- vbox = gtk_vbox_new(FALSE, 10);
+ vbox = gtk_vbox_new (FALSE, 10);
gtk_container_border_width (GTK_CONTAINER (vbox), 10);
- gtk_container_add(GTK_CONTAINER (frame), vbox);
+ gtk_container_add (GTK_CONTAINER (frame), vbox);
/* Find background style for browser */
style = gtk_style_copy (chooser->style);
style->bg[GTK_STATE_NORMAL] = bbg;
- gtk_widget_push_style(style);
+ gtk_widget_push_style (style);
/* Icon list */
- if(maxwidth < GdmIconMaxWidth/2)
- maxwidth=(gint) GdmIconMaxWidth/2;
+ 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 (browser, " /-_.");
- gnome_icon_list_set_row_spacing (browser, 2);
- gnome_icon_list_set_col_spacing (browser, 2);
- gnome_icon_list_set_icon_border (browser, 2);
- gnome_icon_list_set_text_spacing (browser, 2);
- gnome_icon_list_set_selection_mode (browser, GTK_SELECTION_SINGLE);
+ 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_chooser_browser_select), NULL);
gtk_signal_connect (GTK_OBJECT (browser), "unselect_icon",
@@ -493,9 +492,9 @@ gdm_chooser_gui_init (void)
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));
+ 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 */
adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
@@ -512,56 +511,56 @@ gdm_chooser_gui_init (void)
gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (bbox), TRUE, TRUE, 0);
/* Buttons */
- manage = gtk_button_new_with_label(_("Connect"));
- gtk_signal_connect(GTK_OBJECT (manage), "clicked",
- GTK_SIGNAL_FUNC (gdm_chooser_manage), NULL);
- GTK_WIDGET_SET_FLAGS(manage, GTK_CAN_DEFAULT);
- gtk_widget_set_sensitive (manage, FALSE);
- gtk_widget_show(manage);
-
- rescan = gtk_button_new_with_label(_("Rescan"));
+ manage = gtk_button_new_with_label (_("Connect"));
+ gtk_signal_connect (GTK_OBJECT (manage), "clicked",
+ GTK_SIGNAL_FUNC (gdm_chooser_manage), NULL);
+ GTK_WIDGET_SET_FLAGS (GTK_WIDGET (manage), GTK_CAN_DEFAULT);
+ gtk_widget_set_sensitive (GTK_WIDGET (manage), FALSE);
+ gtk_widget_show (GTK_WIDGET (manage));
+
+ rescan = gtk_button_new_with_label (_("Rescan"));
gtk_signal_connect(GTK_OBJECT (rescan), "clicked",
GTK_SIGNAL_FUNC (gdm_chooser_xdmcp_discover), NULL);
- GTK_WIDGET_SET_FLAGS(rescan, GTK_CAN_DEFAULT);
- gtk_widget_show(rescan);
+ GTK_WIDGET_SET_FLAGS (GTK_WIDGET (rescan), GTK_CAN_DEFAULT);
+ gtk_widget_show (GTK_WIDGET (rescan));
- cancel = gtk_button_new_with_label(_("Cancel"));
+ cancel = gtk_button_new_with_label (_("Cancel"));
gtk_signal_connect(GTK_OBJECT (cancel), "clicked",
GTK_SIGNAL_FUNC (gdm_chooser_cancel), NULL);
- GTK_WIDGET_SET_FLAGS(cancel, GTK_CAN_DEFAULT);
- gtk_widget_show(cancel);
+ GTK_WIDGET_SET_FLAGS(GTK_WIDGET (cancel), GTK_CAN_DEFAULT);
+ gtk_widget_show (GTK_WIDGET (cancel));
/* Button pane */
buttonpane = gtk_hbox_new(TRUE, 0);
- gtk_container_set_border_width(GTK_CONTAINER (buttonpane), 0);
- gtk_box_pack_start(GTK_BOX (buttonpane),
- manage, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX (buttonpane),
- rescan, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX (buttonpane),
- cancel, TRUE, TRUE, 0);
- gtk_window_set_default(GTK_WINDOW(chooser), GTK_WIDGET(manage));
- gtk_widget_show_all(buttonpane);
+ gtk_container_set_border_width ( GTK_CONTAINER (buttonpane), 0);
+ gtk_box_pack_start (GTK_BOX (buttonpane),
+ GTK_WIDGET (manage), TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (buttonpane),
+ GTK_WIDGET (rescan), TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (buttonpane),
+ GTK_WIDGET (cancel), TRUE, TRUE, 0);
+ gtk_window_set_default (GTK_WINDOW (chooser), GTK_WIDGET (manage));
+ gtk_widget_show_all (GTK_WIDGET (buttonpane));
/* Put button pane in main window */
- gtk_box_pack_end(GTK_BOX (vbox),
- buttonpane, FALSE, FALSE, 0);
+ gtk_box_pack_end (GTK_BOX (vbox),
+ GTK_WIDGET (buttonpane), FALSE, FALSE, 0);
- gtk_widget_show(vbox);
- gtk_widget_show(frame);
+ gtk_widget_show (GTK_WIDGET (vbox));
+ gtk_widget_show (GTK_WIDGET (frame));
- gtk_window_set_policy(GTK_WINDOW (chooser), 1, 1, 1);
- gtk_window_set_focus(GTK_WINDOW (chooser), manage);
+ gtk_window_set_policy (GTK_WINDOW (chooser), 1, 1, 1);
+ gtk_window_set_focus (GTK_WINDOW (chooser), GTK_WIDGET (manage));
/* Geometry fun */
- gtk_widget_show_all(GTK_WIDGET(browser));
+ gtk_widget_show_all (GTK_WIDGET (browser));
gnome_icon_list_thaw (GNOME_ICON_LIST (browser));
- gtk_widget_set_usize(GTK_WIDGET (chooser),
- (gint) gdk_screen_width() * 0.4,
- (gint) gdk_screen_height() * 0.6);
+ gtk_widget_set_usize (GTK_WIDGET (chooser),
+ (gint) gdk_screen_width() * 0.4,
+ (gint) gdk_screen_height() * 0.6);
- gtk_window_position(GTK_WINDOW (chooser), GTK_WIN_POS_CENTER);
- gtk_widget_show_all(chooser);
+ gtk_window_position (GTK_WINDOW (chooser), GTK_WIN_POS_CENTER);
+ gtk_widget_show_all (GTK_WIDGET (chooser));
}
@@ -573,26 +572,24 @@ gdm_chooser_signals_init(void)
hup.sa_handler = (void *) gdm_chooser_cancel;
hup.sa_flags = 0;
- sigemptyset(&hup.sa_mask);
+ sigemptyset (&hup.sa_mask);
- if(sigaction(SIGHUP, &hup, NULL) < 0)
- gdm_chooser_abort(_("main: Error setting up HUP signal handler"));
+ if (sigaction (SIGHUP, &hup, NULL) < 0)
+ gdm_chooser_abort (_("gdm_signals_init: Error setting up HUP signal handler"));
- if(sigaction(SIGINT, &hup, NULL) < 0)
- gdm_chooser_abort(_("main: Error setting up INT signal handler"));
+ if (sigaction (SIGINT, &hup, NULL) < 0)
+ gdm_chooser_abort (_("gdm_signals_init: Error setting up INT signal handler"));
- if(sigaction(SIGTERM, &hup, NULL) < 0)
- gdm_chooser_abort(_("main: Error setting up TERM signal handler"));
+ if (sigaction (SIGTERM, &hup, NULL) < 0)
+ gdm_chooser_abort (_("gdm_signals_init: 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);
- }
+ if (sigprocmask (SIG_SETMASK, &mask, NULL) == -1)
+ gdm_chooser_abort (_("Could not set signal mask!"));
}
static GdmChooserHost *
@@ -600,57 +597,57 @@ gdm_chooser_host_alloc (gchar *hostname, gchar *description)
{
GdmChooserHost *host;
GdkImlibImage *imlibimg;
- gint w, h;
gchar *hostimg;
struct stat statbuf;
- host=g_malloc(sizeof(GdmChooserHost));
- host->name=g_strdup(hostname);
- host->desc=g_strdup(description);
+ host = g_malloc (sizeof (GdmChooserHost));
+ host->name = g_strdup (hostname);
+ host->desc = g_strdup (description);
- hostimg=g_strconcat(GdmHostIconDir, "/", hostname, NULL);
+ hostimg = g_strconcat (GdmHostIconDir, "/", hostname, NULL);
- if (!stat(hostimg, &statbuf) && (imlibimg=gdk_imlib_load_image(hostimg))) {
+ if (!stat (hostimg, &statbuf) && (imlibimg = gdk_imlib_load_image (hostimg))) {
+ gint w, h;
- w=imlibimg->rgb_width;
- h=imlibimg->rgb_height;
+ w = imlibimg->rgb_width;
+ h = imlibimg->rgb_height;
- if(w>h && w>GdmIconMaxWidth) {
- h=h*((gfloat) GdmIconMaxWidth/w);
- w=GdmIconMaxWidth;
+ if (w>h && w>GdmIconMaxWidth) {
+ h = h * ((gfloat) GdmIconMaxWidth/w);
+ w = GdmIconMaxWidth;
}
- else if(h>GdmIconMaxHeight) {
- w=w*((gfloat) GdmIconMaxHeight/h);
- h=GdmIconMaxHeight;
+ else if (h>GdmIconMaxHeight) {
+ w = w * ((gfloat) GdmIconMaxHeight/h);
+ h = GdmIconMaxHeight;
}
- maxwidth=MAX(maxwidth, w);
+ maxwidth = MAX (maxwidth, w);
- host->picture=gdk_imlib_clone_scaled_image(imlibimg, w, h);
+ host->picture = gdk_imlib_clone_scaled_image (imlibimg, w, h);
- gdk_imlib_destroy_image(imlibimg);
+ gdk_imlib_destroy_image (imlibimg);
}
else
- host->picture=nohostimg;
+ host->picture = defhostimg;
- g_free(hostimg);
+ g_free (hostimg);
return (host);
}
static void
-gdm_chooser_host_dispose(GdmChooserHost *host)
+gdm_chooser_host_dispose (GdmChooserHost *host)
{
- if(!host)
+ if (!host)
return;
- if(host->picture != nohostimg)
- gdk_imlib_destroy_image(host->picture);
+ if (host->picture != defhostimg)
+ gdk_imlib_destroy_image (host->picture);
- g_free(host->name);
- g_free(host->desc);
- g_free(host);
+ g_free (host->name);
+ g_free (host->desc);
+ g_free (host);
}
@@ -660,21 +657,21 @@ main (int argc, char *argv[])
/* Avoid creating ~gdm/.gnome stuff */
gnome_do_not_create_directories = TRUE;
- openlog("gdmchooser", LOG_PID, LOG_DAEMON);
+ openlog ("gdmchooser", LOG_PID, LOG_DAEMON);
- gnome_init("gdmchooser", VERSION, argc, argv);
+ gnome_init ("gdmchooser", VERSION, argc, argv);
gnome_sound_shutdown();
gnome_preferences_set_dialog_position(GTK_WIN_POS_CENTER);
gdm_chooser_parse_config();
gdm_chooser_gui_init();
gdm_chooser_signals_init();
-
gdm_chooser_xdmcp_init();
gtk_main();
- exit(EXIT_SUCCESS);
+ exit (EXIT_SUCCESS);
}
+
/* EOF */
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();