diff options
Diffstat (limited to 'quantum')
| -rw-r--r-- | quantum/process_keycode/process_tap_dance.c | 18 | ||||
| -rw-r--r-- | quantum/process_keycode/process_tap_dance.h | 14 | 
2 files changed, 32 insertions, 0 deletions
diff --git a/quantum/process_keycode/process_tap_dance.c b/quantum/process_keycode/process_tap_dance.c index 4fd45810bb..00870c4e7f 100644 --- a/quantum/process_keycode/process_tap_dance.c +++ b/quantum/process_keycode/process_tap_dance.c @@ -41,6 +41,24 @@ void qk_tap_dance_pair_reset (qk_tap_dance_state_t *state, void *user_data) {    }  } +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; + +  if (state->count == 1) { +    register_code16 (pair->kc); +  } else if (state->count == 2) { +    layer_invert (pair->layer); +  } +} + +void qk_tap_dance_dual_role_reset (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 == 1) { +    unregister_code16 (pair->kc); +  } +} +  static inline void _process_tap_dance_action_fn (qk_tap_dance_state_t *state,                                                   void *user_data,                                                   qk_tap_dance_user_fn_t fn) diff --git a/quantum/process_keycode/process_tap_dance.h b/quantum/process_keycode/process_tap_dance.h index f42c154a05..37a27c5366 100644 --- a/quantum/process_keycode/process_tap_dance.h +++ b/quantum/process_keycode/process_tap_dance.h @@ -54,11 +54,22 @@ typedef struct    uint16_t kc2;  } qk_tap_dance_pair_t; +typedef struct +{ +  uint16_t kc; +  uint8_t layer; +} qk_tap_dance_dual_role_t; +  #define ACTION_TAP_DANCE_DOUBLE(kc1, kc2) { \      .fn = { NULL, qk_tap_dance_pair_finished, qk_tap_dance_pair_reset }, \      .user_data = (void *)&((qk_tap_dance_pair_t) { kc1, kc2 }),  \    } +#define ACTION_TAP_DANCE_DUAL_ROLE(kc, layer) { \ +    .fn = { NULL, qk_tap_dance_dual_role_finished, qk_tap_dance_dual_role_reset }, \ +    .user_data = (void *)&((qk_tap_dance_dual_role_t) { kc, layer }), \ +  } +  #define ACTION_TAP_DANCE_FN(user_fn) {  \      .fn = { NULL, user_fn, NULL }, \      .user_data = NULL, \ @@ -86,6 +97,9 @@ void reset_tap_dance (qk_tap_dance_state_t *state);  void qk_tap_dance_pair_finished (qk_tap_dance_state_t *state, void *user_data);  void qk_tap_dance_pair_reset (qk_tap_dance_state_t *state, void *user_data); +void qk_tap_dance_dual_role_finished (qk_tap_dance_state_t *state, void *user_data); +void qk_tap_dance_dual_role_reset (qk_tap_dance_state_t *state, void *user_data); +  #else  #define TD(n) KC_NO  | 
