summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--liblightdm-gobject/greeter.c22
-rw-r--r--liblightdm-gobject/lightdm/greeter.h2
-rw-r--r--liblightdm-qt/QLightDM/greeter.cpp7
-rw-r--r--liblightdm-qt/QLightDM/greeter.h1
-rw-r--r--src/display.c9
-rw-r--r--src/greeter.c24
-rw-r--r--src/greeter.h4
7 files changed, 49 insertions, 20 deletions
diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c
index f9eb9399..b14d4958 100644
--- a/liblightdm-gobject/greeter.c
+++ b/liblightdm-gobject/greeter.c
@@ -111,6 +111,7 @@ struct _LdmGreeterPrivate
gint login_delay;
guint login_timeout;
gboolean guest_account_supported;
+ guint greeter_count;
};
G_DEFINE_TYPE (LdmGreeter, ldm_greeter, G_TYPE_OBJECT);
@@ -339,12 +340,14 @@ from_server_cb (GIOChannel *source, GIOCondition condition, gpointer data)
greeter->priv->timed_user = read_string (greeter, &offset);
greeter->priv->login_delay = read_int (greeter, &offset);
greeter->priv->guest_account_supported = read_int (greeter, &offset) != 0;
+ greeter->priv->greeter_count = read_int (greeter, &offset);
- g_debug ("Connected theme=%s default-session=%s timed-user=%s login-delay=%d guest-account-supported=%s",
+ g_debug ("Connected theme=%s default-session=%s timed-user=%s login-delay=%d guest-account-supported=%s greeter-count=%d",
greeter->priv->theme,
greeter->priv->default_session,
greeter->priv->timed_user, greeter->priv->login_delay,
- greeter->priv->guest_account_supported ? "true" : "false");
+ greeter->priv->guest_account_supported ? "true" : "false",
+ greeter->priv->greeter_count);
/* Set timeout for default login */
if (greeter->priv->timed_user[0] != '\0' && greeter->priv->login_delay > 0)
@@ -1202,6 +1205,21 @@ ldm_greeter_get_has_guest_session (LdmGreeter *greeter)
}
/**
+ * ldm_greeter_get_is_first:
+ * @greeter: A #LdmGreeter
+ *
+ * Check if this is the first time a greeter has been shown on this display.
+ *
+ * Return value: TRUE if this is the first greeter on this display.
+ */
+gboolean
+ldm_greeter_get_is_first (LdmGreeter *greeter)
+{
+ g_return_val_if_fail (LDM_IS_GREETER (greeter), 0);
+ return greeter->priv->greeter_count == 0;
+}
+
+/**
* ldm_greeter_get_timed_login_user:
* @greeter: A #LdmGreeter
*
diff --git a/liblightdm-gobject/lightdm/greeter.h b/liblightdm-gobject/lightdm/greeter.h
index 5698ecbd..1eced7d2 100644
--- a/liblightdm-gobject/lightdm/greeter.h
+++ b/liblightdm-gobject/lightdm/greeter.h
@@ -93,6 +93,8 @@ const gchar *ldm_greeter_get_default_session (LdmGreeter *greeter);
gboolean ldm_greeter_get_has_guest_session (LdmGreeter *greeter);
+gboolean ldm_greeter_get_is_first (LdmGreeter *greeter);
+
const gchar *ldm_greeter_get_timed_login_user (LdmGreeter *greeter);
gint ldm_greeter_get_timed_login_delay (LdmGreeter *greeter);
diff --git a/liblightdm-qt/QLightDM/greeter.cpp b/liblightdm-qt/QLightDM/greeter.cpp
index 7930f6ce..b7cff168 100644
--- a/liblightdm-qt/QLightDM/greeter.cpp
+++ b/liblightdm-qt/QLightDM/greeter.cpp
@@ -59,6 +59,7 @@ public:
QString timedUser;
int loginDelay;
bool guestAccountSupported;
+ int greeterCount;
SessionsModel *sessionsModel;
Config *config;
@@ -324,6 +325,7 @@ void Greeter::onRead(int fd)
d->timedUser = readString(&offset);
d->loginDelay = readInt(&offset);
d->guestAccountSupported = readInt(&offset) != 0;
+ d->greeterCount = readInt(&offset);
qDebug() << "Connected theme=" << d->theme << " default-session=" << d->defaultSession << " timed-user=" << d->timedUser << " login-delay" << d->loginDelay << " guestAccountSupported" << d->guestAccountSupported;
/* Set timeout for default login */
@@ -409,6 +411,11 @@ bool Greeter::guestAccountSupported() const
return d->guestAccountSupported;
}
+bool Greeter::isFirst() const
+{
+ return d->greeterCount == 0;
+}
+
QString Greeter::timedLoginUser() const
{
return d->timedUser;
diff --git a/liblightdm-qt/QLightDM/greeter.h b/liblightdm-qt/QLightDM/greeter.h
index 62b4b5b7..6d507ba5 100644
--- a/liblightdm-qt/QLightDM/greeter.h
+++ b/liblightdm-qt/QLightDM/greeter.h
@@ -58,6 +58,7 @@ namespace QLightDM
QString defaultSession() const;
bool guestAccountSupported() const;
+ bool isFirst() const;
bool inAuthentication() const;
bool isAuthenticated() const;
diff --git a/src/display.c b/src/display.c
index 7398a194..b9c5845e 100644
--- a/src/display.c
+++ b/src/display.c
@@ -51,6 +51,9 @@ struct DisplayPrivate
/* X server */
XServer *xserver;
+
+ /* Number of times we have shown the greeter */
+ gint greeter_count;
/* Number of times have logged in */
gint login_count;
@@ -715,7 +718,7 @@ start_greeter (Display *display)
User *user;
gboolean result;
GError *error = NULL;
-
+
theme = load_theme (display->priv->greeter_theme, &error);
if (!theme)
g_warning ("Failed to find theme %s: %s", display->priv->greeter_theme, error->message);
@@ -736,14 +739,14 @@ start_greeter (Display *display)
user = user_get_current ();
g_debug ("Starting greeter %s as user %s", display->priv->greeter_theme, user_get_name (user));
+ display->priv->greeter_count++;
display->priv->greeter_pam_session = pam_session_new (display->priv->pam_service, user_get_name (user));
pam_session_authorize (display->priv->greeter_pam_session);
display->priv->greeter_ck_cookie = start_ck_session (display, "LoginWindow", user_get_name (user));
- display->priv->greeter_session = greeter_new ();
- greeter_set_theme (display->priv->greeter_session, display->priv->greeter_theme);
+ display->priv->greeter_session = greeter_new (display->priv->greeter_theme, display->priv->greeter_count - 1);
greeter_set_default_user (display->priv->greeter_session, display->priv->default_user, display->priv->timeout);
greeter_set_default_session (display->priv->greeter_session, display->priv->default_session);
g_signal_connect (G_OBJECT (display->priv->greeter_session), "start-session", G_CALLBACK (greeter_start_session_cb), display);
diff --git a/src/greeter.c b/src/greeter.c
index 22474329..c953a881 100644
--- a/src/greeter.c
+++ b/src/greeter.c
@@ -30,6 +30,9 @@ static guint signals[LAST_SIGNAL] = { 0 };
struct GreeterPrivate
{
+ /* The number of greeters before this one */
+ guint count;
+
/* TRUE if the greeter has connected to the daemon pipe */
gboolean connected;
@@ -62,9 +65,14 @@ struct GreeterPrivate
G_DEFINE_TYPE (Greeter, greeter, SESSION_TYPE);
Greeter *
-greeter_new (void)
+greeter_new (const gchar *theme, guint count)
{
- return g_object_new (GREETER_TYPE, NULL);
+ Greeter *greeter = g_object_new (GREETER_TYPE, NULL);
+
+ greeter->priv->theme = g_strdup (theme);
+ greeter->priv->count = count;
+
+ return greeter;
}
void
@@ -77,15 +85,6 @@ greeter_set_default_user (Greeter *greeter, const gchar *username, gint timeout)
greeter->priv->autologin_timeout = timeout;
}
-void
-greeter_set_theme (Greeter *greeter, const gchar *theme)
-{
- g_return_if_fail (greeter != NULL);
-
- g_free (greeter->priv->theme);
- greeter->priv->theme = g_strdup (theme);
-}
-
const gchar *
greeter_get_theme (Greeter *greeter)
{
@@ -188,12 +187,13 @@ handle_connect (Greeter *greeter)
theme = g_build_filename (theme_dir, greeter->priv->theme, "index.theme", NULL);
g_free (theme_dir);
- write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONNECTED, string_length (theme) + string_length (greeter->priv->default_session) + string_length (greeter->priv->default_user ? greeter->priv->default_user : "") + int_length () + int_length (), &offset);
+ write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONNECTED, string_length (theme) + string_length (greeter->priv->default_session) + string_length (greeter->priv->default_user ? greeter->priv->default_user : "") + int_length () + int_length () + int_length (), &offset);
write_string (message, MAX_MESSAGE_LENGTH, theme, &offset);
write_string (message, MAX_MESSAGE_LENGTH, greeter->priv->default_session, &offset);
write_string (message, MAX_MESSAGE_LENGTH, greeter->priv->default_user ? greeter->priv->default_user : "", &offset);
write_int (message, MAX_MESSAGE_LENGTH, greeter->priv->autologin_timeout, &offset);
write_int (message, MAX_MESSAGE_LENGTH, FALSE, &offset);
+ write_int (message, MAX_MESSAGE_LENGTH, greeter->priv->count, &offset);
write_message (greeter, message, offset);
g_free (theme);
diff --git a/src/greeter.h b/src/greeter.h
index bd2e9e89..4b1e5b48 100644
--- a/src/greeter.h
+++ b/src/greeter.h
@@ -37,12 +37,10 @@ typedef struct
GType greeter_get_type (void);
-Greeter *greeter_new (void);
+Greeter *greeter_new (const gchar *theme, guint count);
void greeter_set_default_user (Greeter *greeter, const gchar *username, gint timeout);
-void greeter_set_theme (Greeter *greeter, const gchar *theme);
-
const gchar *greeter_get_theme (Greeter *greeter);
void greeter_set_default_session (Greeter *greeter, const gchar *session);