summaryrefslogtreecommitdiff
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.c83
1 files changed, 23 insertions, 60 deletions
diff --git a/quantum/process_keycode/process_leader.c b/quantum/process_keycode/process_leader.c
index b74b4927a8..a9823b6285 100644
--- a/quantum/process_keycode/process_leader.c
+++ b/quantum/process_keycode/process_leader.c
@@ -14,72 +14,35 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef LEADER_ENABLE
-
-# include "process_leader.h"
-# include <string.h>
-
-# ifndef LEADER_TIMEOUT
-# define LEADER_TIMEOUT 300
-# endif
-
-__attribute__((weak)) void leader_start(void) {}
-
-__attribute__((weak)) void leader_end(void) {}
-
-// Leader key stuff
-bool leading = false;
-uint16_t leader_time = 0;
-
-uint16_t leader_sequence[5] = {0, 0, 0, 0, 0};
-uint8_t leader_sequence_size = 0;
-
-void qk_leader_start(void) {
- if (leading) {
- return;
- }
- leader_start();
- leading = true;
- leader_time = timer_read();
- leader_sequence_size = 0;
- memset(leader_sequence, 0, sizeof(leader_sequence));
-}
+#include "process_leader.h"
+#include "leader.h"
bool process_leader(uint16_t keycode, keyrecord_t *record) {
- // Leader key set-up
if (record->event.pressed) {
- if (leading) {
-# ifndef LEADER_NO_TIMEOUT
- if (timer_elapsed(leader_time) < LEADER_TIMEOUT)
-# endif // LEADER_NO_TIMEOUT
- {
-# ifndef LEADER_KEY_STRICT_KEY_PROCESSING
- if (IS_QK_MOD_TAP(keycode)) {
- keycode = QK_MOD_TAP_GET_TAP_KEYCODE(keycode);
- } else if (IS_QK_LAYER_TAP(keycode)) {
- keycode = QK_LAYER_TAP_GET_TAP_KEYCODE(keycode);
- }
-# endif // LEADER_KEY_STRICT_KEY_PROCESSING
- if (leader_sequence_size < ARRAY_SIZE(leader_sequence)) {
- leader_sequence[leader_sequence_size] = keycode;
- leader_sequence_size++;
- } else {
- leading = false;
- leader_end();
- return true;
- }
-# ifdef LEADER_PER_KEY_TIMING
- leader_time = timer_read();
-# endif
- return false;
+ if (leader_sequence_active() && !leader_sequence_timed_out()) {
+#ifndef LEADER_KEY_STRICT_KEY_PROCESSING
+ if (IS_QK_MOD_TAP(keycode)) {
+ keycode = QK_MOD_TAP_GET_TAP_KEYCODE(keycode);
+ } else if (IS_QK_LAYER_TAP(keycode)) {
+ keycode = QK_LAYER_TAP_GET_TAP_KEYCODE(keycode);
}
- } else {
- if (keycode == QK_LEADER) {
- qk_leader_start();
+#endif
+
+ if (!leader_sequence_add(keycode)) {
+ leader_end();
+
+ return true;
}
+
+#ifdef LEADER_PER_KEY_TIMING
+ leader_reset_timer();
+#endif
+
+ return false;
+ } else if (keycode == QK_LEADER) {
+ leader_start();
}
}
+
return true;
}
-
-#endif