diff --git a/src/kmscon_main.c b/src/kmscon_main.c index b02d6bd..548bf23 100644 --- a/src/kmscon_main.c +++ b/src/kmscon_main.c @@ -106,6 +106,19 @@ static int app_seat_event(struct kmscon_seat *s, unsigned int event, if (!--app->vt_exit_count) ev_eloop_exit(app->vt_eloop); } + break; + case KMSCON_SEAT_HUP: + kmscon_seat_free(seat->seat); + seat->seat = NULL; + + if (!shl_string_list_is(app->conf->seats, "all") && + shl_string_list_count(app->conf->seats, true) == 1) { + log_debug("seat HUP in single-seat mode; exiting..."); + ev_eloop_exit(app->eloop); + } else { + log_debug("seat HUP in multi-seat mode; ignoring..."); + } + break; } diff --git a/src/kmscon_seat.c b/src/kmscon_seat.c index d31b042..e8b554a 100644 --- a/src/kmscon_seat.c +++ b/src/kmscon_seat.c @@ -539,6 +539,10 @@ static int seat_vt_event(struct uterm_vt *vt, struct uterm_vt_event *ev, if (ret) return ret; break; + case UTERM_VT_HUP: + if (seat->cb) + seat->cb(seat, KMSCON_SEAT_HUP, seat->data); + break; } return 0; diff --git a/src/kmscon_seat.h b/src/kmscon_seat.h index f70f2a6..4a306ea 100644 --- a/src/kmscon_seat.h +++ b/src/kmscon_seat.h @@ -46,6 +46,7 @@ enum kmscon_seat_event { KMSCON_SEAT_SLEEP, KMSCON_SEAT_BACKGROUND, KMSCON_SEAT_FOREGROUND, + KMSCON_SEAT_HUP, }; typedef int (*kmscon_seat_cb_t) (struct kmscon_seat *seat,