OSDN Git Service

HID: apple: Properly handle function keys on non-Apple keyboard
authorHilton Chain <hako@ultrarare.space>
Thu, 2 Jun 2022 08:12:19 +0000 (16:12 +0800)
committerJiri Kosina <jkosina@suse.cz>
Wed, 8 Jun 2022 09:53:54 +0000 (11:53 +0200)
This commit extends fa33382c7f74 ("HID: apple: Properly handle function
keys on Keychron keyboards") by adding an array of known non-Apple
keyboards' device names, and the function apple_is_non_apple_keyboard()
to identify and create exception for them.

Signed-off-by: Hilton Chain <hako@ultrarare.space>
Reviewed-by: Bryan Cain <bryancain3@gmail.com>
Tested-by: Bryan Cain <bryancain3@gmail.com>
Reviewed-by: José Expósito <jose.exposito89@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-apple.c

index 42a5689..7fbde58 100644 (file)
@@ -36,7 +36,7 @@
 #define APPLE_NUMLOCK_EMULATION        BIT(8)
 #define APPLE_RDESC_BATTERY    BIT(9)
 #define APPLE_BACKLIGHT_CTL    BIT(10)
-#define APPLE_IS_KEYCHRON      BIT(11)
+#define APPLE_IS_NON_APPLE     BIT(11)
 
 #define APPLE_FLAG_FKEY                0x01
 
@@ -65,6 +65,10 @@ MODULE_PARM_DESC(swap_fn_leftctrl, "Swap the Fn and left Control keys. "
                "(For people who want to keep PC keyboard muscle memory. "
                "[0] = as-is, Mac layout, 1 = swapped, PC layout)");
 
+struct apple_non_apple_keyboard {
+       char *name;
+};
+
 struct apple_sc_backlight {
        struct led_classdev cdev;
        struct hid_device *hdev;
@@ -313,6 +317,26 @@ static const struct apple_key_translation swapped_fn_leftctrl_keys[] = {
        { }
 };
 
+static const struct apple_non_apple_keyboard non_apple_keyboards[] = {
+       { "SONiX USB DEVICE" },
+       { "Keychron" },
+       { "AONE" }
+};
+
+static bool apple_is_non_apple_keyboard(struct hid_device *hdev)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(non_apple_keyboards); i++) {
+               char *non_apple = non_apple_keyboards[i].name;
+
+               if (strncmp(hdev->name, non_apple, strlen(non_apple)) == 0)
+                       return true;
+       }
+
+       return false;
+}
+
 static inline void apple_setup_key_translation(struct input_dev *input,
                const struct apple_key_translation *table)
 {
@@ -363,7 +387,7 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
        }
 
        if (fnmode == 3) {
-               real_fnmode = (asc->quirks & APPLE_IS_KEYCHRON) ? 2 : 1;
+               real_fnmode = (asc->quirks & APPLE_IS_NON_APPLE) ? 2 : 1;
        } else {
                real_fnmode = fnmode;
        }
@@ -669,9 +693,9 @@ static int apple_input_configured(struct hid_device *hdev,
                asc->quirks &= ~APPLE_HAS_FN;
        }
 
-       if (strncmp(hdev->name, "Keychron", 8) == 0) {
-               hid_info(hdev, "Keychron keyboard detected; function keys will default to fnmode=2 behavior\n");
-               asc->quirks |= APPLE_IS_KEYCHRON;
+       if (apple_is_non_apple_keyboard(hdev)) {
+               hid_info(hdev, "Non-apple keyboard detected; function keys will default to fnmode=2 behavior\n");
+               asc->quirks |= APPLE_IS_NON_APPLE;
        }
 
        return 0;