aboutsummaryrefslogtreecommitdiff
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
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
-rw-r--r--builddefs/generic_features.mk1
-rw-r--r--builddefs/show_options.mk1
-rw-r--r--docs/config_options.md2
-rw-r--r--docs/keycodes.md10
-rw-r--r--docs/tap_hold.md80
-rw-r--r--docs/understanding_qmk.md1
-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
13 files changed, 191 insertions, 4 deletions
diff --git a/builddefs/generic_features.mk b/builddefs/generic_features.mk
index e41ce6ac9..e4151eb21 100644
--- a/builddefs/generic_features.mk
+++ b/builddefs/generic_features.mk
@@ -36,6 +36,7 @@ GENERIC_FEATURES = \
36 TAP_DANCE \ 36 TAP_DANCE \
37 VELOCIKEY \ 37 VELOCIKEY \
38 WPM \ 38 WPM \
39 DYNAMIC_TAPPING_TERM \
39 40
40define HANDLE_GENERIC_FEATURE 41define HANDLE_GENERIC_FEATURE
41 # $$(info "Processing: $1_ENABLE $2.c") 42 # $$(info "Processing: $1_ENABLE $2.c")
diff --git a/builddefs/show_options.mk b/builddefs/show_options.mk
index ee60597e1..2820332d5 100644
--- a/builddefs/show_options.mk
+++ b/builddefs/show_options.mk
@@ -39,6 +39,7 @@ OTHER_OPTION_NAMES = \
39 UNICODE_COMMON \ 39 UNICODE_COMMON \
40 AUTO_SHIFT_ENABLE \ 40 AUTO_SHIFT_ENABLE \
41 AUTO_SHIFT_MODIFIERS \ 41 AUTO_SHIFT_MODIFIERS \
42 DYNAMIC_TAPPING_TERM_ENABLE \
42 COMBO_ENABLE \ 43 COMBO_ENABLE \
43 KEY_LOCK_ENABLE \ 44 KEY_LOCK_ENABLE \
44 KEY_OVERRIDE_ENABLE \ 45 KEY_OVERRIDE_ENABLE \
diff --git a/docs/config_options.md b/docs/config_options.md
index 9f2453b69..b661b55ee 100644
--- a/docs/config_options.md
+++ b/docs/config_options.md
@@ -448,6 +448,8 @@ Use these to enable or disable building certain features. The more you have enab
448 * Disables usb suspend check after keyboard startup. Usually the keyboard waits for the host to wake it up before any tasks are performed. This is useful for split keyboards as one half will not get a wakeup call but must send commands to the master. 448 * Disables usb suspend check after keyboard startup. Usually the keyboard waits for the host to wake it up before any tasks are performed. This is useful for split keyboards as one half will not get a wakeup call but must send commands to the master.
449* `DEFERRED_EXEC_ENABLE` 449* `DEFERRED_EXEC_ENABLE`
450 * Enables deferred executor support -- timed delays before callbacks are invoked. See [deferred execution](custom_quantum_functions.md#deferred-execution) for more information. 450 * Enables deferred executor support -- timed delays before callbacks are invoked. See [deferred execution](custom_quantum_functions.md#deferred-execution) for more information.
451* `DYNAMIC_TAPPING_TERM_ENABLE`
452 * Allows to configure the global tapping term on the fly.
451 453
452## USB Endpoint Limitations 454## USB Endpoint Limitations
453 455
diff --git a/docs/keycodes.md b/docs/keycodes.md
index 926d4fdce..ba06e1b8b 100644
--- a/docs/keycodes.md
+++ b/docs/keycodes.md
@@ -586,6 +586,16 @@ See also: [Mod-Tap](mod_tap.md)
586|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped | 586|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped |
587|`HYPR_T(kc)` |`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](https://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)| 587|`HYPR_T(kc)` |`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](https://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
588 588
589## Tapping Term Keys :id=tapping-term-keys
590
591See also: [Dynamic Tapping Term](tap_hold#dynamic-tapping-term)
592
593| Key | Description |
594|-------------|------------------------------------------------------------------------------------------------------------------------|
595| `DT_PRNT` | "Dynamic Tapping Term Print": Types the current tapping term, in milliseconds |
596| `DT_UP` | "Dynamic Tapping Term Up": Increases the current tapping term by `DYNAMIC_TAPPING_TERM_INCREMENT`ms (5ms by default) |
597| `DT_DOWN` | "Dynamic Tapping Term Down": Decreases the current tapping term by `DYNAMIC_TAPPING_TERM_INCREMENT`ms (5ms by default) |
598
589## RGB Lighting :id=rgb-lighting 599## RGB Lighting :id=rgb-lighting
590 600
591See also: [RGB Lighting](feature_rgblight.md) 601See also: [RGB Lighting](feature_rgblight.md)
diff --git a/docs/tap_hold.md b/docs/tap_hold.md
index a343d0bc3..d206c10cc 100644
--- a/docs/tap_hold.md
+++ b/docs/tap_hold.md
@@ -6,7 +6,9 @@ These options let you modify the behavior of the Tap-Hold keys.
6 6
7## Tapping Term 7## Tapping Term
8 8
9The crux of all of the following features is the tapping term setting. This determines what is a tap and what is a hold. And the exact timing for this to feel natural can vary from keyboard to keyboard, from switch to switch, and from key to key. 9The crux of all of the following features is the tapping term setting. This determines what is a tap and what is a hold. The exact timing for this to feel natural can vary from keyboard to keyboard, from switch to switch, and from key to key.
10
11?> `DYNAMIC_TAPPING_TERM_ENABLE` enables three special keys that can help you quickly find a comfortable tapping term for you. See "Dynamic Tapping Term" for more details.
10 12
11You can set the global time for this by adding the following setting to your `config.h`: 13You can set the global time for this by adding the following setting to your `config.h`:
12 14
@@ -36,6 +38,82 @@ uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
36} 38}
37``` 39```
38 40
41### Dynamic Tapping Term :id=dynamic-tapping-term
42
43`DYNAMIC_TAPPING_TERM_ENABLE` is a feature you can enable in `rules.mk` that lets you use three special keys in your keymap to configure the tapping term on the fly.
44
45| Key | Description |
46|-------------|------------------------------------------------------------------------------------------------------------------------|
47| `DT_PRNT` | "Dynamic Tapping Term Print": Types the current tapping term, in milliseconds |
48| `DT_UP` | "Dynamic Tapping Term Up": Increases the current tapping term by `DYNAMIC_TAPPING_TERM_INCREMENT`ms (5ms by default) |
49| `DT_DOWN` | "Dynamic Tapping Term Down": Decreases the current tapping term by `DYNAMIC_TAPPING_TERM_INCREMENT`ms (5ms by default) |
50
51Set the tapping term as usual with `#define TAPPING_TERM <value>` in `config.h` and add `DYNAMIC_TAPPING_TERM_ENABLE = yes` in `rules.mk`. Then, place the above three keys somewhere in your keymap and flash the new firmware onto your board.
52
53Now, you can try using your dual-role keys, such as layer-taps and mod-taps, and use `DT_DOWN` and `DT_UP` to adjust the tapping term immediately. If you find that you frequently trigger the modifier of your mod-tap(s) by accident for example, that's a sign that your tapping term may be too low so tap `DT_UP` a few times to increase the tapping term until that no longer happens. On the flip side, if you get superfluous characters when you actually intended to momentarily activate a layer, tap `DT_DOWN` to lower the tapping term. Do note that these keys affect the *global* tapping term, you cannot change the tapping term of a specific key on the fly.
54
55Once you're satisfied with the current tapping term value, open `config.h` and replace whatever value you first wrote for the tapping term by the output of the `DT_PRNT` key.
56
57It's important to update `TAPPING_TERM` with the new value because the adjustments made using `DT_UP` and `DT_DOWN` are not persistent.
58
59The value by which the tapping term increases or decreases when you tap `DT_UP` and `DT_DOWN` can be configured in `config.h` with `#define DYNAMIC_TAPPING_TERM_INCREMENT <new value>`. Note that the tapping term is *not* modified when holding down the tap term keys so if you need to, for example, decrease the current tapping term by 50ms, you cannot just press down and hold `DT_DOWN`; you will have to tap it 10 times in a row with the default increment of 5ms.
60
61If you need more flexibility, nothing prevents you from defining your own custom keys to dynamically change the tapping term.
62
63```c
64enum custom_dynamic_tapping_term_keys = {
65 DT_UP_50 = SAFE_RANGE,
66 DT_DOWN_50,
67 DT_UP_X2,
68 DT_DOWN_X2,
69}
70
71bool process_record_user(uint16_t keycode, keyrecord_t *record) {
72 switch (keycode) {
73 case DT_UP_50:
74 if (record->event.pressed) {
75 g_tapping_term += 50;
76 }
77 break;
78 case DT_DOWN_50:
79 if (record->event.pressed) {
80 g_tapping_term -= 50;
81 }
82 break;
83 case DT_UP_X2:
84 if (record->event.pressed) {
85 g_tapping_term *= 2;
86 }
87 break;
88 case DT_DOWN_X2:
89 if (record->event.pressed) {
90 g_tapping_term /= 2;
91 }
92 break;
93 }
94 return true;
95};
96```
97
98In order for this feature to be effective if you use per-key tapping terms, you need to make a few changes to the syntax of the `get_tapping_term` function. All you need to do is replace every occurrence of `TAPPING_TERM` in the `get_tapping_term` function by lowercase `g_tapping_term`. If you don't do that, you will still see the value typed by `DT_PRNT` go up and down as you configure the tapping term on the fly but you won't feel those changes as they don't get applied. If you can go as low as 10ms and still easily trigger the tap function of a dual-role key, that's a sign that you forgot to make the necessary changes to your `get_tapping_term` function.
99
100For instance, here's how the example `get_tapping_term` shown earlier should look like after the transformation:
101
102```c
103uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
104 switch (keycode) {
105 case SFT_T(KC_SPC):
106 return g_tapping_term + 1250;
107 case LT(1, KC_GRV):
108 return 130;
109 default:
110 return g_tapping_term;
111 }
112}
113```
114
115The reason being that `TAPPING_TERM` is a macro that expands to a constant integer and thus cannot be changed at runtime whereas `g_tapping_term` is a variable whose value can be changed at runtime. If you want, you can temporarily enable `DYNAMIC_TAPPING_TERM_ENABLE` to find a suitable tapping term value and then disable that feature and revert back to using the classic syntax for per-key tapping term settings.
116
39## Tap-Or-Hold Decision Modes 117## Tap-Or-Hold Decision Modes
40 118
41The code which decides between the tap and hold actions of dual-role keys supports three different modes, in increasing order of preference for the hold action: 119The code which decides between the tap and hold actions of dual-role keys supports three different modes, in increasing order of preference for the hold action:
diff --git a/docs/understanding_qmk.md b/docs/understanding_qmk.md
index e0c2ab7dc..016e3d9fd 100644
--- a/docs/understanding_qmk.md
+++ b/docs/understanding_qmk.md
@@ -157,6 +157,7 @@ The `process_record()` function itself is deceptively simple, but hidden within
157 * [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_combo.c#L115) 157 * [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_combo.c#L115)
158 * [`bool process_printer(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_printer.c#L77) 158 * [`bool process_printer(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_printer.c#L77)
159 * [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_auto_shift.c#L94) 159 * [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_auto_shift.c#L94)
160 * `bool process_dynamic_tapping_term(uint16_t keycode, keyrecord_t *record)`
160 * [`bool process_terminal(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_terminal.c#L264) 161 * [`bool process_terminal(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_terminal.c#L264)
161 * [Identify and process Quantum-specific keycodes](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L291) 162 * [Identify and process Quantum-specific keycodes](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L291)
162 163
diff --git a/quantum/action_tapping.c b/quantum/action_tapping.c
index 0586fad42..b64d8b710 100644
--- a/quantum/action_tapping.c
+++ b/quantum/action_tapping.c
@@ -24,12 +24,14 @@
24# define IS_TAPPING_RECORD(r) (IS_TAPPING() && KEYEQ(tapping_key.event.key, (r->event.key)) && tapping_key.keycode == r->keycode) 24# define IS_TAPPING_RECORD(r) (IS_TAPPING() && KEYEQ(tapping_key.event.key, (r->event.key)) && tapping_key.keycode == r->keycode)
25# endif 25# endif
26 26
27__attribute__((weak)) uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { return TAPPING_TERM; } 27uint16_t g_tapping_term = TAPPING_TERM;
28
29__attribute__((weak)) uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { return g_tapping_term; }
28 30
29# ifdef TAPPING_TERM_PER_KEY 31# ifdef TAPPING_TERM_PER_KEY
30# 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)) 32# 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))
31# else 33# else
32# define WITHIN_TAPPING_TERM(e) (TIMER_DIFF_16(e.time, tapping_key.event.time) < TAPPING_TERM) 34# define WITHIN_TAPPING_TERM(e) (TIMER_DIFF_16(e.time, tapping_key.event.time) < g_tapping_term)
33# endif 35# endif
34 36
35# ifdef TAPPING_FORCE_HOLD_PER_KEY 37# ifdef TAPPING_FORCE_HOLD_PER_KEY
@@ -158,7 +160,7 @@ bool process_tapping(keyrecord_t *keyp) {
158# ifdef TAPPING_TERM_PER_KEY 160# ifdef TAPPING_TERM_PER_KEY
159 get_tapping_term(tapping_keycode, keyp) 161 get_tapping_term(tapping_keycode, keyp)
160# else 162# else
161 TAPPING_TERM 163 g_tapping_term
162# endif 164# endif
163 >= 500 165 >= 500
164 ) 166 )
diff --git a/quantum/action_tapping.h b/quantum/action_tapping.h
index 7de8049c7..b2feb6850 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/>.
33uint16_t get_record_keycode(keyrecord_t *record, bool update_layer_cache); 33uint16_t get_record_keycode(keyrecord_t *record, bool update_layer_cache);
34uint16_t get_event_keycode(keyevent_t event, bool update_layer_cache); 34uint16_t get_event_keycode(keyevent_t event, bool update_layer_cache);
35void action_tapping_process(keyrecord_t record); 35void action_tapping_process(keyrecord_t record);
36#endif
36 37
37uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record); 38uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record);
38bool get_permissive_hold(uint16_t keycode, keyrecord_t *record); 39bool get_permissive_hold(uint16_t keycode, keyrecord_t *record);
39bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record); 40bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record);
40bool get_tapping_force_hold(uint16_t keycode, keyrecord_t *record); 41bool get_tapping_force_hold(uint16_t keycode, keyrecord_t *record);
41bool get_retro_tapping(uint16_t keycode, keyrecord_t *record); 42bool get_retro_tapping(uint16_t keycode, keyrecord_t *record);
43
44#ifdef DYNAMIC_TAPPING_TERM_ENABLE
45extern uint16_t g_tapping_term;
42#endif 46#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 000000000..bdc5529e3
--- /dev/null
+++ b/quantum/process_keycode/process_dynamic_tapping_term.c
@@ -0,0 +1,50 @@
1/* Copyright 2020 Vladislav Kucheriavykh
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include "quantum.h"
18#include "process_dynamic_tapping_term.h"
19
20#ifndef DYNAMIC_TAPPING_TERM_INCREMENT
21# define DYNAMIC_TAPPING_TERM_INCREMENT 5
22#endif
23
24static void tapping_term_report(void) {
25 const char *tapping_term_str = get_u16_str(g_tapping_term, ' ');
26 // Skip padding spaces
27 while (*tapping_term_str == ' ') {
28 tapping_term_str++;
29 }
30 send_string(tapping_term_str);
31}
32
33bool process_dynamic_tapping_term(uint16_t keycode, keyrecord_t *record) {
34 if (record->event.pressed) {
35 switch (keycode) {
36 case DT_PRNT:
37 tapping_term_report();
38 return false;
39
40 case DT_UP:
41 g_tapping_term += DYNAMIC_TAPPING_TERM_INCREMENT;
42 return false;
43
44 case DT_DOWN:
45 g_tapping_term -= DYNAMIC_TAPPING_TERM_INCREMENT;
46 return false;
47 }
48 }
49 return true;
50}
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 000000000..85e83ee73
--- /dev/null
+++ b/quantum/process_keycode/process_dynamic_tapping_term.h
@@ -0,0 +1,26 @@
1/* Copyright 2020 Vladislav Kucheriavykh
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#pragma once
18
19#include <stdbool.h>
20#include "action.h"
21
22#ifndef DYNAMIC_TAPPING_TERM_INCREMENT
23# define DYNAMIC_TAPPING_TERM_INCREMENT 5
24#endif
25
26bool process_dynamic_tapping_term(uint16_t keycode, keyrecord_t *record);
diff --git a/quantum/quantum.c b/quantum/quantum.c
index ba3ae0345..35b6351e9 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -275,6 +275,9 @@ bool process_record_quantum(keyrecord_t *record) {
275#ifdef AUTO_SHIFT_ENABLE 275#ifdef AUTO_SHIFT_ENABLE
276 process_auto_shift(keycode, record) && 276 process_auto_shift(keycode, record) &&
277#endif 277#endif
278#ifdef DYNAMIC_TAPPING_TERM_ENABLE
279 process_dynamic_tapping_term(keycode, record) &&
280#endif
278#ifdef TERMINAL_ENABLE 281#ifdef TERMINAL_ENABLE
279 process_terminal(keycode, record) && 282 process_terminal(keycode, record) &&
280#endif 283#endif
diff --git a/quantum/quantum.h b/quantum/quantum.h
index 45050ac0e..6927884e2 100644
--- a/quantum/quantum.h
+++ b/quantum/quantum.h
@@ -125,6 +125,10 @@ extern layer_state_t layer_state;
125# include "process_auto_shift.h" 125# include "process_auto_shift.h"
126#endif 126#endif
127 127
128#ifdef DYNAMIC_TAPPING_TERM_ENABLE
129# include "process_dynamic_tapping_term.h"
130#endif
131
128#ifdef COMBO_ENABLE 132#ifdef COMBO_ENABLE
129# include "process_combo.h" 133# include "process_combo.h"
130#endif 134#endif
diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h
index d013a6a16..e4d0167aa 100644
--- a/quantum/quantum_keycodes.h
+++ b/quantum/quantum_keycodes.h
@@ -524,6 +524,11 @@ enum quantum_keycodes {
524 // Additional magic key 524 // Additional magic key
525 MAGIC_TOGGLE_GUI, 525 MAGIC_TOGGLE_GUI,
526 526
527 // Adjust tapping term on the fly
528 DT_PRNT,
529 DT_UP,
530 DT_DOWN,
531
527 // Programmable Button 532 // Programmable Button
528 PROGRAMMABLE_BUTTON_1, 533 PROGRAMMABLE_BUTTON_1,
529 PROGRAMMABLE_BUTTON_2, 534 PROGRAMMABLE_BUTTON_2,