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.
dev
Kristian Høgsberg 13 years ago
parent 5d1c0c58ad
commit eeb2e50a76
  1. 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…
Cancel
Save