2 // .......................................................... Keycode Primitives
4 // register simple key press
5 void tap_key(uint16_t keycode)
7 register_code (keycode);
8 unregister_code(keycode);
11 void shift_key(uint16_t keycode)
13 register_code (KC_LSFT);
15 unregister_code(KC_LSFT);
21 static uint16_t key_timer = 0;
23 // key press for thumb_layer() and lt_shift() macros
24 bool key_press(uint8_t shift, uint16_t keycode)
27 if (timer_elapsed(key_timer) < TAPPING_TERM) {
40 // ALT_T, CTL_T, GUI_T, SFT_T for shifted keycodes
41 void mt_shift(keyrecord_t *record, uint16_t modifier, uint16_t modifier2, uint16_t keycode)
43 if (record->event.pressed) {
44 key_timer = timer_read();
45 register_code(modifier);
47 register_code(modifier2);
51 unregister_code(modifier);
53 unregister_code(modifier2);
55 if (timer_elapsed(key_timer) < TAPPING_TERM) {
62 // ................................................................... Mod Masks
64 // tap dance persistant mods, see process_record_user()
65 // keyboard_report->mods (?) appears to be cleared by tap dance
66 static uint8_t mods = 0;
68 void tap_mods(keyrecord_t *record, uint16_t keycode)
70 if (record->event.pressed) {
71 mods |= MOD_BIT(keycode);
74 mods &= ~(MOD_BIT(keycode));
78 // (un)register modifiers
79 void modifier(void (*f)(uint8_t))
81 if (mods & MOD_BIT(KC_LCTL)) {
84 if (mods & MOD_BIT(KC_LGUI)) {
87 if (mods & MOD_BIT(KC_LALT)) {
90 if (mods & MOD_BIT(KC_LSFT)) {
93 if (mods & MOD_BIT(KC_RSFT)) {
98 // .................................................... Triple Dance Shift/Layer
100 static uint8_t dt_shift = 0;
102 void double_shift(uint16_t keycode, uint8_t layer)
106 // set_oneshot_mods(MOD_LSFT);
109 set_oneshot_layer(_SHIFT, ONESHOT_START);
117 // tap dance LT (LAYER, KEY) emulation with <KEY><DOWN> -> <KEY><SHIFT> and auto-repeat extensions!
118 void tap_shift(qk_tap_dance_state_t *state, uint16_t keycode, uint8_t layer)
120 // double tap plus down
121 if (state->count > 2) {
122 // double enter shift
123 if (keycode == KC_ENT) {
125 double_shift(keycode, layer);
129 register_code(keycode);
132 // tap plus down (or double tap): keycode (one shot) shift
133 else if (state->count > 1) {
134 double_shift(keycode, layer);
137 else if (state->pressed) {
142 modifier(register_code);
144 modifier(unregister_code);
148 void tap_reset(uint16_t keycode, uint8_t layer)
150 unregister_code(keycode);
151 if (DT_SHIFT && dt_shift) {
152 clear_oneshot_layer_state(ONESHOT_PRESSED);
160 // augment pseudo LT (_RSHIFT, KC_ENT) handling below for rapid <ENTER><SHIFT> sequences
161 void enter(qk_tap_dance_state_t *state, void *user_data)
163 tap_shift(state, KC_ENT, _RSHIFT);
166 void enter_reset(qk_tap_dance_state_t *state, void *user_data)
168 tap_reset(KC_ENT, _RSHIFT);
171 // augment pseudo LT (_LSHIFT, KC_SPC) handling below for rapid <SPACE><SHIFT> sequences
172 void space(qk_tap_dance_state_t *state, void *user_data)
174 tap_shift(state, KC_SPC, _LSHIFT);
177 void space_reset(qk_tap_dance_state_t *state, void *user_data)
179 tap_reset(KC_SPC, _LSHIFT);
182 // ......................................................... Triple Dance Insert
184 void double_max(uint8_t count, uint8_t shift, uint16_t keycode)
200 void colon(qk_tap_dance_state_t *state, void *user_data)
202 if (state->count > 2) {
209 double_max(state->count, SHIFT, KC_SCLN);
211 reset_tap_dance(state);
214 void eql(qk_tap_dance_state_t *state, void *user_data)
216 if (state->count > 2) {
223 double_max(state->count, NOSHIFT, KC_EQL);
225 reset_tap_dance(state);
228 void greater(qk_tap_dance_state_t *state, void *user_data)
230 if (state->count > 2) {
237 double_max(state->count, SHIFT, KC_DOT);
239 reset_tap_dance(state);
242 void lesser(qk_tap_dance_state_t *state, void *user_data)
244 if (state->count > 2) {
251 double_max(state->count, SHIFT, KC_COMM);
253 reset_tap_dance(state);
256 void tilde(qk_tap_dance_state_t *state, void *user_data)
258 // double tap plus down: repeating keycode
259 if (state->count > 2) {
260 register_code(KC_LSFT);
261 register_code(KC_GRV);
266 // double tap: unix home directory
267 if (state->count > 1) {
273 void tilde_reset(qk_tap_dance_state_t *state, void *user_data)
275 unregister_code(KC_GRV);
276 unregister_code(KC_LSFT);
279 // ............................................................. Tap Dance Pairs
281 // tap dance shift rules
285 #define S_ALWAYS S_SINGLE | S_DOUBLE
287 void symbol_pair(uint8_t shift, uint16_t left, uint16_t right)
289 if (shift & S_DOUBLE) {
301 // tap dance symbol pairs
302 void tap_pair(qk_tap_dance_state_t *state, uint8_t shift, uint16_t left, uint16_t right, uint16_t modifier, uint8_t close)
304 // triple tap: left right with cursor between symbol pair a la vim :-)
305 if (state->count > 2) {
306 symbol_pair(shift, left, right);
309 // double tap: left right
310 else if (state->count > 1) {
311 symbol_pair(shift, left, right);
314 else if (state->pressed) {
316 register_code(modifier);
319 // tap: left (close: right)
321 if (shift & S_SINGLE) {
322 shift_key(close ? right : left);
325 tap_key(close ? right : left);
329 reset_tap_dance(state);
333 void doublequote(qk_tap_dance_state_t *state, void *user_data)
335 tap_pair(state, S_ALWAYS, KC_QUOT, KC_QUOT, 0, 0);
338 void grave(qk_tap_dance_state_t *state, void *user_data)
340 tap_pair(state, S_NEVER, KC_GRV, KC_GRV, 0, 0);
343 void lbrace(qk_tap_dance_state_t *state, void *user_data)
345 tap_pair(state, S_NEVER, KC_LBRC, KC_RBRC, 0, 0);
348 void lcurly(qk_tap_dance_state_t *state, void *user_data)
350 tap_pair(state, S_ALWAYS, KC_LBRC, KC_RBRC, 0, 0);
353 void lparen(qk_tap_dance_state_t *state, void *user_data)
355 tap_pair(state, S_ALWAYS, KC_9, KC_0, KC_LCTL, 0);
358 void lparen_reset(qk_tap_dance_state_t *state, void *user_data)
360 unregister_code(KC_LCTL);
363 void quote(qk_tap_dance_state_t *state, void *user_data)
365 tap_pair(state, S_NEVER, KC_QUOT, KC_QUOT, 0, 0);
368 void rangle(qk_tap_dance_state_t *state, void *user_data)
370 tap_pair(state, S_ALWAYS, KC_COMM, KC_DOT, 0, CLOSE);
373 void rbrace(qk_tap_dance_state_t *state, void *user_data)
375 tap_pair(state, S_NEVER, KC_LBRC, KC_RBRC, 0, CLOSE);
378 void rcurly(qk_tap_dance_state_t *state, void *user_data)
380 tap_pair(state, S_ALWAYS, KC_LBRC, KC_RBRC, 0, CLOSE);
383 void rparen(qk_tap_dance_state_t *state, void *user_data)
385 tap_pair(state, S_ALWAYS, KC_9, KC_0, 0, CLOSE);
388 void rparen_reset(qk_tap_dance_state_t *state, void *user_data)
390 unregister_code(KC_LCTL);
393 // ............................................................ Tap Dance Insert
395 void comma(qk_tap_dance_state_t *state, void *user_data)
398 if (state->count > 1) {
401 reset_tap_dance(state);
404 void dot(qk_tap_dance_state_t *state, void *user_data)
406 if (state->count > 1) {
412 reset_tap_dance(state);
415 // compile time macro string, see functions/hardware planck script
416 void private(qk_tap_dance_state_t *state, void *user_data)
418 if (state->count > 1) {
419 #ifdef PRIVATE_STRING
420 #include "private_string.h"
423 reset_tap_dance(state);
426 // config.h defined string
427 void send(qk_tap_dance_state_t *state, void *user_data)
429 if (state->count > 1) {
430 SEND_STRING(PUBLIC_STRING);
432 reset_tap_dance(state);
435 // .......................................................... Tap Dance One Shot
437 void caps(qk_tap_dance_state_t *state, void *user_data)
439 if (state->count > 1) {
443 set_oneshot_mods(MOD_LSFT);
444 register_code (KC_LSFT); // on hold down
448 void caps_reset(qk_tap_dance_state_t *state, void *user_data)
450 unregister_code(KC_LSFT);
453 // ................................................................... Tap Dance
455 qk_tap_dance_action_t tap_dance_actions[] = {
456 [_CAPS] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, caps, caps_reset)
457 ,[_COLN] = ACTION_TAP_DANCE_FN (colon)
458 ,[_COMM] = ACTION_TAP_DANCE_FN (comma)
459 ,[_DOT] = ACTION_TAP_DANCE_FN (dot)
460 ,[_DQOT] = ACTION_TAP_DANCE_FN (doublequote)
461 ,[_ENT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, enter, enter_reset)
462 ,[_EQL] = ACTION_TAP_DANCE_FN (eql)
463 ,[_GRV] = ACTION_TAP_DANCE_FN (grave)
464 ,[_GT] = ACTION_TAP_DANCE_FN (greater)
465 ,[_LBRC] = ACTION_TAP_DANCE_FN (lbrace)
466 ,[_LCBR] = ACTION_TAP_DANCE_FN (lcurly)
467 ,[_LPRN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, lparen, lparen_reset)
468 ,[_LT] = ACTION_TAP_DANCE_FN (lesser)
469 ,[_PRIV] = ACTION_TAP_DANCE_FN (private)
470 ,[_QUOT] = ACTION_TAP_DANCE_FN (quote)
471 ,[_RBRC] = ACTION_TAP_DANCE_FN (rbrace)
472 ,[_RCBR] = ACTION_TAP_DANCE_FN (rcurly)
473 ,[_RNGL] = ACTION_TAP_DANCE_FN (rangle)
474 ,[_RPRN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, rparen, rparen_reset)
475 ,[_SEND] = ACTION_TAP_DANCE_FN (send)
476 ,[_SPC] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, space, space_reset)
477 ,[_TILD] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tilde, tilde_reset)
480 // .............................................................. Dynamic Layers
484 static uint8_t thumb = 0;
486 // LEFT (KC_SPC, S(KC_BSLS)), RIGHT (KC_LEFT, S(KC_LEFT)) opposite thumb combinations, see process_record_user()
488 // up, down -> _SYMBOL
489 // down, up -> _NUMBER
490 // down, down -> _MOUSE // see layer keycodes that raise mouse layer
491 #define THUMBS_DOWN _MOUSE // layer
493 static uint8_t overlayer = 0;
495 // left right thumb layer combinations
496 void thumb_layer(keyrecord_t *record, uint8_t side, uint8_t shift, uint16_t keycode, uint8_t thumb_dn_layer, uint8_t thumb_up_layer)
498 if (record->event.pressed) {
499 // layer_on via tap_layer(), see process_record_user()
500 key_timer = timer_read();
501 thumb = thumb | side;
504 layer_off(thumb_dn_layer);
505 // opposite thumb_layer() thumb may have switched effective layer!
507 layer_off(overlayer);
510 if (!key_press(shift, keycode)) {
511 layer_off(THUMBS_DOWN); // both thumbs needed
512 // opposite thumb down? see left right combination layer table above
513 if (thumb & (side == LEFT ? RIGHT : LEFT)) {
514 layer_on(thumb_up_layer);
515 overlayer = thumb_up_layer;
519 thumb = thumb & ~side;
524 // #ifdef STENO_ENABLE
525 // // LT for steno keycode
526 // void stn_layer(keyrecord_t *record, uint16_t keycode, uint8_t layer)
528 // if (record->event.pressed) {
529 // key_timer = timer_read();
531 // process_steno(keycode, record);
538 // if (timer_elapsed(key_timer) < TAPPING_TERM) {
539 // process_steno(keycode, record);
542 // // clear pressed state (request push of updated) process_steno.c and .h
543 // // steno_clear_state();
551 // LT macro for nested LT layers
552 void lt(keyrecord_t *record, uint8_t shift, uint16_t keycode, uint16_t modifier, uint8_t layer)
554 if (record->event.pressed) {
555 key_timer = timer_read();
557 register_code(modifier);
563 unregister_code(modifier);
566 // for shifted keycodes, hence, LT_SHIFT
567 key_press(shift, keycode);
574 void lt_shift(keyrecord_t *record, uint16_t keycode, uint8_t layer)
576 lt(record, SHIFT, keycode, 0, layer);
579 // set layer asap to overcome macro latency errors, notably tap dance and LT usage
580 // this routine inexplicably (?) sets layer_on() faster than can be done in thumb_layer()
581 void tap_layer(keyrecord_t *record, uint8_t layer)
583 if (record->event.pressed) {
591 // ..................................................................... Keymaps
593 // void persistant_default_layer_set(uint16_t default_layer)
595 // eeconfig_update_default_layer(default_layer);
596 // default_layer_set (default_layer);
599 void clear_layers(void)
602 for (layer = 0; layer < _END_LAYERS; layer++) {
608 // home row layer/shift key state, see tap_mods() and keymap.c
609 #define LSYMBOL MOD_BIT(KC_LSFT)
610 #define RSYMBOL MOD_BIT(KC_RSFT)
612 void home_state(void) {
613 // if only the shift key, raise the opposite hand symbol layer
614 if (mods == LSYMBOL) {
617 else if (mods == RSYMBOL) {
620 // or combine modifiers
621 else if (mods & LSYMBOL) {
622 register_code(KC_LSFT);
624 else if (mods & RSYMBOL) {
625 register_code(KC_RSFT);
629 // home row layer/shift
630 void symbol_shift(keyrecord_t *record, uint16_t keycode)
633 if (record->event.pressed) {
634 key_timer = timer_read();
638 // clear layer/shift state
639 if (keycode == KC_A) {
641 unregister_code(KC_LSFT);
643 else if (keycode == KC_T) {
645 unregister_code(KC_RSFT);
647 // no other modifier enabled, issue keycode
649 key_press(NOSHIFT, keycode);
655 // a non-shift modifier disables symbol layer
658 // update home layer/shift state
665 static uint16_t tt_keycode = 0; // current TT keycode
669 if (tt_keycode == KC_CAPS) {
670 tap_key(KC_CAPS); // clear capslock
674 set_single_persistent_default_layer(_BASE);
678 // txbolt plover run state
679 static uint8_t plover = 0;
681 void toggle_plover(uint8_t state)
683 if (plover != state) {
684 #ifdef PLOVER_KEYBIND
685 #include "plover_keybind.h"
691 void base_layer(void)
695 PLAY_SONG(song_plover_gb);
698 PLAY_SONG(song_qwerty);
702 set_single_persistent_default_layer(_BASE);
706 void steno(keyrecord_t *record)
708 if (record->event.pressed) {
710 PLAY_SONG(song_plover);
714 if (!eeconfig_is_enabled()) {
717 keymap_config.raw = eeconfig_read_keymap();
718 keymap_config.nkro = 1;
719 eeconfig_update_keymap(keymap_config.raw);
726 void steno_exit(keyrecord_t *record)
728 if (record->event.pressed) {