aboutsummaryrefslogtreecommitdiff
path: root/quantum/process_keycode/process_leader.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/process_keycode/process_leader.c')
-rw-r--r--quantum/process_keycode/process_leader.c86
1 files changed, 43 insertions, 43 deletions
diff --git a/quantum/process_keycode/process_leader.c b/quantum/process_keycode/process_leader.c
index f787e6b01..58a615d85 100644
--- a/quantum/process_keycode/process_leader.c
+++ b/quantum/process_keycode/process_leader.c
@@ -16,64 +16,64 @@
16 16
17#ifdef LEADER_ENABLE 17#ifdef LEADER_ENABLE
18 18
19#include "process_leader.h" 19# include "process_leader.h"
20#include <string.h> 20# include <string.h>
21 21
22#ifndef LEADER_TIMEOUT 22# ifndef LEADER_TIMEOUT
23 #define LEADER_TIMEOUT 300 23# define LEADER_TIMEOUT 300
24#endif 24# endif
25 25
26__attribute__ ((weak)) 26__attribute__((weak)) void leader_start(void) {}
27void leader_start(void) {}
28 27
29__attribute__ ((weak)) 28__attribute__((weak)) void leader_end(void) {}
30void leader_end(void) {}
31 29
32// Leader key stuff 30// Leader key stuff
33bool leading = false; 31bool leading = false;
34uint16_t leader_time = 0; 32uint16_t leader_time = 0;
35 33
36uint16_t leader_sequence[5] = {0, 0, 0, 0, 0}; 34uint16_t leader_sequence[5] = {0, 0, 0, 0, 0};
37uint8_t leader_sequence_size = 0; 35uint8_t leader_sequence_size = 0;
38 36
39void qk_leader_start(void) { 37void qk_leader_start(void) {
40 if (leading) { return; } 38 if (leading) {
41 leader_start(); 39 return;
42 leading = true; 40 }
43 leader_time = timer_read(); 41 leader_start();
44 leader_sequence_size = 0; 42 leading = true;
45 memset(leader_sequence, 0, sizeof(leader_sequence)); 43 leader_time = timer_read();
44 leader_sequence_size = 0;
45 memset(leader_sequence, 0, sizeof(leader_sequence));
46} 46}
47 47
48bool process_leader(uint16_t keycode, keyrecord_t *record) { 48bool process_leader(uint16_t keycode, keyrecord_t *record) {
49 // Leader key set-up 49 // Leader key set-up
50 if (record->event.pressed) { 50 if (record->event.pressed) {
51 if (leading) { 51 if (leading) {
52 if (timer_elapsed(leader_time) < LEADER_TIMEOUT) { 52 if (timer_elapsed(leader_time) < LEADER_TIMEOUT) {
53#ifndef LEADER_KEY_STRICT_KEY_PROCESSING 53# ifndef LEADER_KEY_STRICT_KEY_PROCESSING
54 if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { 54 if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) {
55 keycode = keycode & 0xFF; 55 keycode = keycode & 0xFF;
56 } 56 }
57#endif // LEADER_KEY_STRICT_KEY_PROCESSING 57# endif // LEADER_KEY_STRICT_KEY_PROCESSING
58 if ( leader_sequence_size < ( sizeof(leader_sequence) / sizeof(leader_sequence[0]) ) ) { 58 if (leader_sequence_size < (sizeof(leader_sequence) / sizeof(leader_sequence[0]))) {
59 leader_sequence[leader_sequence_size] = keycode; 59 leader_sequence[leader_sequence_size] = keycode;
60 leader_sequence_size++; 60 leader_sequence_size++;
61 } else {
62 leading = false;
63 leader_end();
64 }
65# ifdef LEADER_PER_KEY_TIMING
66 leader_time = timer_read();
67# endif
68 return false;
69 }
61 } else { 70 } else {
62 leading = false; 71 if (keycode == KC_LEAD) {
63 leader_end(); 72 qk_leader_start();
73 }
64 } 74 }
65#ifdef LEADER_PER_KEY_TIMING
66 leader_time = timer_read();
67#endif
68 return false;
69 }
70 } else {
71 if (keycode == KC_LEAD) {
72 qk_leader_start();
73 }
74 } 75 }
75 } 76 return true;
76 return true;
77} 77}
78 78
79#endif 79#endif