summaryrefslogtreecommitdiff
path: root/src/login
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2014-02-25 13:08:24 +0100
committerDavid Herrmann <dh.herrmann@gmail.com>2014-02-25 13:10:42 +0100
commit3e6b205f81e743c7354ccbc69eb45afbdbebe2dc (patch)
treef34e84e45be336e7b4b9fc40c54fe09dc8421f7f /src/login
parent949138ccc3417748b0978980e4a1c67955dd4ba4 (diff)
login: set pos-slot to fallback on pos-eviction
If we evict a session position, we open the position slot for future sessions. However, there might already be another session on the same position if both were started on the same VT. This is currently done if gdm spawns the session on its own Xserver. Hence, look for such a session on pos-eviction and claim the new slot immediately.
Diffstat (limited to 'src/login')
-rw-r--r--src/login/logind-seat.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/login/logind-seat.c b/src/login/logind-seat.c
index 36ec7ed757..96cf08e3b2 100644
--- a/src/login/logind-seat.c
+++ b/src/login/logind-seat.c
@@ -459,6 +459,7 @@ int seat_stop_sessions(Seat *s, bool force) {
}
void seat_evict_position(Seat *s, Session *session) {
+ Session *iter;
unsigned int pos = session->pos;
session->pos = 0;
@@ -466,8 +467,19 @@ void seat_evict_position(Seat *s, Session *session) {
if (!pos)
return;
- if (pos < s->position_count && s->positions[pos] == session)
+ if (pos < s->position_count && s->positions[pos] == session) {
s->positions[pos] = NULL;
+
+ /* There might be another session claiming the same
+ * position (eg., during gdm->session transition), so lets look
+ * for it and set it on the free slot. */
+ LIST_FOREACH(sessions_by_seat, iter, s->sessions) {
+ if (iter->pos == pos) {
+ s->positions[pos] = iter;
+ break;
+ }
+ }
+ }
}
void seat_claim_position(Seat *s, Session *session, unsigned int pos) {