aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2022-02-10 11:55:54 +0000
committerMichael Brown <mcb30@ipxe.org>2022-02-10 13:11:27 +0000
commiteb92ba0a4fe6b1b56e3ca5edfb93fdd545bc901a (patch)
tree0e9bc935c66e5bd292e7ec1d45d0cbaeda68aca5
parent468980db2b99f54ffec7d2a44c281308b4eec3c0 (diff)
downloadipxe-eb92ba0a4fe6b1b56e3ca5edfb93fdd545bc901a.zip
ipxe-eb92ba0a4fe6b1b56e3ca5edfb93fdd545bc901a.tar.gz
ipxe-eb92ba0a4fe6b1b56e3ca5edfb93fdd545bc901a.tar.bz2
[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.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/drivers/usb/usbkbd.c b/src/drivers/usb/usbkbd.c
index 397ed77..ba4b2d4 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;
}