summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Lebl <jirka@5z.com>2003-09-11 23:12:55 +0000
committerGeorge Lebl <jirka@src.gnome.org>2003-09-11 23:12:55 +0000
commit1eedcd47213dd470fc7e9a5aa3849a88cd20a8d2 (patch)
tree45fb9a28ddc14b37b189026314e30d378c8bd252
parent59aceebaf29e48a782db65315b5fa45ea8beda90 (diff)
downloadgdm-1eedcd47213dd470fc7e9a5aa3849a88cd20a8d2.tar.gz
add comment about ShowLastSession
Thu Sep 11 16:11:57 2003 George Lebl <jirka@5z.com> * config/gdm.conf.in: add comment about ShowLastSession * daemon/gdm.h, daemon/slave.c, daemon/misc.[ch], gui/gdmlogin.c, gui/greeter/greeter_session.c: Work with the session setup as implemented now in KDM. Doesn't add the built in default, custom, failsafe sessions to the greeters themselves though yet, and doesn't change the default session path (will change to /etc/X11/sessions from /etc/X11/dm/Sessions) * daemon/gdm.c: minor cleanup
-rw-r--r--ChangeLog13
-rw-r--r--config/gdm.conf.in4
-rw-r--r--daemon/gdm.c9
-rw-r--r--daemon/gdm.h5
-rw-r--r--daemon/misc.c29
-rw-r--r--daemon/misc.h2
-rw-r--r--daemon/slave.c152
-rw-r--r--gui/gdmlogin.c32
-rw-r--r--gui/greeter/greeter_session.c28
9 files changed, 229 insertions, 45 deletions
diff --git a/ChangeLog b/ChangeLog
index 3e1f5b4b..8ea2fb3f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+Thu Sep 11 16:11:57 2003 George Lebl <jirka@5z.com>
+
+ * config/gdm.conf.in: add comment about ShowLastSession
+
+ * daemon/gdm.h, daemon/slave.c, daemon/misc.[ch], gui/gdmlogin.c,
+ gui/greeter/greeter_session.c: Work with the session setup
+ as implemented now in KDM. Doesn't add the built in default,
+ custom, failsafe sessions to the greeters themselves though
+ yet, and doesn't change the default session path (will change
+ to /etc/X11/sessions from /etc/X11/dm/Sessions)
+
+ * daemon/gdm.c: minor cleanup
+
Tue Sep 02 12:11:39 2003 George Lebl <jirka@5z.com>
* Release 2.4.4.0
diff --git a/config/gdm.conf.in b/config/gdm.conf.in
index 605cce3e..6533af91 100644
--- a/config/gdm.conf.in
+++ b/config/gdm.conf.in
@@ -282,6 +282,10 @@ Browser=false
# use this rather then just running an xterm from a script.
#ShowGnomeFailsafeSession=true
#ShowXtermFailsafeSession=true
+# Normally there is a session type called 'Last' that is shown which refers to
+# the last session the user used. If off, we will be in 'switchdesk' mode where
+# the session saving stuff is disabled in GDM
+#ShowLastSession=true
# Always use 24 hour clock no matter what the locale.
#Use24Clock=false
# Use circles in the password field. Looks kind of cool actually,
diff --git a/daemon/gdm.c b/daemon/gdm.c
index 7cae5fde..50b7c76e 100644
--- a/daemon/gdm.c
+++ b/daemon/gdm.c
@@ -294,11 +294,6 @@ gdm_config_parse (void)
displays = NULL;
high_display_num = 0;
-#if defined(_SCO_DS) || defined(__UNIXWARE__) || defined(__USLC__)
- gdm_error ("SCO OS detected!!! I will sleep for 5 seconds in protest. This message can be disabled by SCO stopping to sue people.");
- sleep (5);
-#endif
-
IGNORE_EINTR (r = stat (GDM_CONFIG_FILE, &statbuf));
if (r < 0) {
gdm_error (_("%s: No configuration file: %s. Using defaults."),
@@ -832,7 +827,7 @@ gdm_daemonify (void)
errno = 0;
fprintf (pf, "%d\n", (int)pid);
fclose (pf);
- if (errno != 0) {
+ if G_UNLIKELY (errno != 0) {
/* FIXME: how to handle this? */
gdm_fdprintf (2, "Cannot write PID file %s, possibly out of diskspace. Error: %s\n",
GdmPidFile, strerror (errno));
@@ -840,7 +835,7 @@ gdm_daemonify (void)
GdmPidFile, strerror (errno));
}
- } else if (errno != 0) {
+ } else if G_UNLIKELY (errno != 0) {
/* FIXME: how to handle this? */
gdm_fdprintf (2, "Cannot write PID file %s, possibly out of diskspace. Error: %s\n",
GdmPidFile, strerror (errno));
diff --git a/daemon/gdm.h b/daemon/gdm.h
index 81797e97..0eb1dfa4 100644
--- a/daemon/gdm.h
+++ b/daemon/gdm.h
@@ -258,6 +258,11 @@ enum {
#define GDM_SESSION_FAILSAFE_GNOME "GDM_Failsafe.GNOME"
#define GDM_SESSION_FAILSAFE_XTERM "GDM_Failsafe.XTERM"
+/* FIXME: will support these builtin types later */
+#define GDM_SESSION_DEFAULT "default"
+#define GDM_SESSION_CUSTOM "custom"
+#define GDM_SESSION_FAILSAFE "failsafe"
+
#define GDM_STANDARD "Standard"
#ifndef TYPEDEF_GDM_CONNECTION
diff --git a/daemon/misc.c b/daemon/misc.c
index c7c8e6a9..4b582b39 100644
--- a/daemon/misc.c
+++ b/daemon/misc.c
@@ -22,6 +22,7 @@
#include <unistd.h>
#include <dirent.h>
#include <signal.h>
+#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
@@ -1818,4 +1819,32 @@ gdm_make_filename (const char *dir, const char *name, const char *extension)
return full;
}
+char *
+gdm_ensure_extension (const char *name, const char *extension)
+{
+ const char *p = strrchr (name, '.');
+ if (p != NULL &&
+ strcmp (p, extension) == 0) {
+ return g_strdup (name);
+ } else {
+ return g_strconcat (name, extension, NULL);
+ }
+}
+
+char *
+gdm_strip_extension (const char *name, const char *extension)
+{
+ const char *p = strrchr (name, '.');
+ if (p != NULL &&
+ strcmp (p, extension) == 0) {
+ return g_strdup (name);
+ char *r = g_strdup (name);
+ char *rp = strrchr (r, '.');
+ *rp = '\0';
+ return r;
+ } else {
+ return g_strdup (name);
+ }
+}
+
/* EOF */
diff --git a/daemon/misc.h b/daemon/misc.h
index 4f6b4d19..93afde4d 100644
--- a/daemon/misc.h
+++ b/daemon/misc.h
@@ -153,6 +153,8 @@ void gdm_sleep_no_signal (int secs);
* <dir> "/" <name> <extension>
*/
char * gdm_make_filename (const char *dir, const char *name, const char *extension);
+char * gdm_ensure_extension (const char *name, const char *extension);
+char * gdm_strip_extension (const char *name, const char *extension);
#endif /* GDM_MISC_H */
diff --git a/daemon/slave.c b/daemon/slave.c
index f5e3d480..2594e1da 100644
--- a/daemon/slave.c
+++ b/daemon/slave.c
@@ -2792,9 +2792,95 @@ gdm_slave_chooser (void)
}
static gboolean
-is_session_ok (const char *session_name)
+is_prog_in_path (const char *prog, const char *path)
+{
+ char **vec;
+ int i;
+
+ if (ve_string_empty (prog) || ve_string_empty (path))
+ return FALSE;
+
+ vec = g_strsplit (path, ":", -1);
+ for (i = 0; vec != NULL && vec[i] != NULL; i++) {
+ char *full = g_build_filename (vec[i], prog, NULL);
+ if (access (full, X_OK) == 0) {
+ g_free (full);
+ return TRUE;
+ }
+ g_free (full);
+ }
+ return FALSE;
+}
+
+static gboolean
+is_session_magic (const char *session_name)
+{
+ return (strcmp (session_name, GDM_SESSION_DEFAULT) == 0 ||
+ strcmp (session_name, GDM_SESSION_CUSTOM) == 0 ||
+ strcmp (session_name, GDM_SESSION_FAILSAFE) == 0);
+}
+
+static char *
+get_session_exec (const char *session_name)
{
char *file;
+ VeConfig *cfg;
+ static char *exec;
+ static char *cached = NULL;
+ char *tryexec;
+
+ /* clear cache */
+ if (session_name == NULL) {
+ g_free (exec);
+ exec = NULL;
+ g_free (cached);
+ cached = NULL;
+ return NULL;
+ }
+
+ if (cached != NULL && strcmp (session_name, cached) == 0)
+ return g_strdup (exec);
+
+ g_free (exec);
+ exec = NULL;
+ g_free (cached);
+ cached = g_strdup (session_name);
+
+ file = gdm_make_filename (GdmSessDir, session_name, ".desktop");
+
+ if (access (file, R_OK) != 0) {
+ g_free (file);
+ if (is_session_magic (session_name)) {
+ exec = g_strdup (session_name);
+ return g_strdup (exec);
+ } else {
+ return NULL;
+ }
+ }
+
+ cfg = ve_config_get (file);
+ g_free (file);
+ if (ve_config_get_bool (cfg, "Desktop Entry/Hidden=false"))
+ return NULL;
+
+ tryexec = ve_config_get_string (cfg, "Desktop Entry/TryExec");
+ if ( ! ve_string_empty (tryexec) &&
+ ! is_prog_in_path (tryexec, GdmDefaultPath)) {
+ g_free (tryexec);
+ return NULL;
+ }
+ g_free (tryexec);
+
+
+ exec = ve_config_get_string (cfg, "Desktop Entry/Exec");
+ return g_strdup (exec);
+}
+
+static gboolean
+is_session_ok (const char *session_name)
+{
+ char *exec;
+ gboolean ret = TRUE;
/* these are always OK */
if (strcmp (session_name, GDM_SESSION_FAILSAFE_GNOME) == 0 ||
@@ -2802,30 +2888,30 @@ is_session_ok (const char *session_name)
return TRUE;
if (ve_string_empty (GdmSessDir))
- return FALSE;
+ return is_session_magic (session_name);
- file = g_build_filename (GdmSessDir, session_name, NULL);
- if (access (file, F_OK) == 0) {
- g_free (file);
- return TRUE;
- }
- g_free (file);
- return FALSE;
+ exec = get_session_exec (session_name);
+ if (exec == NULL)
+ ret = FALSE;
+ g_free (exec);
+ return ret;
}
static char *
find_a_session (void)
{
char *try[] = {
- "Default.desktop",
- "default.desktop",
- "Gnome.desktop",
- "gnome.desktop",
- "GNOME.desktop",
- "kde.desktop",
- "KDE.desktop",
- "failsafe.desktop",
- "Failsafe.desktop",
+ "Default",
+ "default",
+ "Gnome",
+ "gnome",
+ "GNOME",
+ "Custom",
+ "custom",
+ "kde",
+ "KDE",
+ "failsafe",
+ "Failsafe",
NULL
};
int i;
@@ -2840,20 +2926,6 @@ find_a_session (void)
}
static char *
-get_session_exec (const char *desktop)
-{
- char *file;
- VeConfig *cfg;
- char *exec;
-
- file = g_build_filename (GdmSessDir, desktop, NULL);
- cfg = ve_config_get (file);
- g_free (file);
- exec = ve_config_get_string (cfg, "Desktop Entry/Exec");
- return exec;
-}
-
-static char *
find_prog (const char *name)
{
char *path;
@@ -3166,6 +3238,7 @@ session_child_run (struct passwd *pwent,
gdm_error (_("%s: Cannot find or run the base Xsession script, will try GNOME failsafe"),
"gdm_slave_session_start");
session = GDM_SESSION_FAILSAFE_GNOME;
+ exec = NULL;
gdm_error_box
(d, GTK_MESSAGE_ERROR,
_("Cannot find or run the base session script, will try the GNOME failsafe session for you."));
@@ -3323,6 +3396,7 @@ gdm_slave_session_start (void)
gid_t gid;
int logpipe[2];
int logfilefd;
+ char *tmp;
gdm_debug ("gdm_slave_session_start: Attempting session for user '%s'",
login);
@@ -3421,7 +3495,9 @@ gdm_slave_session_start (void)
setegid (GdmGroupId);
if (greet) {
- session = gdm_slave_greeter_ctl (GDM_SESS, usrsess);
+ tmp = gdm_ensure_extension (usrsess, ".desktop");
+ session = gdm_slave_greeter_ctl (GDM_SESS, tmp);
+ g_free (tmp);
language = gdm_slave_greeter_ctl (GDM_LANG, usrlang);
} else {
session = g_strdup (usrsess);
@@ -3430,6 +3506,10 @@ gdm_slave_session_start (void)
g_free (usrsess);
g_free (usrlang);
+
+ tmp = gdm_strip_extension (session, ".desktop");
+ g_free (session);
+ session = tmp;
if (ve_string_empty (session)) {
g_free (session);
@@ -3508,8 +3588,7 @@ gdm_slave_session_start (void)
if (strcmp (session, GDM_SESSION_FAILSAFE_GNOME) == 0 ||
strcmp (session, GDM_SESSION_FAILSAFE_XTERM) == 0 ||
- g_ascii_strcasecmp (session, "Failsafe") == 0 /* hack */ ||
- g_ascii_strcasecmp (session, "Failsafe.desktop") == 0 /* hack */)
+ g_ascii_strcasecmp (session, "failsafe") == 0 /* hack */)
failsafe = TRUE;
if ( ! failsafe) {
@@ -3594,6 +3673,9 @@ gdm_slave_session_start (void)
default:
break;
}
+
+ /* this clears internal cache */
+ get_session_exec (NULL);
if G_LIKELY (logfilefd >= 0) {
d->xsession_errors_fd = logfilefd;
diff --git a/gui/gdmlogin.c b/gui/gdmlogin.c
index e7b42b03..13e1fca2 100644
--- a/gui/gdmlogin.c
+++ b/gui/gdmlogin.c
@@ -811,15 +811,22 @@ gdm_login_list_lookup (GSList *l, const gchar *data)
if (!list || !data)
return(FALSE);
+ /* FIXME: Hack, will support these builtin types later */
+ if (strcmp (data, GDM_SESSION_DEFAULT ".desktop") == 0 ||
+ strcmp (data, GDM_SESSION_CUSTOM ".desktop") == 0 ||
+ strcmp (data, GDM_SESSION_FAILSAFE ".desktop") == 0) {
+ return TRUE;
+ }
+
while (list) {
if (strcmp (list->data, data) == 0)
- return (TRUE);
+ return TRUE;
list = list->next;
}
- return (FALSE);
+ return FALSE;
}
static const char *
@@ -1239,8 +1246,9 @@ gdm_login_session_init (GtkWidget *menu)
char *comment;
char *s;
char *label;
+ char *tryexec;
- /* ignore everything bug the .desktop files */
+ /* ignore everything but the .desktop files */
if (strstr (dent->d_name, ".desktop") == NULL) {
dent = readdir (sessdir);
continue;
@@ -1250,6 +1258,24 @@ gdm_login_session_init (GtkWidget *menu)
cfg = ve_config_new (s);
g_free (s);
+ if (ve_config_get_bool (cfg, "Desktop Entry/Hidden=false")) {
+ ve_config_destroy (cfg);
+ dent = readdir (sessdir);
+ continue;
+ }
+
+ tryexec = ve_config_get_string (cfg, "Desktop Entry/TryExec");
+ if ( ! ve_string_empty (tryexec)) {
+ char *full = g_find_program_in_path (tryexec);
+ if (full == NULL) {
+ g_free (tryexec);
+ ve_config_destroy (cfg);
+ dent = readdir (sessdir);
+ continue;
+ }
+ g_free (full);
+ }
+ g_free (tryexec);
exec = ve_config_get_string (cfg, "Desktop Entry/Exec");
name = ve_config_get_translated_string (cfg, "Desktop Entry/Name");
diff --git a/gui/greeter/greeter_session.c b/gui/greeter/greeter_session.c
index e6889c7f..d4db8ef4 100644
--- a/gui/greeter/greeter_session.c
+++ b/gui/greeter/greeter_session.c
@@ -46,6 +46,13 @@ greeter_login_list_lookup (GSList *l, const gchar *data)
if (!list || !data)
return(FALSE);
+ /* FIXME: Hack, will support these builtin types later */
+ if (strcmp (data, GDM_SESSION_DEFAULT ".desktop") == 0 ||
+ strcmp (data, GDM_SESSION_CUSTOM ".desktop") == 0 ||
+ strcmp (data, GDM_SESSION_FAILSAFE ".desktop") == 0) {
+ return TRUE;
+ }
+
while (list) {
if (strcmp (list->data, data) == 0)
@@ -293,6 +300,8 @@ greeter_session_init (void)
char *name;
char *comment;
char *label;
+ char *tryexec;
+
/* ignore everything bug the .desktop files */
if (strstr (dent->d_name, ".desktop") == NULL) {
dent = readdir (sessdir);
@@ -303,6 +312,25 @@ greeter_session_init (void)
cfg = ve_config_new (s);
g_free (s);
+ if (ve_config_get_bool (cfg, "Desktop Entry/Hidden=false")) {
+ ve_config_destroy (cfg);
+ dent = readdir (sessdir);
+ continue;
+ }
+
+ tryexec = ve_config_get_string (cfg, "Desktop Entry/TryExec");
+ if ( ! ve_string_empty (tryexec)) {
+ char *full = g_find_program_in_path (tryexec);
+ if (full == NULL) {
+ g_free (tryexec);
+ ve_config_destroy (cfg);
+ dent = readdir (sessdir);
+ continue;
+ }
+ g_free (full);
+ }
+ g_free (tryexec);
+
exec = ve_config_get_string (cfg, "Desktop Entry/Exec");
name = ve_config_get_translated_string (cfg, "Desktop Entry/Name");
comment = ve_config_get_translated_string (cfg, "Desktop Entry/Comment");