From 3c223d9bec8517be9c4d234564b97ee1bd6c323b Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Mon, 19 Nov 2012 16:10:01 +0100 Subject: [PATCH] seat: add helpers to schedule sessions from the outside Two new helpers to schedule a specific session or a session given by a hint-number. These can be used by other subsystems to schedule their/others sessions. Signed-off-by: David Herrmann --- src/kmscon_seat.c | 39 +++++++++++++++++++++++++++++++++++++++ src/kmscon_seat.h | 3 +++ 2 files changed, 42 insertions(+) diff --git a/src/kmscon_seat.c b/src/kmscon_seat.c index 3f0367a..3b037b3 100644 --- a/src/kmscon_seat.c +++ b/src/kmscon_seat.c @@ -830,6 +830,31 @@ struct conf_ctx *kmscon_seat_get_conf(struct kmscon_seat *seat) return seat->conf_ctx; } +void kmscon_seat_schedule(struct kmscon_seat *seat, unsigned int id) +{ + struct shl_dlist *iter; + struct kmscon_session *s, *next; + + if (!seat) + return; + + next = seat->dummy_sess; + shl_dlist_for_each(iter, &seat->sessions) { + s = shl_dlist_entry(iter, struct kmscon_session, list); + if (!s->enabled || seat->dummy_sess == s || + seat->current_sess == s) + continue; + + next = s; + if (!id--) + break; + } + + seat->scheduled_sess = next; + if (seat_has_schedule(seat)) + seat_switch(seat); +} + int kmscon_seat_register_session(struct kmscon_seat *seat, struct kmscon_session **out, kmscon_session_cb_t cb, @@ -994,6 +1019,20 @@ int kmscon_session_set_background(struct kmscon_session *sess) return 0; } +void kmscon_session_schedule(struct kmscon_session *sess) +{ + struct kmscon_seat *seat; + + if (!sess || !sess->seat) + return; + + seat = sess->seat; + seat->scheduled_sess = sess; + seat_reschedule(seat); + if (seat_has_schedule(seat)) + seat_switch(seat); +} + void kmscon_session_enable(struct kmscon_session *sess) { if (!sess || sess->enabled) diff --git a/src/kmscon_seat.h b/src/kmscon_seat.h index bcfabed..f70f2a6 100644 --- a/src/kmscon_seat.h +++ b/src/kmscon_seat.h @@ -90,6 +90,8 @@ struct uterm_input *kmscon_seat_get_input(struct kmscon_seat *seat); struct ev_eloop *kmscon_seat_get_eloop(struct kmscon_seat *seat); struct conf_ctx *kmscon_seat_get_conf(struct kmscon_seat *seat); +void kmscon_seat_schedule(struct kmscon_seat *seat, unsigned int id); + int kmscon_seat_register_session(struct kmscon_seat *seat, struct kmscon_session **out, kmscon_session_cb_t cb, @@ -103,6 +105,7 @@ bool kmscon_session_is_registered(struct kmscon_session *sess); bool kmscon_session_is_active(struct kmscon_session *sess); int kmscon_session_set_foreground(struct kmscon_session *sess); int kmscon_session_set_background(struct kmscon_session *sess); +void kmscon_session_schedule(struct kmscon_session *sess); void kmscon_session_enable(struct kmscon_session *sess); void kmscon_session_disable(struct kmscon_session *sess);