update to current state
https://getreuer.info/posts/keyboards/achordion/ https://sunaku.github.io/home-row-mods.html#typing-streaks
This commit is contained in:
parent
49f72da230
commit
29daa02b02
|
@ -36,6 +36,14 @@ static uint16_t hold_timer = 0;
|
||||||
// Eagerly applied mods, if any.
|
// Eagerly applied mods, if any.
|
||||||
static uint8_t eager_mods = 0;
|
static uint8_t eager_mods = 0;
|
||||||
|
|
||||||
|
#ifdef ACHORDION_STREAK
|
||||||
|
// Timer for typing streak
|
||||||
|
static uint16_t streak_timer = 0;
|
||||||
|
#else
|
||||||
|
// When disabled, is_streak is never true
|
||||||
|
#define is_streak false
|
||||||
|
#endif
|
||||||
|
|
||||||
// Achordion's current state.
|
// Achordion's current state.
|
||||||
enum {
|
enum {
|
||||||
// A tap-hold key is pressed, but hasn't yet been settled as tapped or held.
|
// A tap-hold key is pressed, but hasn't yet been settled as tapped or held.
|
||||||
|
@ -86,8 +94,8 @@ bool process_achordion(uint16_t keycode, keyrecord_t* record) {
|
||||||
#ifdef IS_KEYEVENT
|
#ifdef IS_KEYEVENT
|
||||||
const bool is_key_event = IS_KEYEVENT(record->event);
|
const bool is_key_event = IS_KEYEVENT(record->event);
|
||||||
#else
|
#else
|
||||||
const bool is_key_event = (record->event.key.row < 254 &&
|
const bool is_key_event =
|
||||||
record->event.key.col < 254);
|
(record->event.key.row < 254 && record->event.key.col < 254);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (achordion_state == STATE_RELEASED) {
|
if (achordion_state == STATE_RELEASED) {
|
||||||
|
@ -116,6 +124,9 @@ bool process_achordion(uint16_t keycode, keyrecord_t* record) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ACHORDION_STREAK
|
||||||
|
streak_timer = (timer_read() + achordion_streak_timeout(keycode)) | 1;
|
||||||
|
#endif
|
||||||
return true; // Otherwise, continue with default handling.
|
return true; // Otherwise, continue with default handling.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,6 +150,11 @@ bool process_achordion(uint16_t keycode, keyrecord_t* record) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (achordion_state == STATE_UNSETTLED && record->event.pressed) {
|
if (achordion_state == STATE_UNSETTLED && record->event.pressed) {
|
||||||
|
#ifdef ACHORDION_STREAK
|
||||||
|
const bool is_streak = (streak_timer != 0);
|
||||||
|
streak_timer = (timer_read() + achordion_streak_timeout(keycode)) | 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Press event occurred on a key other than the active tap-hold key.
|
// Press event occurred on a key other than the active tap-hold key.
|
||||||
|
|
||||||
// If the other key is *also* a tap-hold key and considered by QMK to be
|
// If the other key is *also* a tap-hold key and considered by QMK to be
|
||||||
|
@ -151,8 +167,8 @@ bool process_achordion(uint16_t keycode, keyrecord_t* record) {
|
||||||
// events back into the handling pipeline so that QMK features and other
|
// events back into the handling pipeline so that QMK features and other
|
||||||
// user code can see them. This is done by calling `process_record()`, which
|
// user code can see them. This is done by calling `process_record()`, which
|
||||||
// in turn calls most handlers including `process_record_user()`.
|
// in turn calls most handlers including `process_record_user()`.
|
||||||
if (!is_key_event || (is_tap_hold && record->tap.count == 0) ||
|
if (!is_streak && (!is_key_event || (is_tap_hold && record->tap.count == 0) ||
|
||||||
achordion_chord(tap_hold_keycode, &tap_hold_record, keycode, record)) {
|
achordion_chord(tap_hold_keycode, &tap_hold_record, keycode, record))) {
|
||||||
dprintln("Achordion: Plumbing hold press.");
|
dprintln("Achordion: Plumbing hold press.");
|
||||||
settle_as_hold();
|
settle_as_hold();
|
||||||
} else {
|
} else {
|
||||||
|
@ -179,6 +195,10 @@ bool process_achordion(uint16_t keycode, keyrecord_t* record) {
|
||||||
return false; // Block the original event.
|
return false; // Block the original event.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ACHORDION_STREAK
|
||||||
|
// update idle timer on regular keys event
|
||||||
|
streak_timer = (timer_read() + achordion_streak_timeout(keycode)) | 1;
|
||||||
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,6 +208,12 @@ void achordion_task(void) {
|
||||||
dprintln("Achordion: Timeout. Plumbing hold press.");
|
dprintln("Achordion: Timeout. Plumbing hold press.");
|
||||||
settle_as_hold(); // Timeout expired, settle the key as held.
|
settle_as_hold(); // Timeout expired, settle the key as held.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ACHORDION_STREAK
|
||||||
|
if (streak_timer && timer_expired(timer_read(), streak_timer)) {
|
||||||
|
streak_timer = 0; // Expired.
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns true if `pos` on the left hand of the keyboard, false if right.
|
// Returns true if `pos` on the left hand of the keyboard, false if right.
|
||||||
|
@ -225,4 +251,10 @@ __attribute__((weak)) bool achordion_eager_mod(uint8_t mod) {
|
||||||
return (mod & (MOD_LALT | MOD_LGUI)) == 0;
|
return (mod & (MOD_LALT | MOD_LGUI)) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ACHORDION_STREAK
|
||||||
|
__attribute__((weak)) uint16_t achordion_streak_timeout(uint16_t tap_hold_keycode) {
|
||||||
|
return 100; // Default of 100 ms.
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // version check
|
#endif // version check
|
||||||
|
|
|
@ -53,6 +53,27 @@
|
||||||
|
|
||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Suppress tap-hold mods within a *typing streak* by defining
|
||||||
|
* ACHORDION_STREAK. This can help preventing accidental mod
|
||||||
|
* activation when performing a fast tapping sequence.
|
||||||
|
* This is inspired by https://sunaku.github.io/home-row-mods.html#typing-streaks
|
||||||
|
*
|
||||||
|
* Enable with:
|
||||||
|
*
|
||||||
|
* #define ACHORDION_STREAK
|
||||||
|
*
|
||||||
|
* Adjust the maximum time between key events before modifiers can be enabled
|
||||||
|
* by defining the following callback in your keymap.c:
|
||||||
|
*
|
||||||
|
* uint16_t achordion_streak_timeout(uint16_t tap_hold_keycode) {
|
||||||
|
* return 100; // Default of 100 ms.
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
#ifdef ACHORDION_STREAK
|
||||||
|
uint16_t achordion_streak_timeout(uint16_t tap_hold_keycode);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -49,3 +49,6 @@
|
||||||
// delay hold/release to not mess up software
|
// delay hold/release to not mess up software
|
||||||
#define TAP_CODE_DELAY 10
|
#define TAP_CODE_DELAY 10
|
||||||
|
|
||||||
|
// enable the https://sunaku.github.io/home-row-mods.html#typing-streaks inspired stuff
|
||||||
|
#define ACHORDION_STREAK
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue