summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac16
-rw-r--r--doc/lightdm-gobject-0-sections.txt13
-rw-r--r--doc/tmpl/greeter.sgml102
-rw-r--r--greeters/gtk/lightdm-gtk-greeter.c19
-rw-r--r--liblightdm-gobject/greeter.c322
-rw-r--r--liblightdm-gobject/lightdm/greeter.h20
-rw-r--r--liblightdm-qt/QLightDM/greeter.cpp71
-rw-r--r--liblightdm-qt/QLightDM/greeter.h12
-rw-r--r--src/display.c21
-rw-r--r--src/greeter.c96
-rw-r--r--src/greeter.h8
-rw-r--r--src/lightdm.c2
-rw-r--r--tests/src/test-gobject-greeter.c6
13 files changed, 497 insertions, 211 deletions
diff --git a/configure.ac b/configure.ac
index f7b1ea18..1bf46196 100644
--- a/configure.ac
+++ b/configure.ac
@@ -121,16 +121,16 @@ dnl ###########################################################################
dnl Configurable values
dnl ###########################################################################
-DEFAULT_SESSION=gnome
-AC_ARG_WITH(default-session,
- AS_HELP_STRING(--with-default-session=<name>,
- Default session to launch for users),
+USER_SESSION=gnome
+AC_ARG_WITH(user-session,
+ AS_HELP_STRING(--with-user-session=<name>,
+ Session to use for user accounts),
if test x$withval != x; then
- DEFAULT_SESSION="$withval"
+ USER_SESSION="$withval"
fi
)
-AC_SUBST(DEFAULT_SESSION)
-AC_DEFINE_UNQUOTED(DEFAULT_SESSION, "$DEFAULT_SESSION", Default session)
+AC_SUBST(USER_SESSION)
+AC_DEFINE_UNQUOTED(USER_SESSION, "$USER_SESSION", User session)
if test $have_gtk = yes; then
GREETER_SESSION=lightdm-gtk-greeter
@@ -199,7 +199,7 @@ echo "
prefix: $prefix
Greeter session: $GREETER_SESSION
- Default session: $DEFAULT_SESSION
+ User session: $USER_SESSION
liblightdm-gobject: $compile_liblightdm_gobject
GObject introspection: $found_introspection
liblightdm-qt: $compile_liblightdm_qt
diff --git a/doc/lightdm-gobject-0-sections.txt b/doc/lightdm-gobject-0-sections.txt
index be179847..8e414be1 100644
--- a/doc/lightdm-gobject-0-sections.txt
+++ b/doc/lightdm-gobject-0-sections.txt
@@ -113,10 +113,15 @@ ldm_greeter_get_layouts
ldm_greeter_get_layout
ldm_greeter_set_layout
ldm_greeter_get_sessions
-ldm_greeter_get_default_session
-ldm_greeter_get_has_guest_session
-ldm_greeter_get_timed_login_user
-ldm_greeter_get_timed_login_delay
+ldm_greeter_get_default_session_hint
+ldm_greeter_get_hint
+ldm_greeter_get_has_guest_account_hint
+ldm_greeter_get_show_users_hint
+ldm_greeter_get_select_user_hint
+ldm_greeter_get_select_guest_hint
+ldm_greeter_get_autologin_user_hint
+ldm_greeter_get_autologin_guest_hint
+ldm_greeter_get_autologin_timeout_hint
ldm_greeter_cancel_timed_login
ldm_greeter_login
ldm_greeter_login_with_user_prompt
diff --git a/doc/tmpl/greeter.sgml b/doc/tmpl/greeter.sgml
index 6b1e4d6b..758560d6 100644
--- a/doc/tmpl/greeter.sgml
+++ b/doc/tmpl/greeter.sgml
@@ -87,37 +87,35 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL);
@ldmgreeter: the object which received the signal.
-<!-- ##### SIGNAL LdmGreeter::connected ##### -->
+<!-- ##### SIGNAL LdmGreeter::autologin-timer-expired ##### -->
<para>
</para>
@ldmgreeter: the object which received the signal.
-<!-- ##### SIGNAL LdmGreeter::quit ##### -->
+<!-- ##### SIGNAL LdmGreeter::connected ##### -->
<para>
</para>
@ldmgreeter: the object which received the signal.
-<!-- ##### SIGNAL LdmGreeter::session-failed ##### -->
+<!-- ##### SIGNAL LdmGreeter::quit ##### -->
<para>
</para>
@ldmgreeter: the object which received the signal.
-<!-- ##### SIGNAL LdmGreeter::show-message ##### -->
+<!-- ##### SIGNAL LdmGreeter::session-failed ##### -->
<para>
</para>
@ldmgreeter: the object which received the signal.
-@arg1:
-@Param3:
-<!-- ##### SIGNAL LdmGreeter::show-prompt ##### -->
+<!-- ##### SIGNAL LdmGreeter::show-message ##### -->
<para>
</para>
@@ -126,13 +124,14 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL);
@arg1:
@Param3:
-<!-- ##### SIGNAL LdmGreeter::timed-login ##### -->
+<!-- ##### SIGNAL LdmGreeter::show-prompt ##### -->
<para>
</para>
@ldmgreeter: the object which received the signal.
@arg1:
+@Param3:
<!-- ##### SIGNAL LdmGreeter::user-added ##### -->
<para>
@@ -163,6 +162,21 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL);
</para>
+<!-- ##### ARG LdmGreeter:autologin-guest-hint ##### -->
+<para>
+
+</para>
+
+<!-- ##### ARG LdmGreeter:autologin-timeout-hint ##### -->
+<para>
+
+</para>
+
+<!-- ##### ARG LdmGreeter:autologin-user-hint ##### -->
+<para>
+
+</para>
+
<!-- ##### ARG LdmGreeter:can-hibernate ##### -->
<para>
@@ -183,7 +197,12 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL);
</para>
-<!-- ##### ARG LdmGreeter:default-session ##### -->
+<!-- ##### ARG LdmGreeter:default-session-hint ##### -->
+<para>
+
+</para>
+
+<!-- ##### ARG LdmGreeter:has-guest-account-hint ##### -->
<para>
</para>
@@ -208,17 +227,22 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL);
</para>
-<!-- ##### ARG LdmGreeter:login-delay ##### -->
+<!-- ##### ARG LdmGreeter:num-users ##### -->
<para>
</para>
-<!-- ##### ARG LdmGreeter:num-users ##### -->
+<!-- ##### ARG LdmGreeter:select-guest-hint ##### -->
<para>
</para>
-<!-- ##### ARG LdmGreeter:timed-login-user ##### -->
+<!-- ##### ARG LdmGreeter:select-user-hint ##### -->
+<para>
+
+</para>
+
+<!-- ##### ARG LdmGreeter:show-users-hint ##### -->
<para>
</para>
@@ -332,7 +356,53 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL);
@Returns:
-<!-- ##### FUNCTION ldm_greeter_get_default_session ##### -->
+<!-- ##### FUNCTION ldm_greeter_get_default_session_hint ##### -->
+<para>
+
+</para>
+
+@greeter:
+@Returns:
+
+
+<!-- ##### FUNCTION ldm_greeter_get_hint ##### -->
+<para>
+
+</para>
+
+@greeter:
+@name:
+@Returns:
+
+
+<!-- ##### FUNCTION ldm_greeter_get_has_guest_account_hint ##### -->
+<para>
+
+</para>
+
+@greeter:
+@Returns:
+
+
+<!-- ##### FUNCTION ldm_greeter_get_show_users_hint ##### -->
+<para>
+
+</para>
+
+@greeter:
+@Returns:
+
+
+<!-- ##### FUNCTION ldm_greeter_get_select_user_hint ##### -->
+<para>
+
+</para>
+
+@greeter:
+@Returns:
+
+
+<!-- ##### FUNCTION ldm_greeter_get_select_guest_hint ##### -->
<para>
</para>
@@ -341,7 +411,7 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL);
@Returns:
-<!-- ##### FUNCTION ldm_greeter_get_has_guest_session ##### -->
+<!-- ##### FUNCTION ldm_greeter_get_autologin_user_hint ##### -->
<para>
</para>
@@ -350,7 +420,7 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL);
@Returns:
-<!-- ##### FUNCTION ldm_greeter_get_timed_login_user ##### -->
+<!-- ##### FUNCTION ldm_greeter_get_autologin_guest_hint ##### -->
<para>
</para>
@@ -359,7 +429,7 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL);
@Returns:
-<!-- ##### FUNCTION ldm_greeter_get_timed_login_delay ##### -->
+<!-- ##### FUNCTION ldm_greeter_get_autologin_timeout_hint ##### -->
<para>
</para>
diff --git a/greeters/gtk/lightdm-gtk-greeter.c b/greeters/gtk/lightdm-gtk-greeter.c
index 481b527e..0bbe36b5 100644
--- a/greeters/gtk/lightdm-gtk-greeter.c
+++ b/greeters/gtk/lightdm-gtk-greeter.c
@@ -31,7 +31,7 @@ get_session ()
gchar *session;
if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (session_combo), &iter))
- return g_strdup (ldm_greeter_get_default_session (greeter));
+ return g_strdup (ldm_greeter_get_default_session_hint (greeter));
gtk_tree_model_get (gtk_combo_box_get_model (GTK_COMBO_BOX (session_combo)), &iter, 1, &session, -1);
@@ -83,7 +83,7 @@ start_authentication (const gchar *username)
if (user)
set_session (ldm_user_get_session (user));
else
- set_session (ldm_greeter_get_default_session (greeter));
+ set_session (ldm_greeter_get_default_session_hint (greeter));
ldm_greeter_login (greeter, username);
}
@@ -194,10 +194,13 @@ authentication_complete_cb (LdmGreeter *greeter)
}
static void
-timed_login_cb (LdmGreeter *greeter, const gchar *username)
+autologin_timer_expired_cb (LdmGreeter *greeter)
{
- set_session (ldm_greeter_get_default_session (greeter));
- ldm_greeter_login (greeter, ldm_greeter_get_timed_login_user (greeter));
+ set_session (ldm_greeter_get_default_session_hint (greeter));
+ if (ldm_greeter_get_autologin_guest_hint (greeter))
+ ldm_greeter_login_as_guest (greeter);
+ else if (ldm_greeter_get_autologin_user_hint (greeter))
+ ldm_greeter_login (greeter, ldm_greeter_get_autologin_user_hint (greeter));
}
void suspend_cb (GtkWidget *widget, LdmGreeter *greeter);
@@ -551,7 +554,7 @@ connected_cb (LdmGreeter *greeter)
2, pixbuf,
-1);
}
- if (ldm_greeter_get_has_guest_session (greeter))
+ if (ldm_greeter_get_has_guest_account_hint (greeter))
{
gtk_list_store_append (GTK_LIST_STORE (model), &iter);
gtk_list_store_set (GTK_LIST_STORE (model), &iter,
@@ -585,7 +588,7 @@ connected_cb (LdmGreeter *greeter)
1, ldm_session_get_key (session),
-1);
}
- set_session (ldm_greeter_get_default_session (greeter));
+ set_session (ldm_greeter_get_default_session_hint (greeter));
gtk_window_set_default_size (GTK_WINDOW (window), screen_width, screen_height);
gtk_builder_connect_signals(builder, greeter);
@@ -609,7 +612,7 @@ main(int argc, char **argv)
g_signal_connect (G_OBJECT (greeter), "show-prompt", G_CALLBACK (show_prompt_cb), NULL);
g_signal_connect (G_OBJECT (greeter), "show-message", G_CALLBACK (show_message_cb), NULL);
g_signal_connect (G_OBJECT (greeter), "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL);
- g_signal_connect (G_OBJECT (greeter), "timed-login", G_CALLBACK (timed_login_cb), NULL);
+ g_signal_connect (G_OBJECT (greeter), "autologin-timer-expired", G_CALLBACK (autologin_timer_expired_cb), NULL);
g_signal_connect (G_OBJECT (greeter), "user-added", G_CALLBACK (user_added_cb), NULL);
g_signal_connect (G_OBJECT (greeter), "user-changed", G_CALLBACK (user_changed_cb), NULL);
g_signal_connect (G_OBJECT (greeter), "user-removed", G_CALLBACK (user_removed_cb), NULL);
diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c
index 832ecc3b..b7e186bb 100644
--- a/liblightdm-gobject/greeter.c
+++ b/liblightdm-gobject/greeter.c
@@ -33,9 +33,14 @@ enum {
PROP_LAYOUTS,
PROP_LAYOUT,
PROP_SESSIONS,
- PROP_DEFAULT_SESSION,
- PROP_TIMED_LOGIN_USER,
- PROP_TIMED_LOGIN_DELAY,
+ PROP_DEFAULT_SESSION_HINT,
+ PROP_SHOW_USERS_HINT,
+ PROP_HAS_GUEST_ACCOUNT_HINT,
+ PROP_SELECT_USER_HINT,
+ PROP_SELECT_GUEST_HINT,
+ PROP_AUTOLOGIN_USER_HINT,
+ PROP_AUTOLOGIN_GUEST_HINT,
+ PROP_AUTOLOGIN_TIMEOUT_HINT,
PROP_AUTHENTICATION_USER,
PROP_IN_AUTHENTICATION,
PROP_IS_AUTHENTICATED,
@@ -51,7 +56,7 @@ enum {
SHOW_MESSAGE,
AUTHENTICATION_COMPLETE,
SESSION_FAILED,
- TIMED_LOGIN,
+ AUTOLOGIN_TIMER_EXPIRED,
USER_ADDED,
USER_CHANGED,
USER_REMOVED,
@@ -94,18 +99,16 @@ struct _LdmGreeterPrivate
gboolean have_sessions;
GList *sessions;
- gchar *default_session;
gchar *authentication_user;
gboolean in_authentication;
gboolean is_authenticated;
guint32 authenticate_sequence_number;
gboolean cancelling_authentication;
+
+ GHashTable *hints;
- gchar *selected_user;
- gint login_delay;
guint login_timeout;
- gboolean guest_account_supported;
};
G_DEFINE_TYPE (LdmGreeter, ldm_greeter, G_TYPE_OBJECT);
@@ -156,7 +159,7 @@ timed_login_cb (gpointer data)
LdmGreeter *greeter = data;
greeter->priv->login_timeout = 0;
- g_signal_emit (G_OBJECT (greeter), signals[TIMED_LOGIN], 0, greeter->priv->selected_user);
+ g_signal_emit (G_OBJECT (greeter), signals[AUTOLOGIN_TIMER_EXPIRED], 0);
return FALSE;
}
@@ -259,31 +262,34 @@ static guint32 get_packet_length (LdmGreeter *greeter)
}
static void
-handle_connected (LdmGreeter *greeter, gsize *offset)
+handle_connected (LdmGreeter *greeter, guint32 length, gsize *offset)
{
gchar *version;
+ GString *hint_string;
+ int timeout;
version = read_string (greeter, offset);
- greeter->priv->default_session = read_string (greeter, offset);
- greeter->priv->selected_user = read_string (greeter, offset);
- greeter->priv->login_delay = read_int (greeter, offset);
- greeter->priv->guest_account_supported = read_int (greeter, offset) != 0;
-
- g_debug ("Connected version=%s default-session=%s timed-user=%s login-delay=%d guest-account-supported=%s",
- version,
- greeter->priv->default_session,
- greeter->priv->selected_user, greeter->priv->login_delay,
- greeter->priv->guest_account_supported ? "true" : "false");
- g_free (version);
+ hint_string = g_string_new ("");
+ while (*offset < length)
+ {
+ gchar *name, *value;
+
+ name = read_string (greeter, offset);
+ value = read_string (greeter, offset);
+ g_hash_table_insert (greeter->priv->hints, name, value);
+ g_string_append_printf (hint_string, " %s=%s", name, value);
+ }
- if (greeter->priv->selected_user[0] == '\0')
- greeter->priv->selected_user = NULL;
+ g_debug ("Connected version=%s%s", version, hint_string->str);
+ g_free (version);
+ g_string_free (hint_string, TRUE);
/* Set timeout for default login */
- if (greeter->priv->selected_user && greeter->priv->login_delay > 0)
+ timeout = ldm_greeter_get_autologin_timeout_hint (greeter);
+ if (timeout)
{
- g_debug ("Logging in as %s in %d seconds", greeter->priv->selected_user, greeter->priv->login_delay);
- greeter->priv->login_timeout = g_timeout_add (greeter->priv->login_delay * 1000, timed_login_cb, greeter);
+ g_debug ("Setting autologin timer for %d seconds", timeout);
+ greeter->priv->login_timeout = g_timeout_add (timeout * 1000, timed_login_cb, greeter);
}
g_signal_emit (G_OBJECT (greeter), signals[CONNECTED], 0);
}
@@ -431,18 +437,18 @@ from_server_cb (GIOChannel *source, GIOCondition condition, gpointer data)
{
LdmGreeter *greeter = data;
gsize offset;
- guint32 id;
-
+ guint32 id, length;
+
if (!read_packet (greeter, FALSE))
return TRUE;
offset = 0;
id = read_int (greeter, &offset);
- read_int (greeter, &offset);
+ length = read_int (greeter, &offset);
switch (id)
{
case SERVER_MESSAGE_CONNECTED:
- handle_connected (greeter, &offset);
+ handle_connected (greeter, length, &offset);
break;
case SERVER_MESSAGE_PROMPT_AUTHENTICATION:
handle_prompt_authentication (greeter, &offset);
@@ -1104,7 +1110,23 @@ ldm_greeter_get_sessions (LdmGreeter *greeter)
}
/**
- * ldm_greeter_get_default_session:
+ * ldm_greeter_get_hint:
+ * @greeter: A #LdmGreeter
+ * @name: The hint name to query.
+ *
+ * Get a hint.
+ *
+ * Return value: The value for this hint or NULL if not set.
+ **/
+const gchar *
+ldm_greeter_get_hint (LdmGreeter *greeter, const gchar *name)
+{
+ g_return_val_if_fail (LDM_IS_GREETER (greeter), NULL);
+ return g_hash_table_lookup (greeter->priv->hints, name);
+}
+
+/**
+ * ldm_greeter_get_default_session_hint:
* @greeter: A #LdmGreeter
*
* Get the default session to use.
@@ -1112,14 +1134,33 @@ ldm_greeter_get_sessions (LdmGreeter *greeter)
* Return value: The session name
**/
const gchar *
-ldm_greeter_get_default_session (LdmGreeter *greeter)
+ldm_greeter_get_default_session_hint (LdmGreeter *greeter)
{
g_return_val_if_fail (LDM_IS_GREETER (greeter), NULL);
- return greeter->priv->default_session;
+ return ldm_greeter_get_hint (greeter, "default-session");
+}
+
+/**
+ * ldm_greeter_get_show_users_hint:
+ * @greeter: A #LdmGreeter
+ *
+ * Check if user accounts should be shown.
+ *
+ * Return value: TRUE if all the user accounts should be shown.
+ */
+gboolean
+ldm_greeter_get_show_users_hint (LdmGreeter *greeter)
+{
+ const gchar *value;
+
+ g_return_val_if_fail (LDM_IS_GREETER (greeter), FALSE);
+ value = ldm_greeter_get_hint (greeter, "show-users");
+
+ return g_strcmp0 (value, "true") == 0;
}
/**
- * ldm_greeter_get_has_guest_session:
+ * ldm_greeter_get_has_guest_account_hint:
* @greeter: A #LdmGreeter
*
* Check if guest sessions are supported.
@@ -1127,40 +1168,105 @@ ldm_greeter_get_default_session (LdmGreeter *greeter)
* Return value: TRUE if guest sessions are supported.
*/
gboolean
-ldm_greeter_get_has_guest_session (LdmGreeter *greeter)
+ldm_greeter_get_has_guest_account_hint (LdmGreeter *greeter)
{
+ const gchar *value;
+
g_return_val_if_fail (LDM_IS_GREETER (greeter), FALSE);
- return greeter->priv->guest_account_supported;
+ value = ldm_greeter_get_hint (greeter, "has-guest-account");
+
+ return g_strcmp0 (value, "true") == 0;
}
/**
- * ldm_greeter_get_timed_login_user:
+ * ldm_greeter_get_select_user_hint:
* @greeter: A #LdmGreeter
*
- * Get the user to log in by as default.
+ * Get the user to select by default.
*
* Return value: A username
*/
const gchar *
-ldm_greeter_get_timed_login_user (LdmGreeter *greeter)
+ldm_greeter_get_select_user_hint (LdmGreeter *greeter)
+{
+ g_return_val_if_fail (LDM_IS_GREETER (greeter), NULL);
+ return ldm_greeter_get_hint (greeter, "select-user");
+}
+
+/**
+ * ldm_greeter_get_select_guest_hint:
+ * @greeter: A #LdmGreeter
+ *
+ * Check if the guest account should be selected by default.
+ *
+ * Return value: TRUE if the guest account should be selected by default.
+ */
+gboolean
+ldm_greeter_get_select_guest_hint (LdmGreeter *greeter)
+{
+ const gchar *value;
+
+ g_return_val_if_fail (LDM_IS_GREETER (greeter), FALSE);
+ value = ldm_greeter_get_hint (greeter, "select-guest");
+
+ return g_strcmp0 (value, "true") == 0;
+}
+
+/**
+ * ldm_greeter_get_autologin_user_hint:
+ * @greeter: A #LdmGreeter
+ *
+ * Get the user account to automatically logg into when the timer expires.
+ *
+ * Return value: The user account to automatically log into.
+ */
+const gchar *
+ldm_greeter_get_autologin_user_hint (LdmGreeter *greeter)
{
g_return_val_if_fail (LDM_IS_GREETER (greeter), NULL);
- return greeter->priv->selected_user;
+ return ldm_greeter_get_hint (greeter, "autologin-user");
}
/**
- * ldm_greeter_get_timed_login_delay:
+ * ldm_greeter_get_autologin_guest_hint:
* @greeter: A #LdmGreeter
*
- * Get the number of seconds to wait until logging in as the default user.
+ * Check if the guest account should be automatically logged into when the timer expires.
*
- * Return value: The number of seconds before logging in as the default user
+ * Return value: TRUE if the guest account should be automatically logged into.
+ */
+gboolean
+ldm_greeter_get_autologin_guest_hint (LdmGreeter *greeter)
+{
+ const gchar *value;
+
+ g_return_val_if_fail (LDM_IS_GREETER (greeter), FALSE);
+ value = ldm_greeter_get_hint (greeter, "autologin-guest");
+
+ return g_strcmp0 (value, "true") == 0;
+}
+
+/**
+ * ldm_greeter_get_autologin_timeout_hint:
+ * @greeter: A #LdmGreeter
+ *
+ * Get the number of seconds to wait before automaitcally logging in.
+ *
+ * Return value: The number of seconds to wait before automatically logging in or 0 for no timeout.
*/
gint
-ldm_greeter_get_timed_login_delay (LdmGreeter *greeter)
+ldm_greeter_get_autologin_timeout_hint (LdmGreeter *greeter)
{
- g_return_val_if_fail (LDM_IS_GREETER (greeter), 0);
- return greeter->priv->login_delay;
+ const gchar *value;
+ gint timeout;
+
+ g_return_val_if_fail (LDM_IS_GREETER (greeter), FALSE);
+ value = ldm_greeter_get_hint (greeter, "autologin-timeout");
+ timeout = atoi (value);
+ if (timeout < 0)
+ timeout = 0;
+
+ return timeout;
}
/**
@@ -1571,6 +1677,7 @@ ldm_greeter_init (LdmGreeter *greeter)
{
greeter->priv = G_TYPE_INSTANCE_GET_PRIVATE (greeter, LDM_TYPE_GREETER, LdmGreeterPrivate);
greeter->priv->read_buffer = g_malloc (HEADER_SIZE);
+ greeter->priv->hints = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
g_debug ("default-language=%s", ldm_greeter_get_default_language (greeter));
}
@@ -1624,14 +1731,29 @@ ldm_greeter_get_property (GObject *object,
break;
case PROP_SESSIONS:
break;
- case PROP_DEFAULT_SESSION:
- g_value_set_string (value, ldm_greeter_get_default_session (self));
+ case PROP_DEFAULT_SESSION_HINT:
+ g_value_set_string (value, ldm_greeter_get_default_session_hint (self));
+ break;
+ case PROP_SHOW_USERS_HINT:
+ g_value_set_boolean (value, ldm_greeter_get_show_users_hint (self));
+ break;
+ case PROP_HAS_GUEST_ACCOUNT_HINT:
+ g_value_set_boolean (value, ldm_greeter_get_has_guest_account_hint (self));
+ break;
+ case PROP_SELECT_USER_HINT:
+ g_value_set_string (value, ldm_greeter_get_select_user_hint (self));
+ break;
+ case PROP_SELECT_GUEST_HINT:
+ g_value_set_boolean (value, ldm_greeter_get_select_guest_hint (self));
+ break;
+ case PROP_AUTOLOGIN_USER_HINT:
+ g_value_set_string (value, ldm_greeter_get_autologin_user_hint (self));
break;
- case PROP_TIMED_LOGIN_USER:
- g_value_set_string (value, ldm_greeter_get_timed_login_user (self));
+ case PROP_AUTOLOGIN_GUEST_HINT:
+ g_value_set_boolean (value, ldm_greeter_get_autologin_guest_hint (self));
break;
- case PROP_TIMED_LOGIN_DELAY:
- g_value_set_int (value, ldm_greeter_get_timed_login_delay (self));
+ case PROP_AUTOLOGIN_TIMEOUT_HINT:
+ g_value_set_int (value, ldm_greeter_get_autologin_timeout_hint (self));
break;
case PROP_AUTHENTICATION_USER:
g_value_set_string (value, ldm_greeter_get_authentication_user (self));
@@ -1697,6 +1819,16 @@ marshal_VOID__STRING_INT (GClosure *closure,
}
static void
+ldm_greeter_finalize (GObject *object)
+{
+ LdmGreeter *self = LDM_GREETER (object);
+
+ g_hash_table_unref (self->priv->hints);
+
+ G_OBJECT_CLASS (ldm_greeter_parent_class)->finalize (object);
+}
+
+static void
ldm_greeter_class_init (LdmGreeterClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -1705,6 +1837,7 @@ ldm_greeter_class_init (LdmGreeterClass *klass)
object_class->set_property = ldm_greeter_set_property;
object_class->get_property = ldm_greeter_get_property;
+ object_class->finalize = ldm_greeter_finalize;
g_object_class_install_property (object_class,
PROP_NUM_USERS,
@@ -1750,26 +1883,69 @@ ldm_greeter_class_init (LdmGreeterClass *klass)
"sessions",
"Available sessions"));*/
g_object_class_install_property (object_class,
- PROP_DEFAULT_SESSION,
- g_param_spec_string ("default-session",
- "default-session",
- "Default session",
+ PROP_DEFAULT_SESSION_HINT,
+ g_param_spec_string ("default-session-hint",
+ "default-session-hint",
+ "Default session hint",
NULL,
G_PARAM_READWRITE));
+
+ g_object_class_install_property (object_class,
+ PROP_SHOW_USERS_HINT,
+ g_param_spec_boolean ("show-users-hint",
+ "show-users-hint",
+ "Show users hint",
+ FALSE,
+ G_PARAM_READABLE));
+
+ g_object_class_install_property (object_class,
+ PROP_HAS_GUEST_ACCOUNT_HINT,
+ g_param_spec_boolean ("has-guest-account-hint",
+ "has-guest-account-hint",
+ "Has guest account hint",
+ FALSE,
+ G_PARAM_READABLE));
+
+ g_object_class_install_property (object_class,
+ PROP_SELECT_USER_HINT,
+ g_param_spec_string ("select-user-hint",
+ "select-user-hint",
+ "Select user hint",
+ NULL,
+ G_PARAM_READABLE));
+
g_object_class_install_property (object_class,
- PROP_TIMED_LOGIN_USER,
- g_param_spec_string ("timed-login-user",
- "timed-login-user",
- "User to login as when timed expires",
+ PROP_SELECT_GUEST_HINT,
+ g_param_spec_boolean ("select-guest-hint",
+ "select-guest-hint",
+ "Select guest account hint",
+ FALSE,
+ G_PARAM_READABLE));
+
+ g_object_class_install_property (object_class,
+ PROP_AUTOLOGIN_USER_HINT,
+ g_param_spec_string ("autologin-user-hint",
+ "autologin-user-hint",
+ "Autologin user hint",
NULL,
G_PARAM_READABLE));
+
g_object_class_install_property (object_class,
- PROP_TIMED_LOGIN_DELAY,
- g_param_spec_int ("login-delay",
- "login-delay",
- "Number of seconds until logging in as default user",
- G_MININT, G_MAXINT, 0,
+ PROP_AUTOLOGIN_GUEST_HINT,
+ g_param_spec_boolean ("autologin-guest-hint",
+ "autologin-guest-hint",
+ "Autologin guest account hint",
+ FALSE,
+ G_PARAM_READABLE));
+
+ g_object_class_install_property (object_class,
+ PROP_AUTOLOGIN_TIMEOUT_HINT,
+ g_param_spec_int ("autologin-timeout-hint",
+ "autologin-timeout-hint",
+ "Autologin timeout hint",
+ 0, G_MAXINT, 0,
G_PARAM_READABLE));
+
g_object_class_install_property (object_class,
PROP_AUTHENTICATION_USER,
g_param_spec_string ("authentication-user",
@@ -1912,21 +2088,21 @@ ldm_greeter_class_init (LdmGreeterClass *klass)
G_TYPE_NONE, 0);
/**
- * LdmGreeter::timed-login:
+ * LdmGreeter::autologin-timer-expired:
* @greeter: A #LdmGreeter
* @username: A username
*
- * The ::timed-login signal gets emitted when the default user timer
- * has expired.
+ * The ::timed-login signal gets emitted when the automatic login timer has expired.
+ * The application should then call ldm_greeter_login().
**/
- signals[TIMED_LOGIN] =
- g_signal_new ("timed-login",
+ signals[AUTOLOGIN_TIMER_EXPIRED] =
+ g_signal_new ("autologin-timer-expired",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (LdmGreeterClass, timed_login),
+ G_STRUCT_OFFSET (LdmGreeterClass, autologin_timer_expired),
NULL, NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE, 1, G_TYPE_STRING);
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
/**
* LdmGreeter::user-added:
diff --git a/liblightdm-gobject/lightdm/greeter.h b/liblightdm-gobject/lightdm/greeter.h
index b8dc4a31..1b957705 100644
--- a/liblightdm-gobject/lightdm/greeter.h
+++ b/liblightdm-gobject/lightdm/greeter.h
@@ -60,7 +60,7 @@ struct _LdmGreeterClass
void (*show_message)(LdmGreeter *greeter, const gchar *text, LdmMessageType type);
void (*authentication_complete)(LdmGreeter *greeter);
void (*session_failed)(LdmGreeter *greeter);
- void (*timed_login)(LdmGreeter *greeter, const gchar *username);
+ void (*autologin_timer_expired)(LdmGreeter *greeter);
void (*user_added)(LdmGreeter *greeter, LdmUser *user);
void (*user_changed)(LdmGreeter *greeter, LdmUser *user);
void (*user_removed)(LdmGreeter *greeter, LdmUser *user);
@@ -93,13 +93,23 @@ const gchar *ldm_greeter_get_layout (LdmGreeter *greeter);
GList *ldm_greeter_get_sessions (LdmGreeter *greeter);
-const gchar *ldm_greeter_get_default_session (LdmGreeter *greeter);
+const gchar *ldm_greeter_get_hint (LdmGreeter *greeter, const gchar *name);
-gboolean ldm_greeter_get_has_guest_session (LdmGreeter *greeter);
+const gchar *ldm_greeter_get_default_session_hint (LdmGreeter *greeter);
-const gchar *ldm_greeter_get_timed_login_user (LdmGreeter *greeter);
+gboolean ldm_greeter_get_show_users_hint (LdmGreeter *greeter);
-gint ldm_greeter_get_timed_login_delay (LdmGreeter *greeter);
+gboolean ldm_greeter_get_has_guest_account_hint (LdmGreeter *greeter);
+
+const gchar *ldm_greeter_get_select_user_hint (LdmGreeter *greeter);
+
+gboolean ldm_greeter_get_select_guest_hint (LdmGreeter *greeter);
+
+const gchar *ldm_greeter_get_autologin_user_hint (LdmGreeter *greeter);
+
+gboolean ldm_greeter_get_autologin_guest_hint (LdmGreeter *greeter);
+
+gint ldm_greeter_get_autologin_timeout_hint (LdmGreeter *greeter);
void ldm_greeter_cancel_timed_login (LdmGreeter *greeter);
diff --git a/liblightdm-qt/QLightDM/greeter.cpp b/liblightdm-qt/QLightDM/greeter.cpp
index bb1ee267..a51e9bfb 100644
--- a/liblightdm-qt/QLightDM/greeter.cpp
+++ b/liblightdm-qt/QLightDM/greeter.cpp
@@ -25,6 +25,7 @@
#include <QtCore/QSettings>
#include <QtCore/QUrl>
#include <QtCore/QFile>
+#include <QtCore/QHash>
#include <QtCore/QSocketNotifier>
#include <QtDBus/QDBusPendingReply>
#include <QtDBus/QDBusInterface>
@@ -58,16 +59,13 @@ using namespace QLightDM;
class GreeterPrivate
{
public:
- QString defaultSession;
- QString timedUser;
- int loginDelay;
- bool guestAccountSupported;
-
SessionsModel *sessionsModel;
QDBusInterface* lightdmInterface;
QDBusInterface* powerManagementInterface;
QDBusInterface* consoleKitInterface;
+
+ QHash<QString, QString> hints;
int toServerFd;
int fromServerFd;
@@ -319,25 +317,26 @@ void Greeter::onRead(int fd)
int offset = 0;
int id = readInt(&offset);
- readInt(&offset);
+ int length = readInt(&offset);
int nMessages, sequenceNumber, returnCode;
QString version, username;
+ QString hintString = "";
switch(id)
{
case SERVER_MESSAGE_CONNECTED:
version = readString(&offset);
- d->defaultSession = readString(&offset);
- d->timedUser = readString(&offset);
- d->loginDelay = readInt(&offset);
- d->guestAccountSupported = readInt(&offset) != 0;
- qDebug() << "Connected version=" << version << " default-session=" << d->defaultSession << " timed-user=" << d->timedUser << " login-delay" << d->loginDelay << " guestAccountSupported" << d->guestAccountSupported;
-
- /* Set timeout for default login */
- if(d->timedUser != "" && d->loginDelay > 0)
+ while (offset < length)
{
- qDebug() << "Logging in as " << d->timedUser << " in " << d->loginDelay << " seconds";
- //FIXME: d->login_timeout = g_timeout_add (d->login_delay * 1000, timed_login_cb, greeter);
+ QString name = readString(&offset);
+ QString value = readString(&offset);
+ hintString.append (" ");
+ hintString.append (name);
+ hintString.append ("=");
+ hintString.append (value);
}
+
+ qDebug() << "Connected version=" << version << hintString;
+
emit connected();
break;
case SERVER_MESSAGE_QUIT:
@@ -413,29 +412,49 @@ QString Greeter::defaultLanguage() const
return getenv("LANG");
}
-QString Greeter::defaultSession() const
+QString Greeter::getHint(QString name) const
+{
+ return d->hints.value (name);
+}
+
+QString Greeter::defaultSessionHint() const
+{
+ return getHint ("default-session");
+}
+
+bool Greeter::showUsersHint() const
+{
+ return d->hints.value ("show-users", "false") == "true";
+}
+
+bool Greeter::hasGuestAccountHint() const
+{
+ return d->hints.value ("has-guest-account", "false") == "true";
+}
+
+QString Greeter::selectUserHint() const
{
- return d->defaultSession;
+ return getHint ("select-user");
}
-bool Greeter::guestAccountSupported() const
+bool Greeter::selectGuestHint() const
{
- return d->guestAccountSupported;
+ return d->hints.value ("select-guest", "false") == "true";
}
-QString Greeter::timedLoginUser() const
+QString Greeter::autologinUserHint() const
{
- return d->timedUser;
+ return getHint ("autologin-user");
}
-int Greeter::timedLoginDelay() const
+bool Greeter::autologinGuestHint() const
{
- return d->loginDelay;
+ return d->hints.value ("autologin-guest", "false") == "true";
}
-void Greeter::cancelTimedLogin()
+int Greeter::autologinTimeoutHint() const
{
- //FIXME TODO
+ return d->hints.value ("autologin-timeout", "0").toInt ();
}
bool Greeter::canSuspend() const
diff --git a/liblightdm-qt/QLightDM/greeter.h b/liblightdm-qt/QLightDM/greeter.h
index 1e2056a4..36ec1050 100644
--- a/liblightdm-qt/QLightDM/greeter.h
+++ b/liblightdm-qt/QLightDM/greeter.h
@@ -50,8 +50,15 @@ namespace QLightDM
//QList<LdmLayout> layouts() const;
QString layout() const;
- QString defaultSession() const;
- bool guestAccountSupported() const;
+ QString getHint(QString name) const;
+ QString defaultSessionHint() const;
+ bool showUsersHint() const;
+ bool hasGuestAccountHint() const;
+ QString selectUserHint() const;
+ bool selectGuestHint() const;
+ QString autologinUserHint() const;
+ bool autologinGuestHint() const;
+ int autologinTimeoutHint() const;
bool inAuthentication() const;
bool isAuthenticated() const;
@@ -69,7 +76,6 @@ namespace QLightDM
void restart();
void connectToServer();
- void cancelTimedLogin();
void login(const QString &username);
void loginAsGuest();
void respond(const QString &response);
diff --git a/src/display.c b/src/display.c
index 5d53cf08..2dde4d30 100644
--- a/src/display.c
+++ b/src/display.c
@@ -465,6 +465,8 @@ create_session (Display *display, PAMSession *pam_session, const gchar *session_
{
child_process_set_env (CHILD_PROCESS (session), "DBUS_SESSION_BUS_ADDRESS", g_getenv ("DBUS_SESSION_BUS_ADDRESS"));
child_process_set_env (CHILD_PROCESS (session), "LDM_BUS", "SESSION");
+ child_process_set_env (CHILD_PROCESS (session), "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH"));
+ child_process_set_env (CHILD_PROCESS (session), "PATH", g_getenv ("PATH"));
}
/* Variables required for regression tests */
@@ -657,11 +659,22 @@ start_greeter_session (Display *display)
display->priv->greeter = greeter_new (session);
g_signal_connect (G_OBJECT (display->priv->greeter), "start-session", G_CALLBACK (greeter_start_session_cb), display);
- if (display->priv->default_user)
- greeter_set_selected_user (display->priv->greeter, display->priv->default_user, display->priv->default_user_timeout);
+ if (display->priv->default_user_timeout)
+ {
+ gchar *value = g_strdup_printf ("%d", display->priv->default_user_timeout);
+ greeter_set_hint (display->priv->greeter, "autologin-timeout", value);
+ g_free (value);
+ if (display->priv->default_user)
+ greeter_set_hint (display->priv->greeter, "autologin-user", display->priv->default_user);
+ else if (display->priv->default_user_is_guest)
+ greeter_set_hint (display->priv->greeter, "autologin-guest", "true");
+ }
+ else if (display->priv->default_user)
+ greeter_set_hint (display->priv->greeter, "select-user", display->priv->default_user);
else if (display->priv->default_user_is_guest)
- greeter_set_selected_user (display->priv->greeter, guest_account_get_username (), 0);
- greeter_set_default_session (display->priv->greeter, display->priv->default_session);
+ greeter_set_hint (display->priv->greeter, "select-guest", "true");
+ greeter_set_hint (display->priv->greeter, "default-session", display->priv->default_session);
+ greeter_set_hint (display->priv->greeter, "has-guest-account", guest_account_get_is_enabled () ? "true" : "false");
result = greeter_start (display->priv->greeter);
if (result)
diff --git a/src/greeter.c b/src/greeter.c
index 1a5e5273..7a337cca 100644
--- a/src/greeter.c
+++ b/src/greeter.c
@@ -34,15 +34,12 @@ struct GreeterPrivate
guint8 *read_buffer;
gsize n_read;
+ /* Hints for the greeter */
+ GHashTable *hints;
+
/* Default session to use */
gchar *default_session;
- /* Hint for user to select */
- gchar *selected_user;
-
- /* Time in seconds to wait until logging in as default user */
- gint autologin_timeout;
-
/* Sequence number of current PAM session */
guint32 authentication_sequence_number;
@@ -52,6 +49,7 @@ struct GreeterPrivate
/* TRUE if logging into guest session */
gboolean using_guest_account;
+ /* Communication channels to communicate with */
GIOChannel *to_greeter_channel;
GIOChannel *from_greeter_channel;
};
@@ -90,36 +88,9 @@ greeter_new (Session *session)
}
void
-greeter_set_selected_user (Greeter *greeter, const gchar *username, gint timeout)
+greeter_set_hint (Greeter *greeter, const gchar *name, const gchar *value)
{
- g_return_if_fail (greeter != NULL);
-
- g_free (greeter->priv->selected_user);
- greeter->priv->selected_user = g_strdup (username);
- greeter->priv->autologin_timeout = timeout;
-}
-
-void
-greeter_set_default_session (Greeter *greeter, const gchar *session)
-{
- g_return_if_fail (greeter != NULL);
-
- g_free (greeter->priv->default_session);
- greeter->priv->default_session = g_strdup (session);
-}
-
-const gchar *
-greeter_get_default_session (Greeter *greeter)
-{
- g_return_val_if_fail (greeter != NULL, NULL);
- return greeter->priv->default_session;
-}
-
-PAMSession *
-greeter_get_pam_session (Greeter *greeter)
-{
- g_return_val_if_fail (greeter != NULL, NULL);
- return greeter->priv->pam_session;
+ g_hash_table_insert (greeter->priv->hints, g_strdup (name), g_strdup (value));
}
static guint32
@@ -195,15 +166,25 @@ handle_connect (Greeter *greeter, const gchar *version)
{
guint8 message[MAX_MESSAGE_LENGTH];
gsize offset = 0;
+ guint32 length;
+ GHashTableIter iter;
+ gpointer key, value;
g_debug ("Greeter connected version=%s", version);
- write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_CONNECTED, string_length (VERSION) + string_length (greeter->priv->default_session) + string_length (greeter->priv->selected_user) + int_length () + int_length (), &offset);
+ length = string_length (VERSION);
+ g_hash_table_iter_init (&iter, greeter->priv->hints);
+ while (g_hash_table_iter_next (&iter, &key, &value))
+ length += string_length (key) + string_length (value);
+
+ write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_CONNECTED, length, &offset);
write_string (message, MAX_MESSAGE_LENGTH, VERSION, &offset);
- write_string (message, MAX_MESSAGE_LENGTH, greeter->priv->default_session, &offset);
- write_string (message, MAX_MESSAGE_LENGTH, greeter->priv->selected_user, &offset);
- write_int (message, MAX_MESSAGE_LENGTH, greeter->priv->autologin_timeout, &offset);
- write_int (message, MAX_MESSAGE_LENGTH, guest_account_get_is_enabled (), &offset);
+ g_hash_table_iter_init (&iter, greeter->priv->hints);
+ while (g_hash_table_iter_next (&iter, &key, &value))
+ {
+ write_string (message, MAX_MESSAGE_LENGTH, key, &offset);
+ write_string (message, MAX_MESSAGE_LENGTH, value, &offset);
+ }
write_message (greeter, message, offset);
}
@@ -380,18 +361,6 @@ handle_cancel_authentication (Greeter *greeter)
pam_session_cancel (greeter->priv->pam_session);
}
-void
-greeter_quit (Greeter *greeter)
-{
- guint8 message[MAX_MESSAGE_LENGTH];
- gsize offset = 0;
-
- g_return_if_fail (greeter != NULL);
-
- write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_QUIT, 0, &offset);
- write_message (greeter, message, offset);
-}
-
static void
handle_start_session (Greeter *greeter, gchar *session)
{
@@ -587,11 +556,31 @@ greeter_start (Greeter *greeter)
return TRUE;
}
+PAMSession *
+greeter_get_pam_session (Greeter *greeter)
+{
+ g_return_val_if_fail (greeter != NULL, NULL);
+ return greeter->priv->pam_session;
+}
+
+void
+greeter_quit (Greeter *greeter)
+{
+ guint8 message[MAX_MESSAGE_LENGTH];
+ gsize offset = 0;
+
+ g_return_if_fail (greeter != NULL);
+
+ write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_QUIT, 0, &offset);
+ write_message (greeter, message, offset);
+}
+
static void
greeter_init (Greeter *greeter)
{
greeter->priv = G_TYPE_INSTANCE_GET_PRIVATE (greeter, GREETER_TYPE, GreeterPrivate);
greeter->priv->read_buffer = g_malloc (HEADER_SIZE);
+ greeter->priv->hints = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
}
static void
@@ -602,9 +591,8 @@ greeter_finalize (GObject *object)
self = GREETER (object);
g_object_unref (self->priv->session);
+ g_hash_table_unref (self->priv->hints);
g_free (self->priv->read_buffer);
- g_free (self->priv->default_session);
- g_free (self->priv->selected_user);
if (self->priv->to_greeter_channel)
g_io_channel_unref (self->priv->to_greeter_channel);
if (self->priv->from_greeter_channel)
diff --git a/src/greeter.h b/src/greeter.h
index 6bc2d3a9..f1a48ae4 100644
--- a/src/greeter.h
+++ b/src/greeter.h
@@ -38,16 +38,12 @@ GType greeter_get_type (void);
Greeter *greeter_new (Session *session);
-void greeter_set_selected_user (Greeter *greeter, const gchar *username, gint timeout);
+void greeter_set_hint (Greeter *greeter, const gchar *name, const gchar *value);
-void greeter_set_default_session (Greeter *greeter, const gchar *session);
-
-const gchar *greeter_get_default_session (Greeter *greeter);
+gboolean greeter_start (Greeter *greeter);
PAMSession *greeter_get_pam_session (Greeter *greeter);
-gboolean greeter_start (Greeter *greeter);
-
void greeter_quit (Greeter *greeter);
G_END_DECLS
diff --git a/src/lightdm.c b/src/lightdm.c
index ccc4ab5d..7f411d9b 100644
--- a/src/lightdm.c
+++ b/src/lightdm.c
@@ -428,7 +428,7 @@ main (int argc, char **argv)
gchar *xsessions_dir = g_strdup (XSESSIONS_DIR);
gchar *run_dir = g_strdup (RUN_DIR);
gchar *cache_dir = g_strdup (CACHE_DIR);
- gchar *user_session = g_strdup (user_session);
+ gchar *user_session = g_strdup (USER_SESSION);
gchar *minimum_display_number = NULL;
gboolean show_version = FALSE;
GOptionEntry options[] =
diff --git a/tests/src/test-gobject-greeter.c b/tests/src/test-gobject-greeter.c
index dd003d3d..73124e51 100644
--- a/tests/src/test-gobject-greeter.c
+++ b/tests/src/test-gobject-greeter.c
@@ -26,10 +26,10 @@ connected_cb (LdmGreeter *greeter)
}
/* Automatically log in as requested user */
- if (ldm_greeter_get_timed_login_user (greeter) && ldm_greeter_get_timed_login_delay (greeter) == 0)
+ if (ldm_greeter_get_select_user_hint (greeter))
{
- notify_status ("GREETER LOGIN-SELECTED USERNAME=%s", ldm_greeter_get_timed_login_user (greeter));
- ldm_greeter_login (greeter, ldm_greeter_get_timed_login_user (greeter));
+ notify_status ("GREETER LOGIN-SELECTED USERNAME=%s", ldm_greeter_get_select_user_hint (greeter));
+ ldm_greeter_login (greeter, ldm_greeter_get_select_user_hint (greeter));
return;
}