From 2def8a31c7bcb0fc90374909ce67d5ad305b2cbb Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 14 Apr 2026 22:22:21 +0000 Subject: [PATCH] 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 --- users/timfee/config.h | 1 + users/timfee/timfee.c | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/users/timfee/config.h b/users/timfee/config.h index f1e563f0..f673326b 100644 --- a/users/timfee/config.h +++ b/users/timfee/config.h @@ -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 diff --git a/users/timfee/timfee.c b/users/timfee/timfee.c index 25ff9df5..6087fc09 100644 --- a/users/timfee/timfee.c +++ b/users/timfee/timfee.c @@ -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; }