mirror of
https://github.com/ipxe/ipxe
synced 2026-02-14 02:31:26 +03:00
[console] Handle remapping of scancode 86
The key with scancode 86 appears in the position between left shift and Z on a US keyboard, where it typically fails to exist entirely. Most US keyboard maps define this nonexistent key as generating "\|", with the notable exception of "loadkeys" which instead reports it as generating "<>". Both of these mapping choices duplicate keys that exist elsewhere in the map, which causes problems for our ASCII-based remapping mechanism. Work around these quirks by treating the key as generating "\|" with the high bit set, and making it subject to remapping. Where the BIOS generates "\|" as expected, this allows us to remap to the correct ASCII value. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -114,13 +114,19 @@ static unsigned int usbkbd_map ( unsigned int keycode, unsigned int modifiers,
|
||||
};
|
||||
key = keypad[ keycode - USBKBD_KEY_PAD_1 ];
|
||||
};
|
||||
} else if ( keycode == USBKBD_KEY_NON_US ) {
|
||||
/* Non-US \ and | */
|
||||
key = ( ( modifiers & USBKBD_SHIFT ) ?
|
||||
( KEYMAP_PSEUDO | '|' ) : ( KEYMAP_PSEUDO | '\\' ) );
|
||||
} else {
|
||||
key = 0;
|
||||
}
|
||||
|
||||
/* Remap key if applicable */
|
||||
if ( keycode < USBKBD_KEY_CAPS_LOCK )
|
||||
if ( ( keycode < USBKBD_KEY_CAPS_LOCK ) ||
|
||||
( keycode == USBKBD_KEY_NON_US ) ) {
|
||||
key = key_remap ( key );
|
||||
}
|
||||
|
||||
/* Handle upper/lower case and Ctrl-<key> */
|
||||
if ( islower ( key ) ) {
|
||||
|
||||
Reference in New Issue
Block a user