summaryrefslogtreecommitdiff
path: root/src/uvtd_seat.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uvtd_seat.c')
-rw-r--r--src/uvtd_seat.c54
1 files changed, 45 insertions, 9 deletions
diff --git a/src/uvtd_seat.c b/src/uvtd_seat.c
index 2ef3180..0a1d71c 100644
--- a/src/uvtd_seat.c
+++ b/src/uvtd_seat.c
@@ -64,6 +64,7 @@ struct uvtd_session {
struct shl_dlist list;
unsigned long ref;
struct uvtd_seat *seat;
+ unsigned int id;
bool enabled;
bool deactivating;
@@ -426,12 +427,36 @@ void uvtd_seat_wake_up(struct uvtd_seat *seat)
seat_run(seat);
}
+void uvtd_seat_schedule(struct uvtd_seat *seat, unsigned int id)
+{
+ struct shl_dlist *iter;
+ struct uvtd_session *session;
+ unsigned int i;
+
+ if (!seat || !id)
+ return;
+
+ session = NULL;
+ i = id;
+ shl_dlist_for_each(iter, &seat->sessions) {
+ session = shl_dlist_entry(iter, struct uvtd_session, list);
+ if (!--i)
+ break;
+ if (session->id >= id)
+ break;
+ }
+
+ if (session)
+ seat_schedule(seat, session);
+}
+
int uvtd_seat_register_session(struct uvtd_seat *seat,
struct uvtd_session **out,
unsigned int id, uvtd_session_cb_t cb,
void *data)
{
- struct uvtd_session *sess;
+ struct uvtd_session *sess, *s;
+ struct shl_dlist *iter;
if (!seat || !out)
return -EINVAL;
@@ -440,23 +465,34 @@ int uvtd_seat_register_session(struct uvtd_seat *seat,
if (!sess)
return -ENOMEM;
- log_debug("register session %p", sess);
+ log_debug("register session %p with id %u on seat %p",
+ sess, id, seat);
memset(sess, 0, sizeof(*sess));
sess->ref = 1;
sess->seat = seat;
sess->cb = cb;
sess->data = data;
-
- /* TODO: add support for \ids */
- /* register new sessions next to the current one */
- if (seat->current_sess)
- shl_dlist_link(&seat->current_sess->list, &sess->list);
- else
- shl_dlist_link_tail(&seat->sessions, &sess->list);
+ sess->id = id;
++seat->session_count;
*out = sess;
+
+ if (sess->id) {
+ shl_dlist_for_each(iter, &seat->sessions) {
+ s = shl_dlist_entry(iter, struct uvtd_session, list);
+ if (!s->id || s->id > sess->id) {
+ shl_dlist_link_tail(iter, &sess->list);
+ return 0;
+ }
+
+ if (s->id == sess->id)
+ log_warning("session %p shadowed by %p",
+ sess, s);
+ }
+ }
+
+ shl_dlist_link_tail(&seat->sessions, &sess->list);
return 0;
}