From f41bc8ce20da5efb29a80bfaa708f8be06f7f2c9 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sat, 8 Jul 2023 10:15:51 +1000 Subject: bootmagic mods covering the case when swapped mods are pressed at the same time (#21320) (#21472) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Nimish Gåtam --- quantum/keycode_config.c | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) (limited to 'quantum/keycode_config.c') 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) { -- cgit v1.2.3