From: Ray Strode Date: Mon, 19 May 2008 02:40:56 +0000 (-0400) Subject: buffer key presses until full characters are read, and then dispatch characters to... X-Git-Tag: 0.1.0~117 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b0f2e44af979924711786e6966cbb974409e799;p=thirdparty%2Fplymouth.git buffer key presses until full characters are read, and then dispatch characters to keyboard input handler --- diff --git a/src/ply-boot-splash.c b/src/ply-boot-splash.c index 4a1f93c0..9cc9ba5d 100644 --- a/src/ply-boot-splash.c +++ b/src/ply-boot-splash.c @@ -146,7 +146,8 @@ ply_boot_splash_unload_plugin (ply_boot_splash_t *splash) static bool ply_boot_splash_create_window (ply_boot_splash_t *splash) { - splash->window = ply_window_new ("/dev/tty1"); + splash->window = ply_window_new ("/dev/tty1", + NULL, NULL); if (!ply_window_open (splash->window)) { diff --git a/src/ply-window.c b/src/ply-window.c index b0be5903..6181469c 100644 --- a/src/ply-window.c +++ b/src/ply-window.c @@ -34,9 +34,11 @@ #include #include #include +#include #include +#include "ply-buffer.h" #include "ply-event-loop.h" #include "ply-logger.h" #include "ply-utils.h" @@ -44,36 +46,77 @@ struct _ply_window { ply_event_loop_t *loop; + ply_buffer_t *buffer; char *tty_name; int tty_fd; ply_fd_watch_t *tty_fd_watch; ply_window_mode_t mode; + + ply_window_keyboard_input_handler_t keyboard_input_handler; + void *keyboard_input_handler_user_data; }; ply_window_t * -ply_window_new (const char *tty_name) +ply_window_new (const char *tty_name, + ply_window_keyboard_input_handler_t input_handler, + void *user_data) { ply_window_t *window; assert (tty_name != NULL); window = calloc (1, sizeof (ply_window_t)); + window->buffer = ply_buffer_new (); window->loop = NULL; window->tty_name = strdup (tty_name); window->tty_fd = -1; + window->keyboard_input_handler = input_handler; + window->keyboard_input_handler_user_data = user_data; return window; } +static void +check_buffer_for_key_events (ply_window_t *window) +{ + const char *bytes; + size_t size, i; + + bytes = ply_buffer_get_bytes (window->buffer); + size = ply_buffer_get_size (window->buffer); + + i = 0; + while (i < size) + { + ssize_t character_size; + char *key; + + character_size = (ssize_t) mbrlen (bytes + i, size - i, NULL); + + if (character_size < 0) + break; + + key = strndup (bytes + i, character_size); + if (window->keyboard_input_handler != NULL) + window->keyboard_input_handler (window->keyboard_input_handler_user_data, + key); + free (key); + + i += character_size; + } + + ply_buffer_remove_bytes (window->buffer, i); +} + static void on_key_event (ply_window_t *window) { - char buffer[64] = ""; + ply_buffer_append_from_fd (window->buffer, window->tty_fd); - ply_read (window->tty_fd, buffer, sizeof (buffer) - 1); + check_buffer_for_key_events (window); } bool @@ -165,6 +208,8 @@ ply_window_free (ply_window_t *window) ply_window_set_mode (window, PLY_WINDOW_MODE_TEXT); ply_window_close (window); + ply_buffer_free (window->buffer); + free (window); } @@ -211,6 +256,14 @@ on_timeout (ply_window_t *window, ply_event_loop_exit (loop, 0); } +static void +on_keypress (ply_window_t *window, + const char *keyboard_input) +{ + printf ("key '%c' (0x%x) was pressed\n", + keyboard_input[0], (unsigned int) keyboard_input[0]); +} + int main (int argc, char **argv) @@ -229,7 +282,9 @@ main (int argc, else tty_name = "/dev/tty1"; - window = ply_window_new (tty_name); + window = ply_window_new (tty_name, + (ply_window_keyboard_input_handler_t) + on_keypress, window); ply_window_attach_to_event_loop (window, loop); if (!ply_window_open (window)) @@ -240,7 +295,7 @@ main (int argc, return errno; } - if (!ply_window_set_mode (window, PLY_WINDOW_MODE_GRAPHICS)) + if (!ply_window_set_mode (window, PLY_WINDOW_MODE_TEXT)) { ply_save_errno (); perror ("could not set window for graphics mode"); diff --git a/src/ply-window.h b/src/ply-window.h index da032389..8c9db255 100644 --- a/src/ply-window.h +++ b/src/ply-window.h @@ -30,6 +30,9 @@ typedef struct _ply_window ply_window_t; +typedef void (* ply_window_keyboard_input_handler_t) (void *user_data, + const char *keyboard_input); + typedef enum { PLY_WINDOW_MODE_TEXT, @@ -37,7 +40,9 @@ typedef enum } ply_window_mode_t; #ifndef PLY_HIDE_FUNCTION_DECLARATIONS -ply_window_t *ply_window_new (const char *tty_name); +ply_window_t *ply_window_new (const char *tty_name, + ply_window_keyboard_input_handler_t input_handler, + void *user_data); void ply_window_free (ply_window_t *window); bool ply_window_open (ply_window_t *window);