tty: Put console in K_OFF mode
authorKristian Høgsberg <krh@bitplanet.net>
Tue, 10 Apr 2012 04:18:33 +0000 (00:18 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 10 Apr 2012 04:35:15 +0000 (00:35 -0400)
This disables all kernel key bindings (VT switch keybindings, caps lock
etc) and disables delivery of console input.

src/tty.c

index e029d55..135cdad 100644 (file)
--- 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);