diff options
author | Gustaf Rydholm <gustaf.rydholm@gmail.com> | 2024-03-10 00:47:43 +0100 |
---|---|---|
committer | Gustaf Rydholm <gustaf.rydholm@gmail.com> | 2024-03-10 00:47:43 +0100 |
commit | 40183b3cfa7fa2f487e1bfb828ddeecfc76c25e7 (patch) | |
tree | ec6b6e5cb3bf04a46dda00222252448e2dd9d707 /aktersnurra/sftrp.c | |
parent | 7e9f4b4aedd9e26d2aa3a51fb762a1293c69af1c (diff) |
Add sfrp to fix right parenthesis bug
Diffstat (limited to 'aktersnurra/sftrp.c')
-rw-r--r-- | aktersnurra/sftrp.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/aktersnurra/sftrp.c b/aktersnurra/sftrp.c new file mode 100644 index 0000000..b80f6c7 --- /dev/null +++ b/aktersnurra/sftrp.c @@ -0,0 +1,69 @@ +enum td_keycodes { + SFT_RP // `LSFT` when held, `(` when tapped. +}; + +typedef enum { + TD_NONE, + TD_UNKNOWN, + TD_SINGLE_TAP, + TD_SINGLE_HOLD, + TD_DOUBLE_SINGLE_TAP +} td_state_t; + +static td_state_t td_state; + +td_state_t cur_dance(tap_dance_state_t *state) { + if (state->count == 1) { + if (state->interrupted || !state->pressed) + return TD_SINGLE_TAP; + else + return TD_SINGLE_HOLD; + } + + if (state->count == 2) + return TD_DOUBLE_SINGLE_TAP; + else + return TD_UNKNOWN; // Any number higher than the maximum state value you + // return above +} + +void sftrp_finished(tap_dance_state_t *state, void *user_data) { + td_state = cur_dance(state); + switch (td_state) { + case TD_SINGLE_TAP: + register_code16(KC_RPRN); + break; + case TD_SINGLE_HOLD: + register_mods(MOD_BIT( + KC_LSFT)); // For a layer-tap key, use `layer_on(_MY_LAYER)` here + break; + case TD_DOUBLE_SINGLE_TAP: // Allow nesting of 2 parens `))` within tapping + // term + tap_code16(KC_RPRN); + register_code16(KC_RPRN); + break; + default: + break; + } +} + +void sftrp_reset(tap_dance_state_t *state, void *user_data) { + switch (td_state) { + case TD_SINGLE_TAP: + unregister_code16(KC_RPRN); + break; + case TD_SINGLE_HOLD: + unregister_mods(MOD_BIT( + KC_LSFT)); // For a layer-tap key, use `layer_off(_MY_LAYER)` here + break; + case TD_DOUBLE_SINGLE_TAP: + unregister_code16(KC_RPRN); + break; + default: + break; + } +} + +tap_dance_action_t tap_dance_actions[] = { + [SFT_RP] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, sftrp_finished, sftrp_reset)}; + |