Use permissive hold for mod-taps instead of always-hold

Chordal hold now passes on same-hand mod-taps (default behavior:
cross-hand = hold, same-hand = defer). Permissive hold then decides:
if the other key completes a full tap while the mod-tap is held, it's
a hold (CMD+A). If the mod-tap releases first, it's a tap (backspace).

This protects against fast typing rolls triggering accidental modifiers
while keeping same-hand shortcuts reliable.

https://claude.ai/code/session_01Q6jUPkVNbXkBqPgkmLWsTK
This commit is contained in:
Claude 2026-04-14 22:22:21 +00:00
commit 2def8a31c7
No known key found for this signature in database
2 changed files with 6 additions and 2 deletions

View file

@ -6,6 +6,7 @@
#define QUICK_TAP_TERM 130
#define QUICK_TAP_TERM_PER_KEY
#define CHORDAL_HOLD
#define PERMISSIVE_HOLD_PER_KEY
#define HOLD_ON_OTHER_KEY_PRESS_PER_KEY
#define RETRO_TAPPING
#define RETRO_TAPPING_PER_KEY

View file

@ -28,7 +28,6 @@ const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM = {
bool get_chordal_hold(uint16_t tap_hold_keycode, keyrecord_t *tap_hold_record,
uint16_t other_keycode, keyrecord_t *other_record) {
if (IS_QK_LAYER_TAP(tap_hold_keycode)) return true;
if (IS_QK_MOD_TAP(tap_hold_keycode)) return true;
return get_chordal_hold_default(tap_hold_record, other_record);
}
@ -244,8 +243,12 @@ uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
return TAPPING_TERM;
}
// ── Per-key permissive hold (mod-taps only) ──
bool get_permissive_hold(uint16_t keycode, keyrecord_t *record) {
return IS_QK_MOD_TAP(keycode);
}
// ── Per-key hold on other key press ──
// Disabled; chordal hold handles the opposite-hands rule.
bool get_hold_on_other_key_press(uint16_t keycode, keyrecord_t *record) {
return false;
}