1 /* Copyright 2016 Jack Humbert
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 # include "process_leader.h"
22 # ifndef LEADER_TIMEOUT
23 # define LEADER_TIMEOUT 300
26 __attribute__((weak)) void leader_start(void) {}
28 __attribute__((weak)) void leader_end(void) {}
32 uint16_t leader_time = 0;
34 uint16_t leader_sequence[5] = {0, 0, 0, 0, 0};
35 uint8_t leader_sequence_size = 0;
37 void qk_leader_start(void) {
43 leader_time = timer_read();
44 leader_sequence_size = 0;
45 memset(leader_sequence, 0, sizeof(leader_sequence));
48 bool process_leader(uint16_t keycode, keyrecord_t *record) {
50 if (record->event.pressed) {
52 if (timer_elapsed(leader_time) < LEADER_TIMEOUT) {
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)) {
55 keycode = keycode & 0xFF;
57 # endif // LEADER_KEY_STRICT_KEY_PROCESSING
58 if (leader_sequence_size < (sizeof(leader_sequence) / sizeof(leader_sequence[0]))) {
59 leader_sequence[leader_sequence_size] = keycode;
60 leader_sequence_size++;
65 # ifdef LEADER_PER_KEY_TIMING
66 leader_time = timer_read();
71 if (keycode == KC_LEAD) {