]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
buffer key presses until full characters are read, and then dispatch characters to...
authorRay Strode <rstrode@redhat.com>
Mon, 19 May 2008 02:40:56 +0000 (22:40 -0400)
committerRay Strode <rstrode@redhat.com>
Mon, 19 May 2008 02:56:07 +0000 (22:56 -0400)
src/ply-boot-splash.c
src/ply-window.c
src/ply-window.h

index 4a1f93c0785f4976df1a3b2c1ca1d020e8a52b6e..9cc9ba5d56dcd54160e704115056c7ab793747e4 100644 (file)
@@ -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))
     {
index b0be590331afa112cf4b1e61843401a477529461..6181469c7a9193ead83030eab25f5db04d663111 100644 (file)
 #include <sys/types.h>
 #include <termios.h>
 #include <unistd.h>
+#include <wchar.h>
 
 #include <linux/kd.h>
 
+#include "ply-buffer.h"
 #include "ply-event-loop.h"
 #include "ply-logger.h"
 #include "ply-utils.h"
 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");
index da032389891c9bd794368a2fca9d82c1781158c3..8c9db255725a96d69c6c6a36ed24fda07bf57b97 100644 (file)
@@ -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);