summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Brassel <nick@tzarc.org>2023-07-08 10:15:51 +1000
committerGitHub <noreply@github.com>2023-07-08 10:15:51 +1000
commitf41bc8ce20da5efb29a80bfaa708f8be06f7f2c9 (patch)
tree617208d24135559be4a04744b767e95ac678312a
parent9a19b80c0c37cef968f8b53f88df6bb61ac3602d (diff)
bootmagic mods covering the case when swapped mods are pressed at the same time (#21320) (#21472)
Co-authored-by: Nimish Gåtam <nimishg@gmail.com>
-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) {
122 */ 122 */
123 123
124__attribute__((weak)) uint8_t mod_config(uint8_t mod) { 124__attribute__((weak)) uint8_t mod_config(uint8_t mod) {
125 /**
126 * Note: This function is for the 5-bit packed mods, NOT the full 8-bit mods.
127 * More info about the mods can be seen in modifiers.h.
128 */
125 if (keymap_config.swap_lalt_lgui) { 129 if (keymap_config.swap_lalt_lgui) {
126 if ((mod & MOD_RGUI) == MOD_LGUI) { 130 /** If both modifiers pressed or neither pressed, do nothing
127 mod &= ~MOD_LGUI; 131 * Otherwise swap the values
128 mod |= MOD_LALT; 132 * Note: The left mods are ANDed with the right-hand values to check
129 } else if ((mod & MOD_RALT) == MOD_LALT) { 133 * if they were pressed with the right hand bit set
130 mod &= ~MOD_LALT; 134 */
131 mod |= MOD_LGUI; 135 if (((mod & MOD_RALT) == MOD_LALT) ^ ((mod & MOD_RGUI) == MOD_LGUI)) {
136 mod ^= (MOD_LALT | MOD_LGUI);
132 } 137 }
133 } 138 }
134 if (keymap_config.swap_ralt_rgui) { 139 if (keymap_config.swap_ralt_rgui) {
135 if ((mod & MOD_RGUI) == MOD_RGUI) { 140 if (((mod & MOD_RALT) == MOD_RALT) ^ ((mod & MOD_RGUI) == MOD_RGUI)) {
136 mod &= ~MOD_RGUI; 141 /* lefthand values to preserve the right hand bit */
137 mod |= MOD_RALT; 142 mod ^= (MOD_LALT | MOD_LGUI);
138 } else if ((mod & MOD_RALT) == MOD_RALT) {
139 mod &= ~MOD_RALT;
140 mod |= MOD_RGUI;
141 } 143 }
142 } 144 }
143 if (keymap_config.swap_lctl_lgui) { 145 if (keymap_config.swap_lctl_lgui) {
144 if ((mod & MOD_RGUI) == MOD_LGUI) { 146 /* left mods ANDed with right-hand values to check for right hand bit */
145 mod &= ~MOD_LGUI; 147 if (((mod & MOD_RCTL) == MOD_LCTL) ^ ((mod & MOD_RGUI) == MOD_LGUI)) {
146 mod |= MOD_LCTL; 148 mod ^= (MOD_LCTL | MOD_LGUI);
147 } else if ((mod & MOD_RCTL) == MOD_LCTL) {
148 mod &= ~MOD_LCTL;
149 mod |= MOD_LGUI;
150 } 149 }
151 } 150 }
152 if (keymap_config.swap_rctl_rgui) { 151 if (keymap_config.swap_rctl_rgui) {
153 if ((mod & MOD_RGUI) == MOD_RGUI) { 152 if (((mod & MOD_RCTL) == MOD_RCTL) ^ ((mod & MOD_RGUI) == MOD_RGUI)) {
154 mod &= ~MOD_RGUI; 153 /* lefthand values to preserve the right hand bit */
155 mod |= MOD_RCTL; 154 mod ^= (MOD_LCTL | MOD_LGUI);
156 } else if ((mod & MOD_RCTL) == MOD_RCTL) {
157 mod &= ~MOD_RCTL;
158 mod |= MOD_RGUI;
159 } 155 }
160 } 156 }
161 if (keymap_config.no_gui) { 157 if (keymap_config.no_gui) {