diff options
| author | Ray Strode <rstrode@redhat.com> | 2008-05-18 19:09:16 -0400 |
|---|---|---|
| committer | Ray Strode <rstrode@redhat.com> | 2008-05-18 19:09:16 -0400 |
| commit | 413270724bdcb3cf635efbd3874f76b11781dce9 (patch) | |
| tree | 101f74688933b4f94e5131106edd3755554b22ea /src | |
| parent | 64198914dac53e21b5de259efda79878d080c496 (diff) | |
Set active terminal into non-canonical mode
We want to be able to gain access to key presses immediately,
so we can pass them on to the splash plugin to display to the
user in some form. The "pass to the splash plugin" part isn't
implemented yet.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ply-window.c | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/src/ply-window.c b/src/ply-window.c index bc0bfec..b0be590 100644 --- a/src/ply-window.c +++ b/src/ply-window.c @@ -32,6 +32,7 @@ #include <sys/socket.h> #include <sys/stat.h> #include <sys/types.h> +#include <termios.h> #include <unistd.h> #include <linux/kd.h> @@ -47,6 +48,7 @@ struct _ply_window char *tty_name; int tty_fd; + ply_fd_watch_t *tty_fd_watch; ply_window_mode_t mode; }; @@ -66,6 +68,28 @@ ply_window_new (const char *tty_name) return window; } +static void +on_key_event (ply_window_t *window) +{ + char buffer[64] = ""; + + ply_read (window->tty_fd, buffer, sizeof (buffer) - 1); +} + +bool +ply_window_set_unbuffered_input (ply_window_t *window) +{ + struct termios term_attributes; + + tcgetattr (window->tty_fd, &term_attributes); + term_attributes.c_lflag &= ~ICANON; + + if (tcsetattr (window->tty_fd, TCSAFLUSH, &term_attributes) != 0) + return false; + + return true; +} + bool ply_window_open (ply_window_t *window) { @@ -78,9 +102,18 @@ ply_window_open (ply_window_t *window) if (window->tty_fd < 0) return false; + if (!ply_window_set_unbuffered_input (window)) + return false; + if (!ply_window_set_mode (window, PLY_WINDOW_MODE_TEXT)) return false; + if (window->loop != NULL) + window->tty_fd_watch = ply_event_loop_watch_fd (window->loop, window->tty_fd, + PLY_EVENT_LOOP_FD_STATUS_HAS_DATA, + (ply_event_handler_t) on_key_event, + NULL, window); + return true; } @@ -89,6 +122,12 @@ ply_window_close (ply_window_t *window) { ply_window_set_mode (window, PLY_WINDOW_MODE_TEXT); + if (window->tty_fd_watch != NULL) + { + ply_event_loop_stop_watching_fd (window->loop, window->tty_fd_watch); + window->tty_fd_watch = NULL; + } + close (window->tty_fd); window->tty_fd = -1; } @@ -134,11 +173,12 @@ ply_window_detach_from_event_loop (ply_window_t *window) { assert (window != NULL); window->loop = NULL; + window->tty_fd_watch = NULL; } void -ply_window_attach_to_event_loop (ply_window_t *window, - ply_event_loop_t *loop) +ply_window_attach_to_event_loop (ply_window_t *window, + ply_event_loop_t *loop) { assert (window != NULL); assert (loop != NULL); @@ -146,6 +186,12 @@ ply_window_attach_to_event_loop (ply_window_t *window, window->loop = loop; + if (window->tty_fd >= 0) + window->tty_fd_watch = ply_event_loop_watch_fd (window->loop, window->tty_fd, + PLY_EVENT_LOOP_FD_STATUS_HAS_DATA, + (ply_event_handler_t) on_key_event, + NULL, window); + ply_event_loop_watch_for_exit (loop, (ply_event_loop_exit_handler_t) ply_window_detach_from_event_loop, window); @@ -202,7 +248,7 @@ main (int argc, } ply_event_loop_watch_for_timeout (loop, - 1.0, + 15.0, (ply_event_loop_timeout_handler_t) on_timeout, window); |
