forked from mirrors/qmk_userspace
On-each-release tap dance function (#20255)
Co-authored-by: Sergey Vlasov <sigprof@gmail.com>
This commit is contained in:
parent
821db155f2
commit
2c70d38910
6 changed files with 159 additions and 7 deletions
|
@ -95,6 +95,10 @@ static inline void process_tap_dance_action_on_each_tap(tap_dance_action_t *acti
|
|||
_process_tap_dance_action_fn(&action->state, action->user_data, action->fn.on_each_tap);
|
||||
}
|
||||
|
||||
static inline void process_tap_dance_action_on_each_release(tap_dance_action_t *action) {
|
||||
_process_tap_dance_action_fn(&action->state, action->user_data, action->fn.on_each_release);
|
||||
}
|
||||
|
||||
static inline void process_tap_dance_action_on_reset(tap_dance_action_t *action) {
|
||||
_process_tap_dance_action_fn(&action->state, action->user_data, action->fn.on_reset);
|
||||
del_weak_mods(action->state.weak_mods);
|
||||
|
@ -158,8 +162,12 @@ bool process_tap_dance(uint16_t keycode, keyrecord_t *record) {
|
|||
process_tap_dance_action_on_each_tap(action);
|
||||
active_td = action->state.finished ? 0 : keycode;
|
||||
} else {
|
||||
process_tap_dance_action_on_each_release(action);
|
||||
if (action->state.finished) {
|
||||
process_tap_dance_action_on_reset(action);
|
||||
if (active_td == keycode) {
|
||||
active_td = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@ typedef struct {
|
|||
tap_dance_user_fn_t on_each_tap;
|
||||
tap_dance_user_fn_t on_dance_finished;
|
||||
tap_dance_user_fn_t on_reset;
|
||||
tap_dance_user_fn_t on_each_release;
|
||||
} fn;
|
||||
void *user_data;
|
||||
} tap_dance_action_t;
|
||||
|
@ -56,19 +57,22 @@ typedef struct {
|
|||
} tap_dance_dual_role_t;
|
||||
|
||||
#define ACTION_TAP_DANCE_DOUBLE(kc1, kc2) \
|
||||
{ .fn = {tap_dance_pair_on_each_tap, tap_dance_pair_finished, tap_dance_pair_reset}, .user_data = (void *)&((tap_dance_pair_t){kc1, kc2}), }
|
||||
{ .fn = {tap_dance_pair_on_each_tap, tap_dance_pair_finished, tap_dance_pair_reset, NULL}, .user_data = (void *)&((tap_dance_pair_t){kc1, kc2}), }
|
||||
|
||||
#define ACTION_TAP_DANCE_LAYER_MOVE(kc, layer) \
|
||||
{ .fn = {tap_dance_dual_role_on_each_tap, tap_dance_dual_role_finished, tap_dance_dual_role_reset}, .user_data = (void *)&((tap_dance_dual_role_t){kc, layer, layer_move}), }
|
||||
{ .fn = {tap_dance_dual_role_on_each_tap, tap_dance_dual_role_finished, tap_dance_dual_role_reset, NULL}, .user_data = (void *)&((tap_dance_dual_role_t){kc, layer, layer_move}), }
|
||||
|
||||
#define ACTION_TAP_DANCE_LAYER_TOGGLE(kc, layer) \
|
||||
{ .fn = {NULL, tap_dance_dual_role_finished, tap_dance_dual_role_reset}, .user_data = (void *)&((tap_dance_dual_role_t){kc, layer, layer_invert}), }
|
||||
{ .fn = {NULL, tap_dance_dual_role_finished, tap_dance_dual_role_reset, NULL}, .user_data = (void *)&((tap_dance_dual_role_t){kc, layer, layer_invert}), }
|
||||
|
||||
#define ACTION_TAP_DANCE_FN(user_fn) \
|
||||
{ .fn = {NULL, user_fn, NULL}, .user_data = NULL, }
|
||||
{ .fn = {NULL, user_fn, NULL, NULL}, .user_data = NULL, }
|
||||
|
||||
#define ACTION_TAP_DANCE_FN_ADVANCED(user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset) \
|
||||
{ .fn = {user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset}, .user_data = NULL, }
|
||||
{ .fn = {user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset, NULL}, .user_data = NULL, }
|
||||
|
||||
#define ACTION_TAP_DANCE_FN_ADVANCED_WITH_RELEASE(user_fn_on_each_tap, user_fn_on_each_release, user_fn_on_dance_finished, user_fn_on_dance_reset) \
|
||||
{ .fn = {user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset, user_fn_on_each_release}, .user_data = NULL, }
|
||||
|
||||
#define TD(n) (QK_TAP_DANCE | TD_INDEX(n))
|
||||
#define TD_INDEX(code) ((code)&0xFF)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue