This is to allow new sessions and greeters to be defined that aren't X based.
We will also look in the legacy directories /usr/share/xsessions and /usr/share/xgreeters.
Rename the config options xsessions-directory->sessions-directory and xgreeters-directory->greeters-directory.
Support multiple directories separated by ':'.
Remove the command line --xsessions-dir, --remote-sessions-dir and --xgreeter-dir options.
They were used primarily for the regression tests and are no longer required.
# log-directory = Directory to log information to
# run-directory = Directory to put running state in
# cache-directory = Directory to cache to
-# xsessions-directory = Directory to find X sessions
+# sessions-directory = Directory to find sessions
# remote-sessions-directory = Directory to find remote sessions
-# xgreeters-directory = Directory to find X greeters
+# greeters-directory = Directory to find greeters
# disable-guest-wrapper = Disable using guest session wrapper (temporary? required to make tests work without installing)
#
[LightDM]
#log-directory=/var/log/lightdm
#run-directory=/var/run/lightdm
#cache-directory=/var/cache/lightdm
-#xsessions-directory=/usr/share/xsessions
+#sessions-directory=/usr/share/lightdm/sessions:/usr/share/xsessions
#remote-sessions-directory=/usr/share/lightdm/remote-sessions
-#xgreeters-directory=/usr/share/xgreeters
+#greeters-directory=/usr/share/lightdm/greeters:/usr/share/xgreeters
#disable-guest-wrapper=false
#
liblightdm_gobject_1_la_CFLAGS = $(LIBLIGHTDM_GOBJECT_CFLAGS) \
$(WARN_CFLAGS) \
-DCONFIG_DIR=\"$(sysconfdir)/lightdm\" \
- -DXSESSIONS_DIR=\"$(datadir)/xsessions\" \
+ -DSESSIONS_DIR=\"$(pkgdatadir)/sessions:$(datadir)/xsessions\" \
-DREMOTE_SESSIONS_DIR=\"$(pkgdatadir)/remote-sessions\"
mainheader_HEADERS = lightdm.h
}
static GList *
-load_sessions (const gchar *sessions_dir)
+load_sessions_dir (GList *sessions, const gchar *sessions_dir)
{
GDir *directory;
- GList *sessions = NULL;
GError *error = NULL;
directory = g_dir_open (sessions_dir, 0, &error);
g_warning ("Failed to open sessions directory: %s", error->message);
g_clear_error (&error);
if (!directory)
- return NULL;
+ return sessions;
while (TRUE)
{
return sessions;
}
+static GList *
+load_sessions (const gchar *sessions_dir)
+{
+ GList *sessions = NULL;
+ gchar **dirs;
+ int i;
+
+ dirs = g_strsplit (sessions_dir, ":", -1);
+ for (i = 0; dirs[i]; i++)
+ sessions = load_sessions_dir (sessions, dirs[i]);
+ g_strfreev (dirs);
+
+ return sessions;
+}
+
static void
update_sessions (void)
{
GKeyFile *config_key_file = NULL;
gchar *config_path = NULL;
- gchar *xsessions_dir;
+ gchar *sessions_dir;
gchar *remote_sessions_dir;
gboolean result;
GError *error = NULL;
if (have_sessions)
return;
- xsessions_dir = g_strdup (XSESSIONS_DIR);
+ sessions_dir = g_strdup (SESSIONS_DIR);
remote_sessions_dir = g_strdup (REMOTE_SESSIONS_DIR);
/* Use session directory from configuration */
{
gchar *value;
- value = g_key_file_get_string (config_key_file, "LightDM", "xsessions-directory", NULL);
+ value = g_key_file_get_string (config_key_file, "LightDM", "sessions-directory", NULL);
if (value)
{
- g_free (xsessions_dir);
- xsessions_dir = value;
+ g_free (sessions_dir);
+ sessions_dir = value;
}
value = g_key_file_get_string (config_key_file, "LightDM", "remote-sessions-directory", NULL);
g_key_file_free (config_key_file);
g_free (config_path);
- local_sessions = load_sessions (xsessions_dir);
+ local_sessions = load_sessions (sessions_dir);
remote_sessions = load_sessions (remote_sessions_dir);
- g_free (xsessions_dir);
+ g_free (sessions_dir);
g_free (remote_sessions_dir);
have_sessions = TRUE;
-DLOG_DIR=\"$(localstatedir)/log/lightdm\" \
-DRUN_DIR=\"$(localstatedir)/run/lightdm\" \
-DCACHE_DIR=\"$(localstatedir)/cache/lightdm\" \
- -DXSESSIONS_DIR=\"$(datadir)/xsessions\" \
+ -DSESSIONS_DIR=\"$(pkgdatadir)/sessions:$(datadir)/xsessions\" \
-DREMOTE_SESSIONS_DIR=\"$(pkgdatadir)/remote-sessions\" \
- -DXGREETERS_DIR=\"$(datadir)/xgreeters\"
+ -DGREETERS_DIR=\"$(pkgdatadir)/greeters:$(datadir)/xgreeters\"
lightdm_LDADD = \
$(LIGHTDM_LIBS) \
static gboolean
display_start_greeter (Display *display)
{
- gchar *log_dir, *filename, *log_filename, *sessions_dir, *path, *wrapper;
+ gchar *log_dir, *filename, *log_filename, *sessions_dir, *wrapper, **dirs;
gchar **argv;
+ int i;
/* Log the output of the greeter to a system location */
log_dir = config_get_string (config_get_instance (), "LightDM", "log-directory");
g_free (log_filename);
/* Load the greeter session information */
- sessions_dir = config_get_string (config_get_instance (), "LightDM", "xgreeters-directory");
- filename = g_strdup_printf ("%s.desktop", display->priv->greeter_session);
- path = g_build_filename (sessions_dir, filename, NULL);
+ sessions_dir = config_get_string (config_get_instance (), "LightDM", "greeters-directory");
+ dirs = g_strsplit (sessions_dir, ":", -1);
g_free (sessions_dir);
- g_free (filename);
- argv = get_session_command (path, NULL);
- g_free (path);
+ for (i = 0; dirs[i]; i++)
+ {
+ gchar *path;
+
+ filename = g_strdup_printf ("%s.desktop", display->priv->greeter_session);
+ path = g_build_filename (dirs[i], filename, NULL);
+ g_free (filename);
+ argv = get_session_command (path, NULL);
+ g_free (path);
+ if (argv)
+ break;
+ }
+ g_strfreev (dirs);
if (!argv)
return TRUE;
display_start_session (Display *display)
{
User *user;
- gchar *filename, *sessions_dir, *path;
+ gchar *sessions_dir, **dirs;
const gchar *language;
gchar **argv;
gboolean disable_guest_wrapper;
+ int i;
user = session_get_user (display->priv->session);
/* Find the command to run for the selected session */
if (display->priv->user_session_type == SESSION_TYPE_LOCAL)
{
- sessions_dir = config_get_string (config_get_instance (), "LightDM", "xsessions-directory");
+ sessions_dir = config_get_string (config_get_instance (), "LightDM", "sessions-directory");
/* Store this session name so we automatically use it next time */
user_set_xsession (user, display->priv->user_session);
}
else
sessions_dir = config_get_string (config_get_instance (), "LightDM", "remote-sessions-directory");
- filename = g_strdup_printf ("%s.desktop", display->priv->user_session);
- path = g_build_filename (sessions_dir, filename, NULL);
+ dirs = g_strsplit (sessions_dir, ":", -1);
g_free (sessions_dir);
- g_free (filename);
- argv = get_session_command (path, display->priv->session_wrapper);
- g_free (path);
+ for (i = 0; dirs[i]; i++)
+ {
+ gchar *filename, *path;
+
+ filename = g_strdup_printf ("%s.desktop", display->priv->user_session);
+ path = g_build_filename (dirs[i], filename, NULL);
+ g_free (filename);
+ argv = get_session_command (path, display->priv->session_wrapper);
+ g_free (path);
+ if (argv)
+ break;
+ }
+ g_strfreev (dirs);
if (!argv)
return TRUE;
gboolean explicit_config = FALSE;
gboolean test_mode = FALSE;
gchar *pid_path = "/var/run/lightdm.pid";
- gchar *xsessions_dir = NULL;
- gchar *remote_sessions_dir = NULL;
- gchar *xgreeters_dir = NULL;
gchar *config_dir, *config_d_dir = NULL;
gchar *log_dir = NULL;
gchar *run_dir = NULL;
{ "pid-file", 0, 0, G_OPTION_ARG_STRING, &pid_path,
/* Help string for command line --pid-file flag */
N_("File to write PID into"), "FILE" },
- { "xsessions-dir", 0, 0, G_OPTION_ARG_STRING, &xsessions_dir,
- /* Help string for command line --xsessions-dir flag */
- N_("Directory to load X sessions from"), "DIRECTORY" },
- { "remote-sessions-dir", 0, 0, G_OPTION_ARG_STRING, &remote_sessions_dir,
- /* Help string for command line --remote-sessions-dir flag */
- N_("Directory to load remote sessions from"), "DIRECTORY" },
- { "xgreeters-dir", 0, 0, G_OPTION_ARG_STRING, &xgreeters_dir,
- /* Help string for command line --xgreeters-dir flag */
- N_("Directory to load X greeters from"), "DIRECTORY" },
{ "log-dir", 0, 0, G_OPTION_ARG_STRING, &log_dir,
/* Help string for command line --log-dir flag */
N_("Directory to write logs to"), "DIRECTORY" },
fclose (pid_file);
}
- /* Always use absolute directories as child processes may run from different locations */
- xsessions_dir = path_make_absolute (xsessions_dir);
- remote_sessions_dir = path_make_absolute (remote_sessions_dir);
- xgreeters_dir = path_make_absolute (xgreeters_dir);
-
/* If not running as root write output to directories we control */
if (getuid () != 0)
{
if (!config_has_key (config_get_instance (), "LightDM", "cache-directory"))
config_set_string (config_get_instance (), "LightDM", "cache-directory", default_cache_dir);
g_free (default_cache_dir);
- if (!config_has_key (config_get_instance (), "LightDM", "xsessions-directory"))
- config_set_string (config_get_instance (), "LightDM", "xsessions-directory", XSESSIONS_DIR);
+ if (!config_has_key (config_get_instance (), "LightDM", "sessions-directory"))
+ config_set_string (config_get_instance (), "LightDM", "sessions-directory", SESSIONS_DIR);
if (!config_has_key (config_get_instance (), "LightDM", "remote-sessions-directory"))
config_set_string (config_get_instance (), "LightDM", "remote-sessions-directory", REMOTE_SESSIONS_DIR);
- if (!config_has_key (config_get_instance (), "LightDM", "xgreeters-directory"))
- config_set_string (config_get_instance (), "LightDM", "xgreeters-directory", XGREETERS_DIR);
+ if (!config_has_key (config_get_instance (), "LightDM", "greeters-directory"))
+ config_set_string (config_get_instance (), "LightDM", "greeters-directory", GREETERS_DIR);
/* Override defaults */
if (log_dir)
if (cache_dir)
config_set_string (config_get_instance (), "LightDM", "cache-directory", cache_dir);
g_free (cache_dir);
- if (xsessions_dir)
- config_set_string (config_get_instance (), "LightDM", "xsessions-directory", xsessions_dir);
- g_free (xsessions_dir);
- if (remote_sessions_dir)
- config_set_string (config_get_instance (), "LightDM", "remote-sessions-directory", remote_sessions_dir);
- g_free (remote_sessions_dir);
- if (xgreeters_dir)
- config_set_string (config_get_instance (), "LightDM", "xgreeters-directory", xgreeters_dir);
- g_free (xgreeters_dir);
/* Create run and cache directories */
dir = config_get_string (config_get_instance (), "LightDM", "log-directory");
-DBUILDDIR=\"$(abs_top_builddir)\" \
-DSYSCONFDIR=\"$(sysconfdir)\" \
-DLOCALSTATEDIR=\"$(localstatedir)\" \
+ -DDATADIR=\"$(datadir)\" \
-DCONFIG_DIR=\"$(sysconfdir)/lightdm\"
libsystem_la_LIBADD = -ldl $(GLIB_LIBS) $(GIO_UNIX_LIBS)
if (g_str_has_prefix (path, LOCALSTATEDIR))
return g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "var", path + strlen (LOCALSTATEDIR), NULL);
+ if (g_str_has_prefix (path, DATADIR))
+ return g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "usr", "share", path + strlen (DATADIR), NULL);
+
// Don't redirect if inside the build directory
if (g_str_has_prefix (path, BUILDDIR))
return g_strdup (path);
if (getenv ("DEBUG"))
g_string_append (command_line, " --debug");
g_string_append_printf (command_line, " --cache-dir %s/cache", temp_dir);
- g_string_append_printf (command_line, " --xsessions-dir=%s/usr/share/xsessions", temp_dir);
- g_string_append_printf (command_line, " --remote-sessions-dir=%s/usr/share/remote-sessions", temp_dir);
- g_string_append_printf (command_line, " --xgreeters-dir=%s/usr/share/xgreeters", temp_dir);
test_runner_command = g_strdup_printf ("PATH=%s LD_PRELOAD=%s LD_LIBRARY_PATH=%s LIGHTDM_TEST_ROOT=%s DBUS_SESSION_BUS_ADDRESS=%s %s\n",
g_getenv ("PATH"), g_getenv ("LD_PRELOAD"), g_getenv ("LD_LIBRARY_PATH"), g_getenv ("LIGHTDM_TEST_ROOT"), g_getenv ("DBUS_SESSION_BUS_ADDRESS"),
/* Set up a skeleton file system */
g_mkdir_with_parents (g_strdup_printf ("%s/etc", temp_dir), 0755);
g_mkdir_with_parents (g_strdup_printf ("%s/usr/share", temp_dir), 0755);
- g_mkdir_with_parents (g_strdup_printf ("%s/usr/share/xsessions", temp_dir), 0755);
- g_mkdir_with_parents (g_strdup_printf ("%s/usr/share/remote-sessions", temp_dir), 0755);
- g_mkdir_with_parents (g_strdup_printf ("%s/usr/share/xgreeters", temp_dir), 0755);
+ g_mkdir_with_parents (g_strdup_printf ("%s/usr/share/lightdm/sessions", temp_dir), 0755);
+ g_mkdir_with_parents (g_strdup_printf ("%s/usr/share/lightdm/remote-sessions", temp_dir), 0755);
+ g_mkdir_with_parents (g_strdup_printf ("%s/usr/share/lightdm/greeters", temp_dir), 0755);
g_mkdir_with_parents (g_strdup_printf ("%s/tmp", temp_dir), 0755);
g_mkdir_with_parents (g_strdup_printf ("%s/var/run", temp_dir), 0755);
g_mkdir_with_parents (g_strdup_printf ("%s/var/log", temp_dir), 0755);
perror ("Failed to copy configuration");
/* Copy over the greeter files */
- if (system (g_strdup_printf ("cp %s/xsessions/* %s/usr/share/xsessions", DATADIR, temp_dir)))
- perror ("Failed to copy xsessions");
- if (system (g_strdup_printf ("cp %s/remote-sessions/* %s/usr/share/remote-sessions", DATADIR, temp_dir)))
+ if (system (g_strdup_printf ("cp %s/sessions/* %s/usr/share/lightdm/sessions", DATADIR, temp_dir)))
+ perror ("Failed to copy sessions");
+ if (system (g_strdup_printf ("cp %s/remote-sessions/* %s/usr/share/lightdm/remote-sessions", DATADIR, temp_dir)))
perror ("Failed to copy remote sessions");
- if (system (g_strdup_printf ("cp %s/xgreeters/* %s/usr/share/xgreeters", DATADIR, temp_dir)))
- perror ("Failed to copy xgreeters");
+ if (system (g_strdup_printf ("cp %s/greeters/* %s/usr/share/lightdm/greeters", DATADIR, temp_dir)))
+ perror ("Failed to copy greeters");
/* Set up the default greeter */
- path = g_build_filename (temp_dir, "usr", "share", "xgreeters", "default.desktop", NULL);
+ path = g_build_filename (temp_dir, "usr", "share", "lightdm", "greeters", "default.desktop", NULL);
greeter = g_strdup_printf ("%s.desktop", argv[2]);
if (symlink (greeter, path) < 0)
{