summary refs log tree commit diff
diff options
context:
space:
mode:
authorNimish Gåtam <nimishg@gmail.com>2023-07-07 16:41:22 +0200
committerGitHub <noreply@github.com>2023-07-08 00:41:22 +1000
commitea87936b11a4396d607077d2ebb62e62c57c46a6 (patch)
treef06961262b16fd34f0f4464027f5ea2ce321fc30
parentebec17adea4b89c7d9ae08437d2b311f160b13d9 (diff)
bootmagic mods covering the case when swapped mods are pressed at the same time (#21320)
-rw-r--r--quantum/keycode_config.c44
1 files changed, 20 insertions, 24 deletions
diff --git a/quantum/keycode_config.c b/quantum/keycode_config.c
index 9dd7097c86..864488a65c 100644
--- a/quantum/keycode_config.c
+++ b/quantum/keycode_config.c
@@ -122,40 +122,36 @@ __attribute__((weak)) uint16_t keycode_config(uint16_t keycode) {
  */
 
 __attribute__((weak)) uint8_t mod_config(uint8_t mod) {
+    /**
+     * Note: This function is for the 5-bit packed mods, NOT the full 8-bit mods.
+     * More info about the mods can be seen in modifiers.h.
+     */
     if (keymap_config.swap_lalt_lgui) {
-        if ((mod & MOD_RGUI) == MOD_LGUI) {
-            mod &= ~MOD_LGUI;
-            mod |= MOD_LALT;
-        } else if ((mod & MOD_RALT) == MOD_LALT) {
-            mod &= ~MOD_LALT;
-            mod |= MOD_LGUI;
+        /** If both modifiers pressed or neither pressed, do nothing
+         * Otherwise swap the values
+         * Note: The left mods are ANDed with the right-hand values to check
+         * if they were pressed with the right hand bit set
+         */
+        if (((mod & MOD_RALT) == MOD_LALT) ^ ((mod & MOD_RGUI) == MOD_LGUI)) {
+            mod ^= (MOD_LALT | MOD_LGUI);
         }
     }
     if (keymap_config.swap_ralt_rgui) {
-        if ((mod & MOD_RGUI) == MOD_RGUI) {
-            mod &= ~MOD_RGUI;
-            mod |= MOD_RALT;
-        } else if ((mod & MOD_RALT) == MOD_RALT) {
-            mod &= ~MOD_RALT;
-            mod |= MOD_RGUI;
+        if (((mod & MOD_RALT) == MOD_RALT) ^ ((mod & MOD_RGUI) == MOD_RGUI)) {
+            /* lefthand values to preserve the right hand bit */
+            mod ^= (MOD_LALT | MOD_LGUI);
         }
     }
     if (keymap_config.swap_lctl_lgui) {
-        if ((mod & MOD_RGUI) == MOD_LGUI) {
-            mod &= ~MOD_LGUI;
-            mod |= MOD_LCTL;
-        } else if ((mod & MOD_RCTL) == MOD_LCTL) {
-            mod &= ~MOD_LCTL;
-            mod |= MOD_LGUI;
+        /* left mods ANDed with right-hand values to check for right hand bit */
+        if (((mod & MOD_RCTL) == MOD_LCTL) ^ ((mod & MOD_RGUI) == MOD_LGUI)) {
+            mod ^= (MOD_LCTL | MOD_LGUI);
         }
     }
     if (keymap_config.swap_rctl_rgui) {
-        if ((mod & MOD_RGUI) == MOD_RGUI) {
-            mod &= ~MOD_RGUI;
-            mod |= MOD_RCTL;
-        } else if ((mod & MOD_RCTL) == MOD_RCTL) {
-            mod &= ~MOD_RCTL;
-            mod |= MOD_RGUI;
+        if (((mod & MOD_RCTL) == MOD_RCTL) ^ ((mod & MOD_RGUI) == MOD_RGUI)) {
+            /* lefthand values to preserve the right hand bit */
+            mod ^= (MOD_LCTL | MOD_LGUI);
         }
     }
     if (keymap_config.no_gui) {