summaryrefslogtreecommitdiff
path: root/src/seat.c
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2015-10-16 10:10:34 +0100
committerRobert Ancell <robert.ancell@canonical.com>2015-10-16 10:10:34 +0100
commit5b1596558dd7e01b892479fa32b46757b7566ee2 (patch)
treef5aeb340c423b54071f569802b788ff26800d414 /src/seat.c
parent1f0180f018fa3f9b15f7a68cb17d15423c8e9a22 (diff)
parentb7778d2853d781998a4c6e8733c9cf76b7b6588e (diff)
downloadlightdm-git-5b1596558dd7e01b892479fa32b46757b7566ee2.tar.gz
When locking a session, if an existing greeter can't be reused, then it's stopped and its display server is reused with a new greeter.
Diffstat (limited to 'src/seat.c')
-rw-r--r--src/seat.c65
1 files changed, 57 insertions, 8 deletions
diff --git a/src/seat.c b/src/seat.c
index 33b73152..13624ccb 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);
@@ -790,9 +793,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)
+ {
+ Greeter *replacement_greeter = seat->priv->replacement_greeter;
+ seat->priv->replacement_greeter = NULL;
+
+ if (session_get_is_authenticated (SESSION (replacement_greeter)))
+ {
+ l_debug (seat, "Greeter stopped, running session");
+ run_session (seat, SESSION (replacement_greeter));
+ }
+ else
+ {
+ l_debug (seat, "Greeter stopped, starting session authentication");
+ start_session (seat, SESSION (replacement_greeter));
+ }
+ g_object_unref (replacement_greeter);
+ }
/* 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)))
{
@@ -1594,14 +1616,17 @@ gboolean
seat_lock (Seat *seat, const gchar *username)
{
Greeter *greeter_session;
- DisplayServer *display_server;
- gboolean existing = FALSE;
+ DisplayServer *display_server = NULL;
+ gboolean reset_existing = FALSE;
+ gboolean reuse_xserver = FALSE;
g_return_val_if_fail (seat != NULL, FALSE);
if (!seat_get_can_switch (seat))
return FALSE;
+ // FIXME: If already locked then don't bother...
+
l_debug (seat, "Locking");
/* Switch to greeter we can reuse */
@@ -1610,10 +1635,23 @@ seat_lock (Seat *seat, const gchar *username)
{
l_debug (seat, "Switching to existing greeter");
set_greeter_hints (seat, greeter_session);
- existing = TRUE;
+ reset_existing = TRUE;
}
else
{
+ /* If the existing greeter can't be reused, stop it and reuse its display server */
+ greeter_session = find_greeter_session (seat);
+ if (greeter_session)
+ {
+ display_server = session_get_display_server (SESSION (greeter_session));
+ if (!session_get_is_stopping (SESSION (greeter_session)))
+ {
+ l_debug (seat, "Stopping session");
+ session_stop (SESSION (greeter_session));
+ }
+ reuse_xserver = TRUE;
+ }
+
greeter_session = create_greeter_session (seat);
if (!greeter_session)
return FALSE;
@@ -1623,7 +1661,7 @@ seat_lock (Seat *seat, const gchar *username)
if (username)
greeter_set_hint (greeter_session, "select-user", username);
- if (existing)
+ if (reset_existing)
{
greeter_reset (greeter_session);
seat_set_active_session (seat, SESSION (greeter_session));
@@ -1631,14 +1669,23 @@ seat_lock (Seat *seat, const gchar *username)
}
else
{
- display_server = create_display_server (seat, SESSION (greeter_session));
+ 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);
- return display_server_start (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);
}
}
@@ -1877,6 +1924,8 @@ seat_finalize (GObject *object)
g_object_unref (self->priv->next_session);
if (self->priv->session_to_activate)
g_object_unref (self->priv->session_to_activate);
+ if (self->priv->replacement_greeter)
+ g_object_unref (self->priv->replacement_greeter);
G_OBJECT_CLASS (seat_parent_class)->finalize (object);
}