Hook AT keyboard mapping
This commit is contained in:
parent
ed19677fe3
commit
e55e09628d
9 changed files with 290 additions and 173 deletions
|
@ -46,6 +46,26 @@ struct console_grub_equivalence
|
|||
grub_uint32_t grub;
|
||||
};
|
||||
|
||||
static int at_to_usb_map[128] =
|
||||
{
|
||||
0, 41, 30, 31, 32, 33, 34, 35,
|
||||
36, 37, 38, 39, 45, 46, 42, 43,
|
||||
20, 26, 8, 21, 23, 28, 24, 12,
|
||||
18, 19, 47, 48, 40, 0, 4, 22,
|
||||
7, 9, 10, 11, 13, 14, 15, 51,
|
||||
52, 53, 0, 49, 29, 27, 6, 25,
|
||||
5, 17, 16, 54, 55, 56, 0, 0,
|
||||
0, 44, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 74,
|
||||
82, 78, 45, 80, 0, 79, 0, 77,
|
||||
81, 75, 0, 76, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
static struct console_grub_equivalence console_grub_equivalences[] = {
|
||||
{"KP_1", '1'},
|
||||
{"KP_2", '2'},
|
||||
|
@ -85,7 +105,26 @@ Report bugs to <%s>.\n", program_name, PACKAGE_BUGREPORT);
|
|||
exit (status);
|
||||
}
|
||||
|
||||
char
|
||||
void
|
||||
add_special_keys (struct grub_keyboard_layout *layout)
|
||||
{
|
||||
layout->at.keyboard_map[71] = GRUB_TERM_KEY_HOME;
|
||||
layout->at.keyboard_map[72] = GRUB_TERM_KEY_UP;
|
||||
layout->at.keyboard_map[73] = GRUB_TERM_KEY_NPAGE;
|
||||
layout->at.keyboard_map[75] = GRUB_TERM_KEY_LEFT;
|
||||
layout->at.keyboard_map[77] = GRUB_TERM_KEY_RIGHT;
|
||||
layout->at.keyboard_map[79] = GRUB_TERM_KEY_END;
|
||||
layout->at.keyboard_map[80] = GRUB_TERM_KEY_DOWN;
|
||||
layout->at.keyboard_map[81] = GRUB_TERM_KEY_PPAGE;
|
||||
layout->at.keyboard_map[83] = GRUB_TERM_KEY_DC;
|
||||
|
||||
layout->at.keyboard_map[101] = GRUB_TERM_KEY_UP;
|
||||
layout->at.keyboard_map[102] = GRUB_TERM_KEY_DOWN;
|
||||
layout->at.keyboard_map[103] = GRUB_TERM_KEY_LEFT;
|
||||
layout->at.keyboard_map[104] = GRUB_TERM_KEY_RIGHT;
|
||||
}
|
||||
|
||||
static char
|
||||
lookup (char *code)
|
||||
{
|
||||
int i;
|
||||
|
@ -97,7 +136,7 @@ lookup (char *code)
|
|||
return '\0';
|
||||
}
|
||||
|
||||
unsigned int
|
||||
static unsigned int
|
||||
get_grub_code (char *layout_code)
|
||||
{
|
||||
unsigned int code;
|
||||
|
@ -111,9 +150,8 @@ get_grub_code (char *layout_code)
|
|||
return code;
|
||||
}
|
||||
|
||||
void
|
||||
write_file (char* filename, grub_uint32_t *keyboard_map,
|
||||
grub_uint32_t *keyboard_map_alt)
|
||||
static void
|
||||
write_file (char* filename, struct grub_keyboard_layout *layout)
|
||||
{
|
||||
FILE *fp_output;
|
||||
grub_uint32_t version;
|
||||
|
@ -121,11 +159,35 @@ write_file (char* filename, grub_uint32_t *keyboard_map,
|
|||
|
||||
version = grub_cpu_to_le32 (GRUB_KEYBOARD_LAYOUTS_VERSION);
|
||||
|
||||
for (i = 0; i < GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE; i++)
|
||||
keyboard_map[i] = grub_cpu_to_le32 (keyboard_map[i]);
|
||||
for (i = 0; i < ARRAY_SIZE (layout->at.keyboard_map); i++)
|
||||
layout->at.keyboard_map[i] = grub_cpu_to_le32(layout->at.keyboard_map[i]);
|
||||
|
||||
for (i = 0; i < GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE; i++)
|
||||
keyboard_map_alt[i] = grub_cpu_to_le32 (keyboard_map_alt[i]);
|
||||
for (i = 0; i < ARRAY_SIZE (layout->at.keyboard_map_shift); i++)
|
||||
layout->at.keyboard_map_shift[i]
|
||||
= grub_cpu_to_le32(layout->at.keyboard_map_shift[i]);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE (layout->at.keyboard_map_l3); i++)
|
||||
layout->at.keyboard_map_l3[i]
|
||||
= grub_cpu_to_le32(layout->at.keyboard_map_l3[i]);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE (layout->at.keyboard_map_shift_l3); i++)
|
||||
layout->at.keyboard_map_shift_l3[i]
|
||||
= grub_cpu_to_le32(layout->at.keyboard_map_shift_l3[i]);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE (layout->usb.keyboard_map); i++)
|
||||
layout->usb.keyboard_map[i] = grub_cpu_to_le32(layout->usb.keyboard_map[i]);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE (layout->usb.keyboard_map_shift); i++)
|
||||
layout->usb.keyboard_map_shift[i]
|
||||
= grub_cpu_to_le32(layout->usb.keyboard_map_shift[i]);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE (layout->usb.keyboard_map_l3); i++)
|
||||
layout->usb.keyboard_map_l3[i]
|
||||
= grub_cpu_to_le32(layout->usb.keyboard_map_l3[i]);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE (layout->usb.keyboard_map_shift_l3); i++)
|
||||
layout->usb.keyboard_map_shift_l3[i]
|
||||
= grub_cpu_to_le32(layout->usb.keyboard_map_shift_l3[i]);
|
||||
|
||||
fp_output = fopen (filename, "w");
|
||||
|
||||
|
@ -138,23 +200,19 @@ write_file (char* filename, grub_uint32_t *keyboard_map,
|
|||
fwrite (GRUB_KEYBOARD_LAYOUTS_FILEMAGIC, 1,
|
||||
GRUB_KEYBOARD_LAYOUTS_FILEMAGIC_SIZE, fp_output);
|
||||
fwrite (&version, sizeof (version), 1, fp_output);
|
||||
fwrite (keyboard_map, sizeof (keyboard_map[0]),
|
||||
GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE, fp_output);
|
||||
fwrite (keyboard_map_alt, sizeof (keyboard_map_alt[0]),
|
||||
GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE, fp_output);
|
||||
fwrite (layout, 1, sizeof (*layout), fp_output);
|
||||
fclose (fp_output);
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
write_keymaps (char *keymap, char *file_basename)
|
||||
{
|
||||
grub_uint32_t keyboard_map[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
|
||||
grub_uint32_t keyboard_map_alt[GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE];
|
||||
|
||||
struct grub_keyboard_layout layout;
|
||||
char line[2048];
|
||||
pid_t pid;
|
||||
int pipe_communication[2];
|
||||
int ok;
|
||||
unsigned i;
|
||||
|
||||
FILE *fp_pipe;
|
||||
|
||||
|
@ -182,7 +240,7 @@ write_keymaps (char *keymap, char *file_basename)
|
|||
close (pipe_communication[1]);
|
||||
fp_pipe = fdopen (pipe_communication[0], "r");
|
||||
|
||||
memset (keyboard_map, 0, sizeof (keyboard_map));
|
||||
memset (&layout, 0, sizeof (layout));
|
||||
|
||||
/* Process the ckbcomp output and prepare the layouts. */
|
||||
ok = 0;
|
||||
|
@ -198,9 +256,30 @@ write_keymaps (char *keymap, char *file_basename)
|
|||
|
||||
sscanf (line, "keycode %u = %60s %60s %60s %60s", &keycode,
|
||||
normal, shift, normalalt, shiftalt);
|
||||
if (keycode < GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE)
|
||||
{
|
||||
layout.at.keyboard_map[keycode] = get_grub_code (normal);
|
||||
layout.at.keyboard_map_shift[keycode] = get_grub_code (shift);
|
||||
layout.at.keyboard_map_l3[keycode] = get_grub_code (normalalt);
|
||||
layout.at.keyboard_map_shift_l3[keycode]
|
||||
= get_grub_code (shiftalt);
|
||||
ok = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE; i++)
|
||||
{
|
||||
layout.usb.keyboard_map[at_to_usb_map[i]] = layout.at.keyboard_map[i];
|
||||
layout.usb.keyboard_map_shift[at_to_usb_map[i]]
|
||||
= layout.at.keyboard_map_shift[i];
|
||||
layout.usb.keyboard_map_l3[at_to_usb_map[i]]
|
||||
= layout.at.keyboard_map_l3[i];
|
||||
layout.usb.keyboard_map_shift_l3[at_to_usb_map[i]]
|
||||
= layout.at.keyboard_map_shift_l3[i];
|
||||
}
|
||||
|
||||
|
||||
if (ok == 0)
|
||||
{
|
||||
fprintf (stderr, "ERROR: no keycodes found. Check output of %s %s.\n",
|
||||
|
@ -208,7 +287,9 @@ write_keymaps (char *keymap, char *file_basename)
|
|||
exit (1);
|
||||
}
|
||||
|
||||
write_file (file_basename, keyboard_map, keyboard_map_alt);
|
||||
add_special_keys (&layout);
|
||||
|
||||
write_file (file_basename, &layout);
|
||||
}
|
||||
|
||||
int
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue