diff options
Diffstat (limited to 'users/greatwizard/tap_dances.c')
-rw-r--r-- | users/greatwizard/tap_dances.c | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/users/greatwizard/tap_dances.c b/users/greatwizard/tap_dances.c new file mode 100644 index 000000000..c6be995c4 --- /dev/null +++ b/users/greatwizard/tap_dances.c | |||
@@ -0,0 +1,105 @@ | |||
1 | /* Copyright 2020 Guillaume Gérard | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | #include "tap_dances.h" | ||
17 | |||
18 | uint8_t cur_dance(qk_tap_dance_state_t *state) { | ||
19 | if (state->count == 1) { | ||
20 | if (state->interrupted || !state->pressed) return SINGLE_TAP; | ||
21 | else return SINGLE_HOLD; | ||
22 | } else if (state->count == 2) { | ||
23 | if (state->interrupted) return DOUBLE_SINGLE_TAP; | ||
24 | else if (state->pressed) return DOUBLE_HOLD; | ||
25 | else return DOUBLE_TAP; | ||
26 | } | ||
27 | if (state->count == 3) { | ||
28 | if (state->interrupted || !state->pressed) return TRIPLE_TAP; | ||
29 | else return TRIPLE_HOLD; | ||
30 | } else return 8; | ||
31 | } | ||
32 | |||
33 | static tap tap_state = { | ||
34 | .is_press_action = true, | ||
35 | .state = 0 | ||
36 | }; | ||
37 | |||
38 | #ifdef TAP_DANCE_LALT_GIT | ||
39 | void lalt_finished(qk_tap_dance_state_t *state, void *user_data) { | ||
40 | tap_state.state = cur_dance(state); | ||
41 | switch (tap_state.state) { | ||
42 | case SINGLE_HOLD: | ||
43 | register_mods(MOD_BIT(KC_LALT)); | ||
44 | break; | ||
45 | case DOUBLE_SINGLE_TAP: | ||
46 | case DOUBLE_TAP: | ||
47 | set_oneshot_layer(_GIT, ONESHOT_START); | ||
48 | break; | ||
49 | } | ||
50 | } | ||
51 | |||
52 | void lalt_reset(qk_tap_dance_state_t *state, void *user_data) { | ||
53 | switch (tap_state.state) { | ||
54 | case SINGLE_HOLD: | ||
55 | unregister_mods(MOD_BIT(KC_LALT)); | ||
56 | break; | ||
57 | case DOUBLE_SINGLE_TAP: | ||
58 | case DOUBLE_TAP: | ||
59 | clear_oneshot_layer_state(ONESHOT_PRESSED); | ||
60 | break; | ||
61 | } | ||
62 | tap_state.state = 0; | ||
63 | } | ||
64 | #endif | ||
65 | |||
66 | #ifdef TAP_DANCE_LSFT_CAPS | ||
67 | # ifdef LAYERS_PROGRAMMER | ||
68 | void pg_lsft_finished(qk_tap_dance_state_t *state, void *user_data) { | ||
69 | tap_state.state = cur_dance(state); | ||
70 | switch (tap_state.state) { | ||
71 | case SINGLE_HOLD: | ||
72 | register_mods(MOD_BIT(KC_LSFT)); | ||
73 | layer_on(_PROGRAMMER_SHIFTED); | ||
74 | break; | ||
75 | case DOUBLE_SINGLE_TAP: | ||
76 | case DOUBLE_TAP: | ||
77 | tap_code(KC_CAPS); | ||
78 | layer_on(_PROGRAMMER_SHIFTED); | ||
79 | break; | ||
80 | } | ||
81 | } | ||
82 | |||
83 | void pg_lsft_reset(qk_tap_dance_state_t *state, void *user_data) { | ||
84 | switch (tap_state.state) { | ||
85 | case SINGLE_HOLD: | ||
86 | unregister_mods(MOD_BIT(KC_LSFT)); | ||
87 | layer_off(_PROGRAMMER_SHIFTED); | ||
88 | break; | ||
89 | } | ||
90 | tap_state.state = 0; | ||
91 | } | ||
92 | # endif | ||
93 | #endif | ||
94 | |||
95 | qk_tap_dance_action_t tap_dance_actions[] = { | ||
96 | #ifdef TAP_DANCE_LALT_GIT | ||
97 | [TD_LALT_GIT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, lalt_finished, lalt_reset), | ||
98 | #endif | ||
99 | #ifdef TAP_DANCE_LSFT_CAPS | ||
100 | [TD_LSFT_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS), | ||
101 | # ifdef LAYERS_PROGRAMMER | ||
102 | [TD_PG_LSFT_CAPS] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, pg_lsft_finished, pg_lsft_reset), | ||
103 | # endif | ||
104 | #endif | ||
105 | }; | ||