diff options
| author | Michael Brown | 2022-02-10 12:55:54 +0100 |
|---|---|---|
| committer | Michael Brown | 2022-02-10 14:11:27 +0100 |
| commit | eb92ba0a4fe6b1b56e3ca5edfb93fdd545bc901a (patch) | |
| tree | 0e9bc935c66e5bd292e7ec1d45d0cbaeda68aca5 | |
| parent | [usb] Support keyboard remapping via the native USB keyboard driver (diff) | |
| download | ipxe-eb92ba0a4fe6b1b56e3ca5edfb93fdd545bc901a.tar.gz ipxe-eb92ba0a4fe6b1b56e3ca5edfb93fdd545bc901a.tar.xz ipxe-eb92ba0a4fe6b1b56e3ca5edfb93fdd545bc901a.zip | |
[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; } |
