diff options
author | Toomas Soome <tsoome@me.com> | 2016-12-24 12:50:14 +0200 |
---|---|---|
committer | Robert Mustacchi <rm@joyent.com> | 2019-01-16 23:17:32 +0000 |
commit | ead1aeb99fc825309962c1dc2f20333bdd5898f6 (patch) | |
tree | 23d6c159a113a0a9219d2afdd4a5dae3e1965ed5 /usr/src | |
parent | 9f17ecf0b8fdc59cfa903ceb6a96046b0f2d8201 (diff) | |
download | illumos-joyent-ead1aeb99fc825309962c1dc2f20333bdd5898f6.tar.gz |
10195 uts: boot_keyboard should emit esc sequences for arrow keys
Reviewed by: John Levon <john.levon@joyent.com>
Reviewed by: Gergő Mihály Doma <domag02@gmail.com>
Approved by: Robert Mustacchi <rm@joyent.com>
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/i86pc/boot/boot_keyboard.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/usr/src/uts/i86pc/boot/boot_keyboard.c b/usr/src/uts/i86pc/boot/boot_keyboard.c index 220e254f47..3bf27243aa 100644 --- a/usr/src/uts/i86pc/boot/boot_keyboard.c +++ b/usr/src/uts/i86pc/boot/boot_keyboard.c @@ -23,8 +23,6 @@ * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - /* * Miniature keyboard driver for bootstrap. This allows keyboard * support to continue after we take over interrupts and disable @@ -144,6 +142,10 @@ static struct { -1, /* pending */ }; +#define KTAB_STRLEN 3 +static char keystringtab[KTAB_STRLEN] = {'\033', '[', ' '}; +static int keystring = -1; + static int kb_translate(unsigned char code); static void kb_send(unsigned char cmd); static void kb_update_leds(void); @@ -157,6 +159,15 @@ kb_getchar(void) while (!kb_ischar()) /* LOOP */; + if (keystring >= 0) { + ret = keystringtab[keystring++]; + if (keystring == KTAB_STRLEN) { + keystring = -1; + kb.pending = -1; + } + return (ret); + } + /* * kb_ischar() doesn't succeed without leaving kb.pending * set. @@ -164,8 +175,27 @@ kb_getchar(void) ASSERT(kb.pending >= 0); if (kb.pending & 0x100) { - ret = 0; kb.pending &= 0xff; + switch (kb.pending) { + case 'H': /* Up */ + keystringtab[2] = 'A'; + keystring = 0; + return (kb_getchar()); + case 'P': /* Down */ + keystringtab[2] = 'B'; + keystring = 0; + return (kb_getchar()); + case 'M': /* Right */ + keystringtab[2] = 'C'; + keystring = 0; + return (kb_getchar()); + case 'K': /* Left */ + keystringtab[2] = 'D'; + keystring = 0; + return (kb_getchar()); + default: + ret = 0; + } } else { ret = kb.pending; kb.pending = -1; |