summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2012-04-10 00:18:33 -0400
committerKristian Høgsberg <krh@bitplanet.net>2012-04-10 00:35:15 -0400
commiteeb2e50a760eb0135f22a2a4f3a31c9d32aa8b39 (patch)
treee55e6f55fd3b35b2a7f2dfab20f3b9d69df745f5
parent5d1c0c58ad137eaa1ec31440afe0b757f3f9ab8b (diff)
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.
-rw-r--r--src/tty.c35
1 files changed, 13 insertions, 22 deletions
diff --git a/src/tty.c b/src/tty.c
index e029d55..135cdad 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)
@@ -65,18 +65,6 @@ static int vt_handler(int signal_number, void *data)
}
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)
{
int tty0, fd;
@@ -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);