From d948bffd3e7b283870dcbd7f1a5dd2aaea1950ec Mon Sep 17 00:00:00 2001 From: sghctoma Date: Sun, 2 Sep 2018 20:01:13 +0200 Subject: Activate last active VT after compositor exit The VT the compositor was started from was not activated after exiting the compositor, which resulted in arriving on a blank VT. This commit fixes that by introducing a new field in direct_session struct that stores the last active VT so that it can be activated in direct_session_destroy. --- backend/session/direct-freebsd.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'backend/session/direct-freebsd.c') diff --git a/backend/session/direct-freebsd.c b/backend/session/direct-freebsd.c index 1ef76f7a..7784296b 100644 --- a/backend/session/direct-freebsd.c +++ b/backend/session/direct-freebsd.c @@ -23,6 +23,7 @@ const struct session_impl session_direct; struct direct_session { struct wlr_session base; int tty_fd; + int old_tty; int old_kbmode; int sock; pid_t child; @@ -87,7 +88,7 @@ static void direct_session_destroy(struct wlr_session *base) { ioctl(session->tty_fd, KDSETMODE, KD_TEXT); ioctl(session->tty_fd, VT_SETMODE, &mode); - ioctl(session->tty_fd, VT_ACTIVATE, 1); + ioctl(session->tty_fd, VT_ACTIVATE, session->old_tty); if (errno) { wlr_log(WLR_ERROR, "Failed to restore tty"); @@ -138,11 +139,15 @@ static int vt_handler(int signo, void *data) { } static bool setup_tty(struct direct_session *session, struct wl_display *display) { - int fd = -1, tty = -1, tty0_fd = -1; + int fd = -1, tty = -1, tty0_fd = -1, old_tty = 1; if ((tty0_fd = open("/dev/ttyv0", O_RDWR | O_CLOEXEC)) < 0) { wlr_log_errno(WLR_ERROR, "Could not open /dev/ttyv0 to find a free vt"); goto error; } + if (ioctl(tty0_fd, VT_GETACTIVE, &old_tty) != 0) { + wlr_log_errno(WLR_ERROR, "Could not get active vt"); + goto error; + } if (ioctl(tty0_fd, VT_OPENQRY, &tty) != 0) { wlr_log_errno(WLR_ERROR, "Could not find a free vt"); goto error; @@ -198,13 +203,16 @@ static bool setup_tty(struct direct_session *session, struct wl_display *display session->base.vtnr = tty; session->tty_fd = fd; + session->old_tty = old_tty; session->old_kbmode = old_kbmode; return true; error: - // Drop back to tty 1, better than hanging in a useless blank console - ioctl(fd, VT_ACTIVATE, 1); + // In case we could not get the last active one, drop back to tty 1, + // better than hanging in a useless blank console. Otherwise activate the + // last active. + ioctl(fd, VT_ACTIVATE, old_tty); close(fd); return false; } -- cgit v1.2.3