* grub-core/term/terminfo.c: Recognize keys F1-F12.

This commit is contained in:
Vladimir Serbinenko 2014-01-18 16:57:35 +01:00
parent dcecae1a49
commit 3abb956371
2 changed files with 54 additions and 36 deletions

View file

@ -1,3 +1,7 @@
2014-01-18 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/term/terminfo.c: Recognize keys F1-F12.
2014-01-07 Andrey Borzenkov <arvidjaar@gmail.com> 2014-01-07 Andrey Borzenkov <arvidjaar@gmail.com>
* configure.ac: Add support for BUILD_LDFLAGS. * configure.ac: Add support for BUILD_LDFLAGS.

View file

@ -460,28 +460,31 @@ grub_terminfo_readkey (struct grub_term_input *term, int *keys, int *len,
{'@', GRUB_TERM_KEY_INSERT}, {'@', GRUB_TERM_KEY_INSERT},
}; };
static struct static unsigned four_code_table[] =
{
char key;
unsigned ascii;
}
four_code_table[] =
{ {
{'1', GRUB_TERM_KEY_HOME}, [1] = GRUB_TERM_KEY_HOME,
{'3', GRUB_TERM_KEY_DC}, [3] = GRUB_TERM_KEY_DC,
{'5', GRUB_TERM_KEY_PPAGE}, [5] = GRUB_TERM_KEY_PPAGE,
{'6', GRUB_TERM_KEY_NPAGE}, [6] = GRUB_TERM_KEY_NPAGE,
{'7', GRUB_TERM_KEY_HOME}, [7] = GRUB_TERM_KEY_HOME,
{'8', GRUB_TERM_KEY_END} [8] = GRUB_TERM_KEY_END,
[17] = GRUB_TERM_KEY_F6,
[18] = GRUB_TERM_KEY_F7,
[19] = GRUB_TERM_KEY_F8,
[20] = GRUB_TERM_KEY_F9,
[21] = GRUB_TERM_KEY_F10,
[23] = GRUB_TERM_KEY_F11,
[24] = GRUB_TERM_KEY_F12,
}; };
char fx_key[] = char fx_key[] =
{ 'P', 'Q', 'w', 'x', 't', 'u', { 'P', 'Q', 'w', 'x', 't', 'u',
'q', 'r', 'p', 'M', 'A', 'B' }; 'q', 'r', 'p', 'M', 'A', 'B', 'H', 'F' };
unsigned fx_code[] = unsigned fx_code[] =
{ GRUB_TERM_KEY_F1, GRUB_TERM_KEY_F2, GRUB_TERM_KEY_F3, { GRUB_TERM_KEY_F1, GRUB_TERM_KEY_F2, GRUB_TERM_KEY_F3,
GRUB_TERM_KEY_F4, GRUB_TERM_KEY_F5, GRUB_TERM_KEY_F6, GRUB_TERM_KEY_F4, GRUB_TERM_KEY_F5, GRUB_TERM_KEY_F6,
GRUB_TERM_KEY_F7, GRUB_TERM_KEY_F8, GRUB_TERM_KEY_F9, GRUB_TERM_KEY_F7, GRUB_TERM_KEY_F8, GRUB_TERM_KEY_F9,
GRUB_TERM_KEY_F10, GRUB_TERM_KEY_F11, GRUB_TERM_KEY_F12 }; GRUB_TERM_KEY_F10, GRUB_TERM_KEY_F11, GRUB_TERM_KEY_F12,
GRUB_TERM_KEY_HOME, GRUB_TERM_KEY_END };
unsigned i; unsigned i;
if (c == '\e') if (c == '\e')
@ -492,19 +495,13 @@ grub_terminfo_readkey (struct grub_term_input *term, int *keys, int *len,
{ {
CONTINUE_READ; CONTINUE_READ;
switch (c) for (i = 0; i < ARRAY_SIZE (fx_key); i++)
{ if (fx_key[i] == c)
case 'H': {
keys[0] = GRUB_TERM_KEY_HOME; keys[0] = fx_code[i];
*len = 1; *len = 1;
return; return;
case 'F': }
keys[0] = GRUB_TERM_KEY_END;
*len = 1;
return;
default:
return;
}
} }
if (c != '[') if (c != '[')
@ -523,6 +520,15 @@ grub_terminfo_readkey (struct grub_term_input *term, int *keys, int *len,
switch (c) switch (c)
{ {
case '[':
CONTINUE_READ;
if (c >= 'A' && c <= 'E')
{
keys[0] = GRUB_TERM_KEY_F1 + c - 'A';
*len = 1;
return;
}
return;
case 'O': case 'O':
CONTINUE_READ; CONTINUE_READ;
for (i = 0; i < ARRAY_SIZE (fx_key); i++) for (i = 0; i < ARRAY_SIZE (fx_key); i++)
@ -555,18 +561,26 @@ grub_terminfo_readkey (struct grub_term_input *term, int *keys, int *len,
return; return;
} }
default: case '1' ... '9':
for (i = 0; i < ARRAY_SIZE (four_code_table); i++) {
if (four_code_table[i].key == c) unsigned val = c - '0';
CONTINUE_READ;
if (c >= '0' && c <= '9')
{ {
val = val * 10 + (c - '0');
CONTINUE_READ; CONTINUE_READ;
if (c != '~')
return;
keys[0] = four_code_table[i].ascii;
*len = 1;
return;
} }
return; if (c != '~')
return;
if (val >= ARRAY_SIZE (four_code_table)
|| four_code_table[val] == 0)
return;
keys[0] = four_code_table[val];
*len = 1;
return;
}
default:
return;
} }
} }
#undef CONTINUE_READ #undef CONTINUE_READ