From daea43debf2a0f2249cd98a8f109df978791f1fa Mon Sep 17 00:00:00 2001 From: ridingqwerty Date: Thu, 22 Oct 2020 22:57:12 -0400 Subject: [PATCH] New feature: Retro Tapping per key (#10622) --- docs/config_options.md | 2 ++ docs/tap_hold.md | 19 +++++++++++++++++++ tmk_core/common/action.c | 17 ++++++++++++----- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/docs/config_options.md b/docs/config_options.md index f9b1cc6578..3a4d7c87c5 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -135,6 +135,8 @@ If you define these options you will enable the associated feature, which may in * `#define RETRO_TAPPING` * tap anyway, even after TAPPING_TERM, if there was no other key interruption between press and release * See [Retro Tapping](tap_hold.md#retro-tapping) for details +* `#define RETRO_TAPPING_PER_KEY` + * enables handling for per key `RETRO_TAPPING` settings * `#define TAPPING_TOGGLE 2` * how many taps before triggering the toggle * `#define PERMISSIVE_HOLD` diff --git a/docs/tap_hold.md b/docs/tap_hold.md index 9ffbfde8fc..aacff40042 100644 --- a/docs/tap_hold.md +++ b/docs/tap_hold.md @@ -179,6 +179,25 @@ Holding and releasing a dual function key without pressing another key will resu For instance, holding and releasing `LT(2, KC_SPACE)` without hitting another key will result in nothing happening. With this enabled, it will send `KC_SPACE` instead. +For more granular control of this feature, you can add the following to your `config.h`: + +```c +#define RETRO_TAPPING_PER_KEY +``` + +You can then add the following function to your keymap: + +```c +bool get_retro_tapping(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case LT(2, KC_SPACE): + return true; + default: + return false; + } +} +``` + ## Why do we include the key record for the per key functions? One thing that you may notice is that we include the key record for all of the "per key" functions, and may be wondering why we do that. diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index f2560504a2..fdb99f8c24 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -43,7 +43,7 @@ along with this program. If not, see . int tp_buttons; -#ifdef RETRO_TAPPING +#if defined(RETRO_TAPPING) || defined(RETRO_TAPPING_PER_KEY) int retro_tapping_counter = 0; #endif @@ -55,6 +55,10 @@ int retro_tapping_counter = 0; __attribute__((weak)) bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) { return false; } #endif +#ifdef RETRO_TAPPING_PER_KEY +__attribute__((weak)) bool get_retro_tapping(uint16_t keycode, keyrecord_t *record) { return false; } +#endif + #ifndef TAP_CODE_DELAY # define TAP_CODE_DELAY 0 #endif @@ -71,7 +75,7 @@ void action_exec(keyevent_t event) { dprint("EVENT: "); debug_event(event); dprintln(); -#ifdef RETRO_TAPPING +#if defined(RETRO_TAPPING) || defined(RETRO_TAPPING_PER_KEY) retro_tapping_counter++; #endif } @@ -725,20 +729,23 @@ void process_action(keyrecord_t *record, action_t action) { #endif #ifndef NO_ACTION_TAPPING -# ifdef RETRO_TAPPING +# if defined(RETRO_TAPPING) || defined(RETRO_TAPPING_PER_KEY) if (!is_tap_action(action)) { retro_tapping_counter = 0; } else { if (event.pressed) { if (tap_count > 0) { retro_tapping_counter = 0; - } else { } } else { if (tap_count > 0) { retro_tapping_counter = 0; } else { - if (retro_tapping_counter == 2) { + if ( + # ifdef RETRO_TAPPING_PER_KEY + get_retro_tapping(get_event_keycode(record->event, false), record) && + # endif + retro_tapping_counter == 2) { tap_code(action.layer_tap.code); } retro_tapping_counter = 0;