aboutsummaryrefslogtreecommitdiff
path: root/users/issmirnov/tap_tog.c
diff options
context:
space:
mode:
Diffstat (limited to 'users/issmirnov/tap_tog.c')
-rw-r--r--users/issmirnov/tap_tog.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/users/issmirnov/tap_tog.c b/users/issmirnov/tap_tog.c
new file mode 100644
index 000000000..02cea08b1
--- /dev/null
+++ b/users/issmirnov/tap_tog.c
@@ -0,0 +1,52 @@
1#include QMK_KEYBOARD_H
2
3#include "tap_tog.h"
4
5bool tap_tog_layer_other_key_pressed = false;
6bool tap_tog_layer_toggled_on = false;
7uint8_t tap_tog_count = 0;
8
9void process_tap_tog(uint8_t layer, keyrecord_t *record) {
10 tap_tog_count++;
11 // press
12 if (record->event.pressed) {
13
14 // TTL has already been pressed and we are toggled into that layer
15 // so now we need to leave
16 if(tap_tog_layer_toggled_on) {
17 layer_clear();
18 tap_tog_layer_toggled_on = false;
19 }
20
21 // this means we're in our default layer
22 // so switch the layer immediately
23 // whether we'll switch back when it's released depends on if a button gets pressed while this is held down
24 else {
25 // switch layer
26 layer_on(layer);
27 tap_tog_layer_other_key_pressed = false; // if this becomes true before it gets released, it will act as a held modifier
28 }
29 }
30
31 // release
32 else {
33 // if it was used as a held modifier (like traditional shift)
34 if(tap_tog_layer_other_key_pressed) {
35 // switch layer back
36 layer_clear();
37 }
38 // if it was used as a toggle button
39 else {
40 // next time, it will turn layer off
41 tap_tog_layer_toggled_on = true;
42
43 // If it's been tapped twice, reset the toggle flag.
44 // Otherwise, we get stuck oscillating between this code block and the
45 // pressed && TTL_toggled_on block.
46 if (tap_tog_count >= 4 ) {
47 tap_tog_count = 0;
48 tap_tog_layer_toggled_on = false;
49 }
50 }
51 }
52}