diff options
| author | Albert Y <76888457+filterpaper@users.noreply.github.com> | 2022-12-12 23:52:22 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-12-12 16:52:22 +0100 |
| commit | cbabc8dbe6a8476d3082e8bc649d330f87e7b904 (patch) | |
| tree | 55e73275367047981295d046867d9f70352814c7 /quantum | |
| parent | 8698d109d7c2f4554e0f3c01b017738a0a47f162 (diff) | |
[Core] Replace Tapping Force Hold feature with Quick Tap Term (#17007)
* Replace Tapping Force Hold feature with Quick Tap Term
* Replace keyboard level TAPPING_FORCE_HOLD with QUICK_TAP_TERM 0
* Deprecate force hold in info_config.json
* Before and after quick tap term unit tests
* Quick tap unit tests iteration
* Keymap config.h correction
* Remove TAPPING_FORCE_HOLD_PER_KEY macros that were missed
* Add two more test cases for quick tap
* Replace TAPPING_FORCE_HOLD with QUICK_TAP_TERM in configs #2
* Replace TAPPING_FORCE_HOLD_PER_KEY with QUICK_TAP_TERM_PER_KEY in configs #2
* Add function declaration for get_quick_tap_term
Co-authored-by: Stefan Kerkmann <karlk90@pm.me>
Diffstat (limited to 'quantum')
| -rw-r--r-- | quantum/action_tapping.c | 19 | ||||
| -rw-r--r-- | quantum/action_tapping.h | 13 |
2 files changed, 18 insertions, 14 deletions
diff --git a/quantum/action_tapping.c b/quantum/action_tapping.c index b5386a5e17..0350495ae5 100644 --- a/quantum/action_tapping.c +++ b/quantum/action_tapping.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | # define IS_TAPPING_RECORD(r) (IS_TAPPING() && KEYEQ(tapping_key.event.key, (r->event.key)) && tapping_key.keycode == r->keycode) | 25 | # define IS_TAPPING_RECORD(r) (IS_TAPPING() && KEYEQ(tapping_key.event.key, (r->event.key)) && tapping_key.keycode == r->keycode) |
| 26 | # endif | 26 | # endif |
| 27 | # define WITHIN_TAPPING_TERM(e) (TIMER_DIFF_16(e.time, tapping_key.event.time) < GET_TAPPING_TERM(get_record_keycode(&tapping_key, false), &tapping_key)) | 27 | # define WITHIN_TAPPING_TERM(e) (TIMER_DIFF_16(e.time, tapping_key.event.time) < GET_TAPPING_TERM(get_record_keycode(&tapping_key, false), &tapping_key)) |
| 28 | # define WITHIN_QUICK_TAP_TERM(e) (TIMER_DIFF_16(e.time, tapping_key.event.time) < GET_QUICK_TAP_TERM(get_record_keycode(&tapping_key, false), &tapping_key)) | ||
| 28 | 29 | ||
| 29 | # ifdef DYNAMIC_TAPPING_TERM_ENABLE | 30 | # ifdef DYNAMIC_TAPPING_TERM_ENABLE |
| 30 | uint16_t g_tapping_term = TAPPING_TERM; | 31 | uint16_t g_tapping_term = TAPPING_TERM; |
| @@ -40,9 +41,9 @@ __attribute__((weak)) uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *r | |||
| 40 | } | 41 | } |
| 41 | # endif | 42 | # endif |
| 42 | 43 | ||
| 43 | # ifdef TAPPING_FORCE_HOLD_PER_KEY | 44 | # ifdef QUICK_TAP_TERM_PER_KEY |
| 44 | __attribute__((weak)) bool get_tapping_force_hold(uint16_t keycode, keyrecord_t *record) { | 45 | __attribute__((weak)) uint16_t get_quick_tap_term(uint16_t keycode, keyrecord_t *record) { |
| 45 | return false; | 46 | return QUICK_TAP_TERM; |
| 46 | } | 47 | } |
| 47 | # endif | 48 | # endif |
| 48 | 49 | ||
| @@ -121,7 +122,7 @@ void action_tapping_process(keyrecord_t record) { | |||
| 121 | * readable. The conditional definition of tapping_keycode and all the | 122 | * readable. The conditional definition of tapping_keycode and all the |
| 122 | * conditional uses of it are hidden inside macros named TAP_... | 123 | * conditional uses of it are hidden inside macros named TAP_... |
| 123 | */ | 124 | */ |
| 124 | # if (defined(AUTO_SHIFT_ENABLE) && defined(RETRO_SHIFT)) || defined(PERMISSIVE_HOLD_PER_KEY) || defined(TAPPING_FORCE_HOLD_PER_KEY) || defined(HOLD_ON_OTHER_KEY_PRESS_PER_KEY) | 125 | # if (defined(AUTO_SHIFT_ENABLE) && defined(RETRO_SHIFT)) || defined(PERMISSIVE_HOLD_PER_KEY) || defined(QUICK_TAP_TERM_PER_KEY) || defined(HOLD_ON_OTHER_KEY_PRESS_PER_KEY) |
| 125 | # define TAP_DEFINE_KEYCODE uint16_t tapping_keycode = get_record_keycode(&tapping_key, false) | 126 | # define TAP_DEFINE_KEYCODE uint16_t tapping_keycode = get_record_keycode(&tapping_key, false) |
| 126 | # else | 127 | # else |
| 127 | # define TAP_DEFINE_KEYCODE | 128 | # define TAP_DEFINE_KEYCODE |
| @@ -169,14 +170,6 @@ void action_tapping_process(keyrecord_t record) { | |||
| 169 | # define TAP_GET_IGNORE_MOD_TAP_INTERRUPT false | 170 | # define TAP_GET_IGNORE_MOD_TAP_INTERRUPT false |
| 170 | # endif | 171 | # endif |
| 171 | 172 | ||
| 172 | # ifdef TAPPING_FORCE_HOLD_PER_KEY | ||
| 173 | # define TAP_GET_TAPPING_FORCE_HOLD get_tapping_force_hold(tapping_keycode, &tapping_key) | ||
| 174 | # elif defined(TAPPING_FORCE_HOLD) | ||
| 175 | # define TAP_GET_TAPPING_FORCE_HOLD true | ||
| 176 | # else | ||
| 177 | # define TAP_GET_TAPPING_FORCE_HOLD false | ||
| 178 | # endif | ||
| 179 | |||
| 180 | /** \brief Tapping | 173 | /** \brief Tapping |
| 181 | * | 174 | * |
| 182 | * Rule: Tap key is typed(pressed and released) within TAPPING_TERM. | 175 | * Rule: Tap key is typed(pressed and released) within TAPPING_TERM. |
| @@ -385,7 +378,7 @@ bool process_tapping(keyrecord_t *keyp) { | |||
| 385 | if (WITHIN_TAPPING_TERM(event) || MAYBE_RETRO_SHIFTING(event)) { | 378 | if (WITHIN_TAPPING_TERM(event) || MAYBE_RETRO_SHIFTING(event)) { |
| 386 | if (event.pressed) { | 379 | if (event.pressed) { |
| 387 | if (IS_TAPPING_RECORD(keyp)) { | 380 | if (IS_TAPPING_RECORD(keyp)) { |
| 388 | if (!TAP_GET_TAPPING_FORCE_HOLD && !tapping_key.tap.interrupted && tapping_key.tap.count > 0) { | 381 | if (WITHIN_QUICK_TAP_TERM(event) && !tapping_key.tap.interrupted && tapping_key.tap.count > 0) { |
| 389 | // sequential tap. | 382 | // sequential tap. |
| 390 | keyp->tap = tapping_key.tap; | 383 | keyp->tap = tapping_key.tap; |
| 391 | if (keyp->tap.count < 15) keyp->tap.count += 1; | 384 | if (keyp->tap.count < 15) keyp->tap.count += 1; |
diff --git a/quantum/action_tapping.h b/quantum/action_tapping.h index bcccc7ac45..c078488c04 100644 --- a/quantum/action_tapping.h +++ b/quantum/action_tapping.h | |||
| @@ -22,6 +22,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 22 | # define TAPPING_TERM 200 | 22 | # define TAPPING_TERM 200 |
| 23 | #endif | 23 | #endif |
| 24 | 24 | ||
| 25 | /* period of quick tap(ms) */ | ||
| 26 | #if !defined(QUICK_TAP_TERM) || QUICK_TAP_TERM > TAPPING_TERM | ||
| 27 | # define QUICK_TAP_TERM TAPPING_TERM | ||
| 28 | #endif | ||
| 29 | |||
| 25 | /* tap count needed for toggling a feature */ | 30 | /* tap count needed for toggling a feature */ |
| 26 | #ifndef TAPPING_TOGGLE | 31 | #ifndef TAPPING_TOGGLE |
| 27 | # define TAPPING_TOGGLE 5 | 32 | # define TAPPING_TOGGLE 5 |
| @@ -36,9 +41,9 @@ void action_tapping_process(keyrecord_t record); | |||
| 36 | #endif | 41 | #endif |
| 37 | 42 | ||
| 38 | uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record); | 43 | uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record); |
| 44 | uint16_t get_quick_tap_term(uint16_t keycode, keyrecord_t *record); | ||
| 39 | bool get_permissive_hold(uint16_t keycode, keyrecord_t *record); | 45 | bool get_permissive_hold(uint16_t keycode, keyrecord_t *record); |
| 40 | bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record); | 46 | bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record); |
| 41 | bool get_tapping_force_hold(uint16_t keycode, keyrecord_t *record); | ||
| 42 | bool get_retro_tapping(uint16_t keycode, keyrecord_t *record); | 47 | bool get_retro_tapping(uint16_t keycode, keyrecord_t *record); |
| 43 | bool get_hold_on_other_key_press(uint16_t keycode, keyrecord_t *record); | 48 | bool get_hold_on_other_key_press(uint16_t keycode, keyrecord_t *record); |
| 44 | 49 | ||
| @@ -53,3 +58,9 @@ extern uint16_t g_tapping_term; | |||
| 53 | #else | 58 | #else |
| 54 | # define GET_TAPPING_TERM(keycode, record) (TAPPING_TERM) | 59 | # define GET_TAPPING_TERM(keycode, record) (TAPPING_TERM) |
| 55 | #endif | 60 | #endif |
| 61 | |||
| 62 | #ifdef QUICK_TAP_TERM_PER_KEY | ||
| 63 | # define GET_QUICK_TAP_TERM(keycode, record) get_quick_tap_term(keycode, record) | ||
| 64 | #else | ||
| 65 | # define GET_QUICK_TAP_TERM(keycode, record) (QUICK_TAP_TERM) | ||
| 66 | #endif | ||
