From 4bac5f53d864a77a6f0fa8a2a046ed7748824ecc Mon Sep 17 00:00:00 2001 From: precondition <57645186+precondition@users.noreply.github.com> Date: Thu, 25 Nov 2021 20:06:50 +0000 Subject: New feature: `DYNAMIC_TAPPING_TERM_ENABLE` (#11036) * New feature: `DYNAMIC_TAPPING_TERM_ENABLE` 3 new quantum keys to configure the tapping term on the fly. * Replace sprintf call in tapping_term_report by get_u16_str * Replace tab with 4 spaces --- quantum/action_tapping.c | 8 ++-- quantum/action_tapping.h | 4 ++ .../process_keycode/process_dynamic_tapping_term.c | 50 ++++++++++++++++++++++ .../process_keycode/process_dynamic_tapping_term.h | 26 +++++++++++ quantum/quantum.c | 3 ++ quantum/quantum.h | 4 ++ quantum/quantum_keycodes.h | 5 +++ 7 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 quantum/process_keycode/process_dynamic_tapping_term.c create mode 100644 quantum/process_keycode/process_dynamic_tapping_term.h (limited to 'quantum') diff --git a/quantum/action_tapping.c b/quantum/action_tapping.c index 0586fad421..b64d8b710b 100644 --- a/quantum/action_tapping.c +++ b/quantum/action_tapping.c @@ -24,12 +24,14 @@ # define IS_TAPPING_RECORD(r) (IS_TAPPING() && KEYEQ(tapping_key.event.key, (r->event.key)) && tapping_key.keycode == r->keycode) # endif -__attribute__((weak)) uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { return TAPPING_TERM; } +uint16_t g_tapping_term = TAPPING_TERM; + +__attribute__((weak)) uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { return g_tapping_term; } # ifdef TAPPING_TERM_PER_KEY # 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)) # else -# define WITHIN_TAPPING_TERM(e) (TIMER_DIFF_16(e.time, tapping_key.event.time) < TAPPING_TERM) +# define WITHIN_TAPPING_TERM(e) (TIMER_DIFF_16(e.time, tapping_key.event.time) < g_tapping_term) # endif # ifdef TAPPING_FORCE_HOLD_PER_KEY @@ -158,7 +160,7 @@ bool process_tapping(keyrecord_t *keyp) { # ifdef TAPPING_TERM_PER_KEY get_tapping_term(tapping_keycode, keyp) # else - TAPPING_TERM + g_tapping_term # endif >= 500 ) diff --git a/quantum/action_tapping.h b/quantum/action_tapping.h index 7de8049c7f..b2feb6850c 100644 --- a/quantum/action_tapping.h +++ b/quantum/action_tapping.h @@ -33,10 +33,14 @@ along with this program. If not, see . uint16_t get_record_keycode(keyrecord_t *record, bool update_layer_cache); uint16_t get_event_keycode(keyevent_t event, bool update_layer_cache); void action_tapping_process(keyrecord_t record); +#endif uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record); bool get_permissive_hold(uint16_t keycode, keyrecord_t *record); bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record); bool get_tapping_force_hold(uint16_t keycode, keyrecord_t *record); bool get_retro_tapping(uint16_t keycode, keyrecord_t *record); + +#ifdef DYNAMIC_TAPPING_TERM_ENABLE +extern uint16_t g_tapping_term; #endif diff --git a/quantum/process_keycode/process_dynamic_tapping_term.c b/quantum/process_keycode/process_dynamic_tapping_term.c new file mode 100644 index 0000000000..bdc5529e33 --- /dev/null +++ b/quantum/process_keycode/process_dynamic_tapping_term.c @@ -0,0 +1,50 @@ +/* Copyright 2020 Vladislav Kucheriavykh + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" +#include "process_dynamic_tapping_term.h" + +#ifndef DYNAMIC_TAPPING_TERM_INCREMENT +# define DYNAMIC_TAPPING_TERM_INCREMENT 5 +#endif + +static void tapping_term_report(void) { + const char *tapping_term_str = get_u16_str(g_tapping_term, ' '); + // Skip padding spaces + while (*tapping_term_str == ' ') { + tapping_term_str++; + } + send_string(tapping_term_str); +} + +bool process_dynamic_tapping_term(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch (keycode) { + case DT_PRNT: + tapping_term_report(); + return false; + + case DT_UP: + g_tapping_term += DYNAMIC_TAPPING_TERM_INCREMENT; + return false; + + case DT_DOWN: + g_tapping_term -= DYNAMIC_TAPPING_TERM_INCREMENT; + return false; + } + } + return true; +} diff --git a/quantum/process_keycode/process_dynamic_tapping_term.h b/quantum/process_keycode/process_dynamic_tapping_term.h new file mode 100644 index 0000000000..85e83ee73b --- /dev/null +++ b/quantum/process_keycode/process_dynamic_tapping_term.h @@ -0,0 +1,26 @@ +/* Copyright 2020 Vladislav Kucheriavykh + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include +#include "action.h" + +#ifndef DYNAMIC_TAPPING_TERM_INCREMENT +# define DYNAMIC_TAPPING_TERM_INCREMENT 5 +#endif + +bool process_dynamic_tapping_term(uint16_t keycode, keyrecord_t *record); diff --git a/quantum/quantum.c b/quantum/quantum.c index ba3ae03457..35b6351e9d 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -275,6 +275,9 @@ bool process_record_quantum(keyrecord_t *record) { #ifdef AUTO_SHIFT_ENABLE process_auto_shift(keycode, record) && #endif +#ifdef DYNAMIC_TAPPING_TERM_ENABLE + process_dynamic_tapping_term(keycode, record) && +#endif #ifdef TERMINAL_ENABLE process_terminal(keycode, record) && #endif diff --git a/quantum/quantum.h b/quantum/quantum.h index 45050ac0ea..6927884e2f 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -125,6 +125,10 @@ extern layer_state_t layer_state; # include "process_auto_shift.h" #endif +#ifdef DYNAMIC_TAPPING_TERM_ENABLE +# include "process_dynamic_tapping_term.h" +#endif + #ifdef COMBO_ENABLE # include "process_combo.h" #endif diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index d013a6a169..e4d0167aac 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -524,6 +524,11 @@ enum quantum_keycodes { // Additional magic key MAGIC_TOGGLE_GUI, + // Adjust tapping term on the fly + DT_PRNT, + DT_UP, + DT_DOWN, + // Programmable Button PROGRAMMABLE_BUTTON_1, PROGRAMMABLE_BUTTON_2, -- cgit v1.2.1