]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[usb] Handle upper/lower case and Ctrl-<key> after applying remapping
authorMichael Brown <mcb30@ipxe.org>
Thu, 10 Feb 2022 11:55:54 +0000 (11:55 +0000)
committerMichael Brown <mcb30@ipxe.org>
Thu, 10 Feb 2022 13:11:27 +0000 (13:11 +0000)
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>
src/drivers/usb/usbkbd.c

index 397ed77ec82945c0f8ed03492f93b8a3c8f410be..ba4b2d4d7a3bcd136348f52072220ca85cf34ea5 100644 (file)
@@ -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;
 }