mirror of
https://github.com/ipxe/ipxe
synced 2025-12-20 12:00:19 +03:00
[console] Centralise handling of key modifiers
Handle Ctrl and CapsLock key modifiers within key_remap(), to provide consistent behaviour across different console types. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -361,6 +361,7 @@ static const char * bios_ansi_seq ( unsigned int scancode ) {
|
||||
*/
|
||||
static int bios_getchar ( void ) {
|
||||
uint16_t keypress;
|
||||
uint8_t kb0;
|
||||
unsigned int scancode;
|
||||
unsigned int character;
|
||||
const char *ansi_seq;
|
||||
@@ -385,16 +386,28 @@ static int bios_getchar ( void ) {
|
||||
bios_inject_lock--;
|
||||
scancode = ( keypress >> 8 );
|
||||
character = ( keypress & 0xff );
|
||||
get_real ( kb0, BDA_SEG, BDA_KB0 );
|
||||
|
||||
/* If it's a normal character, map (if applicable) and return it */
|
||||
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 {
|
||||
|
||||
/* Handle special scancodes */
|
||||
if ( scancode == SCANCODE_NON_US ) {
|
||||
/* Treat as "\|" with high bit set */
|
||||
character |= KEYMAP_PSEUDO;
|
||||
} else if ( scancode >= SCANCODE_RSHIFT ) {
|
||||
/* Non-remappable scancode (e.g. numeric keypad) */
|
||||
return character;
|
||||
}
|
||||
|
||||
/* Apply modifiers */
|
||||
if ( kb0 & BDA_KB0_CTRL )
|
||||
character |= KEYMAP_CTRL;
|
||||
if ( kb0 & BDA_KB0_CAPSLOCK )
|
||||
character |= KEYMAP_CAPSLOCK_REDO;
|
||||
|
||||
/* Map and return */
|
||||
return key_remap ( character );
|
||||
}
|
||||
|
||||
/* Otherwise, check for a special key that we know about */
|
||||
|
||||
Reference in New Issue
Block a user