mirror of
https://github.com/qmk/qmk_firmware.git
synced 2024-11-24 12:22:57 +00:00
Merge d60d0cebee
into 36b5559b99
This commit is contained in:
commit
1fbb7dfbf9
@ -84,6 +84,16 @@ To remove the stress this situation produces to your hands, you can disable the
|
|||||||
|
|
||||||
Now, after you hit the leader key, you will have an infinite amount of time to start the rest of the sequence, allowing you to properly position your hands to type the rest of the sequence comfortably. This way you can configure a very short `LEADER_TIMEOUT`, but still have plenty of time to position your hands.
|
Now, after you hit the leader key, you will have an infinite amount of time to start the rest of the sequence, allowing you to properly position your hands to type the rest of the sequence comfortably. This way you can configure a very short `LEADER_TIMEOUT`, but still have plenty of time to position your hands.
|
||||||
|
|
||||||
|
### Disabling Timeout for aditional keystrokes {#disabling-timeout-more-keystrokes}
|
||||||
|
|
||||||
|
Aditionally, you may want to disable the timeout for additional keystrokes after the leader key.
|
||||||
|
Add the following to your `config.h`:
|
||||||
|
```c
|
||||||
|
#define LEADER_NO_TIMEOUT_FOR_N_KEYSTOKES <Number of keystrokes including leader>
|
||||||
|
```
|
||||||
|
Use with care, since sequences shorter than LEADER_NO_TIMEOUT_FOR_N_KEYSTOKES will not timeout, and thus will not terminate unless leader_end() is called.
|
||||||
|
|
||||||
|
|
||||||
### Strict Key Processing {#strict-key-processing}
|
### Strict Key Processing {#strict-key-processing}
|
||||||
|
|
||||||
By default, only the "tap keycode" portions of [Mod-Taps](../mod_tap) and [Layer Taps](../feature_layers#switching-and-toggling-layers) are added to the sequence buffer. This means if you press eg. `LT(3, KC_A)` as part of a sequence, `KC_A` will be added to the buffer, rather than the entire `LT(3, KC_A)` keycode.
|
By default, only the "tap keycode" portions of [Mod-Taps](../mod_tap) and [Layer Taps](../feature_layers#switching-and-toggling-layers) are added to the sequence buffer. This means if you press eg. `LT(3, KC_A)` as part of a sequence, `KC_A` will be added to the buffer, rather than the entire `LT(3, KC_A)` keycode.
|
||||||
|
@ -11,6 +11,10 @@
|
|||||||
# define LEADER_TIMEOUT 300
|
# define LEADER_TIMEOUT 300
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(LEADER_NO_TIMEOUT) && !defined(LEADER_NO_TIMEOUT_FOR_N_KEYSTOKES)
|
||||||
|
# define LEADER_NO_TIMEOUT_FOR_N_KEYSTOKES 1
|
||||||
|
#endif
|
||||||
|
|
||||||
// Leader key stuff
|
// Leader key stuff
|
||||||
bool leading = false;
|
bool leading = false;
|
||||||
uint16_t leader_time = 0;
|
uint16_t leader_time = 0;
|
||||||
@ -53,7 +57,7 @@ bool leader_sequence_add(uint16_t keycode) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined(LEADER_NO_TIMEOUT)
|
#if defined(LEADER_NO_TIMEOUT)
|
||||||
if (leader_sequence_size == 0) {
|
if (leader_sequence_size < LEADER_NO_TIMEOUT_FOR_N_KEYSTOKES) {
|
||||||
leader_reset_timer();
|
leader_reset_timer();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -66,7 +70,7 @@ bool leader_sequence_add(uint16_t keycode) {
|
|||||||
|
|
||||||
bool leader_sequence_timed_out(void) {
|
bool leader_sequence_timed_out(void) {
|
||||||
#if defined(LEADER_NO_TIMEOUT)
|
#if defined(LEADER_NO_TIMEOUT)
|
||||||
return leader_sequence_size > 0 && timer_elapsed(leader_time) > LEADER_TIMEOUT;
|
return leader_sequence_size >= LEADER_NO_TIMEOUT_FOR_N_KEYSTOKES && timer_elapsed(leader_time) > LEADER_TIMEOUT;
|
||||||
#else
|
#else
|
||||||
return timer_elapsed(leader_time) > LEADER_TIMEOUT;
|
return timer_elapsed(leader_time) > LEADER_TIMEOUT;
|
||||||
#endif
|
#endif
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
// Copyright 2023 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "test_common.h"
|
||||||
|
|
||||||
|
#define LEADER_NO_TIMEOUT
|
||||||
|
#define LEADER_NO_TIMEOUT_FOR_N_KEYSTOKES 2
|
@ -0,0 +1,7 @@
|
|||||||
|
# --------------------------------------------------------------------------------
|
||||||
|
# Keep this file, even if it is empty, as a marker that this folder contains tests
|
||||||
|
# --------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
LEADER_ENABLE = yes
|
||||||
|
|
||||||
|
SRC += ../leader_sequences.c
|
@ -0,0 +1,53 @@
|
|||||||
|
// Copyright 2023 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "keyboard_report_util.hpp"
|
||||||
|
#include "keycode.h"
|
||||||
|
#include "test_common.hpp"
|
||||||
|
#include "test_keymap_key.hpp"
|
||||||
|
|
||||||
|
using testing::_;
|
||||||
|
|
||||||
|
class Leader : public TestFixture {};
|
||||||
|
|
||||||
|
TEST_F(Leader, does_not_timeout_until_numkeypress_keys_pressed) {
|
||||||
|
TestDriver driver;
|
||||||
|
|
||||||
|
auto key_leader = KeymapKey(0, 0, 0, QK_LEADER);
|
||||||
|
auto key_a = KeymapKey(0, 1, 0, KC_A);
|
||||||
|
auto key_b = KeymapKey(0, 2, 0, KC_B);
|
||||||
|
|
||||||
|
set_keymap({key_leader, key_a, key_b});
|
||||||
|
|
||||||
|
EXPECT_EQ(leader_sequence_active(), false);
|
||||||
|
|
||||||
|
EXPECT_NO_REPORT(driver);
|
||||||
|
tap_key(key_leader);
|
||||||
|
|
||||||
|
EXPECT_EQ(leader_sequence_active(), true);
|
||||||
|
|
||||||
|
idle_for(1000);
|
||||||
|
|
||||||
|
EXPECT_EQ(leader_sequence_active(), true);
|
||||||
|
EXPECT_EQ(leader_sequence_timed_out(), false);
|
||||||
|
|
||||||
|
EXPECT_REPORT(driver, (KC_2));
|
||||||
|
EXPECT_EMPTY_REPORT(driver);
|
||||||
|
tap_key(key_a);
|
||||||
|
|
||||||
|
idle_for(1000);
|
||||||
|
|
||||||
|
EXPECT_EQ(leader_sequence_active(), true);
|
||||||
|
EXPECT_EQ(leader_sequence_timed_out(), false);
|
||||||
|
|
||||||
|
tap_key(key_b);
|
||||||
|
|
||||||
|
idle_for(300);
|
||||||
|
|
||||||
|
EXPECT_EQ(leader_sequence_active(), false);
|
||||||
|
EXPECT_EQ(leader_sequence_timed_out(), true);
|
||||||
|
|
||||||
|
EXPECT_REPORT(driver, (KC_A));
|
||||||
|
EXPECT_EMPTY_REPORT(driver);
|
||||||
|
tap_key(key_a);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user