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.
This commit is contained in:
parent
5d1c0c58ad
commit
eeb2e50a76
35
src/tty.c
35
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);
|
||||
|
Loading…
Reference in New Issue
Block a user