keycode_functions.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. // .......................................................... Keycode Primitives
  2. // register simple key press
  3. void tap_key(uint16_t keycode)
  4. {
  5. register_code (keycode);
  6. unregister_code(keycode);
  7. }
  8. void shift_key(uint16_t keycode)
  9. {
  10. register_code (KC_LSFT);
  11. tap_key (keycode);
  12. unregister_code(KC_LSFT);
  13. }
  14. #define SHIFT 1
  15. #define NOSHIFT 0
  16. static uint16_t key_timer = 0;
  17. // key press for thumb_layer() and lt_shift() macros
  18. bool key_press(uint8_t shift, uint16_t keycode)
  19. {
  20. if (keycode) {
  21. if (timer_elapsed(key_timer) < TAPPING_TERM) {
  22. if (shift) {
  23. shift_key(keycode);
  24. }
  25. else {
  26. tap_key(keycode);
  27. }
  28. return true;
  29. }
  30. }
  31. return false;
  32. }
  33. // ALT_T, CTL_T, GUI_T, SFT_T for shifted keycodes
  34. void mt_shift(keyrecord_t *record, uint16_t modifier, uint16_t modifier2, uint16_t keycode)
  35. {
  36. if (record->event.pressed) {
  37. key_timer = timer_read();
  38. register_code(modifier);
  39. if (modifier2) {
  40. register_code(modifier2);
  41. }
  42. }
  43. else {
  44. unregister_code(modifier);
  45. if (modifier2) {
  46. unregister_code(modifier2);
  47. }
  48. if (timer_elapsed(key_timer) < TAPPING_TERM) {
  49. shift_key(keycode);
  50. }
  51. key_timer = 0;
  52. }
  53. }
  54. // ................................................................... Mod Masks
  55. // tap dance persistant mods, see process_record_user()
  56. // keyboard_report->mods (?) appears to be cleared by tap dance
  57. static uint8_t mods = 0;
  58. void tap_mods(keyrecord_t *record, uint16_t keycode)
  59. {
  60. if (record->event.pressed) {
  61. mods |= MOD_BIT(keycode);
  62. }
  63. else {
  64. mods &= ~(MOD_BIT(keycode));
  65. }
  66. }
  67. // (un)register modifiers
  68. void modifier(void (*f)(uint8_t))
  69. {
  70. if (mods & MOD_BIT(KC_LCTL)) {
  71. (*f)(KC_LCTL);
  72. }
  73. if (mods & MOD_BIT(KC_LGUI)) {
  74. (*f)(KC_LGUI);
  75. }
  76. if (mods & MOD_BIT(KC_LALT)) {
  77. (*f)(KC_LALT);
  78. }
  79. }
  80. // .................................................... Triple Dance Shift/Layer
  81. static uint8_t dt_shift = 0;
  82. void double_shift(uint16_t keycode, uint8_t layer)
  83. {
  84. tap_key (keycode);
  85. if (DT_SHIFT) {
  86. // set_oneshot_mods(MOD_LSFT);
  87. // layer_on(layer);
  88. layer_on (_SHIFT);
  89. set_oneshot_layer(_SHIFT, ONESHOT_START);
  90. dt_shift = 1;
  91. }
  92. else {
  93. layer_on(layer);
  94. }
  95. }
  96. // tap dance LT (LAYER, KEY) emulation with <KEY><DOWN> -> <KEY><SHIFT> and auto-repeat extensions!
  97. void tap_shift(qk_tap_dance_state_t *state, uint16_t keycode, uint8_t layer)
  98. {
  99. // double tap plus down
  100. if (state->count > 2) {
  101. // double enter shift
  102. if (keycode == KC_ENT) {
  103. tap_key (keycode);
  104. double_shift(keycode, layer);
  105. }
  106. // repeating keycode
  107. else {
  108. register_code(keycode);
  109. }
  110. }
  111. // tap plus down (or double tap): keycode (one shot) shift
  112. else if (state->count > 1) {
  113. double_shift(keycode, layer);
  114. }
  115. // down: shift
  116. else if (state->pressed) {
  117. layer_on(layer);
  118. }
  119. // tap: keycode
  120. else {
  121. modifier(register_code);
  122. tap_key (keycode);
  123. modifier(unregister_code);
  124. }
  125. }
  126. void tap_reset(uint16_t keycode, uint8_t layer)
  127. {
  128. unregister_code(keycode);
  129. if (DT_SHIFT && dt_shift) {
  130. clear_oneshot_layer_state(ONESHOT_PRESSED);
  131. dt_shift = 0;
  132. }
  133. else {
  134. layer_off(layer);
  135. }
  136. }
  137. // augment pseudo LT (_RSHIFT, KC_ENT) handling below for rapid <ENTER><SHIFT> sequences
  138. void enter(qk_tap_dance_state_t *state, void *user_data)
  139. {
  140. tap_shift(state, KC_ENT, _RSHIFT);
  141. }
  142. void enter_reset(qk_tap_dance_state_t *state, void *user_data)
  143. {
  144. tap_reset(KC_ENT, _RSHIFT);
  145. }
  146. // augment pseudo LT (_LSHIFT, KC_SPC) handling below for rapid <SPACE><SHIFT> sequences
  147. void space(qk_tap_dance_state_t *state, void *user_data)
  148. {
  149. tap_shift(state, KC_SPC, _LSHIFT);
  150. }
  151. void space_reset(qk_tap_dance_state_t *state, void *user_data)
  152. {
  153. tap_reset(KC_SPC, _LSHIFT);
  154. }
  155. // ......................................................... Triple Dance Insert
  156. void double_max(uint8_t count, uint8_t shift, uint16_t keycode)
  157. {
  158. if (shift) {
  159. shift_key(keycode);
  160. if (count > 1) {
  161. shift_key(keycode);
  162. }
  163. }
  164. else {
  165. tap_key(keycode);
  166. if (count > 1) {
  167. tap_key(keycode);
  168. }
  169. }
  170. }
  171. void colon(qk_tap_dance_state_t *state, void *user_data)
  172. {
  173. if (state->count > 2) {
  174. tap_key (KC_SPC);
  175. shift_key(KC_SCLN);
  176. shift_key(KC_SCLN);
  177. tap_key (KC_SPC);
  178. }
  179. else {
  180. double_max(state->count, SHIFT, KC_SCLN);
  181. }
  182. reset_tap_dance(state);
  183. }
  184. void eql(qk_tap_dance_state_t *state, void *user_data)
  185. {
  186. if (state->count > 2) {
  187. tap_key(KC_SPC);
  188. tap_key(KC_SLSH);
  189. tap_key(KC_EQL);
  190. tap_key(KC_SPC);
  191. }
  192. else {
  193. double_max(state->count, NOSHIFT, KC_EQL);
  194. }
  195. reset_tap_dance(state);
  196. }
  197. void greater(qk_tap_dance_state_t *state, void *user_data)
  198. {
  199. if (state->count > 2) {
  200. tap_key (KC_SPC);
  201. tap_key (KC_MINS);
  202. shift_key(KC_DOT);
  203. tap_key (KC_SPC);
  204. }
  205. else {
  206. double_max(state->count, SHIFT, KC_DOT);
  207. }
  208. reset_tap_dance(state);
  209. }
  210. void lesser(qk_tap_dance_state_t *state, void *user_data)
  211. {
  212. if (state->count > 2) {
  213. tap_key (KC_SPC);
  214. shift_key(KC_COMM);
  215. tap_key (KC_MINS);
  216. tap_key (KC_SPC);
  217. }
  218. else {
  219. double_max(state->count, SHIFT, KC_COMM);
  220. }
  221. reset_tap_dance(state);
  222. }
  223. void tilde(qk_tap_dance_state_t *state, void *user_data)
  224. {
  225. // double tap plus down: repeating keycode
  226. if (state->count > 2) {
  227. register_code(KC_LSFT);
  228. register_code(KC_GRV);
  229. }
  230. // tap: keycode
  231. else {
  232. shift_key(KC_GRV);
  233. // double tap: unix home directory
  234. if (state->count > 1) {
  235. tap_key(KC_SLSH);
  236. }
  237. }
  238. }
  239. void tilde_reset(qk_tap_dance_state_t *state, void *user_data)
  240. {
  241. unregister_code(KC_GRV);
  242. unregister_code(KC_LSFT);
  243. }
  244. // ............................................................. Tap Dance Pairs
  245. // tap dance shift rules
  246. #define S_NEVER 0
  247. #define S_SINGLE 1
  248. #define S_DOUBLE 2
  249. #define S_ALWAYS S_SINGLE | S_DOUBLE
  250. void symbol_pair(uint8_t shift, uint16_t left, uint16_t right)
  251. {
  252. if (shift & S_DOUBLE) {
  253. shift_key(left);
  254. shift_key(right);
  255. }
  256. else {
  257. tap_key(left);
  258. tap_key(right);
  259. }
  260. }
  261. #define CLOSE 1
  262. // tap dance symbol pairs
  263. void tap_pair(qk_tap_dance_state_t *state, uint8_t shift, uint16_t left, uint16_t right, uint16_t modifier, uint8_t close)
  264. {
  265. // triple tap: left right with cursor between symbol pair a la vim :-)
  266. if (state->count > 2) {
  267. symbol_pair(shift, left, right);
  268. tap_key (KC_LEFT);
  269. }
  270. // double tap: left right
  271. else if (state->count > 1) {
  272. symbol_pair(shift, left, right);
  273. }
  274. // down: modifier
  275. else if (state->pressed) {
  276. if (modifier) {
  277. register_code(modifier);
  278. }
  279. }
  280. // tap: left (close: right)
  281. else {
  282. if (shift & S_SINGLE) {
  283. shift_key(close ? right : left);
  284. }
  285. else {
  286. tap_key(close ? right : left);
  287. }
  288. }
  289. if (!modifier) {
  290. reset_tap_dance(state);
  291. }
  292. }
  293. void doublequote(qk_tap_dance_state_t *state, void *user_data)
  294. {
  295. tap_pair(state, S_ALWAYS, KC_QUOT, KC_QUOT, 0, 0);
  296. }
  297. void grave(qk_tap_dance_state_t *state, void *user_data)
  298. {
  299. tap_pair(state, S_NEVER, KC_GRV, KC_GRV, 0, 0);
  300. }
  301. void lbrace(qk_tap_dance_state_t *state, void *user_data)
  302. {
  303. tap_pair(state, S_NEVER, KC_LBRC, KC_RBRC, 0, 0);
  304. }
  305. void lcurly(qk_tap_dance_state_t *state, void *user_data)
  306. {
  307. tap_pair(state, S_ALWAYS, KC_LBRC, KC_RBRC, 0, 0);
  308. }
  309. void lparen(qk_tap_dance_state_t *state, void *user_data)
  310. {
  311. tap_pair(state, S_ALWAYS, KC_9, KC_0, KC_LCTL, 0);
  312. }
  313. void lparen_reset(qk_tap_dance_state_t *state, void *user_data)
  314. {
  315. unregister_code(KC_LCTL);
  316. }
  317. void quote(qk_tap_dance_state_t *state, void *user_data)
  318. {
  319. tap_pair(state, S_NEVER, KC_QUOT, KC_QUOT, 0, 0);
  320. }
  321. void rangle(qk_tap_dance_state_t *state, void *user_data)
  322. {
  323. tap_pair(state, S_ALWAYS, KC_COMM, KC_DOT, 0, CLOSE);
  324. }
  325. void rbrace(qk_tap_dance_state_t *state, void *user_data)
  326. {
  327. tap_pair(state, S_NEVER, KC_LBRC, KC_RBRC, 0, CLOSE);
  328. }
  329. void rcurly(qk_tap_dance_state_t *state, void *user_data)
  330. {
  331. tap_pair(state, S_ALWAYS, KC_LBRC, KC_RBRC, 0, CLOSE);
  332. }
  333. void rparen(qk_tap_dance_state_t *state, void *user_data)
  334. {
  335. tap_pair(state, S_ALWAYS, KC_9, KC_0, 0, CLOSE);
  336. }
  337. void rparen_reset(qk_tap_dance_state_t *state, void *user_data)
  338. {
  339. unregister_code(KC_LCTL);
  340. }
  341. // ............................................................ Tap Dance Insert
  342. void comma(qk_tap_dance_state_t *state, void *user_data)
  343. {
  344. tap_key(KC_COMM);
  345. if (state->count > 1) {
  346. tap_key(KC_SPC);
  347. }
  348. reset_tap_dance(state);
  349. }
  350. void dot(qk_tap_dance_state_t *state, void *user_data)
  351. {
  352. if (state->count > 1) {
  353. shift_key(KC_COLN);
  354. }
  355. else {
  356. tap_key(KC_DOT);
  357. }
  358. reset_tap_dance(state);
  359. }
  360. // compile time macro string, see functions/hardware planck script
  361. void private(qk_tap_dance_state_t *state, void *user_data)
  362. {
  363. if (state->count > 1) {
  364. #ifdef PRIVATE_STRING
  365. #include "private_string.h"
  366. #endif
  367. }
  368. reset_tap_dance(state);
  369. }
  370. // config.h defined string
  371. void send(qk_tap_dance_state_t *state, void *user_data)
  372. {
  373. if (state->count > 1) {
  374. SEND_STRING(PUBLIC_STRING);
  375. }
  376. reset_tap_dance(state);
  377. }
  378. // .......................................................... Tap Dance One Shot
  379. void caps(qk_tap_dance_state_t *state, void *user_data)
  380. {
  381. if (state->count > 1) {
  382. tap_key(KC_CAPS);
  383. }
  384. else {
  385. set_oneshot_mods(MOD_LSFT);
  386. register_code (KC_LSFT); // on hold down
  387. }
  388. }
  389. void caps_reset(qk_tap_dance_state_t *state, void *user_data)
  390. {
  391. unregister_code(KC_LSFT);
  392. }
  393. // ................................................................... Tap Dance
  394. qk_tap_dance_action_t tap_dance_actions[] = {
  395. [_CAPS] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, caps, caps_reset)
  396. ,[_COLN] = ACTION_TAP_DANCE_FN (colon)
  397. ,[_COMM] = ACTION_TAP_DANCE_FN (comma)
  398. ,[_DOT] = ACTION_TAP_DANCE_FN (dot)
  399. ,[_DQOT] = ACTION_TAP_DANCE_FN (doublequote)
  400. ,[_ENT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, enter, enter_reset)
  401. ,[_EQL] = ACTION_TAP_DANCE_FN (eql)
  402. ,[_GRV] = ACTION_TAP_DANCE_FN (grave)
  403. ,[_GT] = ACTION_TAP_DANCE_FN (greater)
  404. ,[_LBRC] = ACTION_TAP_DANCE_FN (lbrace)
  405. ,[_LCBR] = ACTION_TAP_DANCE_FN (lcurly)
  406. ,[_LPRN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, lparen, lparen_reset)
  407. ,[_LT] = ACTION_TAP_DANCE_FN (lesser)
  408. ,[_PRIV] = ACTION_TAP_DANCE_FN (private)
  409. ,[_QUOT] = ACTION_TAP_DANCE_FN (quote)
  410. ,[_RBRC] = ACTION_TAP_DANCE_FN (rbrace)
  411. ,[_RCBR] = ACTION_TAP_DANCE_FN (rcurly)
  412. ,[_RNGL] = ACTION_TAP_DANCE_FN (rangle)
  413. ,[_RPRN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, rparen, rparen_reset)
  414. ,[_SEND] = ACTION_TAP_DANCE_FN (send)
  415. ,[_SPC] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, space, space_reset)
  416. ,[_TILD] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tilde, tilde_reset)
  417. };
  418. // .............................................................. Dynamic Layers
  419. #define LEFT 1
  420. #define RIGHT 2
  421. static uint8_t thumb = 0;
  422. // LEFT (KC_SPC, S(KC_BSLS)), RIGHT (KC_LEFT, S(KC_LEFT)) opposite thumb combinations, see process_record_user()
  423. // up, up -> _BASE
  424. // up, down -> _SYMBOL
  425. // down, up -> _NUMBER
  426. // down, down -> _MOUSE // see layer keycodes that raise mouse layer
  427. #define THUMBS_DOWN _MOUSE // layer
  428. static uint8_t overlayer = 0;
  429. // left right thumb layer combinations
  430. 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)
  431. {
  432. if (record->event.pressed) {
  433. // layer_on via tap_layer(), see process_record_user()
  434. key_timer = timer_read();
  435. thumb = thumb | side;
  436. }
  437. else {
  438. layer_off(thumb_dn_layer);
  439. // opposite thumb_layer() thumb may have switched effective layer!
  440. if (overlayer) {
  441. layer_off(overlayer);
  442. overlayer = 0;
  443. }
  444. if (!key_press(shift, keycode)) {
  445. layer_off(THUMBS_DOWN); // both thumbs needed
  446. // opposite thumb down? see left right combination layer table above
  447. if (thumb & (side == LEFT ? RIGHT : LEFT)) {
  448. layer_on(thumb_up_layer);
  449. overlayer = thumb_up_layer;
  450. }
  451. }
  452. clear_mods();
  453. thumb = thumb & ~side;
  454. key_timer = 0;
  455. }
  456. }
  457. // #ifdef STENO_ENABLE
  458. // // LT for steno keycode
  459. // void stn_layer(keyrecord_t *record, uint16_t keycode, uint8_t layer)
  460. // {
  461. // if (record->event.pressed) {
  462. // key_timer = timer_read();
  463. // if (keycode) {
  464. // process_steno(keycode, record);
  465. // }
  466. // layer_on(layer);
  467. // }
  468. // else {
  469. // layer_off(layer);
  470. // if (keycode) {
  471. // if (timer_elapsed(key_timer) < TAPPING_TERM) {
  472. // process_steno(keycode, record);
  473. // }
  474. // else {
  475. // // clear pressed state (request push of updated) process_steno.c and .h
  476. // // steno_clear_state();
  477. // }
  478. // }
  479. // key_timer = 0;
  480. // }
  481. // }
  482. // #endif
  483. // LT for S(keycode)
  484. void lt_shift(keyrecord_t *record, uint16_t keycode, uint8_t layer)
  485. {
  486. if (record->event.pressed) {
  487. key_timer = timer_read();
  488. layer_on(layer);
  489. }
  490. else {
  491. layer_off(layer);
  492. // for shifted keycodes, hence, LT_SHIFT
  493. key_press(SHIFT, keycode);
  494. clear_mods();
  495. key_timer = 0;
  496. }
  497. }
  498. // set layer asap to overcome macro latency errors, notably tap dance and LT usage
  499. // this routine inexplicably (?) sets layer_on() faster than can be done in thumb_layer()
  500. void tap_layer(keyrecord_t *record, uint8_t layer)
  501. {
  502. if (record->event.pressed) {
  503. layer_on(layer);
  504. }
  505. else {
  506. layer_off(layer);
  507. }
  508. }
  509. // ..................................................................... Keymaps
  510. // void persistant_default_layer_set(uint16_t default_layer)
  511. // {
  512. // eeconfig_update_default_layer(default_layer);
  513. // default_layer_set (default_layer);
  514. // }
  515. void clear_layers(void)
  516. {
  517. uint8_t layer;
  518. for (layer = 0; layer < _END_LAYERS; layer++) {
  519. layer_off(layer);
  520. }
  521. }
  522. #ifdef CENTER_TT
  523. static uint16_t tt_keycode = 0; // current TT keycode
  524. void clear_tt(void)
  525. {
  526. if (tt_keycode == KC_CAPS) {
  527. tap_key(KC_CAPS); // clear capslock
  528. }
  529. tt_keycode = 0;
  530. clear_layers();
  531. set_single_persistent_default_layer(_BASE);
  532. }
  533. #endif
  534. // txbolt plover run state
  535. static uint8_t plover = 0;
  536. void base_layer(void)
  537. {
  538. #ifdef AUDIO_ENABLE
  539. if (plover) {
  540. PLAY_SONG(song_plover_gb);
  541. }
  542. else {
  543. PLAY_SONG(song_qwerty);
  544. }
  545. #endif
  546. clear_layers();
  547. set_single_persistent_default_layer(_BASE);
  548. }
  549. void toggle_plover(uint8_t state)
  550. {
  551. if (plover != state) {
  552. #ifdef PLOVER_KEYBIND
  553. #include "plover_keybind.h"
  554. #endif
  555. plover = state;
  556. }
  557. }
  558. void steno(keyrecord_t *record)
  559. {
  560. if (record->event.pressed) {
  561. #ifdef AUDIO_ENABLE
  562. PLAY_SONG(song_plover);
  563. #endif
  564. clear_layers();
  565. layer_on(_PLOVER);
  566. if (!eeconfig_is_enabled()) {
  567. eeconfig_init();
  568. }
  569. keymap_config.raw = eeconfig_read_keymap();
  570. keymap_config.nkro = 1;
  571. eeconfig_update_keymap(keymap_config.raw);
  572. if (!plover) {
  573. toggle_plover(1);
  574. }
  575. }
  576. }
  577. void steno_exit(keyrecord_t *record)
  578. {
  579. if (record->event.pressed) {
  580. base_layer();
  581. toggle_plover(0);
  582. }
  583. }