diff options
| author | Ryan <fauxpark@gmail.com> | 2023-02-13 03:19:02 +1100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-02-13 03:19:02 +1100 |
| commit | bbf7a20b33de2d203518687cb5cd1aa85005ea27 (patch) | |
| tree | ee1a5c412a02021d085c81a26321c3424eca7022 /quantum/process_keycode/process_leader.c | |
| parent | d10350cd2ceb2b9d80522cdec3ea908118f7fd35 (diff) | |
Refactor Leader key feature (#19632)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Diffstat (limited to 'quantum/process_keycode/process_leader.c')
| -rw-r--r-- | quantum/process_keycode/process_leader.c | 77 |
1 files changed, 20 insertions, 57 deletions
diff --git a/quantum/process_keycode/process_leader.c b/quantum/process_keycode/process_leader.c index 80bc96e65f..a9823b6285 100644 --- a/quantum/process_keycode/process_leader.c +++ b/quantum/process_keycode/process_leader.c | |||
| @@ -15,71 +15,34 @@ | |||
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | #include "process_leader.h" | 17 | #include "process_leader.h" |
| 18 | #include <string.h> | 18 | #include "leader.h" |
| 19 | 19 | ||
| 20 | #ifndef LEADER_TIMEOUT | 20 | bool process_leader(uint16_t keycode, keyrecord_t *record) { |
| 21 | # define LEADER_TIMEOUT 300 | 21 | if (record->event.pressed) { |
| 22 | if (leader_sequence_active() && !leader_sequence_timed_out()) { | ||
| 23 | #ifndef LEADER_KEY_STRICT_KEY_PROCESSING | ||
| 24 | if (IS_QK_MOD_TAP(keycode)) { | ||
| 25 | keycode = QK_MOD_TAP_GET_TAP_KEYCODE(keycode); | ||
| 26 | } else if (IS_QK_LAYER_TAP(keycode)) { | ||
| 27 | keycode = QK_LAYER_TAP_GET_TAP_KEYCODE(keycode); | ||
| 28 | } | ||
| 22 | #endif | 29 | #endif |
| 23 | 30 | ||
| 24 | __attribute__((weak)) void leader_start_user(void) {} | 31 | if (!leader_sequence_add(keycode)) { |
| 25 | 32 | leader_end(); | |
| 26 | __attribute__((weak)) void leader_end_user(void) {} | ||
| 27 | |||
| 28 | // Leader key stuff | ||
| 29 | bool leading = false; | ||
| 30 | uint16_t leader_time = 0; | ||
| 31 | |||
| 32 | uint16_t leader_sequence[5] = {0, 0, 0, 0, 0}; | ||
| 33 | uint8_t leader_sequence_size = 0; | ||
| 34 | |||
| 35 | void leader_start(void) { | ||
| 36 | if (leading) { | ||
| 37 | return; | ||
| 38 | } | ||
| 39 | leader_start_user(); | ||
| 40 | leading = true; | ||
| 41 | leader_time = timer_read(); | ||
| 42 | leader_sequence_size = 0; | ||
| 43 | memset(leader_sequence, 0, sizeof(leader_sequence)); | ||
| 44 | } | ||
| 45 | 33 | ||
| 46 | void leader_end(void) { | 34 | return true; |
| 47 | leader_end_user(); | 35 | } |
| 48 | } | ||
| 49 | 36 | ||
| 50 | bool process_leader(uint16_t keycode, keyrecord_t *record) { | ||
| 51 | // Leader key set-up | ||
| 52 | if (record->event.pressed) { | ||
| 53 | if (leading) { | ||
| 54 | #ifndef LEADER_NO_TIMEOUT | ||
| 55 | if (timer_elapsed(leader_time) < LEADER_TIMEOUT) | ||
| 56 | #endif // LEADER_NO_TIMEOUT | ||
| 57 | { | ||
| 58 | #ifndef LEADER_KEY_STRICT_KEY_PROCESSING | ||
| 59 | if (IS_QK_MOD_TAP(keycode)) { | ||
| 60 | keycode = QK_MOD_TAP_GET_TAP_KEYCODE(keycode); | ||
| 61 | } else if (IS_QK_LAYER_TAP(keycode)) { | ||
| 62 | keycode = QK_LAYER_TAP_GET_TAP_KEYCODE(keycode); | ||
| 63 | } | ||
| 64 | #endif // LEADER_KEY_STRICT_KEY_PROCESSING | ||
| 65 | if (leader_sequence_size < ARRAY_SIZE(leader_sequence)) { | ||
| 66 | leader_sequence[leader_sequence_size] = keycode; | ||
| 67 | leader_sequence_size++; | ||
| 68 | } else { | ||
| 69 | leading = false; | ||
| 70 | leader_end_user(); | ||
| 71 | return true; | ||
| 72 | } | ||
| 73 | #ifdef LEADER_PER_KEY_TIMING | 37 | #ifdef LEADER_PER_KEY_TIMING |
| 74 | leader_time = timer_read(); | 38 | leader_reset_timer(); |
| 75 | #endif | 39 | #endif |
| 76 | return false; | 40 | |
| 77 | } | 41 | return false; |
| 78 | } else { | 42 | } else if (keycode == QK_LEADER) { |
| 79 | if (keycode == QK_LEADER) { | 43 | leader_start(); |
| 80 | leader_start(); | ||
| 81 | } | ||
| 82 | } | 44 | } |
| 83 | } | 45 | } |
| 46 | |||
| 84 | return true; | 47 | return true; |
| 85 | } | 48 | } |
