From eeb2e50a760eb0135f22a2a4f3a31c9d32aa8b39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Tue, 10 Apr 2012 00:18:33 -0400 Subject: [PATCH] tty: Put console in K_OFF mode This disables all kernel key bindings (VT switch keybindings, caps lock etc) and disables delivery of console input. --- src/tty.c | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/src/tty.c b/src/tty.c index e029d551..135cdad1 100644 --- a/src/tty.c +++ b/src/tty.c @@ -39,10 +39,10 @@ struct tty { int fd; struct termios terminal_attributes; - struct wl_event_source *input_source; struct wl_event_source *vt_source; tty_vt_func_t vt_func; int vt, starting_vt, has_vt; + int kb_mode; }; static int vt_handler(int signal_number, void *data) @@ -64,18 +64,6 @@ static int vt_handler(int signal_number, void *data) return 1; } -static int -on_tty_input(int fd, uint32_t mask, void *data) -{ - struct tty *tty = data; - - /* Ignore input to tty. We get keyboard events from evdev - */ - tcflush(tty->fd, TCIFLUSH); - - return 1; -} - static int try_open_vt(struct tty *tty) { @@ -186,17 +174,17 @@ tty_create(struct weston_compositor *compositor, tty_vt_func_t vt_func, if (tcsetattr(tty->fd, TCSANOW, &raw_attributes) < 0) fprintf(stderr, "could not put terminal into raw mode: %m\n"); - loop = wl_display_get_event_loop(compositor->wl_display); - tty->input_source = - wl_event_loop_add_fd(loop, tty->fd, - WL_EVENT_READABLE, on_tty_input, tty); - if (!tty->input_source) + ioctl(tty->fd, KDGKBMODE, &tty->kb_mode); + ret = ioctl(tty->fd, KDSKBMODE, K_OFF); + if (ret) { + fprintf(stderr, "failed to set K_OFF keyboard mode on tty: %m\n"); goto err_attr; + } ret = ioctl(tty->fd, KDSETMODE, KD_GRAPHICS); if (ret) { fprintf(stderr, "failed to set KD_GRAPHICS mode on tty: %m\n"); - goto err_input_source; + goto err_kdkbmode; } tty->has_vt = 1; @@ -208,6 +196,7 @@ tty_create(struct weston_compositor *compositor, tty_vt_func_t vt_func, goto err_kdmode; } + loop = wl_display_get_event_loop(compositor->wl_display); tty->vt_source = wl_event_loop_add_signal(loop, SIGUSR1, vt_handler, tty); if (!tty->vt_source) @@ -221,8 +210,8 @@ err_vtmode: err_kdmode: ioctl(tty->fd, KDSETMODE, KD_TEXT); -err_input_source: - wl_event_source_remove(tty->input_source); +err_kdkbmode: + ioctl(tty->fd, KDSKBMODE, tty->kb_mode); err_attr: tcsetattr(tty->fd, TCSANOW, &tty->terminal_attributes); @@ -241,6 +230,9 @@ tty_destroy(struct tty *tty) if(!tty) return; + if (ioctl(tty->fd, KDSKBMODE, tty->kb_mode)) + fprintf(stderr, "failed to restore keyboard mode: %m\n"); + if (ioctl(tty->fd, KDSETMODE, KD_TEXT)) fprintf(stderr, "failed to set KD_TEXT mode on tty: %m\n"); @@ -258,7 +250,6 @@ tty_destroy(struct tty *tty) ioctl(tty->fd, VT_WAITACTIVE, tty->starting_vt); } - wl_event_source_remove(tty->input_source); wl_event_source_remove(tty->vt_source); close(tty->fd);