Apple keyboards have the Command keys (a.k.a. the Apple or "waffle" key) in the positions normally occupied on PC keyboards by the Alt/AltGr keys, and the Option or Alt keys in the position occupied by the so-called Windows keys. Folks who have been using PC-type computers for too long generally have insurmountable muscle memory in this regard. This patch adds a module parameter, defaulting to off, that swaps these keys. The same effect can also be achieved by changing the console and X keymaps, but this approach does not scale. For example, I don't want to have to learn how to reconfigure Wayland's keymaps when the future arrives and we all start using it, and there may be applications I don't know about that also read keyboard events directly. Signed-off-by: Paul Collins <paul@xxxxxxxxxxxxx> --- drivers/hid/hid-apple.c | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+), 0 deletions(-) diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c index 7ed94cf..63e9ee3 100644 --- a/drivers/hid/hid-apple.c +++ b/drivers/hid/hid-apple.c @@ -40,6 +40,11 @@ module_param(fnmode, uint, 0644); MODULE_PARM_DESC(fnmode, "Mode of fn key on Apple keyboards (0 = disabled, " "[1] = fkeyslast, 2 = fkeysfirst)"); +static unsigned int swapmodifiers = 0; +module_param(swapmodifiers, uint, 0644); +MODULE_PARM_DESC(fnmode, "Modifiers match labels or positions " + "([0] = labels, 1 = positions)"); + struct apple_sc { unsigned long quirks; unsigned int fn_on; @@ -123,6 +128,14 @@ static struct apple_key_translation apple_iso_keyboard[] = { { } }; +static struct apple_key_translation apple_swap_modifiers[] = { + { KEY_LEFTALT, KEY_LEFTMETA }, + { KEY_RIGHTALT, KEY_RIGHTMETA }, + { KEY_LEFTMETA, KEY_LEFTALT }, + { KEY_RIGHTMETA, KEY_RIGHTALT }, + { } +}; + static struct apple_key_translation *apple_find_translation( struct apple_key_translation *table, u16 from) { @@ -199,6 +212,14 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input, } } + if (swapmodifiers) { + trans = apple_find_translation(apple_swap_modifiers, usage->code); + if (trans) { + input_event(input, usage->type, trans->to, value); + return 1; + } + } + if (asc->quirks & APPLE_ISO_KEYBOARD) { trans = apple_find_translation(apple_iso_keyboard, usage->code); if (trans) { -- Paul Collins Wellington, New Zealand Dag vijandelijk luchtschip de huismeester is dood -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html