|
|
@ -21,6 +21,15 @@ uint8_t get_oneshot_mods(void); |
|
|
|
static uint16_t last_td; |
|
|
|
static int8_t highest_td = -1; |
|
|
|
|
|
|
|
void qk_tap_dance_pair_on_each_tap (qk_tap_dance_state_t *state, void *user_data) { |
|
|
|
qk_tap_dance_pair_t *pair = (qk_tap_dance_pair_t *)user_data; |
|
|
|
|
|
|
|
if (state->count == 2) { |
|
|
|
register_code16 (pair->kc2); |
|
|
|
state->finished = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void qk_tap_dance_pair_finished (qk_tap_dance_state_t *state, void *user_data) { |
|
|
|
qk_tap_dance_pair_t *pair = (qk_tap_dance_pair_t *)user_data; |
|
|
|
|
|
|
@ -41,6 +50,15 @@ void qk_tap_dance_pair_reset (qk_tap_dance_state_t *state, void *user_data) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void qk_tap_dance_dual_role_on_each_tap (qk_tap_dance_state_t *state, void *user_data) { |
|
|
|
qk_tap_dance_dual_role_t *pair = (qk_tap_dance_dual_role_t *)user_data; |
|
|
|
|
|
|
|
if (state->count == 2) { |
|
|
|
layer_move (pair->layer); |
|
|
|
state->finished = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void qk_tap_dance_dual_role_finished (qk_tap_dance_state_t *state, void *user_data) { |
|
|
|
qk_tap_dance_dual_role_t *pair = (qk_tap_dance_dual_role_t *)user_data; |
|
|
|
|
|
|
@ -92,13 +110,30 @@ static inline void process_tap_dance_action_on_reset (qk_tap_dance_action_t *act |
|
|
|
send_keyboard_report(); |
|
|
|
} |
|
|
|
|
|
|
|
bool process_tap_dance(uint16_t keycode, keyrecord_t *record) { |
|
|
|
uint16_t idx = keycode - QK_TAP_DANCE; |
|
|
|
void preprocess_tap_dance(uint16_t keycode, keyrecord_t *record) { |
|
|
|
qk_tap_dance_action_t *action; |
|
|
|
|
|
|
|
if (last_td && last_td != keycode) { |
|
|
|
(&tap_dance_actions[last_td - QK_TAP_DANCE])->state.interrupted = true; |
|
|
|
if (!record->event.pressed) |
|
|
|
return; |
|
|
|
|
|
|
|
if (highest_td == -1) |
|
|
|
return; |
|
|
|
|
|
|
|
for (int i = 0; i <= highest_td; i++) { |
|
|
|
action = &tap_dance_actions[i]; |
|
|
|
if (action->state.count) { |
|
|
|
if (keycode == action->state.keycode && keycode == last_td) |
|
|
|
continue; |
|
|
|
action->state.interrupted = true; |
|
|
|
process_tap_dance_action_on_dance_finished (action); |
|
|
|
reset_tap_dance (&action->state); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
bool process_tap_dance(uint16_t keycode, keyrecord_t *record) { |
|
|
|
uint16_t idx = keycode - QK_TAP_DANCE; |
|
|
|
qk_tap_dance_action_t *action; |
|
|
|
|
|
|
|
switch(keycode) { |
|
|
|
case QK_TAP_DANCE ... QK_TAP_DANCE_MAX: |
|
|
@ -116,34 +151,14 @@ bool process_tap_dance(uint16_t keycode, keyrecord_t *record) { |
|
|
|
action->state.weak_mods |= get_weak_mods(); |
|
|
|
process_tap_dance_action_on_each_tap (action); |
|
|
|
|
|
|
|
if (last_td && last_td != keycode) { |
|
|
|
qk_tap_dance_action_t *paction = &tap_dance_actions[last_td - QK_TAP_DANCE]; |
|
|
|
paction->state.interrupted = true; |
|
|
|
process_tap_dance_action_on_dance_finished (paction); |
|
|
|
reset_tap_dance (&paction->state); |
|
|
|
} |
|
|
|
|
|
|
|
last_td = keycode; |
|
|
|
} else { |
|
|
|
if (action->state.count && action->state.finished) { |
|
|
|
reset_tap_dance (&action->state); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
if (!record->event.pressed) |
|
|
|
return true; |
|
|
|
|
|
|
|
if (highest_td == -1) |
|
|
|
return true; |
|
|
|
|
|
|
|
for (int i = 0; i <= highest_td; i++) { |
|
|
|
action = &tap_dance_actions[i]; |
|
|
|
if (action->state.count == 0) |
|
|
|
continue; |
|
|
|
action->state.interrupted = true; |
|
|
|
process_tap_dance_action_on_dance_finished (action); |
|
|
|
reset_tap_dance (&action->state); |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
return true; |
|
|
@ -156,7 +171,7 @@ void matrix_scan_tap_dance () { |
|
|
|
return; |
|
|
|
uint16_t tap_user_defined; |
|
|
|
|
|
|
|
for (uint8_t i = 0; i <= highest_td; i++) { |
|
|
|
for (uint8_t i = 0; i <= highest_td; i++) { |
|
|
|
qk_tap_dance_action_t *action = &tap_dance_actions[i]; |
|
|
|
if(action->custom_tapping_term > 0 ) { |
|
|
|
tap_user_defined = action->custom_tapping_term; |
|
|
|