summaryrefslogtreecommitdiff
path: root/quantum
diff options
context:
space:
mode:
authorprecondition <57645186+precondition@users.noreply.github.com>2021-11-25 20:06:50 +0000
committerGitHub <noreply@github.com>2021-11-26 07:06:50 +1100
commit4bac5f53d864a77a6f0fa8a2a046ed7748824ecc (patch)
tree75153ff862bdb0644e9d7622c1b80517e10a30f8 /quantum
parent5e9c29da0df045b03ada9278c34f37b22349a6f7 (diff)
downloadqmk_firmware-4bac5f53d864a77a6f0fa8a2a046ed7748824ecc.tar.gz
qmk_firmware-4bac5f53d864a77a6f0fa8a2a046ed7748824ecc.zip
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
Diffstat (limited to 'quantum')
-rw-r--r--quantum/action_tapping.c8
-rw-r--r--quantum/action_tapping.h4
-rw-r--r--quantum/process_keycode/process_dynamic_tapping_term.c50
-rw-r--r--quantum/process_keycode/process_dynamic_tapping_term.h26
-rw-r--r--quantum/quantum.c3
-rw-r--r--quantum/quantum.h4
-rw-r--r--quantum/quantum_keycodes.h5
7 files changed, 97 insertions, 3 deletions
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 <http://www.gnu.org/licenses/>.
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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include <stdbool.h>
+#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,