#define GRUB_TERM_HEADER 1
/* Internal codes used by GRUB to represent terminal input. */
-#define GRUB_TERM_LEFT 2
-#define GRUB_TERM_RIGHT 6
-#define GRUB_TERM_UP 16
-#define GRUB_TERM_DOWN 14
-#define GRUB_TERM_HOME 1
-#define GRUB_TERM_END 5
-#define GRUB_TERM_DC 4
-#define GRUB_TERM_PPAGE 7
-#define GRUB_TERM_NPAGE 3
+#define GRUB_TERM_CTRL 0x02000000
+#define GRUB_TERM_ALT 0x04000000
+/* Used by keylayouts code. Never returned in grub_getkey. */
+#define GRUB_TERM_ALT_GR 0x08000000
+#define GRUB_TERM_CAPS 0x10000000
+
+/* Keys without associated character. */
+#define GRUB_TERM_EXTENDED 0x1000000
+#define GRUB_TERM_KEY_MASK 0x1ffffff
+#define GRUB_TERM_KEY_LEFT (GRUB_TERM_EXTENDED | 1)
+#define GRUB_TERM_KEY_RIGHT (GRUB_TERM_EXTENDED | 2)
+#define GRUB_TERM_KEY_UP (GRUB_TERM_EXTENDED | 3)
+#define GRUB_TERM_KEY_DOWN (GRUB_TERM_EXTENDED | 4)
+#define GRUB_TERM_KEY_HOME (GRUB_TERM_EXTENDED | 5)
+#define GRUB_TERM_KEY_END (GRUB_TERM_EXTENDED | 6)
+#define GRUB_TERM_KEY_DC (GRUB_TERM_EXTENDED | 7)
+#define GRUB_TERM_KEY_PPAGE (GRUB_TERM_EXTENDED | 8)
+#define GRUB_TERM_KEY_NPAGE (GRUB_TERM_EXTENDED | 9)
++
+/* Used by keylayouts code. Never returned in grub_getkey. */
+#define GRUB_TERM_KEY_102 (GRUB_TERM_EXTENDED | 10)
+#define GRUB_TERM_KEY_SHIFT_102 (GRUB_TERM_EXTENDED | 11)
+
#define GRUB_TERM_ESC '\e'
#define GRUB_TERM_TAB '\t'
-#define GRUB_TERM_BACKSPACE 8
+#define GRUB_TERM_BACKSPACE '\b'
#ifndef ASM_FILE
const char *name;
/* Initialize the terminal. */
- grub_err_t (*init) (void);
+ grub_err_t (*init) (struct grub_term_input *term);
/* Clean up the terminal. */
- grub_err_t (*fini) (void);
+ grub_err_t (*fini) (struct grub_term_input *term);
/* Check if any input character is available. */
- int (*checkkey) (void);
+ int (*checkkey) (struct grub_term_input *term);
/* Get a character. */
- int (*getkey) (void);
+ int (*getkey) (struct grub_term_input *term);
/* Get keyboard modifier status. */
- int (*getkeystatus) (void);
+ int (*getkeystatus) (struct grub_term_input *term);
+ grub_uint32_t flags;
++
+ void *data;
};
typedef struct grub_term_input *grub_term_input_t;
GRUB_AS_LIST (term));
}
- #define FOR_ACTIVE_TERM_INPUTS(var) for (var = grub_term_inputs; var; var = var->next)
- #define FOR_DISABLED_TERM_INPUTS(var) for (var = grub_term_inputs_disabled; var; var = var->next)
- #define FOR_ACTIVE_TERM_OUTPUTS(var) for (var = grub_term_outputs; var; var = var->next)
- #define FOR_DISABLED_TERM_OUTPUTS(var) for (var = grub_term_outputs_disabled; var; var = var->next)
+ #define FOR_ACTIVE_TERM_INPUTS(var) FOR_LIST_ELEMENTS((var), (grub_term_inputs))
+ #define FOR_DISABLED_TERM_INPUTS(var) FOR_LIST_ELEMENTS((var), (grub_term_inputs_disabled))
+ #define FOR_ACTIVE_TERM_OUTPUTS(var) FOR_LIST_ELEMENTS((var), (grub_term_outputs))
+ #define FOR_DISABLED_TERM_OUTPUTS(var) FOR_LIST_ELEMENTS((var), (grub_term_outputs_disabled))
- void EXPORT_FUNC(grub_putchar) (int c);
- void EXPORT_FUNC(grub_putcode) (grub_uint32_t code,
- struct grub_term_output *term);
+ void grub_putcode (grub_uint32_t code, struct grub_term_output *term);
-int EXPORT_FUNC(grub_getkey) (void);
-int EXPORT_FUNC(grub_checkkey) (void);
-int EXPORT_FUNC(grub_getkeystatus) (void);
+extern int (*EXPORT_VAR(grub_getkey)) (void);
+int grub_checkkey (void);
- void EXPORT_FUNC(grub_cls) (void);
- void EXPORT_FUNC(grub_setcolorstate) (grub_term_color_state state);
+ void grub_cls (void);
void EXPORT_FUNC(grub_refresh) (void);
void grub_puts_terminal (const char *str, struct grub_term_output *term);
grub_uint16_t *grub_term_save_pos (void);
}
}
-int
-grub_getkey (void)
+ void (*grub_xputs) (const char *str) = grub_xputs_dumb;
+
+static int
+grub_getkey_dumb (void)
{
grub_term_input_t term;
{
FOR_ACTIVE_TERM_INPUTS(term)
{
- int key = term->checkkey ();
+ int key = term->checkkey (term);
if (key != -1)
- return term->getkey () & 0xff;
- return term->getkey (term);
++ return term->getkey (term) & 0xff;
}
grub_cpu_idle ();
}
}
-int
-grub_checkkey (void)
-{
- grub_term_input_t term;
-
- FOR_ACTIVE_TERM_INPUTS(term)
- {
- int key = term->checkkey (term);
- if (key != -1)
- return key;
- }
-
- return -1;
-}
-
-int
-grub_getkeystatus (void)
-{
- int status = 0;
- grub_term_input_t term;
-
- FOR_ACTIVE_TERM_INPUTS(term)
- {
- if (term->getkeystatus)
- status |= term->getkeystatus (term);
- }
-
- return status;
-}
+int (*grub_getkey) (void) = grub_getkey_dumb;
- void
- grub_cls (void)
- {
- struct grub_term_output *term;
-
- FOR_ACTIVE_TERM_OUTPUTS(term)
- {
- if ((term->flags & GRUB_TERM_DUMB) || (grub_env_get ("debug")))
- {
- grub_putcode ('\n', term);
- grub_term_refresh (term);
- }
- else
- (term->cls) ();
- }
- }
-
- void
- grub_setcolorstate (grub_term_color_state state)
- {
- struct grub_term_output *term;
-
- FOR_ACTIVE_TERM_OUTPUTS(term)
- grub_term_setcolorstate (term, state);
- }
-
void
grub_refresh (void)
{