diff options
-rw-r--r-- | liblightdm-gobject/greeter.c | 22 | ||||
-rw-r--r-- | liblightdm-gobject/lightdm/greeter.h | 2 | ||||
-rw-r--r-- | liblightdm-qt/QLightDM/greeter.cpp | 7 | ||||
-rw-r--r-- | liblightdm-qt/QLightDM/greeter.h | 1 | ||||
-rw-r--r-- | src/display.c | 9 | ||||
-rw-r--r-- | src/greeter.c | 24 | ||||
-rw-r--r-- | src/greeter.h | 4 |
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); |