diff options
author | Callum Oakley <hello@callumoakley.net> | 2020-09-09 23:37:34 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-09 15:37:34 -0700 |
commit | 3d4f0028d60cebc829ac9c947d1a61cc840d05c0 (patch) | |
tree | cc54048f38bd75f62de4d2f396359b4fa31b2711 /users/callum/oneshot.c | |
parent | 6e948feb6a33bcd1da45c5a590d0e6c241e1d879 (diff) |
[Keymap] major keymap overhaul (#10185)
* experiment with userspace
* reorganise
* readme
* missing oneshot shift from ignored keys
* recombine hands in layout macro
Diffstat (limited to 'users/callum/oneshot.c')
-rw-r--r-- | users/callum/oneshot.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/users/callum/oneshot.c b/users/callum/oneshot.c new file mode 100644 index 0000000000..33ec3895e2 --- /dev/null +++ b/users/callum/oneshot.c @@ -0,0 +1,57 @@ +#include "oneshot.h" + +void update_oneshot( + oneshot_state *state, + uint16_t mod, + uint16_t trigger, + uint16_t keycode, + keyrecord_t *record +) { + if (keycode == trigger) { + if (record->event.pressed) { + // Trigger keydown + if (*state == os_up_unqueued) { + register_code(mod); + } + *state = os_down_unused; + } else { + // Trigger keyup + switch (*state) { + case os_down_unused: + // If we didn't use the mod while trigger was held, queue it. + *state = os_up_queued; + break; + case os_down_used: + // If we did use the mod while trigger was held, unregister it. + *state = os_up_unqueued; + unregister_code(mod); + break; + default: + break; + } + } + } else { + if (record->event.pressed) { + if (is_oneshot_cancel_key(keycode) && *state != os_up_unqueued) { + // Cancel oneshot on designated cancel keydown. + *state = os_up_unqueued; + unregister_code(mod); + } + } else { + if (!is_oneshot_ignored_key(keycode)) { + // On non-ignored keyup, consider the oneshot used. + switch (*state) { + case os_down_unused: + *state = os_down_used; + break; + case os_up_queued: + *state = os_up_unqueued; + unregister_code(mod); + break; + default: + break; + } + } + } + } +} |