#include <grub/env.h>
#include <grub/time.h>
#include <grub/dl.h>
-#include <grub/at_keyboard.h>
#include <grub/keyboard_layouts.h>
#include <grub/command.h>
#include <grub/gzio.h>
#include <grub/i18n.h>
-GRUB_AT_KEY_KEYBOARD_MAP (keyboard_map);
-
-static int
-get_abstract_code (grub_term_input_t term, int in)
-{
- switch (term->flags & GRUB_TERM_INPUT_FLAGS_TYPE_MASK)
- {
- case GRUB_TERM_INPUT_FLAGS_TYPE_TERMCODES:
- default:
- return in;
- case GRUB_TERM_INPUT_FLAGS_TYPE_BIOS:
- {
- unsigned status = 0;
- unsigned flags = 0;
-
- if (term->getkeystatus)
- status = term->getkeystatus (term);
- if (status & GRUB_TERM_CAPS)
- flags |= GRUB_TERM_CAPS;
-
- if ((0x5600 | '\\') == (in & 0xffff))
- return GRUB_TERM_KEY_102 | flags;
-
- if ((0x5600 | '|') == (in & 0xffff))
- return GRUB_TERM_KEY_SHIFT_102 | flags;
-
- if ((in & 0xff00) == 0x3500 || (in & 0xff00) == 0x3700
- || (in & 0xff00) == 0x4500
- || ((in & 0xff00) >= 0x4700 && (in & 0xff00) <= 0x5300))
- flags |= GRUB_TERM_KEYPAD;
-
- /* Detect CTRL'ed keys. */
- if ((in & 0xff) > 0 && (in & 0xff) < 0x20
- && ((in & 0xffff) != (0x0100 | '\e'))
- && ((in & 0xffff) != (0x0f00 | '\t'))
- && ((in & 0xffff) != (0x0e00 | '\b'))
- && ((in & 0xffff) != (0x1c00 | '\r'))
- && ((in & 0xffff) != (0x1c00 | '\n')))
- return ((in & 0xff) - 1 + 'a') | flags | GRUB_TERM_CTRL;
- /* Detect ALT'ed keys. */
- /* XXX no way to distinguish left and right ALT. */
- if (((in & 0xff) == 0) && keyboard_map[(in & 0xff00) >> 8] >= 'a'
- && keyboard_map[(in & 0xff00) >> 8] <= 'z')
- return keyboard_map[(in & 0xff00) >> 8] | flags | GRUB_TERM_ALT_GR;
- if ((in & 0xff) == 0 && (in & 0xff00) >= 0x7800
- && (in & 0xff00) <= 0x8000)
- return (((in & 0xff00) >> 8) - 0x78 + '1') | flags | GRUB_TERM_ALT_GR;
-
- if ((in & 0xff00) == 0x8100)
- return '0' | flags | GRUB_TERM_ALT_GR;
-
- if ((in & 0xffff) == 0x8200)
- return '-' | flags | GRUB_TERM_ALT_GR;
-
- if ((in & 0xffff) == 0x8300)
- return '+' | flags | GRUB_TERM_ALT_GR;
-
- if ((in & 0xff) == 0)
- return keyboard_map[(in & 0xff00) >> 8] | flags;
-
- return (in & 0xff) | flags;
- }
- }
-}
-
-static grub_uint32_t mapping[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
-static grub_uint32_t mapping_alt[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
-
-static unsigned
-map (grub_term_input_t term __attribute__ ((unused)), unsigned in)
-{
- if (in & GRUB_TERM_KEYPAD)
- return in;
-
- if ((in & GRUB_TERM_EXTENDED) || (in & GRUB_TERM_KEY_MASK) == '\b'
- || (in & GRUB_TERM_KEY_MASK) == '\n' || (in & GRUB_TERM_KEY_MASK) == ' '
- || (in & GRUB_TERM_KEY_MASK) == '\t' || (in & GRUB_TERM_KEY_MASK) == '\e'
- || (in & GRUB_TERM_KEY_MASK) == '\r'
- || (in & GRUB_TERM_KEY_MASK) >= ARRAY_SIZE (mapping))
- return in;
-
- if ((in & GRUB_TERM_ALT_GR) && mapping_alt[in & GRUB_TERM_KEY_MASK])
- return mapping_alt[in & GRUB_TERM_KEY_MASK] | (in & ~GRUB_TERM_KEY_MASK & ~GRUB_TERM_ALT_GR);
-
- return mapping[in & GRUB_TERM_KEY_MASK] | (in & ~GRUB_TERM_KEY_MASK);
-}
-
-static int
-translate (grub_term_input_t term, int in)
-{
- int code, flags;
- code = get_abstract_code (term, in);
-
- flags = code & ~(GRUB_TERM_KEY_MASK | GRUB_TERM_ALT_GR | GRUB_TERM_KEYPAD | GRUB_TERM_CAPS);
-
- if ((code & GRUB_TERM_CAPS) && (code & GRUB_TERM_KEY_MASK) >= 'a'
- && (code & GRUB_TERM_KEY_MASK) <= 'z')
- code = (code & GRUB_TERM_KEY_MASK) + 'A' - 'a';
- else if ((code & GRUB_TERM_CAPS) && (code & GRUB_TERM_KEY_MASK) >= 'A'
- && (code & GRUB_TERM_KEY_MASK) <= 'Z')
- code = (code & GRUB_TERM_KEY_MASK) + 'a' - 'A';
-
- code &= (GRUB_TERM_KEY_MASK | GRUB_TERM_ALT_GR | GRUB_TERM_KEYPAD);
- code = map (term, code);
- /* Transform unconsumed AltGr into Alt. */
- if (code & GRUB_TERM_ALT_GR)
- {
- flags |= GRUB_TERM_ALT;
- code &= ~GRUB_TERM_ALT_GR;
- }
- code &= ~GRUB_TERM_KEYPAD;
-
- if ((flags & GRUB_TERM_CAPS) && code >= 'a' && code <= 'z')
- code += 'A' - 'a';
- else if ((flags & GRUB_TERM_CAPS) && code >= 'A'
- && code <= 'Z')
- code += 'a' - 'A';
- return code | flags;
-}
-
-static int
-grub_getkey_smart (void)
-{
- grub_term_input_t term;
-
- grub_refresh ();
-
- while (1)
- {
- FOR_ACTIVE_TERM_INPUTS(term)
- {
- int key = term->checkkey (term);
- if (key != -1)
- return translate (term, term->getkey (term));
- }
-
- 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 translate (term, key);
- }
-
- return -1;
-}
-
static grub_err_t
grub_cmd_keymap (struct grub_command *cmd __attribute__ ((unused)),
int argc, char *argv[])
grub_file_t file;
grub_uint32_t version;
grub_uint8_t magic[GRUB_KEYBOARD_LAYOUTS_FILEMAGIC_SIZE];
- grub_uint32_t newmapping[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
- grub_uint32_t newmapping_alt[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
+ struct grub_keyboard_layout *newmap = NULL;
unsigned i;
if (argc < 1)
goto fail;
}
- if (grub_file_read (file, newmapping, sizeof (newmapping))
- != sizeof (newmapping))
- {
- if (!grub_errno)
- grub_error (GRUB_ERR_BAD_ARGUMENT, "file is too short");
- goto fail;
- }
+ newmap = grub_malloc (sizeof (*newmap));
+ if (!newmap)
+ goto fail;
- if (grub_file_read (file, newmapping_alt, sizeof (newmapping_alt))
- != sizeof (newmapping_alt))
+ if (grub_file_read (file, newmap, sizeof (*newmap)) != sizeof (*newmap))
{
if (!grub_errno)
grub_error (GRUB_ERR_BAD_ARGUMENT, "file is too short");
goto fail;
}
- for (i = 0; i < ARRAY_SIZE (mapping); i++)
- mapping[i] = grub_le_to_cpu32(newmapping[i]);
+ for (i = 0; i < ARRAY_SIZE (newmap->at.keyboard_map); i++)
+ newmap->at.keyboard_map[i] = grub_le_to_cpu32(newmap->at.keyboard_map[i]);
+
+ for (i = 0; i < ARRAY_SIZE (newmap->at.keyboard_map_shift); i++)
+ newmap->at.keyboard_map_shift[i]
+ = grub_le_to_cpu32(newmap->at.keyboard_map_shift[i]);
- for (i = 0; i < ARRAY_SIZE (mapping_alt); i++)
- mapping_alt[i] = grub_le_to_cpu32(newmapping_alt[i]);
+ for (i = 0; i < ARRAY_SIZE (newmap->at.keyboard_map_l3); i++)
+ newmap->at.keyboard_map_l3[i]
+ = grub_le_to_cpu32(newmap->at.keyboard_map_l3[i]);
+
+ for (i = 0; i < ARRAY_SIZE (newmap->at.keyboard_map_shift_l3); i++)
+ newmap->at.keyboard_map_shift_l3[i]
+ = grub_le_to_cpu32(newmap->at.keyboard_map_shift_l3[i]);
return GRUB_ERR_NONE;
fail:
if (filename != argv[0])
grub_free (filename);
+ grub_free (newmap);
if (file)
grub_file_close (file);
return grub_errno;
}
-static int (*grub_getkey_saved) (void);
-
static grub_command_t cmd;
GRUB_MOD_INIT(keylayouts)
{
- unsigned i;
- for (i = 0; i < ARRAY_SIZE (mapping); i++)
- mapping[i] = i;
- grub_memset (mapping_alt, 0, sizeof (mapping_alt));
- mapping[GRUB_TERM_KEY_102] = '\\';
- mapping[GRUB_TERM_KEY_SHIFT_102] = '|';
-
- grub_getkey_saved = grub_getkey;
- grub_getkey = grub_getkey_smart;
-
cmd = grub_register_command ("keymap", grub_cmd_keymap,
0, N_("Load a keyboard layout."));
}
GRUB_MOD_FINI(keylayouts)
{
- grub_getkey = grub_getkey_saved;
+ grub_current_layout = NULL;
grub_unregister_command (cmd);
}
#define OLPC_RIGHT '\0'
#endif
-#define GRUB_AT_KEY_KEYBOARD_MAP(name) \
-static const unsigned name[128] = \
-{ \
- /* 0x00 */ '\0', GRUB_TERM_ESC, '1', '2', '3', '4', '5', '6', \
- /* 0x08 */ '7', '8', '9', '0', \
- /* 0x0c */ '-', '=', GRUB_TERM_BACKSPACE, GRUB_TERM_TAB, \
- /* 0x10 */ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', \
- /* 0x18 */ 'o', 'p', '[', ']', '\n', '\0', 'a', 's', \
- /* 0x20 */ 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', \
- /* 0x28 */ '\'', '`', '\0', '\\', 'z', 'x', 'c', 'v', \
- /* 0x30 */ 'b', 'n', 'm', ',', '.', '/', '\0', '*' | GRUB_TERM_KEYPAD, \
- /* 0x38 */ '\0', ' ', '\0', GRUB_TERM_KEY_F1, \
- /* 0x3c */ GRUB_TERM_KEY_F2, GRUB_TERM_KEY_F3, \
- /* 0x3e */ GRUB_TERM_KEY_F4, GRUB_TERM_KEY_F5, \
- /* 0x40 */ GRUB_TERM_KEY_F6, GRUB_TERM_KEY_F7, \
- /* 0x42 */ GRUB_TERM_KEY_F8, GRUB_TERM_KEY_F9, \
- /* 0x44 */ GRUB_TERM_KEY_F10, '\0', \
- /* 0x46 */ '\0', GRUB_TERM_KEY_HOME, \
- /* 0x48 */ GRUB_TERM_KEY_UP, \
- /* 0x49 */ GRUB_TERM_KEY_NPAGE, \
- /* 0x4a */ '-' | GRUB_TERM_KEYPAD, \
- /* 0x4b */ GRUB_TERM_KEY_LEFT, \
- /* 0x4c */ GRUB_TERM_KEY_CENTER | GRUB_TERM_KEYPAD, \
- /* 0x4d */ GRUB_TERM_KEY_RIGHT, \
- /* 0x4e */ '+' | GRUB_TERM_KEYPAD, \
- /* 0x4f */ GRUB_TERM_KEY_END, \
- /* 0x50 */ GRUB_TERM_KEY_DOWN, \
- /* 0x51 */ GRUB_TERM_KEY_PPAGE, \
- /* 0x52 */ GRUB_TERM_KEY_INSERT, \
- /* 0x53 */ GRUB_TERM_KEY_DC, \
- /* 0x54 */ '\0', '\0', GRUB_TERM_KEY_102, GRUB_TERM_KEY_F11, \
- /* 0x58 */ GRUB_TERM_KEY_F12, '\0', '\0', '\0', '\0', '\0', '\0', '\0', \
- /* 0x60 */ '\0', '\0', '\0', '\0', '\0', OLPC_UP, OLPC_DOWN, OLPC_LEFT, \
- /* 0x68 */ OLPC_RIGHT \
-}
-
-#define GRUB_AT_KEY_KEYBOARD_MAP_SHIFT(name) \
-static unsigned name[128] = \
-{ \
- '\0', '\0', '!', '@', '#', '$', '%', '^', \
- '&', '*', '(', ')', '_', '+', '\0', '\0', \
- 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', \
- 'O', 'P', '{', '}', '\n', '\0', 'A', 'S', \
- 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', \
- '\"', '~', '\0', '|', 'Z', 'X', 'C', 'V', \
- 'B', 'N', 'M', '<', '>', '?', \
- [0x56] = GRUB_TERM_KEY_SHIFT_102 \
-}
-
#endif
#ifndef GRUB_CONSOLE_MACHINE_HEADER
#define GRUB_CONSOLE_MACHINE_HEADER 1
-/* Define scan codes. */
-#define GRUB_CONSOLE_KEY_LEFT 0x4B00
-#define GRUB_CONSOLE_KEY_RIGHT 0x4D00
-#define GRUB_CONSOLE_KEY_UP 0x4800
-#define GRUB_CONSOLE_KEY_DOWN 0x5000
-#define GRUB_CONSOLE_KEY_IC 0x5200
-#define GRUB_CONSOLE_KEY_DC 0x5300
-#define GRUB_CONSOLE_KEY_BACKSPACE 0x0008
-#define GRUB_CONSOLE_KEY_HOME 0x4700
-#define GRUB_CONSOLE_KEY_END 0x4F00
-#define GRUB_CONSOLE_KEY_NPAGE 0x5100
-#define GRUB_CONSOLE_KEY_PPAGE 0x4900
-
#ifndef ASM_FILE
#include <grub/types.h>
#define GRUB_KEYBOARD_LAYOUTS_FILEMAGIC "GRUBLAYO"
#define GRUB_KEYBOARD_LAYOUTS_FILEMAGIC_SIZE (sizeof(GRUB_KEYBOARD_LAYOUTS_FILEMAGIC) - 1)
-#define GRUB_KEYBOARD_LAYOUTS_VERSION 3
+#define GRUB_KEYBOARD_LAYOUTS_VERSION 4
-#define GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE 256
+#define GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE 128
+
+struct grub_keyboard_layout
+{
+ struct
+ {
+ grub_uint32_t keyboard_map[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
+ grub_uint32_t keyboard_map_shift[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
+ grub_uint32_t keyboard_map_l3[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
+ grub_uint32_t keyboard_map_shift_l3[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
+ } at;
+ struct
+ {
+ grub_uint32_t keyboard_map[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
+ grub_uint32_t keyboard_map_shift[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
+ grub_uint32_t keyboard_map_l3[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
+ grub_uint32_t keyboard_map_shift_l3[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
+ } usb;
+};
+
+struct grub_keyboard_layout *EXPORT_VAR (grub_current_layout);
#endif /* GRUB_KEYBOARD_LAYOUTS */
#define GRUB_TERM_SHIFT 0x01000000
#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
-#define GRUB_TERM_KEYPAD 0x20000000
/* Keys without associated character. */
#define GRUB_TERM_EXTENDED 0x00800000
#define GRUB_TERM_KEY_MASK 0x00ffffff
-#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)
-#define GRUB_TERM_KEY_F1 (GRUB_TERM_EXTENDED | 10)
-#define GRUB_TERM_KEY_F2 (GRUB_TERM_EXTENDED | 11)
-#define GRUB_TERM_KEY_F3 (GRUB_TERM_EXTENDED | 12)
-#define GRUB_TERM_KEY_F4 (GRUB_TERM_EXTENDED | 13)
-#define GRUB_TERM_KEY_F5 (GRUB_TERM_EXTENDED | 14)
-#define GRUB_TERM_KEY_F6 (GRUB_TERM_EXTENDED | 15)
-#define GRUB_TERM_KEY_F7 (GRUB_TERM_EXTENDED | 16)
-#define GRUB_TERM_KEY_F8 (GRUB_TERM_EXTENDED | 17)
-#define GRUB_TERM_KEY_F9 (GRUB_TERM_EXTENDED | 18)
-#define GRUB_TERM_KEY_F10 (GRUB_TERM_EXTENDED | 19)
-#define GRUB_TERM_KEY_F11 (GRUB_TERM_EXTENDED | 20)
-#define GRUB_TERM_KEY_F12 (GRUB_TERM_EXTENDED | 21)
-#define GRUB_TERM_KEY_INSERT (GRUB_TERM_EXTENDED | 22)
-#define GRUB_TERM_KEY_CENTER (GRUB_TERM_EXTENDED | 23)
-
-/* Used by keylayouts code. Never returned in grub_getkey. */
-#define GRUB_TERM_KEY_102 0x80
-#define GRUB_TERM_KEY_SHIFT_102 0x81
+
+#define GRUB_TERM_KEY_LEFT (GRUB_TERM_EXTENDED | 0x4b)
+#define GRUB_TERM_KEY_RIGHT (GRUB_TERM_EXTENDED | 0x4d)
+#define GRUB_TERM_KEY_UP (GRUB_TERM_EXTENDED | 0x48)
+#define GRUB_TERM_KEY_DOWN (GRUB_TERM_EXTENDED | 0x50)
+#define GRUB_TERM_KEY_HOME (GRUB_TERM_EXTENDED | 0x47)
+#define GRUB_TERM_KEY_END (GRUB_TERM_EXTENDED | 0x4f)
+#define GRUB_TERM_KEY_DC (GRUB_TERM_EXTENDED | 0x53)
+#define GRUB_TERM_KEY_PPAGE (GRUB_TERM_EXTENDED | 0x49)
+#define GRUB_TERM_KEY_NPAGE (GRUB_TERM_EXTENDED | 0x51)
+#define GRUB_TERM_KEY_F1 (GRUB_TERM_EXTENDED | 0x3b)
+#define GRUB_TERM_KEY_F2 (GRUB_TERM_EXTENDED | 0x3c)
+#define GRUB_TERM_KEY_F3 (GRUB_TERM_EXTENDED | 0x3d)
+#define GRUB_TERM_KEY_F4 (GRUB_TERM_EXTENDED | 0x3e)
+#define GRUB_TERM_KEY_F5 (GRUB_TERM_EXTENDED | 0x3f)
+#define GRUB_TERM_KEY_F6 (GRUB_TERM_EXTENDED | 0x40)
+#define GRUB_TERM_KEY_F7 (GRUB_TERM_EXTENDED | 0x41)
+#define GRUB_TERM_KEY_F8 (GRUB_TERM_EXTENDED | 0x42)
+#define GRUB_TERM_KEY_F9 (GRUB_TERM_EXTENDED | 0x43)
+#define GRUB_TERM_KEY_F10 (GRUB_TERM_EXTENDED | 0x44)
+#define GRUB_TERM_KEY_F11 (GRUB_TERM_EXTENDED | 0x57)
+#define GRUB_TERM_KEY_F12 (GRUB_TERM_EXTENDED | 0x58)
+#define GRUB_TERM_KEY_INSERT (GRUB_TERM_EXTENDED | 0x52)
+#define GRUB_TERM_KEY_CENTER (GRUB_TERM_EXTENDED | 0x4c)
#define GRUB_TERM_ESC '\e'
#define GRUB_TERM_TAB '\t'
/* Get keyboard modifier status. */
int (*getkeystatus) (struct grub_term_input *term);
- grub_uint32_t flags;
-
void *data;
};
typedef struct grub_term_input *grub_term_input_t;
-#define GRUB_TERM_INPUT_FLAGS_TYPE_MASK 0xf
-#define GRUB_TERM_INPUT_FLAGS_TYPE_TERMCODES 0x0
-#define GRUB_TERM_INPUT_FLAGS_TYPE_BIOS 0x1
-
struct grub_term_output
{
/* The next terminal. */
#define FOR_DISABLED_TERM_OUTPUTS(var) FOR_LIST_ELEMENTS((var), (grub_term_outputs_disabled))
void grub_putcode (grub_uint32_t code, struct grub_term_output *term);
-extern int (*EXPORT_VAR(grub_getkey)) (void);
-int grub_checkkey (void);
+int EXPORT_FUNC(grub_getkey) (void);
+int EXPORT_FUNC(grub_checkkey) (void);
void grub_cls (void);
void EXPORT_FUNC(grub_refresh) (void);
void grub_puts_terminal (const char *str, struct grub_term_output *term);
ret
+LOCAL(bypass_table):
+ .word 0x0100 | '\e',0x0f00 | '\t', 0x0e00 | '\b', 0x1c00 | '\r'
+ .word 0x1c00 | '\n'
+LOCAL(bypass_table_end):
+
/*
* int grub_console_getkey (void)
* BIOS call "INT 16H Function 00H" to read character from keyboard
movb $0, %ah
int $0x16
+ xorl %edx, %edx
movw %ax, %dx /* real_to_prot uses %eax */
DATA32 call real_to_prot
.code32
- movw %dx, %ax
+ movl $0xff, %eax
+ testl %eax, %edx
+ jz 1f
+
+ andl %edx, %eax
+ cmp %eax, 0x20
+ ja 2f
+ movl %edx, %eax
+ leal LOCAL(bypass_table), %esi
+ movl $((LOCAL(bypass_table_end) - LOCAL(bypass_table)) / 2), %ecx
+ repne cmpsw
+ jz 3f
+
+ addl $('a' - 1 | GRUB_TERM_CTRL), %eax
+ jmp 2f
+3:
+ andl $0xff, %eax
+ jmp 2f
+
+1: movl %edx, %eax
+ shrl $8, %eax
+ orl $GRUB_TERM_EXTENDED, %eax
+2:
popl %ebp
ret
-
/*
* int grub_console_checkkey (void)
* if there is a character pending, return it; otherwise return -1
jz notpending
+ xorl %edx, %edx
movw %ax, %dx
DATA32 jmp pending
DATA32 call real_to_prot
.code32
- movl %edx, %eax
-
popl %ebp
ret
#include <grub/misc.h>
#include <grub/env.h>
#include <grub/time.h>
+#include <grub/keyboard_layouts.h>
struct grub_term_output *grub_term_outputs_disabled;
struct grub_term_input *grub_term_inputs_disabled;
struct grub_term_output *grub_term_outputs;
struct grub_term_input *grub_term_inputs;
+struct grub_keyboard_layout *grub_current_layout;
/* Put a Unicode character. */
static void
void (*grub_xputs) (const char *str) = grub_xputs_dumb;
-static int
-grub_getkey_dumb (void)
+int
+grub_getkey (void)
{
grub_term_input_t term;
{
int key = term->checkkey (term);
if (key != -1)
- return term->getkey (term) & 0xff;
+ return term->getkey (term);
}
grub_cpu_idle ();
}
}
-int (*grub_getkey) (void) = grub_getkey_dumb;
+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;
+}
void
grub_refresh (void)
#define KEYBOARD_LED_NUM (1 << 1)
#define KEYBOARD_LED_CAPS (1 << 2)
-GRUB_AT_KEY_KEYBOARD_MAP (keyboard_map);
-GRUB_AT_KEY_KEYBOARD_MAP_SHIFT (keyboard_map_shift);
+static const unsigned keyboard_map[128] =
+{
+ /* 0x00 */ '\0', GRUB_TERM_ESC, '1', '2', '3', '4', '5', '6',
+ /* 0x08 */ '7', '8', '9', '0', '-', '=', GRUB_TERM_BACKSPACE, GRUB_TERM_TAB,
+ /* 0x10 */ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i',
+ /* 0x18 */ 'o', 'p', '[', ']', '\n', '\0', 'a', 's',
+ /* 0x20 */ 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';',
+ /* 0x28 */ '\'', '`', '\0', '\\', 'z', 'x', 'c', 'v',
+ /* 0x30 */ 'b', 'n', 'm', ',', '.', '/', '\0', '*',
+ /* 0x38 */ '\0', ' ', '\0', GRUB_TERM_KEY_F1,
+ /* 0x3c */ GRUB_TERM_KEY_F2, GRUB_TERM_KEY_F3,
+ /* 0x3e */ GRUB_TERM_KEY_F4, GRUB_TERM_KEY_F5,
+ /* 0x40 */ GRUB_TERM_KEY_F6, GRUB_TERM_KEY_F7,
+ /* 0x42 */ GRUB_TERM_KEY_F8, GRUB_TERM_KEY_F9,
+ /* 0x44 */ GRUB_TERM_KEY_F10, '\0', '\0', GRUB_TERM_KEY_HOME,
+ /* 0x48 */ GRUB_TERM_KEY_UP, GRUB_TERM_KEY_NPAGE, '-', GRUB_TERM_KEY_LEFT,
+ /* 0x4c */ GRUB_TERM_KEY_CENTER, GRUB_TERM_KEY_RIGHT, '+', GRUB_TERM_KEY_END,
+ /* 0x50 */ GRUB_TERM_KEY_DOWN, GRUB_TERM_KEY_PPAGE,
+ /* 0x52 */ GRUB_TERM_KEY_INSERT, GRUB_TERM_KEY_DC,
+ /* 0x54 */ '\0', '\0', '\\', GRUB_TERM_KEY_F11,
+ /* 0x58 */ GRUB_TERM_KEY_F12, '\0', '\0', '\0', '\0', '\0', '\0', '\0',
+ /* 0x60 */ '\0', '\0', '\0', '\0',
+ /* 0x64 */ '\0', GRUB_TERM_KEY_UP, GRUB_TERM_KEY_DOWN, GRUB_TERM_KEY_LEFT,
+ /* 0x68 */ GRUB_TERM_KEY_RIGHT
+};
+
+static unsigned keyboard_map_shift[128] =
+{
+ '\0', '\0', '!', '@', '#', '$', '%', '^',
+ '&', '*', '(', ')', '_', '+', '\0', '\0',
+ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I',
+ 'O', 'P', '{', '}', '\n', '\0', 'A', 'S',
+ 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':',
+ '\"', '~', '\0', '|', 'Z', 'X', 'C', 'V',
+ 'B', 'N', 'M', '<', '>', '?',
+ [0x56] = '|'
+};
static grub_uint8_t grub_keyboard_controller_orig;
}
if (at_keyboard_status & KEYBOARD_STATUS_ALT_L)
- {
- key |= GRUB_TERM_ALT;
- grub_printf ("AltL");
- }
+ key |= GRUB_TERM_ALT;
if (at_keyboard_status & KEYBOARD_STATUS_ALT_R)
- {
- key |= GRUB_TERM_ALT_GR;
- grub_printf ("AltGr");
- }
+ key |= GRUB_TERM_ALT;
if (at_keyboard_status & (KEYBOARD_STATUS_CTRL_L
| KEYBOARD_STATUS_CTRL_R))
key |= GRUB_TERM_CTRL;
-
- if (at_keyboard_status & KEYBOARD_STATUS_CAPS_LOCK)
- key |= GRUB_TERM_CAPS;
}
return key;
}
.init = grub_keyboard_controller_init,
.fini = grub_keyboard_controller_fini,
.checkkey = grub_at_keyboard_checkkey,
- .getkey = grub_at_keyboard_getkey,
- .flags = GRUB_TERM_INPUT_FLAGS_TYPE_TERMCODES
+ .getkey = grub_at_keyboard_getkey
};
GRUB_MOD_INIT(at_keyboard)
.name = "console",
.checkkey = grub_console_checkkey,
.getkey = grub_console_getkey,
- .getkeystatus = grub_console_getkeystatus,
- .flags = GRUB_TERM_INPUT_FLAGS_TYPE_BIOS
+ .getkeystatus = grub_console_getkeystatus
};
static struct grub_term_output grub_console_term_output =
'\0', GRUB_TERM_KEY_INSERT, GRUB_TERM_KEY_HOME, GRUB_TERM_KEY_PPAGE,
GRUB_TERM_KEY_DC, GRUB_TERM_KEY_END, GRUB_TERM_KEY_NPAGE, GRUB_TERM_KEY_RIGHT,
GRUB_TERM_KEY_LEFT, GRUB_TERM_KEY_DOWN, GRUB_TERM_KEY_UP,
- [0x64] = GRUB_TERM_KEY_102
+ [0x64] = '\\'
};
static unsigned keyboard_map_shift[128] =
'\n', '\0', '\0', '\0', ' ', '_', '+', '{',
'}', '|', '#', ':', '"', '`', '<', '>',
'?',
- [0x64] = GRUB_TERM_KEY_SHIFT_102
+ [0x64] = '|'
};
static grub_usb_device_t usbdev;
key |= GRUB_TERM_ALT;
if (data[0] & GRUB_USB_KEYBOARD_RIGHT_ALT)
- key |= GRUB_TERM_ALT_GR;
+ key |= GRUB_TERM_ALT;
#if 0
/* Wait until the key is released. */
.checkkey = grub_usb_keyboard_checkkey,
.getkey = grub_usb_keyboard_getkey,
.getkeystatus = grub_usb_keyboard_getkeystatus,
- .flags = GRUB_TERM_INPUT_FLAGS_TYPE_TERMCODES,
.next = 0
};
void (*grub_xputs) (const char *str) = grub_xputs_real;
-static int
-grub_getkey_real (void)
+int
+grub_getkey (void)
{
return -1;
}
-int (*grub_getkey) (void) = grub_getkey_real;
-
void
grub_refresh (void)
{
{"", '\0'}
};
-GRUB_AT_KEY_KEYBOARD_MAP (us_keyboard_map);
-GRUB_AT_KEY_KEYBOARD_MAP_SHIFT (us_keyboard_map_shifted);
-
static void
usage (int status)
{
sscanf (line, "keycode %u = %60s %60s %60s %60s", &keycode,
normal, shift, normalalt, shiftalt);
- if (keycode < ARRAY_SIZE (us_keyboard_map)
- && us_keyboard_map[keycode] < ARRAY_SIZE (keyboard_map))
- {
- keyboard_map[us_keyboard_map[keycode]] = get_grub_code (normal);
- keyboard_map_alt[us_keyboard_map[keycode]]
- = get_grub_code (normalalt);
- ok = 1;
- }
- if (keycode < ARRAY_SIZE (us_keyboard_map_shifted)
- && us_keyboard_map_shifted[keycode] < ARRAY_SIZE (keyboard_map))
- {
- keyboard_map[us_keyboard_map_shifted[keycode]]
- = get_grub_code (shift);
- keyboard_map_alt[us_keyboard_map_shifted[keycode]]
- = get_grub_code (shiftalt);
- ok = 1;
- }
}
}
void (*grub_xputs) (const char *str) = grub_xputs_real;
-static int
-grub_getkey_real (void)
+int
+grub_getkey (void)
{
return -1;
}
-int (*grub_getkey) (void) = grub_getkey_real;
-
void
grub_refresh (void)
{
void (*grub_xputs) (const char *str) = grub_xputs_real;
-static int
-grub_getkey_real (void)
+int
+grub_getkey (void)
{
return -1;
}
-int (*grub_getkey) (void) = grub_getkey_real;
-
void
grub_refresh (void)
{