From d7660329e9aeae9329ae1b19ab93324fcdcb7f6c Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Mon, 19 Nov 2012 13:13:01 +0100 Subject: [PATCH] seat: fix delayed VT switches If we switch VT and the current session cannot be put asleep, and later it notifies us that it went asleep, we should then switch VT and not reschedule the sessions. We do this by remembering whether a VT switch is pending. The new uterm-retry infrastructure allows us to easily repeat VT switches then. Signed-off-by: David Herrmann --- src/kmscon_seat.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/kmscon_seat.c b/src/kmscon_seat.c index adbe6ab..957869d 100644 --- a/src/kmscon_seat.c +++ b/src/kmscon_seat.c @@ -88,6 +88,7 @@ struct kmscon_seat { struct kmscon_session *current_sess; struct kmscon_session *scheduled_sess; struct kmscon_session *dummy_sess; + bool scheduled_vt; kmscon_seat_cb_t cb; void *data; @@ -508,6 +509,7 @@ static int seat_vt_event(struct uterm_vt *vt, struct uterm_vt_event *ev, seat_run(seat); break; case UTERM_VT_DEACTIVATE: + seat->scheduled_vt = true; ret = seat_pause(seat, false); if (ret) return ret; @@ -517,6 +519,7 @@ static int seat_vt_event(struct uterm_vt *vt, struct uterm_vt_event *ev, ret = seat_go_asleep(seat, false); if (ret) return ret; + seat->scheduled_vt = false; break; } @@ -1031,6 +1034,7 @@ bool kmscon_session_is_enabled(struct kmscon_session *sess) void kmscon_session_notify_deactivated(struct kmscon_session *sess) { struct kmscon_seat *seat; + int ret; if (!sess || !sess->seat) return; @@ -1041,5 +1045,15 @@ void kmscon_session_notify_deactivated(struct kmscon_session *sess) session_deactivate(sess); seat_reschedule(seat); - seat_switch(sess->seat); + if (seat->scheduled_vt) { + ret = seat_go_background(seat, false); + if (ret) + return; + ret = seat_go_asleep(seat, false); + if (ret) + return; + uterm_vt_retry(seat->vt); + } else { + seat_switch(sess->seat); + } }