keycode_functions.h 16 KB

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