summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesús González <jgonzalez@gdr-sistemas.com>2015-01-05 21:29:53 +0100
committerJesús González <jgonzalez@gdr-sistemas.com>2015-01-05 21:29:53 +0100
commita8ecb0045b165026df4e93e6d5b008584c3d6cac (patch)
tree732c9b7200c6b1f1c46a298e634e5f832535ba40
parent7c0ffad5dc2ec05c8dfefb2ec1633f71e0ec26d3 (diff)
downloadlightdm-a8ecb0045b165026df4e93e6d5b008584c3d6cac.tar.gz
Store in the seat the replacement greeter that shall be started when the replaced one stops
-rw-r--r--src/seat.c31
-rw-r--r--tests/scripts/lock-seat-twice.conf13
-rw-r--r--tests/scripts/lock-session-twice.conf14
3 files changed, 52 insertions, 6 deletions
diff --git a/src/seat.c b/src/seat.c
index 16f40678..d2de0c64 100644
--- a/src/seat.c
+++ b/src/seat.c
@@ -65,6 +65,9 @@ struct SeatPrivate
/* TRUE if stopped */
gboolean stopped;
+
+ /* The greeter to be started to replace the current one */
+ Greeter *replacement_greeter;
};
static void seat_logger_iface_init (LoggerInterface *iface);
@@ -740,9 +743,28 @@ session_stopped_cb (Session *session, Seat *seat)
g_object_unref (session);
return;
}
+
+ /* If there is a pending replacement greeter, start it */
+ if (IS_GREETER (session) && seat->priv->replacement_greeter)
+ {
+ Session *s = SESSION(seat->priv->replacement_greeter);
+ seat->priv->replacement_greeter = NULL;
+ g_object_unref(s);
+
+ if (session_get_is_authenticated (s))
+ {
+ l_debug (seat, "Greeter stopped, running session");
+ run_session (seat, s);
+ }
+ else
+ {
+ l_debug (seat, "Greeter stopped, starting session authentication");
+ start_session (seat, s);
+ }
+ }
/* If this is the greeter session then re-use this display server */
- if (IS_GREETER (session) &&
+ else if (IS_GREETER (session) &&
can_share_display_server (seat, display_server) &&
greeter_get_start_session (GREETER (session)))
{
@@ -1587,14 +1609,19 @@ seat_lock (Seat *seat, const gchar *username)
{
if (!reuse_xserver)
display_server = create_display_server (seat, SESSION (greeter_session));
+ session_set_display_server (SESSION (greeter_session), display_server);
if (seat->priv->session_to_activate)
g_object_unref (seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (greeter_session);
- session_set_display_server (SESSION (greeter_session), display_server);
if (reuse_xserver)
+ {
+ if (seat->priv->replacement_greeter)
+ g_object_unref (seat->priv->replacement_greeter);
+ seat->priv->replacement_greeter = g_object_ref (greeter_session);
return TRUE;
+ }
else
return display_server_start (display_server);
}
diff --git a/tests/scripts/lock-seat-twice.conf b/tests/scripts/lock-seat-twice.conf
index 19128acd..c8d6dc8e 100644
--- a/tests/scripts/lock-seat-twice.conf
+++ b/tests/scripts/lock-seat-twice.conf
@@ -54,8 +54,17 @@ user-session=default
#?*SESSION-X-0 LOCK-SEAT
#?SESSION-X-0 LOCK-SEAT
-# Nothing should happen...
-#?*WAIT
+# Old greeter is stopped
+#?GREETER-X-1 TERMINATE SIGNAL=15
+
+# A new greeter is started and activated on the same X server
+#?LOGIN1 ACTIVATE-SESSION SESSION=c2
+#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter
+#?XSERVER-1 ACCEPT-CONNECT
+#?GREETER-X-1 CONNECT-XSERVER
+#?GREETER-X-1 CONNECT-TO-DAEMON
+#?GREETER-X-1 CONNECTED-TO-DAEMON
+#?GREETER-X-1 LOCK-HINT
# Cleanup
#?*STOP-DAEMON
diff --git a/tests/scripts/lock-session-twice.conf b/tests/scripts/lock-session-twice.conf
index 6a8bda7e..e7f20c3d 100644
--- a/tests/scripts/lock-session-twice.conf
+++ b/tests/scripts/lock-session-twice.conf
@@ -55,8 +55,18 @@ user-session=default
#?*SESSION-X-0 LOCK-SESSION
#?SESSION-X-0 LOCK-SESSION
-# Nothing should happen
-#?*WAIT
+# Old greeter is stopped
+#?GREETER-X-1 TERMINATE SIGNAL=15
+#?LOGIN1 ACTIVATE-SESSION SESSION=c2
+
+# A new greeter is started and activated on the same X server
+#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter
+#?XSERVER-1 ACCEPT-CONNECT
+#?GREETER-X-1 CONNECT-XSERVER
+#?GREETER-X-1 CONNECT-TO-DAEMON
+#?GREETER-X-1 CONNECTED-TO-DAEMON
+#?GREETER-X-1 SELECT-USER-HINT USERNAME=have-password1
+#?GREETER-X-1 LOCK-HINT
# Cleanup
#?*STOP-DAEMON