From a737fcd92dd7ad0a3a91c1f1c8e6b27ec67446f0 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Fri, 12 Oct 2012 15:30:13 +0200 Subject: [PATCH] seat: add enable/disable logic to sessions If we want to allow dummy sessions, we need some way to disable these so they are never activated on a seat. This patch disables every session by default and you need to explicitely enable them to be available for activation. Signed-off-by: David Herrmann --- src/kmscon_seat.c | 35 ++++++++++++++++++++++++++++++----- src/kmscon_seat.h | 4 ++++ 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/kmscon_seat.c b/src/kmscon_seat.c index 59ca8f8..8665341 100644 --- a/src/kmscon_seat.c +++ b/src/kmscon_seat.c @@ -47,6 +47,8 @@ struct kmscon_session { unsigned long ref; struct kmscon_seat *seat; + bool enabled; + kmscon_session_cb_t cb; void *data; }; @@ -110,7 +112,7 @@ static void session_activate(struct kmscon_session *sess) { struct kmscon_seat *seat = sess->seat; - if (seat->cur_sess == sess) + if (seat->cur_sess == sess || !sess->enabled) return; if (seat->cur_sess) { @@ -128,7 +130,7 @@ static void session_deactivate(struct kmscon_session *sess) { struct kmscon_seat *seat = sess->seat; - if (seat->cur_sess != sess) + if (seat->cur_sess != sess || !sess->enabled) return; if (seat->awake) @@ -302,6 +304,7 @@ int kmscon_seat_new(struct kmscon_seat **out, ret = kmscon_terminal_register(&s, seat); if (ret) goto err_vt; + kmscon_session_enable(s); ev_eloop_ref(seat->eloop); uterm_vt_master_ref(seat->vtm); @@ -440,9 +443,6 @@ int kmscon_seat_register_session(struct kmscon_seat *seat, shl_dlist_link(&seat->sessions, &sess->list); *out = sess; - if (!seat->cur_sess) - session_activate(sess); - return 0; } @@ -499,3 +499,28 @@ bool kmscon_session_is_active(struct kmscon_session *sess) { return sess && sess->seat && sess->seat->cur_sess == sess; } + +void kmscon_session_enable(struct kmscon_session *sess) +{ + if (!sess) + return; + + sess->enabled = true; + if (sess->seat && !sess->seat->cur_sess) + session_activate(sess); +} + +void kmscon_session_disable(struct kmscon_session *sess) +{ + if (!sess) + return; + + if (sess->seat) + session_deactivate(sess); + sess->enabled = false; +} + +bool kmscon_session_is_enabled(struct kmscon_session *sess) +{ + return sess && sess->enabled; +} diff --git a/src/kmscon_seat.h b/src/kmscon_seat.h index 07b48cd..eb367ca 100644 --- a/src/kmscon_seat.h +++ b/src/kmscon_seat.h @@ -95,4 +95,8 @@ void kmscon_session_activate(struct kmscon_session *sess); void kmscon_session_deactivate(struct kmscon_session *sess); bool kmscon_session_is_active(struct kmscon_session *sess); +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); + #endif /* KMSCON_SEAT_H */