seat: allow sessions to notify seat when deactivating

If a session is deactivated asynchronously, it can now notify the seat
when it is done. This will then cause a re-schedule of the session list.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-11-10 16:57:04 +01:00
parent 4d65024ab5
commit d74a71f70b
2 changed files with 28 additions and 3 deletions

View File

@ -310,6 +310,15 @@ static int seat_run(struct kmscon_seat *seat)
return 0;
}
static void session_deactivate(struct kmscon_session *sess)
{
if (sess->seat->current_sess != sess)
return;
sess->deactivating = false;
sess->seat->current_sess = NULL;
}
static int seat_pause(struct kmscon_seat *seat, bool force)
{
int ret;
@ -318,7 +327,6 @@ static int seat_pause(struct kmscon_seat *seat, bool force)
return 0;
seat->current_sess->deactivating = true;
ret = session_call_deactivate(seat->current_sess);
if (ret) {
log_warning("cannot deactivate session %p: %d",
@ -327,8 +335,7 @@ static int seat_pause(struct kmscon_seat *seat, bool force)
return ret;
}
seat->current_sess->deactivating = false;
seat->current_sess = NULL;
session_deactivate(seat->current_sess);
return 0;
}
@ -974,3 +981,19 @@ bool kmscon_session_is_enabled(struct kmscon_session *sess)
{
return sess && sess->enabled;
}
void kmscon_session_notify_deactivated(struct kmscon_session *sess)
{
struct kmscon_seat *seat;
if (!sess || !sess->seat)
return;
seat = sess->seat;
if (seat->current_sess != sess)
return;
session_deactivate(sess);
seat_reschedule(seat);
seat_switch(sess->seat);
}

View File

@ -106,4 +106,6 @@ void kmscon_session_enable(struct kmscon_session *sess);
void kmscon_session_disable(struct kmscon_session *sess);
bool kmscon_session_is_enabled(struct kmscon_session *sess);
void kmscon_session_notify_deactivated(struct kmscon_session *sess);
#endif /* KMSCON_SEAT_H */