|
|
|
@ -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,14 +110,31 @@ 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:
|
|
|
|
|
if ((int16_t)idx > highest_td)
|
|
|
|
@ -116,33 +151,13 @@ 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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
} else {
|
|
|
|
|
if (action->state.count && action->state.finished) {
|
|
|
|
|
reset_tap_dance (&action->state);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|