diff options
author | Michael Brown <mcb30@ipxe.org> | 2022-02-10 11:55:54 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2022-02-10 13:11:27 +0000 |
commit | eb92ba0a4fe6b1b56e3ca5edfb93fdd545bc901a (patch) | |
tree | 0e9bc935c66e5bd292e7ec1d45d0cbaeda68aca5 | |
parent | 468980db2b99f54ffec7d2a44c281308b4eec3c0 (diff) | |
download | ipxe-eb92ba0a4fe6b1b56e3ca5edfb93fdd545bc901a.tar.gz |
[usb] Handle upper/lower case and Ctrl-<key> after applying remapping
Some keyboard layouts (e.g. "fr") swap letter and punctuation keys.
Apply the logic for upper and lower case and for Ctrl-<key> only after
applying remapping, in order to handle these layouts correctly.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r-- | src/drivers/usb/usbkbd.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/drivers/usb/usbkbd.c b/src/drivers/usb/usbkbd.c index 397ed77ec..ba4b2d4d7 100644 --- a/src/drivers/usb/usbkbd.c +++ b/src/drivers/usb/usbkbd.c @@ -25,6 +25,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <stdlib.h> #include <string.h> +#include <ctype.h> #include <errno.h> #include <assert.h> #include <ipxe/console.h> @@ -70,12 +71,6 @@ static unsigned int usbkbd_map ( unsigned int keycode, unsigned int modifiers, } else if ( keycode <= USBKBD_KEY_Z ) { /* Alphabetic keys */ key = ( keycode - USBKBD_KEY_A + 'a' ); - if ( modifiers & USBKBD_CTRL ) { - key -= ( 'a' - CTRL_A ); - } else if ( ( modifiers & USBKBD_SHIFT ) || - ( leds & USBKBD_LED_CAPS_LOCK ) ) { - key -= ( 'a' - 'A' ); - } } else if ( keycode <= USBKBD_KEY_0 ) { /* Numeric key row */ if ( modifiers & USBKBD_SHIFT ) { @@ -127,6 +122,16 @@ static unsigned int usbkbd_map ( unsigned int keycode, unsigned int modifiers, if ( keycode < USBKBD_KEY_CAPS_LOCK ) key = key_remap ( key ); + /* Handle upper/lower case and Ctrl-<key> */ + if ( islower ( key ) ) { + if ( modifiers & USBKBD_CTRL ) { + key -= ( 'a' - CTRL_A ); + } else if ( ( modifiers & USBKBD_SHIFT ) || + ( leds & USBKBD_LED_CAPS_LOCK ) ) { + key -= ( 'a' - 'A' ); + } + } + return key; } |