summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2008-05-18 19:09:16 -0400
committerRay Strode <rstrode@redhat.com>2008-05-18 19:09:16 -0400
commit413270724bdcb3cf635efbd3874f76b11781dce9 (patch)
tree101f74688933b4f94e5131106edd3755554b22ea /src
parent64198914dac53e21b5de259efda79878d080c496 (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.c52
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);