diff options
author | Drashna Jaelre <drashna@live.com> | 2021-11-01 09:41:24 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-01 09:41:24 -0700 |
commit | 2980c63d3d4480a10bb1f7e6cf417bc9c9b65b72 (patch) | |
tree | d8ea4fd23db524ca69c1c518153e72a70d5642b9 /quantum | |
parent | f7e94f6624cc06a0403ec3b20e12ff558132459d (diff) | |
download | qmk_firmware-2980c63d3d4480a10bb1f7e6cf417bc9c9b65b72.tar.gz qmk_firmware-2980c63d3d4480a10bb1f7e6cf417bc9c9b65b72.zip |
Fix issues with Oneshot disabling (#14934)
Diffstat (limited to 'quantum')
-rw-r--r-- | quantum/action.c | 166 | ||||
-rw-r--r-- | quantum/action_util.c | 3 |
2 files changed, 104 insertions, 65 deletions
diff --git a/quantum/action.c b/quantum/action.c index 95f39d23d..8c34b84ef 100644 --- a/quantum/action.c +++ b/quantum/action.c | |||
@@ -27,6 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
27 | #include "action_util.h" | 27 | #include "action_util.h" |
28 | #include "action.h" | 28 | #include "action.h" |
29 | #include "wait.h" | 29 | #include "wait.h" |
30 | #include "keycode_config.h" | ||
30 | 31 | ||
31 | #ifdef BACKLIGHT_ENABLE | 32 | #ifdef BACKLIGHT_ENABLE |
32 | # include "backlight.h" | 33 | # include "backlight.h" |
@@ -87,19 +88,21 @@ void action_exec(keyevent_t event) { | |||
87 | keyrecord_t record = {.event = event}; | 88 | keyrecord_t record = {.event = event}; |
88 | 89 | ||
89 | #ifndef NO_ACTION_ONESHOT | 90 | #ifndef NO_ACTION_ONESHOT |
91 | if (!keymap_config.oneshot_disable) { | ||
90 | # if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) | 92 | # if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) |
91 | if (has_oneshot_layer_timed_out()) { | 93 | if (has_oneshot_layer_timed_out()) { |
92 | clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); | 94 | clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); |
93 | } | 95 | } |
94 | if (has_oneshot_mods_timed_out()) { | 96 | if (has_oneshot_mods_timed_out()) { |
95 | clear_oneshot_mods(); | 97 | clear_oneshot_mods(); |
96 | } | 98 | } |
97 | # ifdef SWAP_HANDS_ENABLE | 99 | # ifdef SWAP_HANDS_ENABLE |
98 | if (has_oneshot_swaphands_timed_out()) { | 100 | if (has_oneshot_swaphands_timed_out()) { |
99 | clear_oneshot_swaphands(); | 101 | clear_oneshot_swaphands(); |
100 | } | 102 | } |
101 | # endif | 103 | # endif |
102 | # endif | 104 | # endif |
105 | } | ||
103 | #endif | 106 | #endif |
104 | 107 | ||
105 | #ifndef NO_ACTION_TAPPING | 108 | #ifndef NO_ACTION_TAPPING |
@@ -195,7 +198,7 @@ void process_record(keyrecord_t *record) { | |||
195 | 198 | ||
196 | if (!process_record_quantum(record)) { | 199 | if (!process_record_quantum(record)) { |
197 | #ifndef NO_ACTION_ONESHOT | 200 | #ifndef NO_ACTION_ONESHOT |
198 | if (is_oneshot_layer_active() && record->event.pressed) { | 201 | if (is_oneshot_layer_active() && record->event.pressed && !keymap_config.oneshot_disable) { |
199 | clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); | 202 | clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); |
200 | } | 203 | } |
201 | #endif | 204 | #endif |
@@ -260,7 +263,7 @@ void process_action(keyrecord_t *record, action_t action) { | |||
260 | # ifdef SWAP_HANDS_ENABLE | 263 | # ifdef SWAP_HANDS_ENABLE |
261 | && !(action.kind.id == ACT_SWAP_HANDS && action.swap.code == OP_SH_ONESHOT) | 264 | && !(action.kind.id == ACT_SWAP_HANDS && action.swap.code == OP_SH_ONESHOT) |
262 | # endif | 265 | # endif |
263 | ) { | 266 | && !keymap_config.oneshot_disable) { |
264 | clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); | 267 | clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); |
265 | do_release_oneshot = !is_oneshot_layer_active(); | 268 | do_release_oneshot = !is_oneshot_layer_active(); |
266 | } | 269 | } |
@@ -304,41 +307,68 @@ void process_action(keyrecord_t *record, action_t action) { | |||
304 | # ifndef NO_ACTION_ONESHOT | 307 | # ifndef NO_ACTION_ONESHOT |
305 | case MODS_ONESHOT: | 308 | case MODS_ONESHOT: |
306 | // Oneshot modifier | 309 | // Oneshot modifier |
307 | if (event.pressed) { | 310 | if (keymap_config.oneshot_disable) { |
308 | if (tap_count == 0) { | 311 | if (event.pressed) { |
309 | dprint("MODS_TAP: Oneshot: 0\n"); | 312 | if (mods) { |
310 | register_mods(mods | get_oneshot_mods()); | 313 | if (IS_MOD(action.key.code) || action.key.code == KC_NO) { |
311 | } else if (tap_count == 1) { | 314 | // e.g. LSFT(KC_LGUI): we don't want the LSFT to be weak as it would make it useless. |
312 | dprint("MODS_TAP: Oneshot: start\n"); | 315 | // This also makes LSFT(KC_LGUI) behave exactly the same as LGUI(KC_LSFT). |
313 | set_oneshot_mods(mods | get_oneshot_mods()); | 316 | // Same applies for some keys like KC_MEH which are declared as MEH(KC_NO). |
314 | # if defined(ONESHOT_TAP_TOGGLE) && ONESHOT_TAP_TOGGLE > 1 | 317 | add_mods(mods); |
315 | } else if (tap_count == ONESHOT_TAP_TOGGLE) { | 318 | } else { |
316 | dprint("MODS_TAP: Toggling oneshot"); | 319 | add_weak_mods(mods); |
317 | clear_oneshot_mods(); | 320 | } |
318 | set_oneshot_locked_mods(mods); | 321 | send_keyboard_report(); |
319 | register_mods(mods); | 322 | } |
320 | # endif | 323 | register_code(action.key.code); |
321 | } else { | 324 | } else { |
322 | register_mods(mods | get_oneshot_mods()); | 325 | unregister_code(action.key.code); |
326 | if (mods) { | ||
327 | if (IS_MOD(action.key.code) || action.key.code == KC_NO) { | ||
328 | del_mods(mods); | ||
329 | } else { | ||
330 | del_weak_mods(mods); | ||
331 | } | ||
332 | send_keyboard_report(); | ||
333 | } | ||
323 | } | 334 | } |
324 | } else { | 335 | } else { |
325 | if (tap_count == 0) { | 336 | if (event.pressed) { |
326 | clear_oneshot_mods(); | 337 | if (tap_count == 0) { |
327 | unregister_mods(mods); | 338 | dprint("MODS_TAP: Oneshot: 0\n"); |
328 | } else if (tap_count == 1) { | 339 | register_mods(mods | get_oneshot_mods()); |
329 | // Retain Oneshot mods | 340 | } else if (tap_count == 1) { |
341 | dprint("MODS_TAP: Oneshot: start\n"); | ||
342 | set_oneshot_mods(mods | get_oneshot_mods()); | ||
330 | # if defined(ONESHOT_TAP_TOGGLE) && ONESHOT_TAP_TOGGLE > 1 | 343 | # if defined(ONESHOT_TAP_TOGGLE) && ONESHOT_TAP_TOGGLE > 1 |
331 | if (mods & get_mods()) { | 344 | } else if (tap_count == ONESHOT_TAP_TOGGLE) { |
332 | clear_oneshot_locked_mods(); | 345 | dprint("MODS_TAP: Toggling oneshot"); |
333 | clear_oneshot_mods(); | 346 | clear_oneshot_mods(); |
334 | unregister_mods(mods); | 347 | set_oneshot_locked_mods(mods); |
335 | } | 348 | register_mods(mods); |
336 | } else if (tap_count == ONESHOT_TAP_TOGGLE) { | ||
337 | // Toggle Oneshot Layer | ||
338 | # endif | 349 | # endif |
350 | } else { | ||
351 | register_mods(mods | get_oneshot_mods()); | ||
352 | } | ||
339 | } else { | 353 | } else { |
340 | clear_oneshot_mods(); | 354 | if (tap_count == 0) { |
341 | unregister_mods(mods); | 355 | clear_oneshot_mods(); |
356 | unregister_mods(mods); | ||
357 | } else if (tap_count == 1) { | ||
358 | // Retain Oneshot mods | ||
359 | # if defined(ONESHOT_TAP_TOGGLE) && ONESHOT_TAP_TOGGLE > 1 | ||
360 | if (mods & get_mods()) { | ||
361 | clear_oneshot_locked_mods(); | ||
362 | clear_oneshot_mods(); | ||
363 | unregister_mods(mods); | ||
364 | } | ||
365 | } else if (tap_count == ONESHOT_TAP_TOGGLE) { | ||
366 | // Toggle Oneshot Layer | ||
367 | # endif | ||
368 | } else { | ||
369 | clear_oneshot_mods(); | ||
370 | unregister_mods(mods); | ||
371 | } | ||
342 | } | 372 | } |
343 | } | 373 | } |
344 | break; | 374 | break; |
@@ -523,39 +553,47 @@ void process_action(keyrecord_t *record, action_t action) { | |||
523 | # ifndef NO_ACTION_ONESHOT | 553 | # ifndef NO_ACTION_ONESHOT |
524 | case OP_ONESHOT: | 554 | case OP_ONESHOT: |
525 | // Oneshot modifier | 555 | // Oneshot modifier |
526 | # if defined(ONESHOT_TAP_TOGGLE) && ONESHOT_TAP_TOGGLE > 1 | 556 | if (keymap_config.oneshot_disable) { |
527 | do_release_oneshot = false; | 557 | if (event.pressed) { |
528 | if (event.pressed) { | ||
529 | del_mods(get_oneshot_locked_mods()); | ||
530 | if (get_oneshot_layer_state() == ONESHOT_TOGGLED) { | ||
531 | reset_oneshot_layer(); | ||
532 | layer_off(action.layer_tap.val); | ||
533 | break; | ||
534 | } else if (tap_count < ONESHOT_TAP_TOGGLE) { | ||
535 | layer_on(action.layer_tap.val); | 558 | layer_on(action.layer_tap.val); |
536 | set_oneshot_layer(action.layer_tap.val, ONESHOT_START); | 559 | } else { |
560 | layer_off(action.layer_tap.val); | ||
537 | } | 561 | } |
538 | } else { | 562 | } else { |
539 | add_mods(get_oneshot_locked_mods()); | 563 | # if defined(ONESHOT_TAP_TOGGLE) && ONESHOT_TAP_TOGGLE > 1 |
540 | if (tap_count >= ONESHOT_TAP_TOGGLE) { | 564 | do_release_oneshot = false; |
541 | reset_oneshot_layer(); | 565 | if (event.pressed) { |
542 | clear_oneshot_locked_mods(); | 566 | del_mods(get_oneshot_locked_mods()); |
543 | set_oneshot_layer(action.layer_tap.val, ONESHOT_TOGGLED); | 567 | if (get_oneshot_layer_state() == ONESHOT_TOGGLED) { |
568 | reset_oneshot_layer(); | ||
569 | layer_off(action.layer_tap.val); | ||
570 | break; | ||
571 | } else if (tap_count < ONESHOT_TAP_TOGGLE) { | ||
572 | layer_on(action.layer_tap.val); | ||
573 | set_oneshot_layer(action.layer_tap.val, ONESHOT_START); | ||
574 | } | ||
544 | } else { | 575 | } else { |
545 | clear_oneshot_layer_state(ONESHOT_PRESSED); | 576 | add_mods(get_oneshot_locked_mods()); |
577 | if (tap_count >= ONESHOT_TAP_TOGGLE) { | ||
578 | reset_oneshot_layer(); | ||
579 | clear_oneshot_locked_mods(); | ||
580 | set_oneshot_layer(action.layer_tap.val, ONESHOT_TOGGLED); | ||
581 | } else { | ||
582 | clear_oneshot_layer_state(ONESHOT_PRESSED); | ||
583 | } | ||
546 | } | 584 | } |
547 | } | ||
548 | # else | 585 | # else |
549 | if (event.pressed) { | 586 | if (event.pressed) { |
550 | layer_on(action.layer_tap.val); | 587 | layer_on(action.layer_tap.val); |
551 | set_oneshot_layer(action.layer_tap.val, ONESHOT_START); | 588 | set_oneshot_layer(action.layer_tap.val, ONESHOT_START); |
552 | } else { | 589 | } else { |
553 | clear_oneshot_layer_state(ONESHOT_PRESSED); | 590 | clear_oneshot_layer_state(ONESHOT_PRESSED); |
554 | if (tap_count > 1) { | 591 | if (tap_count > 1) { |
555 | clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); | 592 | clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); |
593 | } | ||
556 | } | 594 | } |
557 | } | ||
558 | # endif | 595 | # endif |
596 | } | ||
559 | break; | 597 | break; |
560 | # endif | 598 | # endif |
561 | default: | 599 | default: |
diff --git a/quantum/action_util.c b/quantum/action_util.c index 9a85bd504..78e02aec1 100644 --- a/quantum/action_util.c +++ b/quantum/action_util.c | |||
@@ -170,7 +170,7 @@ void reset_oneshot_layer(void) { | |||
170 | void clear_oneshot_layer_state(oneshot_fullfillment_t state) { | 170 | void clear_oneshot_layer_state(oneshot_fullfillment_t state) { |
171 | uint8_t start_state = oneshot_layer_data; | 171 | uint8_t start_state = oneshot_layer_data; |
172 | oneshot_layer_data &= ~state; | 172 | oneshot_layer_data &= ~state; |
173 | if ((!get_oneshot_layer_state() && start_state != oneshot_layer_data) || keymap_config.oneshot_disable) { | 173 | if ((!get_oneshot_layer_state() && start_state != oneshot_layer_data) && !keymap_config.oneshot_disable) { |
174 | layer_off(get_oneshot_layer()); | 174 | layer_off(get_oneshot_layer()); |
175 | reset_oneshot_layer(); | 175 | reset_oneshot_layer(); |
176 | } | 176 | } |
@@ -189,6 +189,7 @@ void oneshot_set(bool active) { | |||
189 | if (keymap_config.oneshot_disable != active) { | 189 | if (keymap_config.oneshot_disable != active) { |
190 | keymap_config.oneshot_disable = active; | 190 | keymap_config.oneshot_disable = active; |
191 | eeconfig_update_keymap(keymap_config.raw); | 191 | eeconfig_update_keymap(keymap_config.raw); |
192 | clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); | ||
192 | dprintf("Oneshot: active: %d\n", active); | 193 | dprintf("Oneshot: active: %d\n", active); |
193 | } | 194 | } |
194 | } | 195 | } |