aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Pagano <mpagano@gentoo.org>2018-06-23 18:21:38 -0400
committerBertrand Jacquin <bertrand@jacquin.bzh>2018-10-05 00:55:01 +0200
commitca39d01a0099a27884a5c73abffebadc47f43948 (patch)
tree6d8f61864e72660cd6a27e26da98b9606e67c3a1
parentusb-storage: Disable UAS on JMicron SATA enclosure (diff)
downloadlinux-ca39d01a0099a27884a5c73abffebadc47f43948.tar.gz
4.18:2600_enable-key-swapping-for-apple-mac.patch
-rw-r--r--drivers/hid/hid-apple.c76
1 files changed, 74 insertions, 2 deletions
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c
index 25b7bd56ae11..d043ff014275 100644
--- a/drivers/hid/hid-apple.c
+++ b/drivers/hid/hid-apple.c
@@ -54,6 +54,22 @@ MODULE_PARM_DESC(swap_opt_cmd, "Swap the Option (\"Alt\") and Command (\"Flag\")
"(For people who want to keep Windows PC keyboard muscle memory. "
"[0] = as-is, Mac layout. 1 = swapped, Windows layout.)");
+static unsigned int swap_fn_leftctrl;
+module_param(swap_fn_leftctrl, uint, 0644);
+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)");
+
+static unsigned int rightalt_as_rightctrl;
+module_param(rightalt_as_rightctrl, uint, 0644);
+MODULE_PARM_DESC(rightalt_as_rightctrl, "Use the right Alt key as a right Ctrl key. "
+ "[0] = as-is, Mac layout. 1 = Right Alt is right Ctrl");
+
+static unsigned int ejectcd_as_delete;
+module_param(ejectcd_as_delete, uint, 0644);
+MODULE_PARM_DESC(ejectcd_as_delete, "Use Eject-CD key as Delete key. "
+ "([0] = disabled, 1 = enabled)");
+
struct apple_sc {
unsigned long quirks;
unsigned int fn_on;
@@ -166,6 +182,21 @@ static const struct apple_key_translation swapped_option_cmd_keys[] = {
{ }
};
+static const struct apple_key_translation swapped_fn_leftctrl_keys[] = {
+ { KEY_FN, KEY_LEFTCTRL },
+ { }
+};
+
+static const struct apple_key_translation rightalt_as_rightctrl_keys[] = {
+ { KEY_RIGHTALT, KEY_RIGHTCTRL },
+ { }
+};
+
+static const struct apple_key_translation ejectcd_as_delete_keys[] = {
+ { KEY_EJECTCD, KEY_DELETE },
+ { }
+};
+
static const struct apple_key_translation *apple_find_translation(
const struct apple_key_translation *table, u16 from)
{
@@ -185,9 +216,11 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
struct apple_sc *asc = hid_get_drvdata(hid);
const struct apple_key_translation *trans, *table;
- if (usage->code == KEY_FN) {
+ u16 fn_keycode = (swap_fn_leftctrl) ? (KEY_LEFTCTRL) : (KEY_FN);
+
+ if (usage->code == fn_keycode) {
asc->fn_on = !!value;
- input_event(input, usage->type, usage->code, value);
+ input_event(input, usage->type, KEY_FN, value);
return 1;
}
@@ -266,6 +299,30 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
}
}
+ if (swap_fn_leftctrl) {
+ trans = apple_find_translation(swapped_fn_leftctrl_keys, usage->code);
+ if (trans) {
+ input_event(input, usage->type, trans->to, value);
+ return 1;
+ }
+ }
+
+ if (ejectcd_as_delete) {
+ trans = apple_find_translation(ejectcd_as_delete_keys, usage->code);
+ if (trans) {
+ input_event(input, usage->type, trans->to, value);
+ return 1;
+ }
+ }
+
+ if (rightalt_as_rightctrl) {
+ trans = apple_find_translation(rightalt_as_rightctrl_keys, usage->code);
+ if (trans) {
+ input_event(input, usage->type, trans->to, value);
+ return 1;
+ }
+ }
+
return 0;
}
@@ -329,6 +386,21 @@ static void apple_setup_input(struct input_dev *input)
for (trans = apple_iso_keyboard; trans->from; trans++)
set_bit(trans->to, input->keybit);
+
+ if (swap_fn_leftctrl) {
+ for (trans = swapped_fn_leftctrl_keys; trans->from; trans++)
+ set_bit(trans->to, input->keybit);
+ }
+
+ if (ejectcd_as_delete) {
+ for (trans = ejectcd_as_delete_keys; trans->from; trans++)
+ set_bit(trans->to, input->keybit);
+ }
+
+ if (rightalt_as_rightctrl) {
+ for (trans = rightalt_as_rightctrl_keys; trans->from; trans++)
+ set_bit(trans->to, input->keybit);
+ }
}
static int apple_input_mapping(struct hid_device *hdev, struct hid_input *hi,