aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Gergely Nagy <qmk@gergo.csillger.hu>2018-04-24 16:41:38 +0200
committerGravatar Jack Humbert <jack.humb@gmail.com>2018-05-14 10:09:28 -0400
commit38f204db3031475aef2252e1ad11e4c87fb559f1 (patch)
tree037feaeac9bae770ef268b348007aa5efcb63fc8
parente76eee2d0a9d002fb264de538c816a6c5de4b8b9 (diff)
downloadqmk_firmware-38f204db3031475aef2252e1ad11e4c87fb559f1.tar.gz
Allow one-shot modifiers to be chained
Many a times one would want to use multiple modifiers with the same key, preferably without having to hold anything, like `Ctrl+Shift+C` or `Ctrl+Shift+V` to copy/paste in GNOME Terminal. To make this possible, we need to be able to chain one-shot modifiers, so that we can have multiple of them active at the same time. The easiest way to accomplish this is that whenever we activate a one-shot modifier, we apply it on top of the existing set, instead of re-setting the state. When deactivating, either due to an interrupt, or due to a timeout, we deactivate all oneshots anyway, so the clearing part is covered. When we turn the one-shot modifier into a toggle, that will also clear all one-shot modifiers first, so we covered that case too. Fixes #2796, #1580, and #856. Signed-off-by: Gergely Nagy <qmk@gergo.csillger.hu>
-rw-r--r--tmk_core/common/action.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c
index fff834791..f7c039f45 100644
--- a/tmk_core/common/action.c
+++ b/tmk_core/common/action.c
@@ -258,10 +258,10 @@ void process_action(keyrecord_t *record, action_t action)
if (event.pressed) {
if (tap_count == 0) {
dprint("MODS_TAP: Oneshot: 0\n");
- register_mods(mods);
+ register_mods(mods | get_oneshot_mods());
} else if (tap_count == 1) {
dprint("MODS_TAP: Oneshot: start\n");
- set_oneshot_mods(mods);
+ set_oneshot_mods(mods | get_oneshot_mods());
#if defined(ONESHOT_TAP_TOGGLE) && ONESHOT_TAP_TOGGLE > 1
} else if (tap_count == ONESHOT_TAP_TOGGLE) {
dprint("MODS_TAP: Toggling oneshot");
@@ -270,7 +270,7 @@ void process_action(keyrecord_t *record, action_t action)
register_mods(mods);
#endif
} else {
- register_mods(mods);
+ register_mods(mods | get_oneshot_mods());
}
} else {
if (tap_count == 0) {