diff options
| author | Gergely Nagy <algernon@madhouse-project.org> | 2017-08-02 07:49:06 +0200 |
|---|---|---|
| committer | Jack Humbert <jack.humb@gmail.com> | 2017-08-02 16:06:16 -0400 |
| commit | d28b2c395b66d24eb15bacedb8b84c8a3828ac57 (patch) | |
| tree | b8dc14f4a9716f24a255d548da4fdde1fa44c077 /quantum/process_keycode | |
| parent | bb30ff5f71f34e638ffc0ac58b99c75c9214fe7b (diff) | |
| download | qmk_firmware-d28b2c395b66d24eb15bacedb8b84c8a3828ac57.tar.gz qmk_firmware-d28b2c395b66d24eb15bacedb8b84c8a3828ac57.zip | |
tap-dance: key + layer helper
This adds the `ACTION_TAP_DANCE_DUAL_ROLE` helper, which makes it easy to have
keys that act as a key on the first tap, and as a layer toggle on the second.
Fixes #1532, reported by @Ptomerty.
Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
Diffstat (limited to 'quantum/process_keycode')
| -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 4fd45810b..00870c4e7 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) { | |||
| 41 | } | 41 | } |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | void qk_tap_dance_dual_role_finished (qk_tap_dance_state_t *state, void *user_data) { | ||
| 45 | qk_tap_dance_dual_role_t *pair = (qk_tap_dance_dual_role_t *)user_data; | ||
| 46 | |||
| 47 | if (state->count == 1) { | ||
| 48 | register_code16 (pair->kc); | ||
| 49 | } else if (state->count == 2) { | ||
| 50 | layer_invert (pair->layer); | ||
| 51 | } | ||
| 52 | } | ||
| 53 | |||
| 54 | void qk_tap_dance_dual_role_reset (qk_tap_dance_state_t *state, void *user_data) { | ||
| 55 | qk_tap_dance_dual_role_t *pair = (qk_tap_dance_dual_role_t *)user_data; | ||
| 56 | |||
| 57 | if (state->count == 1) { | ||
| 58 | unregister_code16 (pair->kc); | ||
| 59 | } | ||
| 60 | } | ||
| 61 | |||
| 44 | static inline void _process_tap_dance_action_fn (qk_tap_dance_state_t *state, | 62 | static inline void _process_tap_dance_action_fn (qk_tap_dance_state_t *state, |
| 45 | void *user_data, | 63 | void *user_data, |
| 46 | qk_tap_dance_user_fn_t fn) | 64 | 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 f42c154a0..37a27c536 100644 --- a/quantum/process_keycode/process_tap_dance.h +++ b/quantum/process_keycode/process_tap_dance.h | |||
| @@ -54,11 +54,22 @@ typedef struct | |||
| 54 | uint16_t kc2; | 54 | uint16_t kc2; |
| 55 | } qk_tap_dance_pair_t; | 55 | } qk_tap_dance_pair_t; |
| 56 | 56 | ||
| 57 | typedef struct | ||
| 58 | { | ||
| 59 | uint16_t kc; | ||
| 60 | uint8_t layer; | ||
| 61 | } qk_tap_dance_dual_role_t; | ||
| 62 | |||
| 57 | #define ACTION_TAP_DANCE_DOUBLE(kc1, kc2) { \ | 63 | #define ACTION_TAP_DANCE_DOUBLE(kc1, kc2) { \ |
| 58 | .fn = { NULL, qk_tap_dance_pair_finished, qk_tap_dance_pair_reset }, \ | 64 | .fn = { NULL, qk_tap_dance_pair_finished, qk_tap_dance_pair_reset }, \ |
| 59 | .user_data = (void *)&((qk_tap_dance_pair_t) { kc1, kc2 }), \ | 65 | .user_data = (void *)&((qk_tap_dance_pair_t) { kc1, kc2 }), \ |
| 60 | } | 66 | } |
| 61 | 67 | ||
| 68 | #define ACTION_TAP_DANCE_DUAL_ROLE(kc, layer) { \ | ||
| 69 | .fn = { NULL, qk_tap_dance_dual_role_finished, qk_tap_dance_dual_role_reset }, \ | ||
| 70 | .user_data = (void *)&((qk_tap_dance_dual_role_t) { kc, layer }), \ | ||
| 71 | } | ||
| 72 | |||
| 62 | #define ACTION_TAP_DANCE_FN(user_fn) { \ | 73 | #define ACTION_TAP_DANCE_FN(user_fn) { \ |
| 63 | .fn = { NULL, user_fn, NULL }, \ | 74 | .fn = { NULL, user_fn, NULL }, \ |
| 64 | .user_data = NULL, \ | 75 | .user_data = NULL, \ |
| @@ -86,6 +97,9 @@ void reset_tap_dance (qk_tap_dance_state_t *state); | |||
| 86 | void qk_tap_dance_pair_finished (qk_tap_dance_state_t *state, void *user_data); | 97 | void qk_tap_dance_pair_finished (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); | 98 | void qk_tap_dance_pair_reset (qk_tap_dance_state_t *state, void *user_data); |
| 88 | 99 | ||
| 100 | void qk_tap_dance_dual_role_finished (qk_tap_dance_state_t *state, void *user_data); | ||
| 101 | void qk_tap_dance_dual_role_reset (qk_tap_dance_state_t *state, void *user_data); | ||
| 102 | |||
| 89 | #else | 103 | #else |
| 90 | 104 | ||
| 91 | #define TD(n) KC_NO | 105 | #define TD(n) KC_NO |
