summaryrefslogtreecommitdiff
path: root/quantum/process_keycode
diff options
context:
space:
mode:
authorSergey Vlasov <sigprof@gmail.com>2021-04-25 06:41:37 +0300
committerGitHub <noreply@github.com>2021-04-25 13:41:37 +1000
commitda6e888a32a6d9c09a1506e9ae4a59a36f8a5354 (patch)
tree4ae81e39cc59cafce702f42be50b012a0313fc3e /quantum/process_keycode
parentd3bf3d3b1cfa9bd6d60ef605cf767e1fb1957c07 (diff)
downloadqmk_firmware-da6e888a32a6d9c09a1506e9ae4a59a36f8a5354.tar.gz
qmk_firmware-da6e888a32a6d9c09a1506e9ae4a59a36f8a5354.zip
Do not leak weak mods from tap dance to the interrupting keypress (#12471)
Tap dance callbacks may register weak mods; one case when it happens is when a tap dance registers a key with modifiers. When the tap dance is interrupted by pressing another key, these weak mods could affect the interrupting key (normally any stale weak mods are cleared at the start of action_exec() when handling a keypress event, but the tap dance interrupt check code is called later, and the weak mods left by that code were not cleared). Add another clear_weak_mods() call to preprocess_tap_dance() to make sure that the interrupting keypress is not affected by unrelated weak mods from the previous tap dance. Fixes #12445.
Diffstat (limited to 'quantum/process_keycode')
-rw-r--r--quantum/process_keycode/process_tap_dance.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/quantum/process_keycode/process_tap_dance.c b/quantum/process_keycode/process_tap_dance.c
index 138de0eba2..17dc540a64 100644
--- a/quantum/process_keycode/process_tap_dance.c
+++ b/quantum/process_keycode/process_tap_dance.c
@@ -117,6 +117,10 @@ void preprocess_tap_dance(uint16_t keycode, keyrecord_t *record) {
action->state.interrupting_keycode = keycode;
process_tap_dance_action_on_dance_finished(action);
reset_tap_dance(&action->state);
+
+ // Tap dance actions can leave some weak mods active (e.g., if the tap dance is mapped to a keycode with
+ // modifiers), but these weak mods should not affect the keypress which interrupted the tap dance.
+ clear_weak_mods();
}
}
}