diff options
Diffstat (limited to 'quantum/process_keycode/process_tap_dance.h')
-rw-r--r-- | quantum/process_keycode/process_tap_dance.h | 113 |
1 files changed, 49 insertions, 64 deletions
diff --git a/quantum/process_keycode/process_tap_dance.h b/quantum/process_keycode/process_tap_dance.h index 00d70cbc5..b2d0cb829 100644 --- a/quantum/process_keycode/process_tap_dance.h +++ b/quantum/process_keycode/process_tap_dance.h | |||
@@ -18,75 +18,60 @@ | |||
18 | 18 | ||
19 | #ifdef TAP_DANCE_ENABLE | 19 | #ifdef TAP_DANCE_ENABLE |
20 | 20 | ||
21 | #include <stdbool.h> | 21 | # include <stdbool.h> |
22 | #include <inttypes.h> | 22 | # include <inttypes.h> |
23 | 23 | ||
24 | typedef struct | 24 | typedef struct { |
25 | { | 25 | uint8_t count; |
26 | uint8_t count; | 26 | uint8_t oneshot_mods; |
27 | uint8_t oneshot_mods; | 27 | uint8_t weak_mods; |
28 | uint8_t weak_mods; | 28 | uint16_t keycode; |
29 | uint16_t keycode; | 29 | uint16_t interrupting_keycode; |
30 | uint16_t interrupting_keycode; | 30 | uint16_t timer; |
31 | uint16_t timer; | 31 | bool interrupted; |
32 | bool interrupted; | 32 | bool pressed; |
33 | bool pressed; | 33 | bool finished; |
34 | bool finished; | ||
35 | } qk_tap_dance_state_t; | 34 | } qk_tap_dance_state_t; |
36 | 35 | ||
37 | #define TD(n) (QK_TAP_DANCE | ((n) & 0xFF)) | 36 | # define TD(n) (QK_TAP_DANCE | ((n)&0xFF)) |
38 | 37 | ||
39 | typedef void (*qk_tap_dance_user_fn_t) (qk_tap_dance_state_t *state, void *user_data); | 38 | typedef void (*qk_tap_dance_user_fn_t)(qk_tap_dance_state_t *state, void *user_data); |
40 | 39 | ||
41 | typedef struct | 40 | typedef struct { |
42 | { | 41 | struct { |
43 | struct { | 42 | qk_tap_dance_user_fn_t on_each_tap; |
44 | qk_tap_dance_user_fn_t on_each_tap; | 43 | qk_tap_dance_user_fn_t on_dance_finished; |
45 | qk_tap_dance_user_fn_t on_dance_finished; | 44 | qk_tap_dance_user_fn_t on_reset; |
46 | qk_tap_dance_user_fn_t on_reset; | 45 | } fn; |
47 | } fn; | 46 | qk_tap_dance_state_t state; |
48 | qk_tap_dance_state_t state; | 47 | uint16_t custom_tapping_term; |
49 | uint16_t custom_tapping_term; | 48 | void * user_data; |
50 | void *user_data; | ||
51 | } qk_tap_dance_action_t; | 49 | } qk_tap_dance_action_t; |
52 | 50 | ||
53 | typedef struct | 51 | typedef struct { |
54 | { | 52 | uint16_t kc1; |
55 | uint16_t kc1; | 53 | uint16_t kc2; |
56 | uint16_t kc2; | ||
57 | } qk_tap_dance_pair_t; | 54 | } qk_tap_dance_pair_t; |
58 | 55 | ||
59 | typedef struct | 56 | typedef struct { |
60 | { | 57 | uint16_t kc; |
61 | uint16_t kc; | 58 | uint8_t layer; |
62 | uint8_t layer; | ||
63 | } qk_tap_dance_dual_role_t; | 59 | } qk_tap_dance_dual_role_t; |
64 | 60 | ||
65 | #define ACTION_TAP_DANCE_DOUBLE(kc1, kc2) { \ | 61 | # define ACTION_TAP_DANCE_DOUBLE(kc1, kc2) \ |
66 | .fn = { qk_tap_dance_pair_on_each_tap, qk_tap_dance_pair_finished, qk_tap_dance_pair_reset }, \ | 62 | { .fn = {qk_tap_dance_pair_on_each_tap, qk_tap_dance_pair_finished, qk_tap_dance_pair_reset}, .user_data = (void *)&((qk_tap_dance_pair_t){kc1, kc2}), } |
67 | .user_data = (void *)&((qk_tap_dance_pair_t) { kc1, kc2 }), \ | ||
68 | } | ||
69 | 63 | ||
70 | #define ACTION_TAP_DANCE_DUAL_ROLE(kc, layer) { \ | 64 | # define ACTION_TAP_DANCE_DUAL_ROLE(kc, layer) \ |
71 | .fn = { qk_tap_dance_dual_role_on_each_tap, qk_tap_dance_dual_role_finished, qk_tap_dance_dual_role_reset }, \ | 65 | { .fn = {qk_tap_dance_dual_role_on_each_tap, qk_tap_dance_dual_role_finished, qk_tap_dance_dual_role_reset}, .user_data = (void *)&((qk_tap_dance_dual_role_t){kc, layer}), } |
72 | .user_data = (void *)&((qk_tap_dance_dual_role_t) { kc, layer }), \ | ||
73 | } | ||
74 | 66 | ||
75 | #define ACTION_TAP_DANCE_FN(user_fn) { \ | 67 | # define ACTION_TAP_DANCE_FN(user_fn) \ |
76 | .fn = { NULL, user_fn, NULL }, \ | 68 | { .fn = {NULL, user_fn, NULL}, .user_data = NULL, } |
77 | .user_data = NULL, \ | ||
78 | } | ||
79 | 69 | ||
80 | #define ACTION_TAP_DANCE_FN_ADVANCED(user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset) { \ | 70 | # define ACTION_TAP_DANCE_FN_ADVANCED(user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset) \ |
81 | .fn = { user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset }, \ | 71 | { .fn = {user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset}, .user_data = NULL, } |
82 | .user_data = NULL, \ | ||
83 | } | ||
84 | 72 | ||
85 | #define ACTION_TAP_DANCE_FN_ADVANCED_TIME(user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset, tap_specific_tapping_term) { \ | 73 | # define ACTION_TAP_DANCE_FN_ADVANCED_TIME(user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset, tap_specific_tapping_term) \ |
86 | .fn = { user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset }, \ | 74 | { .fn = {user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset}, .user_data = NULL, .custom_tapping_term = tap_specific_tapping_term, } |
87 | .user_data = NULL, \ | ||
88 | .custom_tapping_term = tap_specific_tapping_term, \ | ||
89 | } | ||
90 | 75 | ||
91 | extern qk_tap_dance_action_t tap_dance_actions[]; | 76 | extern qk_tap_dance_action_t tap_dance_actions[]; |
92 | 77 | ||
@@ -94,20 +79,20 @@ extern qk_tap_dance_action_t tap_dance_actions[]; | |||
94 | 79 | ||
95 | void preprocess_tap_dance(uint16_t keycode, keyrecord_t *record); | 80 | void preprocess_tap_dance(uint16_t keycode, keyrecord_t *record); |
96 | bool process_tap_dance(uint16_t keycode, keyrecord_t *record); | 81 | bool process_tap_dance(uint16_t keycode, keyrecord_t *record); |
97 | void matrix_scan_tap_dance (void); | 82 | void matrix_scan_tap_dance(void); |
98 | void reset_tap_dance (qk_tap_dance_state_t *state); | 83 | void reset_tap_dance(qk_tap_dance_state_t *state); |
99 | 84 | ||
100 | void qk_tap_dance_pair_on_each_tap (qk_tap_dance_state_t *state, void *user_data); | 85 | void qk_tap_dance_pair_on_each_tap(qk_tap_dance_state_t *state, void *user_data); |
101 | void qk_tap_dance_pair_finished (qk_tap_dance_state_t *state, void *user_data); | 86 | void qk_tap_dance_pair_finished(qk_tap_dance_state_t *state, void *user_data); |
102 | void qk_tap_dance_pair_reset (qk_tap_dance_state_t *state, void *user_data); | 87 | void qk_tap_dance_pair_reset(qk_tap_dance_state_t *state, void *user_data); |
103 | 88 | ||
104 | void qk_tap_dance_dual_role_on_each_tap (qk_tap_dance_state_t *state, void *user_data); | 89 | void qk_tap_dance_dual_role_on_each_tap(qk_tap_dance_state_t *state, void *user_data); |
105 | void qk_tap_dance_dual_role_finished (qk_tap_dance_state_t *state, void *user_data); | 90 | void qk_tap_dance_dual_role_finished(qk_tap_dance_state_t *state, void *user_data); |
106 | void qk_tap_dance_dual_role_reset (qk_tap_dance_state_t *state, void *user_data); | 91 | void qk_tap_dance_dual_role_reset(qk_tap_dance_state_t *state, void *user_data); |
107 | 92 | ||
108 | #else | 93 | #else |
109 | 94 | ||
110 | #define TD(n) KC_NO | 95 | # define TD(n) KC_NO |
111 | 96 | ||
112 | #endif | 97 | #endif |
113 | 98 | ||