]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Imported nyu's multi-input
authorRobert Millan <rmh@aybabtu.com>
Thu, 24 Dec 2009 16:08:14 +0000 (17:08 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Thu, 24 Dec 2009 16:08:14 +0000 (17:08 +0100)
commands/keystatus.c
include/grub/term.h
kern/misc.c
kern/term.c
util/console.c
util/grub-editenv.c

index 0a46676459c530dd54f6c742fc3e1a22c2a2753e..1bb22bde38ec35d9d252dc7108709fa7449901de 100644 (file)
@@ -48,13 +48,20 @@ grub_cmd_keystatus (grub_extcmd_t cmd,
   if (state[2].set)
     expect_mods |= GRUB_TERM_STATUS_ALT;
 
+  grub_dprintf ("keystatus", "expect_mods: %d\n", expect_mods);
+
   /* Without arguments, just check whether getkeystatus is supported at
      all.  */
-  if (!grub_cur_term_input->getkeystatus)
-    return grub_error (GRUB_ERR_TEST_FAILURE, "false");
-  grub_dprintf ("keystatus", "expect_mods: %d\n", expect_mods);
-  if (!expect_mods)
-    return 0;
+  if (expect_mods == 0)
+    {
+      grub_term_input_t term;
+
+      FOR_ACTIVE_TERM_INPUTS (term)
+       if (term->getkeystatus)
+         return 0;
+
+      return grub_error (GRUB_ERR_TEST_FAILURE, "false");
+    }
 
   mods = grub_getkeystatus ();
   grub_dprintf ("keystatus", "mods: %d\n", mods);
index a0b96b4973a5b22ca856dc3f8a35797498c3d1d8..fb9ed6f0c4d889d4654ec0ee0d5124ec44797f9c 100644 (file)
@@ -197,14 +197,14 @@ struct grub_term_output
 };
 typedef struct grub_term_output *grub_term_output_t;
 
-extern struct grub_handler_class EXPORT_VAR(grub_term_input_class);
 extern struct grub_term_output *EXPORT_VAR(grub_term_outputs);
+extern struct grub_term_input *EXPORT_VAR(grub_term_inputs);
 
 static inline void
 grub_term_register_input (const char *name __attribute__ ((unused)),
                          grub_term_input_t term)
 {
-  grub_handler_register (&grub_term_input_class, GRUB_AS_HANDLER (term));
+  grub_list_push (GRUB_AS_LIST_P (&grub_term_inputs), GRUB_AS_LIST (term));
 }
 
 static inline void
@@ -217,7 +217,7 @@ grub_term_register_output (const char *name __attribute__ ((unused)),
 static inline void
 grub_term_unregister_input (grub_term_input_t term)
 {
-  grub_handler_unregister (&grub_term_input_class, GRUB_AS_HANDLER (term));
+  grub_list_remove (GRUB_AS_LIST_P (&grub_term_inputs), GRUB_AS_LIST (term));
 }
 
 static inline void
@@ -226,18 +226,7 @@ grub_term_unregister_output (grub_term_output_t term)
   grub_list_remove (GRUB_AS_LIST_P (&grub_term_outputs), GRUB_AS_LIST (term));
 }
 
-static inline grub_err_t
-grub_term_set_current_input (grub_term_input_t term)
-{
-  return grub_handler_set_current (&grub_term_input_class,
-                                  GRUB_AS_HANDLER (term));
-}
-
-static inline grub_term_input_t
-grub_term_get_current_input (void)
-{
-  return (grub_term_input_t) grub_term_input_class.cur_handler;
-}
+#define FOR_ACTIVE_TERM_INPUTS(var) for (var = grub_term_inputs; var; var = var->next)
 
 void EXPORT_FUNC(grub_putchar) (int c);
 void EXPORT_FUNC(grub_putcode) (grub_uint32_t code,
index ef782f5ddeb0ef13cd6396169500941eead71c6e..af6f97758f998de9033f047c28b03e9dc51ef3d2 100644 (file)
@@ -975,7 +975,9 @@ grub_abort (void)
 {
   grub_printf ("\nAborted.");
   
-  if (grub_term_get_current_input ())
+#ifndef GRUB_UTIL
+  if (grub_term_inputs)
+#endif
     {
       grub_printf (" Press any key to exit.");
       grub_getkey ();
index d0d29eb9cff5eeb05d1892ea9205ad5811b64e21..9ce906719277e0c4292b8f73b85f63e9d7cdef7c 100644 (file)
 #include <grub/mm.h>
 #include <grub/misc.h>
 #include <grub/env.h>
-
-struct grub_handler_class grub_term_input_class =
-  {
-    .name = "terminal_input"
-  };
-
-#define grub_cur_term_input    grub_term_get_current_input ()
+#include <grub/cpu/time.h>
 
 struct grub_term_output *grub_term_outputs;
+struct grub_term_input *grub_term_inputs;
 
 void (*grub_newline_hook) (void) = NULL;
 
@@ -85,22 +80,49 @@ grub_putchar (int c)
 int
 grub_getkey (void)
 {
-  return (grub_cur_term_input->getkey) ();
+  grub_term_input_t term;
+
+  while (1)
+    {
+      FOR_ACTIVE_TERM_INPUTS(term)
+      {
+       int key = term->checkkey ();
+       if (key != -1)
+         return term->getkey ();
+      }
+
+      grub_cpu_idle ();
+    }
 }
 
 int
 grub_checkkey (void)
 {
-  return (grub_cur_term_input->checkkey) ();
+  grub_term_input_t term;
+
+  FOR_ACTIVE_TERM_INPUTS(term)
+  {
+    int key = term->checkkey ();
+    if (key != -1)
+      return key;
+  }
+
+  return -1;
 }
 
 int
 grub_getkeystatus (void)
 {
-  if (grub_cur_term_input->getkeystatus)
-    return (grub_cur_term_input->getkeystatus) ();
-  else
-    return 0;
+  int status = 0;
+  grub_term_input_t term;
+
+  FOR_ACTIVE_TERM_INPUTS(term)
+  {
+    if (term->getkeystatus)
+      status |= term->getkeystatus ();
+  }
+
+  return status;
 }
 
 void
index d9a907308abeb1e8ee00c743c796b14a82cef6cf..be64eb9d8a266287eeded0281b0c37c71011ee53 100644 (file)
@@ -377,7 +377,6 @@ grub_console_init (void)
   grub_term_register_output ("console", &grub_ncurses_term_output);
   grub_term_register_input ("console", &grub_ncurses_term_input);
   grub_term_set_current_output (&grub_ncurses_term_output);
-  grub_term_set_current_input (&grub_ncurses_term_input);
 }
 
 void
index 68fb23b158b3dd258941a2ef6a1c1f036967874d..e758924303734331f120c3fc96ab05118313f7a5 100644 (file)
@@ -46,9 +46,6 @@ grub_refresh (void)
   fflush (stdout);
 }
 
-struct grub_handler_class grub_term_input_class;
-struct grub_handler_class grub_term_output_class;
-
 int
 grub_getkey (void)
 {