mirror of
https://github.com/ipxe/ipxe
synced 2025-12-20 20:10:18 +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:
@@ -68,6 +68,13 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
*/
|
||||
#define SCANCODE_RSHIFT 0x36
|
||||
|
||||
/** Scancode for the "non-US \ and |" key
|
||||
*
|
||||
* This is the key that appears between Left Shift and Z on non-US
|
||||
* keyboards.
|
||||
*/
|
||||
#define SCANCODE_NON_US 0x56
|
||||
|
||||
/* Set default console usage if applicable */
|
||||
#if ! ( defined ( CONSOLE_PCBIOS ) && CONSOLE_EXPLICIT ( CONSOLE_PCBIOS ) )
|
||||
#undef CONSOLE_PCBIOS
|
||||
@@ -383,6 +390,8 @@ static int bios_getchar ( void ) {
|
||||
if ( character && ( character < 0x80 ) ) {
|
||||
if ( scancode < SCANCODE_RSHIFT ) {
|
||||
return key_remap ( character );
|
||||
} else if ( scancode == SCANCODE_NON_US ) {
|
||||
return key_remap ( character | KEYMAP_PSEUDO );
|
||||
} else {
|
||||
return character;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user