tests/src/test-runner
tests/src/test-session
tests/src/test-xserver
+utils/lightdm-set-defaults
+utils/dm-tool
if COMPILE_LIBLIGHTDM_QT
SUBDIRS += liblightdm-qt
endif
-SUBDIRS += data greeters po src doc tests
+SUBDIRS += data greeters po src doc tests utils
DISTCHECK_CONFIGURE_FLAGS = --enable-introspection --enable-gtk-doc
+Overview of changes in lightdm 0.9.4
+
+ * lightdm-set-defaults enables tweaking the default session and chosen
+ greeter for lightdm. This is useful for derivatives waiting to not ship
+ the whole configuration file of lightdm
+ * Fix crash in GTK+ greeter when a user is added
+ * Move xsessions-directory and xgreeters-directory from [SeatDefaults] to
+ [LightDM]. This is a configuration break, but making it on the assumption
+ that these settings are not likely to have been overridden.
+ * Fix fallback from org.freedesktop.Accounts to passwd format
+ * Fix duplicate user entries being shown when using passwd file
+ * Add AddSeat D-Bus method for adding dynamic seats
+ * Added a dm-tool program that allows user switching and adding seats
+ * Allow remote X servers, e.g. launched using dm-tool add-nested-seat
+ * Fix bug where sessions were started when the greeter quit and the user
+ hadn't been authorized.
+ * Fix bug where sessions used the seat bus name
+
Overview of changes in lightdm 0.9.3
* Unlock ConsoleKit sessions when switching to them
dnl Process this file with autoconf to produce a configure script.
-AC_INIT(lightdm, 0.9.3)
+AC_INIT(lightdm, 0.9.4)
AC_CONFIG_MACRO_DIR(m4)
AC_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE
GOBJECT_INTROSPECTION_CHECK(0.9.5)
-AC_PATH_PROG([VALA_API_GEN], [vapigen])
-
GNOME_COMPILE_WARNINGS(maximum)
dnl ###########################################################################
src/Makefile
tests/Makefile
tests/src/Makefile
+utils/Makefile
])
AC_OUTPUT
# 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
+# xgreeters-directory = Directory to find X greeters
#
[LightDM]
#start-default-seat=true
#log-directory=/var/log/lightdm
#run-directory=/var/run/lightdm
#cache-directory=/var/cache/lightdm
+#xsessions-directory=/usr/share/xsessions
+#xgreeters-directory=/usr/share/xgreeters
#
# Seat defaults
# xdmcp-manager = XDMCP manager to connect to
# xdmcp-port = XDMCP UDP/IP port to communicate on
# xdmcp-key = Authentication key to use for XDM-AUTHENTICATION-1 (stored in keys.conf)
-# xsessions-directory = Directory to find X sessions
-# xgreeters-directory = Directory to find X greeters
# greeter-session = Session to load for greeter
# greeter-hide-users = True to hide the user list
# user-session = Session to load for users
#xdmcp-manager=
#xdmcp-port=177
#xdmcp-key=
-#xsessions-directory=/usr/share/xsessions
-#xgreeters-directory=/usr/share/xgreeters
#greeter-session=example-gtk-gnome
#greeter-hide-users=false
#user-session=default
gboolean matched;
gtk_tree_model_get (model, iter, 0, &name, -1);
- matched = strcmp (name, username) == 0;
+ matched = g_strcmp0 (name, username) == 0;
g_free (name);
if (matched)
return TRUE;
object_class->set_property = lightdm_language_set_property;
object_class->get_property = lightdm_language_get_property;
- g_object_class_install_property(object_class,
- PROP_CODE,
- g_param_spec_string("code",
- "code",
- "Language code",
- NULL,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
- g_object_class_install_property(object_class,
- PROP_NAME,
- g_param_spec_string("name",
- "name",
- "Name of the language",
- NULL,
- G_PARAM_READABLE));
- g_object_class_install_property(object_class,
- PROP_TERRITORY,
- g_param_spec_string("territory",
- "territory",
- "Territory the language is from",
- NULL,
- G_PARAM_READABLE));
+ g_object_class_install_property (object_class,
+ PROP_CODE,
+ g_param_spec_string ("code",
+ "code",
+ "Language code",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_class_install_property (object_class,
+ PROP_NAME,
+ g_param_spec_string ("name",
+ "name",
+ "Name of the language",
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (object_class,
+ PROP_TERRITORY,
+ g_param_spec_string ("territory",
+ "territory",
+ "Territory the language is from",
+ NULL,
+ G_PARAM_READABLE));
}
object_class->set_property = lightdm_layout_set_property;
object_class->get_property = lightdm_layout_get_property;
- g_object_class_install_property(object_class,
- PROP_NAME,
- g_param_spec_string("name",
- "name",
- "Name of the layout",
- NULL,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
- g_object_class_install_property(object_class,
- PROP_SHORT_DESCRIPTION,
- g_param_spec_string("short-description",
- "short-description",
- "Short description of the layout",
- NULL,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
- g_object_class_install_property(object_class,
- PROP_DESCRIPTION,
- g_param_spec_string("description",
- "description",
- "Long description of the layout",
- NULL,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_class_install_property (object_class,
+ PROP_NAME,
+ g_param_spec_string ("name",
+ "name",
+ "Name of the layout",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_class_install_property (object_class,
+ PROP_SHORT_DESCRIPTION,
+ g_param_spec_string ("short-description",
+ "short-description",
+ "Short description of the layout",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_class_install_property (object_class,
+ PROP_DESCRIPTION,
+ g_param_spec_string ("description",
+ "description",
+ "Long description of the layout",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
}
object_class->set_property = lightdm_session_set_property;
object_class->get_property = lightdm_session_get_property;
- g_object_class_install_property(object_class,
- PROP_KEY,
- g_param_spec_string ("key",
- "key",
- "Session key",
- NULL,
- G_PARAM_READABLE));
- g_object_class_install_property(object_class,
- PROP_NAME,
- g_param_spec_string ("name",
- "name",
- "Session name",
- NULL,
- G_PARAM_READABLE));
- g_object_class_install_property(object_class,
- PROP_COMMENT,
- g_param_spec_string ("comment",
- "comment",
- "Session comment",
- NULL,
- G_PARAM_READABLE));
+ g_object_class_install_property (object_class,
+ PROP_KEY,
+ g_param_spec_string ("key",
+ "key",
+ "Session key",
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (object_class,
+ PROP_NAME,
+ g_param_spec_string ("name",
+ "name",
+ "Session name",
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (object_class,
+ PROP_COMMENT,
+ g_param_spec_string ("comment",
+ "comment",
+ "Session comment",
+ NULL,
+ G_PARAM_READABLE));
}
}
static void
-load_passwd_file (LightDMUserList *user_list)
+load_passwd_file (LightDMUserList *user_list, gboolean emit_add_signal)
{
LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
GKeyFile *config;
LightDMUser *info = link->data;
g_debug ("User %s added", lightdm_user_get_name (info));
g_signal_connect (info, "changed", G_CALLBACK (user_changed_cb), user_list);
- g_signal_emit (user_list, list_signals[USER_ADDED], 0, info);
+ if (emit_add_signal)
+ g_signal_emit (user_list, list_signals[USER_ADDED], 0, info);
}
g_list_free (new_users);
for (link = changed_users; link; link = link->next)
if (event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT)
{
g_debug ("%s changed, reloading user list", g_file_get_path (file));
- load_passwd_file (user_list);
+ load_passwd_file (user_list, TRUE);
}
}
update_users (LightDMUserList *user_list)
{
LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
- GFile *passwd_file;
GError *error = NULL;
if (priv->have_users)
g_warning ("Error contacting org.freedesktop.Accounts: %s", error->message);
g_clear_error (&error);
+ /* Check if the service exists */
+ if (priv->accounts_service_proxy)
+ {
+ gchar *name;
+
+ name = g_dbus_proxy_get_name_owner (priv->accounts_service_proxy);
+ if (!name)
+ {
+ g_debug ("org.freedesktop.Accounts does not exist, falling back to passwd file");
+ g_object_unref (priv->accounts_service_proxy);
+ priv->accounts_service_proxy = NULL;
+ }
+ g_free (name);
+ }
+
if (priv->accounts_service_proxy)
{
GVariant *result;
}
else
{
- load_passwd_file (user_list);
+ GFile *passwd_file;
+
+ load_passwd_file (user_list, FALSE);
/* Watch for changes to user list */
passwd_file = g_file_new_for_path (PASSWD_FILE);
object_class->get_property = lightdm_user_get_property;
object_class->finalize = lightdm_user_finalize;
- g_object_class_install_property(object_class,
- USER_PROP_NAME,
- g_param_spec_string("name",
- "name",
- "Username",
- NULL,
- G_PARAM_READWRITE));
- g_object_class_install_property(object_class,
- USER_PROP_REAL_NAME,
- g_param_spec_string("real-name",
- "real-name",
- "Users real name",
- NULL,
- G_PARAM_READWRITE));
- g_object_class_install_property(object_class,
- USER_PROP_DISPLAY_NAME,
- g_param_spec_string("display-name",
- "display-name",
- "Users display name",
- NULL,
- G_PARAM_READABLE));
- g_object_class_install_property(object_class,
- USER_PROP_HOME_DIRECTORY,
- g_param_spec_string("home-directory",
- "home-directory",
- "Home directory",
- NULL,
- G_PARAM_READWRITE));
- g_object_class_install_property(object_class,
- USER_PROP_IMAGE,
- g_param_spec_string("image",
- "image",
- "Avatar image",
- NULL,
- G_PARAM_READWRITE));
- g_object_class_install_property(object_class,
- USER_PROP_LANGUAGE,
- g_param_spec_string("language",
- "language",
- "Language used by this user",
- NULL,
- G_PARAM_READABLE));
- g_object_class_install_property(object_class,
- USER_PROP_LAYOUT,
- g_param_spec_string("layout",
- "layout",
- "Keyboard layout used by this user",
- NULL,
- G_PARAM_READABLE));
- g_object_class_install_property(object_class,
- USER_PROP_SESSION,
- g_param_spec_string("session",
- "session",
- "Session used by this user",
- NULL,
- G_PARAM_READABLE));
- g_object_class_install_property(object_class,
- USER_PROP_LOGGED_IN,
- g_param_spec_boolean("logged-in",
- "logged-in",
- "TRUE if the user is currently in a session",
- FALSE,
- G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ USER_PROP_NAME,
+ g_param_spec_string ("name",
+ "name",
+ "Username",
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ USER_PROP_REAL_NAME,
+ g_param_spec_string ("real-name",
+ "real-name",
+ "Users real name",
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ USER_PROP_DISPLAY_NAME,
+ g_param_spec_string ("display-name",
+ "display-name",
+ "Users display name",
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (object_class,
+ USER_PROP_HOME_DIRECTORY,
+ g_param_spec_string ("home-directory",
+ "home-directory",
+ "Home directory",
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ USER_PROP_IMAGE,
+ g_param_spec_string ("image",
+ "image",
+ "Avatar image",
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ USER_PROP_LANGUAGE,
+ g_param_spec_string ("language",
+ "language",
+ "Language used by this user",
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (object_class,
+ USER_PROP_LAYOUT,
+ g_param_spec_string ("layout",
+ "layout",
+ "Keyboard layout used by this user",
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (object_class,
+ USER_PROP_SESSION,
+ g_param_spec_string ("session",
+ "session",
+ "Session used by this user",
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (object_class,
+ USER_PROP_LOGGED_IN,
+ g_param_spec_boolean ("logged-in",
+ "logged-in",
+ "TRUE if the user is currently in a session",
+ FALSE,
+ G_PARAM_READWRITE));
/**
* LightDMUser::changed:
[type: gettext/glade]greeters/gtk/greeter.ui
greeters/gtk/lightdm-gtk-greeter.c
src/lightdm.c
+utils/lightdm-set-defaults.c
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:40+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:40+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:40+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:40+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
--- /dev/null
+# Bosnian translation for lightdm
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the lightdm package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lightdm\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2010-12-06 11:05+0000\n"
+"PO-Revision-Date: 2011-08-15 15:46+0000\n"
+"Last-Translator: Daniel4x <daniel4molnar@gmail.com>\n"
+"Language-Team: Bosnian <bs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-08-17 04:57+0000\n"
+"X-Generator: Launchpad (build 13697)\n"
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:322
+msgid "Are you sure you want to close all programs and restart the computer?"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:1
+msgid "Cancel"
+msgstr ""
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:323
+msgid "Restart"
+msgstr ""
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:347
+msgid ""
+"Are you sure you want to close all programs and shutdown the computer?"
+msgstr ""
+"Jeste li sigurni da želite zatvoriti sve programe i isključiti računar?"
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:348
+msgid "Shutdown"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:4
+msgid "Large Font"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:611
+msgid "High Constrast"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:615
+msgid "Options"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:620
+msgid "Language"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:646
+msgid "Keyboard Layout"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:668
+msgid "Session"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:8
+msgid "Suspend"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:2
+msgid "Hibernate"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:6
+msgid "Restart..."
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:7
+msgid "Shutdown..."
+msgstr ""
+
+#. Description on how to use Light Display Manager displayed on command-line
+#: ../src/lightdm.c:100
+#, c-format
+msgid ""
+"Usage:\n"
+" %s - Display Manager"
+msgstr ""
+
+#. Description on how to use Light Display Manager displayed on command-line
+#: ../src/lightdm.c:106
+#, c-format
+msgid ""
+"Help Options:\n"
+" -c, --config <file> Use configuration file\n"
+" --pid-file <file> File to write PID into\n"
+" -d, --debug Print debugging messages\n"
+" --test-mode Run as unprivileged user\n"
+" -v, --version Show release version\n"
+" -h, --help Show help options"
+msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:40+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:40+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:40+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:40+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:40+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:40+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:40+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:40+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:40+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
--- /dev/null
+# Gaelic; Scottish translation for lightdm
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the lightdm package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lightdm\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2010-12-06 11:05+0000\n"
+"PO-Revision-Date: 2011-08-16 22:47+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Gaelic; Scottish <gd@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-08-17 04:57+0000\n"
+"X-Generator: Launchpad (build 13697)\n"
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:322
+msgid "Are you sure you want to close all programs and restart the computer?"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:1
+msgid "Cancel"
+msgstr ""
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:323
+msgid "Restart"
+msgstr ""
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:347
+msgid ""
+"Are you sure you want to close all programs and shutdown the computer?"
+msgstr ""
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:348
+msgid "Shutdown"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:4
+msgid "Large Font"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:611
+msgid "High Constrast"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:615
+msgid "Options"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:620
+msgid "Language"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:646
+msgid "Keyboard Layout"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:668
+msgid "Session"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:8
+msgid "Suspend"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:2
+msgid "Hibernate"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:6
+msgid "Restart..."
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:7
+msgid "Shutdown..."
+msgstr ""
+
+#. Description on how to use Light Display Manager displayed on command-line
+#: ../src/lightdm.c:100
+#, c-format
+msgid ""
+"Usage:\n"
+" %s - Display Manager"
+msgstr ""
+
+#. Description on how to use Light Display Manager displayed on command-line
+#: ../src/lightdm.c:106
+#, c-format
+msgid ""
+"Help Options:\n"
+" -c, --config <file> Use configuration file\n"
+" --pid-file <file> File to write PID into\n"
+" -d, --debug Print debugging messages\n"
+" --test-mode Run as unprivileged user\n"
+" -v, --version Show release version\n"
+" -h, --help Show help options"
+msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:40+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
--- /dev/null
+# Interlingua translation for lightdm
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the lightdm package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lightdm\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2010-12-06 11:05+0000\n"
+"PO-Revision-Date: 2011-08-11 05:03+0000\n"
+"Last-Translator: Emilio Sepulveda <emilio@chilemoz.org>\n"
+"Language-Team: Interlingua <ia@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-08-12 04:45+0000\n"
+"X-Generator: Launchpad (build 13662)\n"
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:322
+msgid "Are you sure you want to close all programs and restart the computer?"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:1
+msgid "Cancel"
+msgstr "Cancellar"
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:323
+msgid "Restart"
+msgstr "Re-initiar"
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:347
+msgid ""
+"Are you sure you want to close all programs and shutdown the computer?"
+msgstr ""
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:348
+msgid "Shutdown"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:4
+msgid "Large Font"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:611
+msgid "High Constrast"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:615
+msgid "Options"
+msgstr "Optiones"
+
+#: ../greeters/ldm-gtk-greeter.c:620
+msgid "Language"
+msgstr "Linguage"
+
+#: ../greeters/ldm-gtk-greeter.c:646
+msgid "Keyboard Layout"
+msgstr "Disposition de claviero"
+
+#: ../greeters/ldm-gtk-greeter.c:668
+msgid "Session"
+msgstr "Session"
+
+#: ../greeters/gtk/greeter.ui.h:8
+msgid "Suspend"
+msgstr "Suspender"
+
+#: ../greeters/gtk/greeter.ui.h:2
+msgid "Hibernate"
+msgstr "Hibernar"
+
+#: ../greeters/gtk/greeter.ui.h:6
+msgid "Restart..."
+msgstr "Reinitiar..."
+
+#: ../greeters/gtk/greeter.ui.h:7
+msgid "Shutdown..."
+msgstr ""
+
+#. Description on how to use Light Display Manager displayed on command-line
+#: ../src/lightdm.c:100
+#, c-format
+msgid ""
+"Usage:\n"
+" %s - Display Manager"
+msgstr ""
+
+#. Description on how to use Light Display Manager displayed on command-line
+#: ../src/lightdm.c:106
+#, c-format
+msgid ""
+"Help Options:\n"
+" -c, --config <file> Use configuration file\n"
+" --pid-file <file> File to write PID into\n"
+" -d, --debug Print debugging messages\n"
+" --test-mode Run as unprivileged user\n"
+" -v, --version Show release version\n"
+" -h, --help Show help options"
+msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:40+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
--- /dev/null
+# Occitan (post 1500) translation for lightdm
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the lightdm package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lightdm\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2010-12-06 11:05+0000\n"
+"PO-Revision-Date: 2011-08-14 13:45+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Occitan (post 1500) <oc@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-08-15 04:42+0000\n"
+"X-Generator: Launchpad (build 13674)\n"
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:322
+msgid "Are you sure you want to close all programs and restart the computer?"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:1
+msgid "Cancel"
+msgstr ""
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:323
+msgid "Restart"
+msgstr ""
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:347
+msgid ""
+"Are you sure you want to close all programs and shutdown the computer?"
+msgstr ""
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:348
+msgid "Shutdown"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:4
+msgid "Large Font"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:611
+msgid "High Constrast"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:615
+msgid "Options"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:620
+msgid "Language"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:646
+msgid "Keyboard Layout"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:668
+msgid "Session"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:8
+msgid "Suspend"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:2
+msgid "Hibernate"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:6
+msgid "Restart..."
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:7
+msgid "Shutdown..."
+msgstr ""
+
+#. Description on how to use Light Display Manager displayed on command-line
+#: ../src/lightdm.c:100
+#, c-format
+msgid ""
+"Usage:\n"
+" %s - Display Manager"
+msgstr ""
+
+#. Description on how to use Light Display Manager displayed on command-line
+#: ../src/lightdm.c:106
+#, c-format
+msgid ""
+"Help Options:\n"
+" -c, --config <file> Use configuration file\n"
+" --pid-file <file> File to write PID into\n"
+" -d, --debug Print debugging messages\n"
+" --test-mode Run as unprivileged user\n"
+" -v, --version Show release version\n"
+" -h, --help Show help options"
+msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:40+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
--- /dev/null
+# Uyghur translation for lightdm
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the lightdm package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lightdm\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2010-12-06 11:05+0000\n"
+"PO-Revision-Date: 2011-08-11 07:42+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Uyghur <ug@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-08-12 04:45+0000\n"
+"X-Generator: Launchpad (build 13662)\n"
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:322
+msgid "Are you sure you want to close all programs and restart the computer?"
+msgstr "ھەممە پروگراممىنى ئېتىپ كومپيۇتېرنى قايتا قوزغامسىز؟"
+
+#: ../greeters/gtk/greeter.ui.h:1
+msgid "Cancel"
+msgstr "ئەمەلدىن قالدۇر"
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:323
+msgid "Restart"
+msgstr "قايتا قوزغات"
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:347
+msgid ""
+"Are you sure you want to close all programs and shutdown the computer?"
+msgstr ""
+
+#: ../greeters/gtk/lightdm-gtk-greeter.c:348
+msgid "Shutdown"
+msgstr "تاقا"
+
+#: ../greeters/gtk/greeter.ui.h:4
+msgid "Large Font"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:611
+msgid "High Constrast"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:615
+msgid "Options"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:620
+msgid "Language"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:646
+msgid "Keyboard Layout"
+msgstr ""
+
+#: ../greeters/ldm-gtk-greeter.c:668
+msgid "Session"
+msgstr ""
+
+#: ../greeters/gtk/greeter.ui.h:8
+msgid "Suspend"
+msgstr "توڭلات"
+
+#: ../greeters/gtk/greeter.ui.h:2
+msgid "Hibernate"
+msgstr "ئۈچەك"
+
+#: ../greeters/gtk/greeter.ui.h:6
+msgid "Restart..."
+msgstr "قايتا قوزغات…"
+
+#: ../greeters/gtk/greeter.ui.h:7
+msgid "Shutdown..."
+msgstr "تاقا…"
+
+#. Description on how to use Light Display Manager displayed on command-line
+#: ../src/lightdm.c:100
+#, c-format
+msgid ""
+"Usage:\n"
+" %s - Display Manager"
+msgstr ""
+
+#. Description on how to use Light Display Manager displayed on command-line
+#: ../src/lightdm.c:106
+#, c-format
+msgid ""
+"Help Options:\n"
+" -c, --config <file> Use configuration file\n"
+" --pid-file <file> File to write PID into\n"
+" -d, --debug Print debugging messages\n"
+" --test-mode Run as unprivileged user\n"
+" -v, --version Show release version\n"
+" -h, --help Show help options"
+msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-09 04:56+0000\n"
-"X-Generator: Launchpad (build 13628)\n"
+"X-Launchpad-Export-Date: 2011-08-10 04:41+0000\n"
+"X-Generator: Launchpad (build 13636)\n"
#: ../greeters/gtk/lightdm-gtk-greeter.c:322
msgid "Are you sure you want to close all programs and restart the computer?"
sbin_PROGRAMS = lightdm
-dist_pkglibexec_SCRIPTS = gdmflexiserver
-
ldm-marshal.c: ldm-marshal.list
@GLIB_GENMARSHAL@ --prefix=ldm_marshal $(srcdir)/ldm-marshal.list --header --body > ldm-marshal.c
seat-xdmcp-session.h \
seat-xlocal.c \
seat-xlocal.h \
+ seat-xremote.c \
+ seat-xremote.h \
session.c \
session.h \
user.c \
return g_key_file_get_groups (config->priv->key_file, NULL);
}
+gchar **
+config_get_keys (Configuration *config, const gchar *group_name)
+{
+ return g_key_file_get_keys (config->priv->key_file, group_name, NULL, NULL);
+}
+
gboolean
config_has_key (Configuration *config, const gchar *section, const gchar *key)
{
gchar **config_get_groups (Configuration *config);
+gchar **config_get_keys (Configuration *config, const gchar *group_name);
+
gboolean config_has_key (Configuration *config, const gchar *section, const gchar *key);
void config_set_string (Configuration *config, const gchar *section, const gchar *key, const gchar *value);
#include "display-manager.h"
#include "configuration.h"
#include "display.h"
-#include "xdmcp-server.h"
#include "seat-xlocal.h"
-#include "seat-xdmcp-session.h"
+#include "seat-xremote.h"
#include "plymouth.h"
enum {
/* The seats available */
GList *seats;
- /* XDMCP server */
- XDMCPServer *xdmcp_server;
-
/* TRUE if stopping the display manager (waiting for seats to stop) */
gboolean stopping;
+
+ /* TRUE if stopped */
+ gboolean stopped;
};
G_DEFINE_TYPE (DisplayManager, display_manager, G_TYPE_OBJECT);
return manager->priv->seats;
}
-static gboolean
-add_seat (DisplayManager *manager, Seat *seat)
+static void
+check_stopped (DisplayManager *manager)
{
- gboolean result;
-
- result = seat_start (SEAT (seat));
- if (!result)
- return FALSE;
+ if (manager->priv->stopping &&
+ !manager->priv->stopped &&
+ g_list_length (manager->priv->seats) == 0)
+ {
+ manager->priv->stopped = TRUE;
+ g_debug ("Display manager stopped");
+ g_signal_emit (manager, signals[STOPPED], 0);
+ }
+}
- manager->priv->seats = g_list_append (manager->priv->seats, g_object_ref (seat));
- g_signal_emit (manager, signals[SEAT_ADDED], 0, seat);
+static void
+seat_stopped_cb (Seat *seat, DisplayManager *manager)
+{
+ manager->priv->seats = g_list_remove (manager->priv->seats, seat);
+ g_signal_handlers_disconnect_matched (seat, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, manager);
- return TRUE;
+ check_stopped (manager);
+
+ if (!manager->priv->stopping)
+ g_signal_emit (manager, signals[SEAT_REMOVED], 0, seat);
}
-static gboolean
-xdmcp_session_cb (XDMCPServer *server, XDMCPSession *session, DisplayManager *manager)
+gboolean
+display_manager_add_seat (DisplayManager *manager, Seat *seat)
{
- SeatXDMCPSession *seat;
gboolean result;
- seat = seat_xdmcp_session_new (session);
- result = add_seat (manager, SEAT (seat));
- g_object_unref (seat);
-
- return result;
-}
+ result = seat_start (SEAT (seat));
+ if (!result)
+ return FALSE;
-static void
-add_static_seat (DisplayManager *manager, const gchar *config_section)
-{
- gchar *type = NULL;
- Seat *seat;
-
- if (config_section)
- type = config_get_string (config_get_instance (), config_section, "type");
- if (!type)
- type = config_get_string (config_get_instance (), "SeatDefaults", "type");
- if (!type)
- {
- g_debug ("Seat missing type field");
- return;
- }
+ manager->priv->seats = g_list_append (manager->priv->seats, g_object_ref (seat));
+ g_signal_connect (seat, "stopped", G_CALLBACK (seat_stopped_cb), manager);
+ g_signal_emit (manager, signals[SEAT_ADDED], 0, seat);
- seat = seat_new (type, config_section);
- if (seat)
- {
- if (!add_seat (manager, seat))
- g_warning ("Failed to start seat %s", config_section);
- g_object_unref (seat);
- }
- else
- g_debug ("Unknown seat type %s", type);
+ return TRUE;
}
void
display_manager_start (DisplayManager *manager)
{
- gchar **groups, **i;
-
g_return_if_fail (manager != NULL);
- /* Load the seat modules */
- seat_register_module ("xlocal", SEAT_XLOCAL_TYPE);
-
- /* Load the static display entries */
- groups = config_get_groups (config_get_instance ());
- for (i = groups; *i; i++)
- {
- gchar *config_section = *i;
-
- if (!g_str_has_prefix (config_section, "Seat:"))
- continue;
-
- g_debug ("Loading seat %s", config_section);
- add_static_seat (manager, config_section);
- }
- g_strfreev (groups);
-
- /* If no seats start a default one */
- if (!manager->priv->seats && config_get_boolean (config_get_instance (), "LightDM", "start-default-seat"))
- {
- g_debug ("Adding default seat");
- add_static_seat (manager, NULL);
- }
-
/* Disable Plymouth if no X servers are replacing it */
if (plymouth_get_is_active ())
{
plymouth_quit (FALSE);
}
- /* Start the XDMCP server */
- if (config_get_boolean (config_get_instance (), "XDMCPServer", "enabled"))
- {
- gchar *key_name, *key = NULL;
-
- manager->priv->xdmcp_server = xdmcp_server_new ();
- if (config_has_key (config_get_instance (), "XDMCPServer", "port"))
- {
- gint port;
- port = config_get_integer (config_get_instance (), "XDMCPServer", "port");
- if (port > 0)
- xdmcp_server_set_port (manager->priv->xdmcp_server, port);
- }
- g_signal_connect (manager->priv->xdmcp_server, "new-session", G_CALLBACK (xdmcp_session_cb), manager);
-
- key_name = config_get_string (config_get_instance (), "XDMCPServer", "key");
- if (key_name)
- {
- gchar *dir, *path;
- GKeyFile *keys;
- GError *error = NULL;
-
- dir = config_get_string (config_get_instance (), "LightDM", "config-directory");
- path = g_build_filename (dir, "keys.conf", NULL);
- g_free (dir);
-
- keys = g_key_file_new ();
- if (g_key_file_load_from_file (keys, path, G_KEY_FILE_NONE, &error))
- {
- if (g_key_file_has_key (keys, "keyring", key_name, NULL))
- key = g_key_file_get_string (keys, "keyring", key_name, NULL);
- else
- g_debug ("Key %s not defined", error->message);
- }
- else
- g_debug ("Error getting key %s", error->message);
- g_clear_error (&error);
- g_free (path);
- g_key_file_free (keys);
- }
- if (key)
- xdmcp_server_set_key (manager->priv->xdmcp_server, key);
- g_free (key_name);
- g_free (key);
-
- g_debug ("Starting XDMCP server on UDP/IP port %d", xdmcp_server_get_port (manager->priv->xdmcp_server));
- xdmcp_server_start (manager->priv->xdmcp_server);
- }
-
g_signal_emit (manager, signals[STARTED], 0);
}
-static gboolean
-check_stopped (DisplayManager *manager)
-{
- if (g_list_length (manager->priv->seats) == 0)
- {
- g_debug ("Display manager stopped");
- g_signal_emit (manager, signals[STOPPED], 0);
- return TRUE;
- }
- return FALSE;
-}
-
-static void
-seat_stopped_cb (Seat *seat, DisplayManager *manager)
-{
- manager->priv->seats = g_list_remove (manager->priv->seats, seat);
- g_signal_handlers_disconnect_matched (seat, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, manager);
-
- if (manager->priv->stopping)
- {
- check_stopped (manager);
- return;
- }
-
- g_signal_emit (manager, signals[SEAT_REMOVED], 0, seat);
-}
-
void
display_manager_stop (DisplayManager *manager)
{
manager->priv->stopping = TRUE;
- if (manager->priv->xdmcp_server)
- {
- // FIXME: xdmcp_server_stop
- g_object_unref (manager->priv->xdmcp_server);
- manager->priv->xdmcp_server = NULL;
- }
-
- if (check_stopped (manager))
- return;
-
+ check_stopped (manager);
for (link = manager->priv->seats; link; link = link->next)
{
Seat *seat = link->data;
- g_signal_connect (seat, "stopped", G_CALLBACK (seat_stopped_cb), manager);
seat_stop (seat);
}
}
display_manager_init (DisplayManager *manager)
{
manager->priv = G_TYPE_INSTANCE_GET_PRIVATE (manager, DISPLAY_MANAGER_TYPE, DisplayManagerPrivate);
+
+ /* Load the seat modules */
+ seat_register_module ("xlocal", SEAT_XLOCAL_TYPE);
+ seat_register_module ("xremote", SEAT_XREMOTE_TYPE);
}
static void
self = DISPLAY_MANAGER (object);
- if (self->priv->xdmcp_server)
- g_object_unref (self->priv->xdmcp_server);
for (link = self->priv->seats; link; link = link->next)
g_object_unref (link->data);
g_list_free (self->priv->seats);
DisplayManager *display_manager_new (void);
+gboolean display_manager_add_seat (DisplayManager *manager, Seat *seat);
+
GList *display_manager_get_seats (DisplayManager *manager);
void display_manager_start (DisplayManager *manager);
/*
* Copyright (C) 2010-2011 Robert Ancell.
* Author: Robert Ancell <robert.ancell@canonical.com>
- *
+ *
* 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 the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
/* Display server */
DisplayServer *display_server;
- /* User to run greeter as */
- gchar *greeter_user;
-
/* Greeter session */
gchar *greeter_session;
/* Session requested to log into */
gchar *user_session;
-
- /* Directory to load X sessions from */
- gchar *xsessions_dir;
-
- /* Directory to load X greeters from */
- gchar *xgreeters_dir;
/* Program to run sessions through */
gchar *session_wrapper;
/* PAM service to authenticate against for automatic logins */
gchar *pam_autologin_service;
+
+ /* TRUE if a session should be started on greeter quit */
+ gboolean start_session_on_greeter_quit;
/* TRUE if in a user session */
gboolean in_user_session;
-
+
/* TRUE if have emitted ready signal */
gboolean indicated_ready;
-
+
/* Session process */
Session *session;
/* TRUE if start greeter if fail to login */
gboolean start_greeter_if_fail;
-
+
/* Hint to select user in greeter */
gchar *select_user_hint;
gboolean select_guest_hint;
-
+
/* TRUE if allowed to log into guest account */
gboolean allow_guest;
/* TRUE if stopping the display (waiting for dispaly server, greeter and session to stop) */
- gboolean stopping;
+ gboolean stopping;
+
+ /* TRUE if stopped */
+ gboolean stopped;
};
G_DEFINE_TYPE (Display, display, G_TYPE_OBJECT);
static gboolean start_greeter_session (Display *display);
static gboolean start_user_session (Display *display, PAMSession *authentication);
-// FIXME: Should be a construct property
-// FIXME: Move into seat.c
-void
-display_load_config (Display *display, const gchar *config_section)
-{
- g_return_if_fail (display != NULL);
-
- display->priv->greeter_user = config_get_string (config_get_instance (), "LightDM", "greeter-user");
-
- if (config_section)
- display->priv->greeter_session = config_get_string (config_get_instance (), config_section, "greeter-session");
- if (!display->priv->greeter_session)
- display->priv->greeter_session = config_get_string (config_get_instance (), "SeatDefaults", "greeter-session");
- if (config_section && config_has_key (config_get_instance (), config_section, "greeter-hide-users"))
- display->priv->greeter_hide_users = config_get_boolean (config_get_instance (), config_section, "greeter-hide-users");
- else if (config_has_key (config_get_instance (), "SeatDefaults", "greeter-hide-users"))
- display->priv->greeter_hide_users = config_get_boolean (config_get_instance (), "SeatDefaults", "greeter-hide-users");
- if (config_section)
- display->priv->user_session = config_get_string (config_get_instance (), config_section, "user-session");
- if (!display->priv->user_session)
- display->priv->user_session = config_get_string (config_get_instance (), "SeatDefaults", "user-session");
- if (config_section)
- display->priv->xsessions_dir = config_get_string (config_get_instance (), config_section, "xsessions-directory");
- if (!display->priv->xsessions_dir)
- display->priv->xsessions_dir = config_get_string (config_get_instance (), "SeatDefaults", "xsessions-directory");
- if (config_section)
- display->priv->xgreeters_dir = config_get_string (config_get_instance (), config_section, "xgreeters-directory");
- if (!display->priv->xgreeters_dir)
- display->priv->xgreeters_dir = config_get_string (config_get_instance (), "SeatDefaults", "xgreeters-directory");
- if (config_section)
- display->priv->session_wrapper = config_get_string (config_get_instance (), config_section, "session-wrapper");
- if (!display->priv->session_wrapper)
- display->priv->session_wrapper = config_get_string (config_get_instance (), "SeatDefaults", "session-wrapper");
-}
-
// FIXME: Should be a construct property
void
display_set_display_server (Display *display, DisplayServer *display_server)
return display->priv->session;
}
+void
+display_set_greeter_session (Display *display, const gchar *greeter_session)
+{
+ g_return_if_fail (display != NULL);
+ g_free (display->priv->greeter_session);
+ display->priv->greeter_session = g_strdup (greeter_session);
+}
+
+void
+display_set_session_wrapper (Display *display, const gchar *session_wrapper)
+{
+ g_return_if_fail (display != NULL);
+ g_free (display->priv->session_wrapper);
+ display->priv->session_wrapper = g_strdup (session_wrapper);
+}
+
void
display_set_allow_guest (Display *display, gboolean allow_guest)
{
display->priv->select_guest_hint = is_guest;
}
+void
+display_set_hide_users_hint (Display *display, gboolean hide_users)
+{
+ g_return_if_fail (display != NULL);
+ display->priv->greeter_hide_users = hide_users;
+}
+
void
display_set_user_session (Display *display, const gchar *session_name)
{
g_return_if_fail (display != NULL);
- if (session_name)
- {
- g_free (display->priv->user_session);
- display->priv->user_session = g_strdup (session_name);
- }
+ g_free (display->priv->user_session);
+ display->priv->user_session = g_strdup (session_name);
}
static gboolean
NULL,
"org.freedesktop.ConsoleKit",
"/org/freedesktop/ConsoleKit/Manager",
- "org.freedesktop.ConsoleKit.Manager",
+ "org.freedesktop.ConsoleKit.Manager",
NULL, &error);
if (!proxy)
g_warning ("Unable to get connection to ConsoleKit: %s", error->message);
NULL,
"org.freedesktop.ConsoleKit",
"/org/freedesktop/ConsoleKit/Manager",
- "org.freedesktop.ConsoleKit.Manager",
+ "org.freedesktop.ConsoleKit.Manager",
NULL, NULL);
result = g_dbus_proxy_call_sync (proxy,
"CloseSession",
check_stopped (Display *display)
{
if (display->priv->stopping &&
+ !display->priv->stopped &&
display->priv->display_server == NULL &&
display->priv->session == NULL)
{
+ display->priv->stopped = TRUE;
g_debug ("Display stopped");
g_signal_emit (display, signals[STOPPED], 0);
}
}
if (!started_session)
- display_stop (display);
+ display_stop (display);
}
static gboolean
if (!display->priv->display_server)
return;
- /* Start the session for the authenticated user */
- if (greeter_get_guest_authenticated (display->priv->greeter))
+ /* Start the session for the authenticated user */
+ if (display->priv->start_session_on_greeter_quit)
{
- started_session = autologin_guest (display, FALSE);
- if (!started_session)
- g_debug ("Failed to start guest session");
- }
- else
- {
- display->priv->in_user_session = TRUE;
- started_session = start_user_session (display, greeter_get_authentication (display->priv->greeter));
- if (!started_session)
- g_debug ("Failed to start user session");
+ if (greeter_get_guest_authenticated (display->priv->greeter))
+ {
+ started_session = autologin_guest (display, FALSE);
+ if (!started_session)
+ g_debug ("Failed to start guest session");
+ }
+ else
+ {
+ display->priv->in_user_session = TRUE;
+ started_session = start_user_session (display, greeter_get_authentication (display->priv->greeter));
+ if (!started_session)
+ g_debug ("Failed to start user session");
+ }
}
g_signal_handlers_disconnect_matched (display->priv->greeter, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
// FIXME: This is X specific, move into xsession.c
if (is_greeter)
- sessions_dir = display->priv->xgreeters_dir;
+ sessions_dir = config_get_string (config_get_instance (), "LightDM", "xgreeters-directory");
else
- sessions_dir = display->priv->xsessions_dir;
-
+ sessions_dir = config_get_string (config_get_instance (), "LightDM", "xsessions-directory");
filename = g_strdup_printf ("%s.desktop", session_name);
path = g_build_filename (sessions_dir, filename, NULL);
+ g_free (sessions_dir);
g_free (filename);
session_desktop_file = g_key_file_new ();
process_set_env (PROCESS (session), "LIGHTDM_TEST_HOME_DIR", g_getenv ("LIGHTDM_TEST_HOME_DIR"));
process_set_env (PROCESS (session), "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH"));
}
-
+
return session;
}
/* Stop the greeter, the session will start when the greeter has quit */
g_debug ("Stopping greeter");
- session_stop (display->priv->session);
+ display->priv->start_session_on_greeter_quit = TRUE;
+ session_stop (display->priv->session);
return TRUE;
}
if (getuid () != 0)
user = user_get_current ();
- else if (display->priv->greeter_user)
+ else
{
- user = user_get_by_name (display->priv->greeter_user);
- if (!user)
+ gchar *greeter_user;
+
+ greeter_user = config_get_string (config_get_instance (), "LightDM", "greeter-user");
+ if (!greeter_user)
{
- g_debug ("Unable to start greeter, user %s does not exist", display->priv->greeter_user);
+ g_warning ("Greeter must not be run as root");
return FALSE;
}
- }
- else
- {
- g_warning ("Greeter must not be run as root");
- return FALSE;
+
+ user = user_get_by_name (greeter_user);
+ if (!user)
+ g_debug ("Unable to start greeter, user %s does not exist", greeter_user);
+ g_free (greeter_user);
+ if (!user)
+ return FALSE;
}
display->priv->in_user_session = FALSE;
if (display->priv->autologin_user)
greeter_set_hint (display->priv->greeter, "autologin-user", display->priv->autologin_user);
else if (display->priv->autologin_guest)
- greeter_set_hint (display->priv->greeter, "autologin-guest", "true");
+ greeter_set_hint (display->priv->greeter, "autologin-guest", "true");
}
if (display->priv->select_user_hint)
greeter_set_hint (display->priv->greeter, "select-user", display->priv->select_user_hint);
gboolean result = FALSE;
g_debug ("Starting user session");
-
+
user = pam_session_get_user (authentication);
/* Load the users login settings (~/.dmrc) */
NULL,
"org.freedesktop.ConsoleKit",
"/org/freedesktop/ConsoleKit/Manager",
- "org.freedesktop.ConsoleKit.Manager",
+ "org.freedesktop.ConsoleKit.Manager",
NULL, &error);
if (!proxy)
g_warning ("Unable to get connection to ConsoleKit: %s", error->message);
NULL,
"org.freedesktop.ConsoleKit",
session_path,
- "org.freedesktop.ConsoleKit.Session",
+ "org.freedesktop.ConsoleKit.Session",
NULL, &error);
if (!proxy)
g_warning ("Unable to get connection to ConsoleKit session: %s", error->message);
if (self->priv->display_server)
g_object_unref (self->priv->display_server);
- g_free (self->priv->greeter_user);
g_free (self->priv->greeter_session);
if (self->priv->greeter)
g_object_unref (self->priv->greeter);
- g_free (self->priv->xsessions_dir);
- g_free (self->priv->xgreeters_dir);
g_free (self->priv->session_wrapper);
g_free (self->priv->pam_service);
g_free (self->priv->pam_autologin_service);
GType display_get_type (void);
-void display_load_config (Display *display, const gchar *config_section);
-
void display_set_display_server (Display *display, DisplayServer *display_server);
DisplayServer *display_get_display_server (Display *display);
Session *display_get_session (Display *display);
+void display_set_greeter_session (Display *display, const gchar *greeter_session);
+
+void display_set_session_wrapper (Display *display, const gchar *session_wrapper);
+
void display_set_allow_guest (Display *display, gboolean allow_guest);
void display_set_autologin_user (Display *display, const gchar *username, gboolean is_guest, gint timeout);
void display_set_select_user_hint (Display *display, const gchar *username, gboolean is_guest);
+void display_set_hide_users_hint (Display *display, gboolean hide_users);
+
void display_set_user_session (Display *display, const gchar *session_name);
gboolean display_start (Display *display);
if (strcmp (session, "") == 0)
session = NULL;
- if (session)
- g_debug ("Start session %s", session);
- else
- g_debug ("Start default session");
-
if (greeter->priv->guest_account_authenticated || pam_session_get_is_authenticated (greeter->priv->authentication))
+ {
+ if (session)
+ g_debug ("Start session %s", session);
+ else
+ g_debug ("Start default session");
g_signal_emit (greeter, signals[START_SESSION], 0, session, &result);
+ }
else
{
g_debug ("Ignoring start session request, user is not authorized");
#include "configuration.h"
#include "display-manager.h"
+#include "xdmcp-server.h"
+#include "seat-xdmcp-session.h"
#include "xserver.h"
#include "user.h"
#include "pam-session.h"
static gboolean debug = FALSE;
static DisplayManager *display_manager = NULL;
-
+static XDMCPServer *xdmcp_server = NULL;
static GDBusConnection *bus = NULL;
static guint bus_id;
static GDBusNodeInfo *seat_info;
{
g_debug ("Caught %s signal, shutting down", g_strsignal (signum));
display_manager_stop (display_manager);
+ // FIXME: Stop XDMCP server
}
static void
return result;
}
+static void
+set_seat_properties (Seat *seat, const gchar *config_section)
+{
+ gchar **keys;
+ gint i;
+
+ keys = config_get_keys (config_get_instance (), "SeatDefaults");
+ for (i = 0; keys[i]; i++)
+ {
+ gchar *value = config_get_string (config_get_instance (), "SeatDefaults", keys[i]);
+ seat_set_property (seat, keys[i], value);
+ g_free (value);
+ }
+ g_strfreev (keys);
+
+ if (config_section)
+ {
+ keys = config_get_keys (config_get_instance (), config_section);
+ for (i = 0; keys[i]; i++)
+ {
+ gchar *value = config_get_string (config_get_instance (), config_section, keys[i]);
+ seat_set_property (seat, keys[i], value);
+ g_free (value);
+ }
+ g_strfreev (keys);
+ }
+}
+
static void
handle_display_manager_call (GDBusConnection *connection,
const gchar *sender,
GDBusMethodInvocation *invocation,
gpointer user_data)
{
- if (g_strcmp0 (method_name, "GetSeatForCookie") == 0)
+ if (g_strcmp0 (method_name, "AddSeat") == 0)
+ {
+ gchar *type;
+ GVariantIter *property_iter;
+ gchar *name, *value;
+ Seat *seat;
+
+ if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(sa(ss))")))
+ return;
+
+ g_variant_get (parameters, "(&sa(ss))", &type, &property_iter);
+
+ g_debug ("Adding seat of type %s", type);
+
+ seat = seat_new (type);
+ if (seat)
+ {
+ set_seat_properties (seat, NULL);
+ while (g_variant_iter_loop (property_iter, "(&s&s)", &name, &value))
+ seat_set_property (seat, name, value);
+ }
+ g_variant_iter_free (property_iter);
+
+ if (!seat)
+ {
+ // FIXME: Need to make proper error
+ g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Unable to create seat of type %s", type);
+ return;
+ }
+
+ if (display_manager_add_seat (display_manager, seat))
+ {
+ BusEntry *entry;
+
+ entry = g_hash_table_lookup (seat_bus_entries, seat);
+ g_dbus_method_invocation_return_value (invocation, g_variant_new ("(o)", entry->path));
+ }
+ else// FIXME: Need to make proper error
+ g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Failed to start seat");
+ }
+ else if (g_strcmp0 (method_name, "GetSeatForCookie") == 0)
{
gchar *cookie;
Seat *seat = NULL;
if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(s)")))
return;
- g_variant_get (parameters, "(s)", &cookie);
+ g_variant_get (parameters, "(&s)", &cookie);
get_session_for_cookie (cookie, &seat);
- g_free (cookie);
-
if (seat)
entry = g_hash_table_lookup (seat_bus_entries, seat);
if (entry)
if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(s)")))
return;
- g_variant_get (parameters, "(s)", &cookie);
+ g_variant_get (parameters, "(&s)", &cookie);
session = get_session_for_cookie (cookie, NULL);
- g_free (cookie);
if (session)
entry = g_hash_table_lookup (session_bus_entries, session);
if (entry)
bus_entry_free (gpointer data)
{
BusEntry *entry = data;
+
g_dbus_connection_unregister_object (bus, entry->bus_id);
g_dbus_connection_emit_signal (bus,
session = display_get_session (display);
seat_entry = g_hash_table_lookup (seat_bus_entries, seat);
- entry = bus_entry_new (process_get_env (PROCESS (session), "XDG_SEAT_PATH"), seat_entry ? seat_entry->path : NULL, "SessionRemoved");
+ entry = bus_entry_new (process_get_env (PROCESS (session), "XDG_SESSION_PATH"), seat_entry ? seat_entry->path : NULL, "SessionRemoved");
g_hash_table_insert (session_bus_entries, g_object_ref (session), entry);
entry->bus_id = g_dbus_connection_register_object (bus,
}
static void
-seat_removed_cb (Seat *seat)
+seat_removed_cb (DisplayManager *display_manager, Seat *seat)
{
g_hash_table_remove (seat_bus_entries, seat);
}
" <interface name='org.freedesktop.DisplayManager'>"
" <property name='Seats' type='ao' access='read'/>"
" <property name='Sessions' type='ao' access='read'/>"
+ " <method name='AddSeat'>"
+ " <arg name='type' direction='in' type='s'/>"
+ " <arg name='properties' direction='in' type='a(ss)'/>"
+ " <arg name='seat' direction='out' type='o'/>"
+ " </method>"
" <method name='GetSeatForCookie'>"
" <arg name='cookie' direction='in' type='s'/>"
" <arg name='seat' direction='out' type='o'/>"
return abs_path;
}
+static gboolean
+xdmcp_session_cb (XDMCPServer *server, XDMCPSession *session)
+{
+ SeatXDMCPSession *seat;
+ gboolean result;
+
+ seat = seat_xdmcp_session_new (session);
+ set_seat_properties (SEAT (seat), NULL);
+ result = display_manager_add_seat (display_manager, SEAT (seat));
+ g_object_unref (seat);
+
+ return result;
+}
+
int
main (int argc, char **argv)
{
FILE *pid_file;
GOptionContext *option_context;
+ gchar **groups, **i;
+ gint n_seats = 0;
gboolean explicit_config = FALSE;
gboolean test_mode = FALSE;
gchar *pid_path = "/var/run/lightdm.pid";
config_set_string (config_get_instance (), "SeatDefaults", "type", "xlocal");
if (!config_has_key (config_get_instance (), "SeatDefaults", "xserver-command"))
config_set_string (config_get_instance (), "SeatDefaults", "xserver-command", "X");
- if (!config_has_key (config_get_instance (), "SeatDefaults", "xsessions-directory"))
- config_set_string (config_get_instance (), "SeatDefaults", "xsessions-directory", XSESSIONS_DIR);
- if (!config_has_key (config_get_instance (), "SeatDefaults", "xgreeters-directory"))
- config_set_string (config_get_instance (), "SeatDefaults", "xgreeters-directory", XGREETERS_DIR);
if (!config_has_key (config_get_instance (), "SeatDefaults", "allow-guest"))
config_set_boolean (config_get_instance (), "SeatDefaults", "allow-guest", TRUE);
if (!config_has_key (config_get_instance (), "SeatDefaults", "greeter-session"))
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", "xgreeters-directory"))
+ config_set_string (config_get_instance (), "LightDM", "xgreeters-directory", XGREETERS_DIR);
/* Override defaults */
if (minimum_vt)
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 (xgreeters_dir)
+ config_set_string (config_get_instance (), "LightDM", "xgreeters-directory", xgreeters_dir);
+ g_free (xgreeters_dir);
if (xserver_command)
config_set_string (config_get_instance (), "SeatDefaults", "xserver-command", xserver_command);
g_free (xserver_command);
if (session_wrapper)
config_set_string (config_get_instance (), "SeatDefaults", "session-wrapper", session_wrapper);
g_free (session_wrapper);
- if (xsessions_dir)
- config_set_string (config_get_instance (), "SeatDefaults", "xsessions-directory", xsessions_dir);
- g_free (xsessions_dir);
- if (xgreeters_dir)
- config_set_string (config_get_instance (), "SeatDefaults", "xgreeters-directory", xgreeters_dir);
- g_free (xgreeters_dir);
/* Create run and cache directories */
g_mkdir_with_parents (config_get_string (config_get_instance (), "LightDM", "log-directory"), S_IRWXU | S_IXGRP | S_IXOTH);
display_manager = display_manager_new ();
g_signal_connect (display_manager, "stopped", G_CALLBACK (display_manager_stopped_cb), NULL);
+ /* Load the static display entries */
+ groups = config_get_groups (config_get_instance ());
+ for (i = groups; *i; i++)
+ {
+ gchar *config_section = *i;
+ gchar *type;
+ Seat *seat;
+
+ if (!g_str_has_prefix (config_section, "Seat:"))
+ continue;
+
+ g_debug ("Loading seat %s", config_section);
+ type = config_get_string (config_get_instance (), config_section, "type");
+ if (!type)
+ type = config_get_string (config_get_instance (), config_section, "type");
+ seat = seat_new (type);
+ g_free (type);
+ if (seat)
+ {
+ set_seat_properties (seat, config_section);
+ display_manager_add_seat (display_manager, seat);
+ n_seats++;
+ }
+ else
+ g_warning ("Failed to create seat %s", config_section);
+ }
+ g_strfreev (groups);
+
+ /* If no seats start a default one */
+ if (n_seats == 0 && config_get_boolean (config_get_instance (), "LightDM", "start-default-seat"))
+ {
+ gchar *type;
+ Seat *seat;
+
+ g_debug ("Adding default seat");
+
+ type = config_get_string (config_get_instance (), "SeatDefaults", "type");
+ seat = seat_new (type);
+ g_free (type);
+ if (seat)
+ {
+ set_seat_properties (seat, NULL);
+ display_manager_add_seat (display_manager, seat);
+ }
+ else
+ g_warning ("Failed to create default seat");
+ }
+
display_manager_start (display_manager);
+ /* Start the XDMCP server */
+ if (config_get_boolean (config_get_instance (), "XDMCPServer", "enabled"))
+ {
+ gchar *key_name, *key = NULL;
+
+ xdmcp_server = xdmcp_server_new ();
+ if (config_has_key (config_get_instance (), "XDMCPServer", "port"))
+ {
+ gint port;
+ port = config_get_integer (config_get_instance (), "XDMCPServer", "port");
+ if (port > 0)
+ xdmcp_server_set_port (xdmcp_server, port);
+ }
+ g_signal_connect (xdmcp_server, "new-session", G_CALLBACK (xdmcp_session_cb), NULL);
+
+ key_name = config_get_string (config_get_instance (), "XDMCPServer", "key");
+ if (key_name)
+ {
+ gchar *dir, *path;
+ GKeyFile *keys;
+ GError *error = NULL;
+
+ dir = config_get_string (config_get_instance (), "LightDM", "config-directory");
+ path = g_build_filename (dir, "keys.conf", NULL);
+ g_free (dir);
+
+ keys = g_key_file_new ();
+ if (g_key_file_load_from_file (keys, path, G_KEY_FILE_NONE, &error))
+ {
+ if (g_key_file_has_key (keys, "keyring", key_name, NULL))
+ key = g_key_file_get_string (keys, "keyring", key_name, NULL);
+ else
+ g_debug ("Key %s not defined", error->message);
+ }
+ else
+ g_debug ("Error getting key %s", error->message);
+ g_clear_error (&error);
+ g_free (path);
+ g_key_file_free (keys);
+ }
+ if (key)
+ xdmcp_server_set_key (xdmcp_server, key);
+ g_free (key_name);
+ g_free (key);
+
+ g_debug ("Starting XDMCP server on UDP/IP port %d", xdmcp_server_get_port (xdmcp_server));
+ xdmcp_server_start (xdmcp_server);
+ }
+
g_main_loop_run (loop);
return EXIT_SUCCESS;
G_DEFINE_TYPE (SeatXLocal, seat_xlocal, SEAT_TYPE);
-struct SeatXLocalPrivate
-{
- /* TRUE if stopping this seat (waiting for displays to stop) */
- gboolean stopping;
-};
-
static void
seat_xlocal_setup (Seat *seat)
{
{
XServerLocal *xserver;
XDisplay *display;
- const gchar *config_section;
- gchar *command = NULL, *layout = NULL, *config_file = NULL, *xdmcp_manager = NULL, *key_name = NULL, *key = NULL;
+ const gchar *command = NULL, *layout = NULL, *config_file = NULL, *xdmcp_manager = NULL, *key_name = NULL;
gint port = 0;
- g_debug ("Starting Local X Display");
+ g_debug ("Starting local X display");
xserver = xserver_local_new ();
- config_section = seat_get_config_section (seat);
-
/* If running inside an X server use Xephyr instead */
if (g_getenv ("DISPLAY"))
- command = g_strdup ("Xephyr");
- if (!command && config_section)
- command = config_get_string (config_get_instance (), config_section, "xserver-command");
+ command = "Xephyr";
if (!command)
- command = config_get_string (config_get_instance (), "SeatDefaults", "xserver-command");
+ command = seat_get_string_property (seat, "xserver-command");
if (command)
xserver_local_set_command (xserver, command);
- g_free (command);
- if (config_section)
- layout = config_get_string (config_get_instance (), config_section, "xserver-layout");
- if (!layout)
- layout = config_get_string (config_get_instance (), "SeatDefaults", "layout");
+ layout = seat_get_string_property (seat, "xserver-layout");
if (layout)
xserver_local_set_layout (xserver, layout);
- g_free (layout);
- if (config_section)
- config_file = config_get_string (config_get_instance (), config_section, "xserver-config");
- if (!config_file)
- config_file = config_get_string (config_get_instance (), "SeatDefaults", "xserver-config");
+ config_file = seat_get_string_property (seat, "xserver-config");
if (config_file)
xserver_local_set_config (xserver, config_file);
- g_free (config_file);
- if (config_section)
- xdmcp_manager = config_get_string (config_get_instance (), config_section, "xdmcp-manager");
- if (!xdmcp_manager)
- xdmcp_manager = config_get_string (config_get_instance (), "SeatDefaults", "xdmcp-manager");
+ xdmcp_manager = seat_get_string_property (seat, "xdmcp-manager");
if (xdmcp_manager)
xserver_local_set_xdmcp_server (xserver, xdmcp_manager);
- g_free (xdmcp_manager);
- if (config_section && config_has_key (config_get_instance (), config_section, "xdmcp-port"))
- port = config_get_integer (config_get_instance (), config_section, "xdmcp-port");
- else if (config_has_key (config_get_instance (), "SeatDefaults", "xdmcp-port"))
- port = config_get_integer (config_get_instance (), "SeatDefaults", "xdmcp-port");
+ port = seat_get_integer_property (seat, "xdmcp-port");
if (port > 0)
xserver_local_set_xdmcp_port (xserver, port);
- if (config_section)
- key_name = config_get_string (config_get_instance (), config_section, "xdmcp-key");
- if (!key_name)
- key_name = config_get_string (config_get_instance (), "SeatDefaults", "xdmcp-key");
+ key_name = seat_get_string_property (seat, "xdmcp-key");
if (key_name)
{
gchar *dir, *path;
keys = g_key_file_new ();
if (g_key_file_load_from_file (keys, path, G_KEY_FILE_NONE, &error))
{
+ gchar *key = NULL;
+
if (g_key_file_has_key (keys, "keyring", key_name, NULL))
key = g_key_file_get_string (keys, "keyring", key_name, NULL);
else
g_debug ("Key %s not defined", error->message);
+
+ if (key)
+ xserver_local_set_xdmcp_key (xserver, key);
+ g_free (key);
}
else
g_debug ("Error getting key %s", error->message);
g_clear_error (&error);
g_key_file_free (keys);
}
- if (key)
- xserver_local_set_xdmcp_key (xserver, key);
- g_free (key_name);
- g_free (key);
display = xdisplay_new (XSERVER (xserver));
g_object_unref (xserver);
static void
seat_xlocal_display_removed (Seat *seat, Display *display)
{
- SeatXLocalPrivate *priv = SEAT_XLOCAL (seat)->priv;
-
/* Show a new greeter */
- if (!priv->stopping && display == seat_get_active_display (seat))
+ if (!seat_get_is_stopping (seat) && display == seat_get_active_display (seat))
{
g_debug ("Active display stopped, switching to greeter");
seat_switch_to_greeter (seat);
}
}
-static void
-seat_xlocal_stop (Seat *seat)
-{
- SEAT_XLOCAL (seat)->priv->stopping = TRUE;
- SEAT_CLASS (seat_xlocal_parent_class)->stop (seat);
-}
-
static void
seat_xlocal_init (SeatXLocal *seat)
{
- seat->priv = G_TYPE_INSTANCE_GET_PRIVATE (seat, SEAT_XLOCAL_TYPE, SeatXLocalPrivate);
}
static void
seat_class->add_display = seat_xlocal_add_display;
seat_class->set_active_display = seat_xlocal_set_active_display;
seat_class->display_removed = seat_xlocal_display_removed;
- seat_class->stop = seat_xlocal_stop;
-
- g_type_class_add_private (klass, sizeof (SeatXLocalPrivate));
}
--- /dev/null
+/*
+ * Copyright (C) 2010-2011 Robert Ancell.
+ * Author: Robert Ancell <robert.ancell@canonical.com>
+ *
+ * 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 the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
+ * license.
+ */
+
+#include <string.h>
+
+#include "seat-xremote.h"
+#include "configuration.h"
+#include "xdisplay.h"
+#include "xserver-remote.h"
+#include "vt.h"
+
+G_DEFINE_TYPE (SeatXRemote, seat_xremote, SEAT_TYPE);
+
+struct SeatXRemotePrivate
+{
+ /* Display being controlled by this seat */
+ XDisplay *display;
+};
+
+static void
+seat_xremote_setup (Seat *seat)
+{
+ seat_set_can_switch (seat, FALSE);
+ SEAT_CLASS (seat_xremote_parent_class)->setup (seat);
+}
+
+static Display *
+seat_xremote_add_display (Seat *seat)
+{
+ XServerRemote *xserver;
+ const gchar *hostname;
+ gint number;
+
+ /* Can only have one display */
+ if (SEAT_XREMOTE (seat)->priv->display)
+ return NULL;
+
+ hostname = seat_get_string_property (seat, "xserver-hostname");
+ if (!hostname)
+ hostname = "localhost";
+ number = seat_get_integer_property (seat, "xserver-display-number");
+
+ g_debug ("Starting remote X display %s:%d", hostname, number);
+
+ xserver = xserver_remote_new (hostname, number, NULL);
+
+ SEAT_XREMOTE (seat)->priv->display = xdisplay_new (XSERVER (xserver));
+ g_object_unref (xserver);
+
+ return DISPLAY (SEAT_XREMOTE (seat)->priv->display);
+}
+
+static void
+seat_xremote_display_removed (Seat *seat, Display *display)
+{
+ /* Can't restart the display, so remote this seat */
+ seat_stop (seat);
+}
+
+static void
+seat_xremote_init (SeatXRemote *seat)
+{
+ seat->priv = G_TYPE_INSTANCE_GET_PRIVATE (seat, SEAT_XREMOTE_TYPE, SeatXRemotePrivate);
+}
+
+static void
+seat_xremote_class_init (SeatXRemoteClass *klass)
+{
+ SeatClass *seat_class = SEAT_CLASS (klass);
+
+ seat_class->setup = seat_xremote_setup;
+ seat_class->add_display = seat_xremote_add_display;
+ seat_class->display_removed = seat_xremote_display_removed;
+
+ g_type_class_add_private (klass, sizeof (SeatXRemotePrivate));
+}
--- /dev/null
+/*
+ * Copyright (C) 2010-2011 Robert Ancell.
+ * Author: Robert Ancell <robert.ancell@canonical.com>
+ *
+ * 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 the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
+ * license.
+ */
+
+#ifndef _SEAT_XREMOTE_H_
+#define _SEAT_XREMOTE_H_
+
+#include <glib-object.h>
+#include "seat.h"
+
+G_BEGIN_DECLS
+
+#define SEAT_XREMOTE_TYPE (seat_xremote_get_type())
+#define SEAT_XREMOTE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SEAT_XREMOTE_TYPE, SeatXRemote))
+
+typedef struct SeatXRemotePrivate SeatXRemotePrivate;
+
+typedef struct
+{
+ Seat parent_instance;
+ SeatXRemotePrivate *priv;
+} SeatXRemote;
+
+typedef struct
+{
+ SeatClass parent_class;
+} SeatXRemoteClass;
+
+GType seat_xremote_get_type (void);
+
+G_END_DECLS
+
+#endif /* _SEAT_XREMOTE_H_ */
* license.
*/
+#include <stdlib.h>
#include <string.h>
#include "seat.h"
-#include "configuration.h"
#include "display.h"
#include "xserver.h"
#include "guest-account.h"
struct SeatPrivate
{
/* Configuration for this seat */
- gchar *config_section;
+ GHashTable *properties;
/* TRUE if able to switch users */
gboolean can_switch;
- /* TRUE if allowed to log into guest account */
- gboolean allow_guest;
-
/* Name of guest account */
gchar *guest_username;
- /* User to automatically log in as */
- gchar *autologin_username;
- gboolean autologin_guest;
- guint autologin_timeout;
-
/* The displays for this seat */
GList *displays;
/* TRUE if stopping this seat (waiting for displays to stop) */
gboolean stopping;
+
+ /* TRUE if stopped */
+ gboolean stopped;
};
G_DEFINE_TYPE (Seat, seat, G_TYPE_OBJECT);
}
Seat *
-seat_new (const gchar *module, const gchar *config_section)
+seat_new (const gchar *module_name)
{
Seat *seat;
SeatModule *m = NULL;
+
+ g_return_val_if_fail (module_name != NULL, NULL);
if (seat_modules)
- m = g_hash_table_lookup (seat_modules, module);
+ m = g_hash_table_lookup (seat_modules, module_name);
if (!m)
return NULL;
seat = g_object_new (m->type, NULL);
- seat->priv->config_section = g_strdup (config_section);
return seat;
}
+void
+seat_set_property (Seat *seat, const gchar *name, const gchar *value)
+{
+ g_return_if_fail (seat != NULL);
+ g_hash_table_insert (seat->priv->properties, g_strdup (name), g_strdup (value));
+}
+
+gboolean
+seat_has_property (Seat *seat, const gchar *name)
+{
+ g_return_val_if_fail (seat != NULL, FALSE);
+ return g_hash_table_lookup (seat->priv->properties, name) != NULL;
+}
+
const gchar *
-seat_get_config_section (Seat *seat)
+seat_get_string_property (Seat *seat, const gchar *name)
{
g_return_val_if_fail (seat != NULL, NULL);
- return seat->priv->config_section;
+ return g_hash_table_lookup (seat->priv->properties, name);
+}
+
+gboolean
+seat_get_boolean_property (Seat *seat, const gchar *name)
+{
+ return g_strcmp0 (seat_get_string_property (seat, name), "true") == 0;
+}
+
+gint
+seat_get_integer_property (Seat *seat, const gchar *name)
+{
+ const gchar *value;
+
+ value = seat_get_string_property (seat, name);
+ return value ? atoi (value) : 0;
}
void
seat_get_allow_guest (Seat *seat)
{
g_return_val_if_fail (seat != NULL, FALSE);
- return seat->priv->allow_guest && guest_account_is_installed ();
+ return seat_get_boolean_property (seat, "allow-guest") && guest_account_is_installed ();
}
static gboolean
}
}
-static gboolean
+static void
check_stopped (Seat *seat)
{
- if (g_list_length (seat->priv->displays) == 0)
+ if (seat->priv->stopping &&
+ !seat->priv->stopped &&
+ g_list_length (seat->priv->displays) == 0)
{
+ seat->priv->stopped = TRUE;
g_debug ("Seat stopped");
g_signal_emit (seat, signals[STOPPED], 0);
- return TRUE;
}
- return FALSE;
}
static void
g_signal_emit (seat, signals[DISPLAY_REMOVED], 0, display);
g_object_unref (display);
- if (seat->priv->stopping)
- check_stopped (seat);
+ check_stopped (seat);
}
static gboolean
}
new_display = SEAT_GET_CLASS (seat)->add_display (seat);
- display_load_config (DISPLAY (new_display), seat->priv->config_section);
g_signal_connect (new_display, "switch-to-user", G_CALLBACK (display_switch_to_user_cb), seat);
g_signal_connect (new_display, "switch-to-guest", G_CALLBACK (display_switch_to_guest_cb), seat);
g_signal_connect (new_display, "get-guest-username", G_CALLBACK (display_get_guest_username_cb), seat);
g_signal_connect (new_display, "ready", G_CALLBACK (display_ready_cb), seat);
g_signal_connect (new_display, "session-stopped", G_CALLBACK (display_session_stopped_cb), seat);
g_signal_connect (new_display, "stopped", G_CALLBACK (display_stopped_cb), seat);
+ display_set_greeter_session (new_display, seat_get_string_property (seat, "greeter-session"));
+ display_set_session_wrapper (new_display, seat_get_string_property (seat, "session-wrapper"));
+ display_set_hide_users_hint (new_display, seat_get_boolean_property (seat, "greeter-hide-users"));
display_set_allow_guest (new_display, seat_get_allow_guest (seat));
if (autologin)
display_set_autologin_user (new_display, username, is_guest, 0);
else
display_set_select_user_hint (new_display, username, is_guest);
+ if (!session_name)
+ session_name = seat_get_string_property (seat, "user-session");
display_set_user_session (new_display, session_name);
seat->priv->displays = g_list_append (seat->priv->displays, new_display);
SEAT_GET_CLASS (seat)->stop (seat);
}
+gboolean
+seat_get_is_stopping (Seat *seat)
+{
+ g_return_val_if_fail (seat != NULL, FALSE);
+ return seat->priv->stopping;
+}
+
static void
seat_real_setup (Seat *seat)
{
- if (seat->priv->config_section && config_has_key (config_get_instance (), seat->priv->config_section, "allow-guest"))
- seat->priv->allow_guest = config_get_boolean (config_get_instance (), seat->priv->config_section, "allow-guest");
- else if (config_has_key (config_get_instance (), "SeatDefaults", "allow-guest"))
- seat->priv->allow_guest = config_get_boolean (config_get_instance (), "SeatDefaults", "allow-guest");
- if (seat->priv->config_section && config_has_key (config_get_instance (), seat->priv->config_section, "autologin-guest"))
- seat->priv->autologin_guest = config_get_boolean (config_get_instance (), seat->priv->config_section, "autologin-guest");
- else if (config_has_key (config_get_instance (), "SeatDefaults", "autologin-guest"))
- seat->priv->autologin_guest = config_get_boolean (config_get_instance (), "SeatDefaults", "autologin-guest");
- if (seat->priv->config_section)
- seat->priv->autologin_username = config_get_string (config_get_instance (), seat->priv->config_section, "autologin-user");
- if (!seat->priv->autologin_username)
- seat->priv->autologin_username = config_get_string (config_get_instance (), "SeatDefaults", "autologin-user");
- if (seat->priv->config_section && config_has_key (config_get_instance (), seat->priv->config_section, "autologin-user-timeout"))
- seat->priv->autologin_timeout = config_get_integer (config_get_instance (), seat->priv->config_section, "autologin-user-timeout");
- else
- seat->priv->autologin_timeout = config_get_integer (config_get_instance (), "SeatDefaults", "autologin-user-timeout");
- if (seat->priv->autologin_timeout < 0)
- seat->priv->autologin_timeout = 0;
}
static gboolean
seat_real_start (Seat *seat)
{
+ const gchar *autologin_username;
+
g_debug ("Starting seat");
/* Start showing a greeter */
- if (seat->priv->autologin_username)
- return switch_to_user_or_start_greeter (seat, seat->priv->autologin_username, FALSE, NULL, TRUE);
- else if (seat->priv->autologin_guest)
+ autologin_username = seat_get_string_property (seat, "autologin-user");
+ if (autologin_username)
+ return switch_to_user_or_start_greeter (seat, autologin_username, FALSE, NULL, TRUE);
+ else if (seat_get_boolean_property (seat, "autologin-guest"))
return switch_to_user_or_start_greeter (seat, NULL, TRUE, NULL, TRUE);
else
return switch_to_user_or_start_greeter (seat, NULL, FALSE, NULL, FALSE);
{
GList *link;
- if (check_stopped (seat))
+ check_stopped (seat);
+ if (seat->priv->stopped)
return;
for (link = seat->priv->displays; link; link = link->next)
seat_init (Seat *seat)
{
seat->priv = G_TYPE_INSTANCE_GET_PRIVATE (seat, SEAT_TYPE, SeatPrivate);
+ seat->priv->properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
}
static void
self = SEAT (object);
- g_free (self->priv->config_section);
+ g_hash_table_unref (self->priv->properties);
+ g_free (self->priv->guest_username);
g_list_free_full (self->priv->displays, g_object_unref);
if (self->priv->active_display)
g_object_unref (self->priv->active_display);
void seat_register_module (const gchar *name, GType type);
-Seat *seat_new (const gchar *module, const gchar *config_section);
+Seat *seat_new (const gchar *module_name);
-const gchar *seat_get_config_section (Seat *seat);
+void seat_set_property (Seat *seat, const gchar *name, const gchar *value);
+
+gboolean seat_has_property (Seat *seat, const gchar *name);
+
+const gchar *seat_get_string_property (Seat *seat, const gchar *name);
+
+gboolean seat_get_boolean_property (Seat *seat, const gchar *name);
+
+gint seat_get_integer_property (Seat *seat, const gchar *name);
void seat_set_can_switch (Seat *seat, gboolean can_switch);
void seat_stop (Seat *seat);
+gboolean seat_get_is_stopping (Seat *seat);
+
G_END_DECLS
#endif /* _SEAT_H_ */
#include <grp.h>
#include "session.h"
-#include "configuration.h"
struct SessionPrivate
{
#include <xcb/xcb.h>
#include "xserver.h"
-#include "configuration.h"
#include "xsession.h"
struct XServerPrivate
xserver_set_authority (XServer *server, XAuthority *authority)
{
g_return_if_fail (server != NULL);
+
if (server->priv->authority)
g_object_unref (server->priv->authority);
- server->priv->authority = g_object_ref (authority);
+ if (authority)
+ server->priv->authority = g_object_ref (authority);
+ else
+ server->priv->authority = NULL;
}
XAuthority *
--- /dev/null
+bin_PROGRAMS = dm-tool
+libexec_PROGRAMS = lightdm-set-defaults
+dist_pkglibexec_SCRIPTS = gdmflexiserver
+
+dm_tool_SOURCES = \
+ dm-tool.c
+
+dm_tool_CFLAGS = \
+ $(LIGHTDM_CFLAGS) \
+ -DCONFIG_DIR=\"$(sysconfdir)/lightdm\" \
+ -DLOCALE_DIR=\"$(datadir)/locale\"
+
+dm_tool_LDADD = \
+ $(LIGHTDM_LIBS)
+
+lightdm_set_defaults_SOURCES = \
+ lightdm-set-defaults.c
+
+lightdm_set_defaults_CFLAGS = \
+ $(LIGHTDM_CFLAGS) \
+ -DCONFIG_DIR=\"$(sysconfdir)/lightdm\" \
+ -DLOCALE_DIR=\"$(datadir)/locale\"
+
+lightdm_set_defaults_LDADD = \
+ $(LIGHTDM_LIBS)
+
+DISTCLEANFILES = \
+ Makefile.in
+
--- /dev/null
+/*
+ * Copyright (C) 2010-2011 Robert Ancell.
+ * Author: Robert Ancell <robert.ancell@canonical.com>
+ *
+ * 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 the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
+ * license.
+ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+
+static GDBusProxy *dm_proxy, *seat_proxy;
+
+static gint xephyr_display_number;
+static GPid xephyr_pid;
+
+static void
+usage ()
+{
+ g_printerr (/* Text printed out when an unknown command-line argument provided */
+ _("Run 'dm-tool --help' to see a full list of available command line options."));
+ g_printerr ("\n");
+}
+
+static void
+xephyr_setup_cb (gpointer user_data)
+{
+ signal (SIGUSR1, SIG_IGN);
+}
+
+static void
+xephyr_signal_cb (int signum)
+{
+ gchar *display_number_string, *path;
+ GVariantBuilder *properties;
+ GVariant *result;
+ GError *error = NULL;
+
+ properties = g_variant_builder_new (G_VARIANT_TYPE ("a(ss)"));
+ display_number_string = g_strdup_printf ("%d", xephyr_display_number);
+ g_variant_builder_add_value (properties, g_variant_new ("(ss)", "xserver-display-number", display_number_string));
+ g_free (display_number_string);
+
+ result = g_dbus_proxy_call_sync (dm_proxy,
+ "AddSeat",
+ g_variant_new ("(sa(ss))", "xremote", properties),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ g_variant_builder_unref (properties);
+ if (!result)
+ {
+ g_printerr ("Unable to add seat: %s\n", error->message);
+ kill (xephyr_pid, SIGQUIT);
+ exit (EXIT_FAILURE);
+ }
+
+ if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("(o)")))
+ {
+ g_printerr ("Unexpected response to AddSeat: %s\n", g_variant_get_type_string (result));
+ exit (EXIT_FAILURE);
+ }
+
+ g_variant_get (result, "(&o)", &path);
+ g_print ("%s\n", path);
+
+ exit (EXIT_SUCCESS);
+}
+
+int
+main (int argc, char **argv)
+{
+ gchar *command;
+ gint n_options;
+ gchar **options;
+ GError *error = NULL;
+ gint arg_index;
+ GBusType bus_type = G_BUS_TYPE_SYSTEM;
+
+ g_type_init ();
+
+ for (arg_index = 1; arg_index < argc; arg_index++)
+ {
+ gchar *arg = argv[arg_index];
+
+ if (!g_str_has_prefix (arg, "-"))
+ break;
+
+ if (strcmp (arg, "-h") == 0 || strcmp (arg, "--help") == 0)
+ {
+ g_printerr ("Usage:\n"
+ " dm-tool [OPTION...] COMMAND [ARGS...] - Display Manager tool\n"
+ "\n"
+ "Options:\n"
+ " -h, --help Show help options\n"
+ " -v, --version Show release version\n"
+ " --session-bus Use session D-Bus\n"
+ "\n"
+ "Commands:\n"
+ " switch-to-greeter Switch to the greeter\n"
+ " switch-to-user USERNAME [SESSION] Switch to a user session\n"
+ " switch-to-guest [SESSION] Switch to a guest session\n"
+ " list-seats List the active seats\n"
+ " add-nested-seat Start a nested display\n"
+ " add-seat TYPE [NAME=VALUE...] Add a dynamic seat\n");
+ return EXIT_SUCCESS;
+ }
+ else if (strcmp (arg, "-v") == 0 || strcmp (arg, "--version") == 0)
+ {
+ /* NOTE: Is not translated so can be easily parsed */
+ g_printerr ("lightdm %s\n", VERSION);
+ return EXIT_SUCCESS;
+ }
+ else if (strcmp (arg, "--session-bus") == 0)
+ bus_type = G_BUS_TYPE_SESSION;
+ else
+ {
+ g_printerr ("Unknown option %s\n", arg);
+ usage ();
+ return EXIT_FAILURE;
+ }
+ }
+
+ if (arg_index >= argc)
+ {
+ g_printerr ("Missing command\n");
+ usage ();
+ return EXIT_FAILURE;
+ }
+
+ dm_proxy = g_dbus_proxy_new_for_bus_sync (bus_type,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.freedesktop.DisplayManager",
+ "/org/freedesktop/DisplayManager",
+ "org.freedesktop.DisplayManager",
+ NULL,
+ &error);
+ if (!dm_proxy)
+ {
+ g_printerr ("Unable to contact display manager: %s\n", error->message);
+ return EXIT_FAILURE;
+ }
+ g_clear_error (&error);
+
+ seat_proxy = g_dbus_proxy_new_for_bus_sync (bus_type,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.freedesktop.DisplayManager",
+ g_getenv ("XDG_SEAT_PATH"),
+ "org.freedesktop.DisplayManager.Seat",
+ NULL,
+ &error);
+ if (!seat_proxy)
+ {
+ g_printerr ("Unable to contact display manager: %s\n", error->message);
+ return EXIT_FAILURE;
+ }
+ g_clear_error (&error);
+
+ command = argv[arg_index];
+ arg_index++;
+ n_options = argc - arg_index;
+ options = argv + arg_index;
+ if (strcmp (command, "switch-to-greeter") == 0)
+ {
+ if (n_options != 0)
+ {
+ g_printerr ("Usage switch-to-greeter\n");
+ usage ();
+ return EXIT_FAILURE;
+ }
+
+ if (!g_dbus_proxy_call_sync (seat_proxy,
+ "SwitchToGreeter",
+ g_variant_new ("()"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error))
+ {
+ g_printerr ("Unable to switch to greeter: %s\n", error->message);
+ return EXIT_FAILURE;
+ }
+ return EXIT_SUCCESS;
+ }
+ else if (strcmp (command, "switch-to-user") == 0)
+ {
+ gchar *username, *session = "";
+
+ if (n_options > 1)
+ {
+ g_printerr ("Usage switch-to-user USERNAME [SESSION]\n");
+ usage ();
+ return EXIT_FAILURE;
+ }
+
+ username = options[0];
+ if (n_options == 2)
+ session = options[1];
+
+ if (!g_dbus_proxy_call_sync (seat_proxy,
+ "SwitchToUser",
+ g_variant_new ("(ss)", username, session),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error))
+ {
+ g_printerr ("Unable to switch to user %s: %s\n", username, error->message);
+ return EXIT_FAILURE;
+ }
+ return EXIT_SUCCESS;
+ }
+ else if (strcmp (command, "switch-to-guest") == 0)
+ {
+ gchar *session = "";
+
+ if (n_options > 1)
+ {
+ g_printerr ("Usage switch-to-guest [SESSION]\n");
+ usage ();
+ return EXIT_FAILURE;
+ }
+
+ if (n_options == 1)
+ session = options[0];
+
+ if (!g_dbus_proxy_call_sync (seat_proxy,
+ "SwitchToGuest",
+ g_variant_new ("(s)", session),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error))
+ {
+ g_printerr ("Unable to switch to guest: %s\n", error->message);
+ return EXIT_FAILURE;
+ }
+ return EXIT_SUCCESS;
+ }
+ else if (strcmp (command, "list-seats") == 0)
+ {
+ GVariant *seats, *sessions;
+ GVariantIter *seat_iter;
+ gchar *seat_path;
+
+ if (!g_dbus_proxy_get_name_owner (dm_proxy))
+ {
+ g_printerr ("Unable to contact display manager\n");
+ return EXIT_FAILURE;
+ }
+ seats = g_dbus_proxy_get_cached_property (dm_proxy, "Seats");
+
+ g_variant_get (seats, "ao", &seat_iter);
+ while (g_variant_iter_loop (seat_iter, "&o", &seat_path))
+ {
+ gchar *seat_name;
+ GDBusProxy *seat_proxy;
+ gchar **property_names;
+ GVariant *sessions;
+ GVariantIter *session_iter;
+ gchar *session_path;
+ gint i;
+
+ if (g_str_has_prefix (seat_path, "/org/freedesktop/DisplayManager/"))
+ seat_name = seat_path + strlen ("/org/freedesktop/DisplayManager/");
+ else
+ seat_name = seat_path;
+
+ seat_proxy = g_dbus_proxy_new_sync (g_dbus_proxy_get_connection (dm_proxy),
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.freedesktop.DisplayManager",
+ seat_path,
+ "org.freedesktop.DisplayManager.Seat",
+ NULL,
+ NULL);
+ if (!seat_proxy || !g_dbus_proxy_get_name_owner (seat_proxy))
+ continue;
+
+ g_print ("%s\n", seat_name);
+ property_names = g_dbus_proxy_get_cached_property_names (seat_proxy);
+ for (i = 0; property_names[i]; i++)
+ {
+ GVariant *value;
+
+ if (strcmp (property_names[i], "Sessions") == 0)
+ continue;
+
+ value = g_dbus_proxy_get_cached_property (seat_proxy, property_names[i]);
+ g_print (" %s=%s\n", property_names[i], g_variant_print (value, FALSE));
+ g_variant_unref (value);
+ }
+
+ sessions = g_dbus_proxy_get_cached_property (seat_proxy, "Sessions");
+ if (!sessions)
+ continue;
+
+ g_variant_get (sessions, "ao", &session_iter);
+ while (g_variant_iter_loop (session_iter, "&o", &session_path))
+ {
+ GDBusProxy *session_proxy;
+ gchar *session_name;
+
+ if (g_str_has_prefix (session_path, "/org/freedesktop/DisplayManager/"))
+ session_name = session_path + strlen ("/org/freedesktop/DisplayManager/");
+ else
+ session_name = session_path;
+
+ session_proxy = g_dbus_proxy_new_sync (g_dbus_proxy_get_connection (dm_proxy),
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.freedesktop.DisplayManager",
+ session_path,
+ "org.freedesktop.DisplayManager.Session",
+ NULL,
+ NULL);
+ if (!session_proxy || !g_dbus_proxy_get_name_owner (session_proxy))
+ continue;
+
+ g_print (" %s\n", session_name);
+ property_names = g_dbus_proxy_get_cached_property_names (session_proxy);
+ for (i = 0; property_names[i]; i++)
+ {
+ GVariant *value;
+
+ if (strcmp (property_names[i], "Seat") == 0)
+ continue;
+
+ value = g_dbus_proxy_get_cached_property (session_proxy, property_names[i]);
+ g_print (" %s=%s\n", property_names[i], g_variant_print (value, FALSE));
+ g_variant_unref (value);
+ }
+
+ g_object_unref (session_proxy);
+ }
+ g_variant_iter_free (session_iter);
+
+ g_object_unref (seat_proxy);
+ }
+ g_variant_iter_free (seat_iter);
+
+ return EXIT_SUCCESS;
+ }
+ else if (strcmp (command, "add-nested-seat") == 0)
+ {
+ gchar *path, *xephyr_command, **xephyr_argv;
+ GMainLoop *loop;
+
+ path = g_find_program_in_path ("Xephyr");
+ if (!path)
+ {
+ g_printerr ("Unable to find Xephyr, please install it\n");
+ return EXIT_FAILURE;
+ }
+
+ /* Get a unique display number. It's racy, but the only reliable method to get one */
+ xephyr_display_number = 0;
+ while (TRUE)
+ {
+ gchar *lock_name;
+ gboolean has_lock;
+
+ lock_name = g_strdup_printf ("/tmp/.X%d-lock", xephyr_display_number);
+ has_lock = g_file_test (lock_name, G_FILE_TEST_EXISTS);
+ g_free (lock_name);
+
+ if (has_lock)
+ xephyr_display_number++;
+ else
+ break;
+ }
+
+ /* Wait for signal from Xephyr is ready */
+ signal (SIGUSR1, xephyr_signal_cb);
+
+ xephyr_command = g_strdup_printf ("Xephyr :%d", xephyr_display_number);
+ if (!g_shell_parse_argv (xephyr_command, NULL, &xephyr_argv, &error) ||
+ !g_spawn_async (NULL, xephyr_argv, NULL,
+ G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL,
+ xephyr_setup_cb, NULL,
+ &xephyr_pid, &error))
+ {
+ g_printerr ("Error running Xephyr: %s\n", error->message);
+ exit (EXIT_FAILURE);
+ }
+ g_clear_error (&error);
+
+ /* Block until ready */
+ loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (loop);
+ }
+ else if (strcmp (command, "add-seat") == 0)
+ {
+ GVariant *result;
+ gchar *type, *path;
+ GVariantBuilder *properties;
+ gint i;
+
+ if (n_options < 1)
+ {
+ g_printerr ("Usage add-seat TYPE [NAME=VALUE...]\n");
+ usage ();
+ return EXIT_FAILURE;
+ }
+
+ type = options[0];
+ properties = g_variant_builder_new (G_VARIANT_TYPE ("a(ss)"));
+
+ for (i = 1; i < n_options; i++)
+ {
+ gchar *property, *name, *value;
+
+ property = g_strdup (options[i]);
+ name = property;
+ value = strchr (property, '=');
+ if (value)
+ {
+ *value = '\0';
+ value++;
+ }
+ else
+ value = "";
+
+ g_variant_builder_add_value (properties, g_variant_new ("(ss)", name, value));
+ g_free (property);
+ }
+
+ result = g_dbus_proxy_call_sync (dm_proxy,
+ "AddSeat",
+ g_variant_new ("(sa(ss))", type, properties),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ g_variant_builder_unref (properties);
+ if (!result)
+ {
+ g_printerr ("Unable to add seat: %s\n", error->message);
+ return EXIT_FAILURE;
+ }
+
+ if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("(o)")))
+ {
+ g_printerr ("Unexpected response to AddSeat: %s\n", g_variant_get_type_string (result));
+ return EXIT_FAILURE;
+ }
+
+ g_variant_get (result, "(&o)", &path);
+ g_print ("%s\n", path);
+
+ return EXIT_SUCCESS;
+ }
+
+ g_printerr ("Unknown command %s\n", command);
+ usage ();
+ return EXIT_FAILURE;
+}
--- /dev/null
+/*
+ * Copyright (C) 2011 Didier Roche.
+ * Author: Didier Roche <didrocks@ubuntu.com>
+ *
+ * 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 the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
+ * license.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+
+#define SEATDEFAULT_KEY_GROUP "SeatDefaults"
+#define SESSION_KEY_NAME "user-session"
+#define GREETER_KEY_NAME "greeter-session"
+
+#define IS_STRING_EMPTY(x) ((x)==NULL||(x)[0]=='\0')
+
+static gboolean debug = FALSE;
+static gboolean keep_old = FALSE;
+static gboolean remove = FALSE;
+
+static char *session = NULL;
+static char *greeter = NULL;
+
+static GOptionEntry entries[] =
+{
+ { "debug", 'd', 0, G_OPTION_ARG_NONE, &debug, N_("Enable debugging"), NULL },
+ { "keep-old", 'k', 0, G_OPTION_ARG_NONE, &keep_old, N_("Only update if no default already set"), NULL },
+ { "remove", 'r', 0, G_OPTION_ARG_NONE, &remove, N_("Remove default value if it's the current one"), NULL },
+ { "session", 's', 0, G_OPTION_ARG_STRING, &session, N_("Set default session"), NULL },
+ { "greeter", 'g', 0, G_OPTION_ARG_STRING, &greeter, N_("Set default greeter"), NULL },
+ { NULL }
+};
+
+void
+show_nothing(const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *message,
+ gpointer unused_data) {};
+
+int
+update_string(const gchar *default_value,
+ const gchar *new_value,
+ gboolean keep_old,
+ gboolean remove,
+ const gchar *key_group,
+ const gchar *key_name,
+ GKeyFile *keyfile)
+{
+ gboolean success = TRUE;
+
+ if (!(default_value) || (strlen(default_value) < 1)) {
+ g_debug ("No existing valid value for %s. Set to %s", key_name, new_value);
+ g_key_file_set_string (keyfile, key_group, key_name, new_value);
+ }
+ else {
+ if (remove) {
+ if (g_strcmp0 (default_value, new_value) == 0) {
+ g_debug ("Remove %s as default value for %s", default_value, key_name);
+ g_key_file_set_string (keyfile, key_group, key_name, "");
+ if (!success)
+ return(2);
+ return(0);
+ }
+ g_debug ("Can't remove: %s is not the default value for %s", default_value, key_name);
+ return(4);
+ }
+ else {
+ g_debug ("Found existing default value(%s) for %s", default_value, key_name);
+ if (keep_old)
+ g_debug ("keep-old mode: keep previous default value");
+ else {
+ g_debug ("Update to %s for %s", default_value, key_name);
+ g_key_file_set_string (keyfile, key_group, key_name, new_value);
+ }
+ }
+ }
+ if (!success)
+ return(2);
+ return(0);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GOptionContext *context = NULL;
+ GError *error = NULL;
+
+ GKeyFile *keyfile;
+ GKeyFileFlags flags;
+ gchar *s_data;
+ gsize size;
+ const gchar *gdm_conf_file = CONFIG_DIR "/lightdm.conf";
+
+ gchar *default_session = NULL;
+ gchar *default_greeter = NULL;
+ gint return_code = 0;
+
+ bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+
+ g_type_init ();
+
+ context = g_option_context_new (N_("- set lightdm default values"));
+ g_option_context_add_main_entries (context, entries, NULL);
+ if (!g_option_context_parse (context, &argc, &argv, &error)) {
+ g_printerr (N_("option parsing failed: %s\n"), error->message);
+ g_option_context_free (context);
+ g_error_free (error);
+ return 1;
+ }
+ if (IS_STRING_EMPTY (session) && IS_STRING_EMPTY (greeter)) {
+ g_printerr (N_("Wrong usage of the command\n%s"), g_option_context_get_help (context, FALSE, NULL));
+ g_option_context_free (context);
+ return 1;
+ }
+ if (context)
+ g_option_context_free (context);
+ if (!debug)
+ g_log_set_handler (NULL, G_LOG_LEVEL_DEBUG, show_nothing, NULL);
+
+ keyfile = g_key_file_new ();
+ flags = G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS;
+ if (!(g_key_file_load_from_file (keyfile, gdm_conf_file, flags, &error))) {
+ g_debug ("File doesn't seem to exist or can't be read: create one (%s)", error->message);
+ g_error_free (error);
+ error = NULL;
+ }
+
+ // try to get the right keys
+ default_session = g_key_file_get_string (keyfile, SEATDEFAULT_KEY_GROUP, SESSION_KEY_NAME, NULL);
+ default_greeter = g_key_file_get_string (keyfile, SEATDEFAULT_KEY_GROUP, GREETER_KEY_NAME, NULL);
+
+ if (!(IS_STRING_EMPTY (session)))
+ return_code = update_string (default_session, session, keep_old, remove, SEATDEFAULT_KEY_GROUP, SESSION_KEY_NAME, keyfile);
+ if (!(IS_STRING_EMPTY (greeter)) && (return_code == 0))
+ return_code = update_string (default_greeter, greeter, keep_old, remove, SEATDEFAULT_KEY_GROUP, GREETER_KEY_NAME, keyfile);
+
+ if(return_code == 0) {
+ s_data = g_key_file_to_data (keyfile, &size, &error);
+ if (!s_data) {
+ g_debug ("Can't convert data to string: %s", error->message);
+ g_error_free (error);
+ return_code = 1;
+ }
+ else {
+ if(!g_file_set_contents (gdm_conf_file, s_data, size, &error)) {
+ g_printerr ("Can't update: %s\n", error->message);
+ g_error_free (error);
+ return_code = 1;
+ }
+ g_free (s_data);
+ }
+ }
+
+ g_key_file_free (keyfile);
+
+ if (default_session)
+ g_free (default_session);
+ if (default_greeter)
+ g_free (default_greeter);
+
+ return return_code;
+
+}