diff options
Diffstat (limited to 'users/issmirnov/tap_tog.c')
| -rw-r--r-- | users/issmirnov/tap_tog.c | 52 |
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 | |||
| 5 | bool tap_tog_layer_other_key_pressed = false; | ||
| 6 | bool tap_tog_layer_toggled_on = false; | ||
| 7 | uint8_t tap_tog_count = 0; | ||
| 8 | |||
| 9 | void 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 | } | ||
