keymap.c 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684
  1. // Copyright 2022 axtlos (@axtloss)
  2. // SPDX-License-Identifier: GPL-2.0-only
  3. #include QMK_KEYBOARD_H
  4. enum sofle_layers {
  5. /* _M_XYZ = Mac Os, _W_XYZ = Win/Linux */
  6. _QWERTY,
  7. _COLEMAK,
  8. _GAME,
  9. _LOWER,
  10. _RAISE,
  11. _ADJUST,
  12. };
  13. enum custom_keycodes {
  14. KC_COLEMAK = SAFE_RANGE,
  15. KC_QWERTY,
  16. KC_LOWER,
  17. KC_RAISE,
  18. KC_ADJUST,
  19. KC_GAME,
  20. KC_PRVWD,
  21. KC_NXTWD,
  22. KC_LSTRT,
  23. KC_LEND,
  24. KC_DLINE,
  25. KC_UNLOCK,
  26. };
  27. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  28. /*
  29. * COLEMAK
  30. * ,-----------------------------------------. ,-----------------------------------------.
  31. * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
  32. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  33. * | ESC | Q | W | F | P | G | | J | L | U | Y | ; | Bspc |
  34. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  35. * | TAB | A | R | S | T | D |-------. ,-------| H | N | E | I | O | ' |
  36. * |------+------+------+------+------+------| MUTE | |ADJUST |------+------+------+------+------+------|
  37. * |LShift| Z | X | C | V | B |-------| |-------| K | M | , | . | / |RShift|
  38. * `-----------------------------------------/ / \ \-----------------------------------------'
  39. * | LGUI | LAlt | LCTR |LOWER | /Space / \Enter \ |RAISE | RCTR | RAlt | MOUSE |
  40. * | | | | |/ / \ \ | | | | |
  41. * `----------------------------------' '------''---------------------------'
  42. */
  43. [_COLEMAK] = LAYOUT(
  44. KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV,
  45. KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC,
  46. KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
  47. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, KC_CAPS ,KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
  48. KC_LGUI,KC_LALT,KC_LCTL,KC_LOWER, KC_ENT, KC_SPC, KC_RAISE, KC_RCTL, KC_RALT, KC_PSCR
  49. ),
  50. /*
  51. * QWERTY
  52. * ,-----------------------------------------. ,-----------------------------------------.
  53. * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
  54. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  55. * | ESC | Q | W | E | R | T | | Y | U | I | O | P | Bspc |
  56. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  57. * | Tab | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
  58. * |------+------+------+------+------+------| | | |------+------+------+------+------+------|
  59. * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift|
  60. * `-----------------------------------------/ / \ \-----------------------------------------'
  61. * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | Print|
  62. * | | | | |/ / \ \ | | | | |
  63. * `----------------------------------' '------''---------------------------'
  64. */
  65. [_QWERTY] = LAYOUT(
  66. KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV,
  67. KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
  68. KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
  69. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, KC_MPLY,KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
  70. KC_LGUI,KC_LALT,KC_LCTL, KC_LOWER, KC_ENT, KC_SPC, KC_RAISE, KC_RCTL, KC_RALT, KC_PSCR
  71. ),
  72. /* LOWER
  73. * ,-----------------------------------------. ,-----------------------------------------.
  74. * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
  75. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  76. * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 |
  77. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  78. * | Tab | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | | |
  79. * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
  80. * | Shift| = | - | + | { | } |-------| |-------| [ | ] | ; | : | \ | Shift|
  81. * `-----------------------------------------/ / \ \-----------------------------------------'
  82. * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
  83. * | | | | |/ / \ \ | | | | |
  84. * `----------------------------------' '------''---------------------------'
  85. */
  86. [_LOWER] = LAYOUT(
  87. _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
  88. KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F12,
  89. _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE,
  90. _______, KC_EQL, KC_MINS, KC_PLUS, KC_LCBR, KC_RCBR, _______, _______, KC_LBRC, KC_RBRC, KC_SCLN, KC_COLN, KC_BSLS, _______,
  91. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  92. ),
  93. /* RAISE
  94. * ,----------------------------------------. ,-----------------------------------------.
  95. * | | | | | | | | | | | | | |
  96. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  97. * | Esc | Ins | Pscr | Menu | | | | | PWrd | Up | NWrd | DLine| Bspc |
  98. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  99. * | Tab | ae | ue | oe | ss | euro |-------. ,-------| | Left | Down | Rigth| Del | Bspc |
  100. * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
  101. * |Shift | Undo | Cut | Copy | Paste| caps |-------| |-------| | LStr | | LEnd | | Shift|
  102. * `-----------------------------------------/ / \ \-----------------------------------------'
  103. * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
  104. * | | | | |/ / \ \ | | | | |
  105. * `----------------------------------' '------''---------------------------'
  106. */
  107. [_RAISE] = LAYOUT(
  108. _______, _______ , _______ , _______ , _______ , _______, _______, _______ , _______, _______ , _______ ,_______,
  109. _______, LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), LGUI(KC_4), LGUI(KC_5), LGUI(KC_6), LGUI(KC_7), KC_UP, LGUI(KC_9),LGUI(KC_0), KC_BSPC,
  110. _______, RALT(KC_Q), RALT(KC_Y), RALT(KC_P), RALT(KC_S) , RALT(KC_5), KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_BSPC,
  111. _______,KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, KC_CAPS, _______, _______, XXXXXXX, KC_LSTRT, XXXXXXX, KC_LEND, XXXXXXX, _______,
  112. _______, _______, _______, _______, KC_ENT, _______, _______, _______, _______, _______
  113. ),
  114. /*
  115. * QWERTY
  116. * ,-----------------------------------------. ,-----------------------------------------.
  117. * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
  118. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  119. * | ESC | Q | W | E | R | T | | Y | U | I | O | P | Bspc |
  120. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  121. * | Tab | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
  122. * |------+------+------+------+------+------| | | |------+------+------+------+------+------|
  123. * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift|
  124. * `-----------------------------------------/ / \ \-----------------------------------------'
  125. * | LGUI | LAlt | LCTR |LOWER | /Space / \Enter \ |RAISE | RCTR | RAlt | Print|
  126. * | | | | |/ / \ \ | | | | |
  127. * `----------------------------------' '------''---------------------------'
  128. */
  129. [_GAME] = LAYOUT(
  130. KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV,
  131. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
  132. KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
  133. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, KC_MPLY,KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
  134. KC_LGUI,KC_LALT,KC_SPC, KC_LOWER, KC_SPC, KC_ENT, KC_RAISE, KC_RCTL, KC_RALT, KC_PSCR
  135. ),
  136. /* ADJUST
  137. * ,-----------------------------------------. ,-----------------------------------------.
  138. * | | | | | | | | | | | | | |
  139. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  140. * | QK_BOOT| |QWERTY|COLEMAK| | | | | | | | | |
  141. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  142. * | | |MACWIN|GAMING| | |-------. ,-------| | VOLDO| MUTE | VOLUP| | |
  143. * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
  144. * |UNLOCK| | | | | |-------| |-------| | PREV | PLAY | NEXT | | |
  145. * `-----------------------------------------/ / \ \-----------------------------------------'
  146. * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
  147. * | | | | |/ / \ \ | | | | |
  148. * `---------------------------''------' '------''---------------------------'
  149. */
  150. [_ADJUST] = LAYOUT(
  151. XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  152. QK_BOOT , XXXXXXX,KC_QWERTY,KC_COLEMAK,CG_TOGG,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  153. XXXXXXX , XXXXXXX,CG_TOGG, KC_GAME, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX,
  154. KC_UNLOCK , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
  155. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  156. ),
  157. };
  158. #ifdef OLED_ENABLE
  159. bool show_lock = true; // this is used to display the lock icon and disable keypresses when the keyboard is locked
  160. static void render_logo(void) {
  161. static const char PROGMEM no_qmk[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  162. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xe0, 0xe0, 0xc0, 0x80, 0x00, 0x80, 0x80, 0x80,
  163. 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0xe0, 0xf0,
  164. 0xf8, 0xf8, 0xe0, 0x00, 0x00, 0x0e, 0xfe, 0xfe, 0xfc, 0xfc, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8,
  165. 0xf8, 0xf8, 0xf8, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  166. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
  167. 0x08, 0x88, 0x88, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0xf0, 0x00, 0x00, 0x00, 0x00,
  168. 0x08, 0x08, 0x88, 0x88, 0x88, 0x48, 0x48, 0x48, 0x28, 0x28, 0x18, 0x18, 0x08, 0x00, 0x00, 0x00,
  169. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  170. 0x00, 0x00, 0x00, 0xf0, 0xfc, 0xf8, 0x03, 0xf3, 0xe7, 0xdf, 0x9f, 0x3f, 0xfe, 0xfe, 0xfc, 0xf9,
  171. 0xfb, 0xf3, 0xf7, 0xf7, 0xe7, 0xef, 0xcf, 0x90, 0xa1, 0x81, 0x81, 0x81, 0xa0, 0xbd, 0xff, 0xff,
  172. 0xff, 0xff, 0x7f, 0x3f, 0x9c, 0xdc, 0xf8, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  173. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
  174. 0x60, 0x00, 0x00, 0x20, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x4c, 0x4f,
  175. 0x47, 0x43, 0x43, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0xc2, 0xc2, 0x41, 0x00, 0x00, 0x00, 0x00,
  176. 0xe3, 0x13, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0xe2, 0x00, 0x00, 0x00,
  177. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  178. 0x00, 0x00, 0x00, 0x3f, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  179. 0xff, 0xff, 0x03, 0x79, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x79, 0x03, 0xff, 0xff, 0xff, 0xff, 0x1f,
  180. 0x03, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  181. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  182. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x40, 0x40,
  183. 0x40, 0x40, 0x40, 0x40, 0x44, 0x4a, 0x4a, 0x51, 0x51, 0x60, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00,
  184. 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00,
  185. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  186. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x0f, 0x0f, 0x1f,
  187. 0x3f, 0x3f, 0x7f, 0x7c, 0x78, 0x78, 0x78, 0x78, 0x7c, 0x7e, 0x7f, 0x7f, 0x4f, 0x43, 0x40, 0x60,
  188. 0x60, 0x78, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
  189. 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  190. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x21,
  191. 0x11, 0x11, 0x09, 0x09, 0x05, 0x05, 0x03, 0x03, 0x05, 0x09, 0x11, 0x21, 0x00, 0x00, 0x00, 0x00,
  192. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  193. oled_write_raw_P(no_qmk, sizeof(no_qmk));
  194. }
  195. static const char PROGMEM locked_logo[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xfc, 0xce, 0xc6,
  196. 0xc6, 0xce, 0xfc, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  197. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
  198. 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  199. /* 32 * 14 os logos */
  200. static const char PROGMEM linux_logo[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x27, 0x27, 0x8f, 0x9f, 0x03,
  201. 0x73, 0xff, 0x03, 0xf2, 0xfe, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  202. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1f, 0x19, 0x19, 0x1b, 0x1b, 0x1b,
  203. 0x1a, 0x18, 0x18, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  204. static const char PROGMEM mac_logo[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xf8, 0xf8, 0xf0, 0xf6, 0xfb, 0xfb, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0f, 0x1f, 0x1f, 0x0f, 0x0f, 0x1f, 0x1f, 0x0f, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  205. /* KEYBOARD PET START */
  206. /* settings */
  207. # define MIN_WALK_SPEED 10
  208. # define MIN_RUN_SPEED 40
  209. /* advanced settings */
  210. # define ANIM_FRAME_DURATION 200 // how long each frame lasts in ms
  211. # define ANIM_SIZE 96 // number of bytes in array. If you change sprites, minimize for adequate firmware size. max is 1024
  212. /* timers */
  213. uint32_t anim_timer = 0;
  214. /* current frame */
  215. uint8_t current_frame = 0;
  216. /* status variables */
  217. int current_wpm = 0;
  218. led_t led_usb_state;
  219. bool isSneaking = false;
  220. bool isJumping = false;
  221. bool showedJump = true;
  222. /* logic */
  223. static void render_luna(int LUNA_X, int LUNA_Y) {
  224. /* Sit */
  225. static const char PROGMEM sit[2][ANIM_SIZE] = {/* 'sit1', 32x22px */
  226. {
  227. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x02, 0x05, 0x02, 0x24, 0x04, 0x04, 0x02, 0xa9, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x68, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x82, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0c, 0x10, 0x10, 0x20, 0x20, 0x20, 0x28, 0x3e, 0x1c, 0x20, 0x20, 0x3e, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  228. },
  229. /* 'sit2', 32x22px */
  230. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x02, 0x05, 0x02, 0x24, 0x04, 0x04, 0x02, 0xa9, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x90, 0x08, 0x18, 0x60, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0e, 0x82, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0c, 0x10, 0x10, 0x20, 0x20, 0x20, 0x28, 0x3e, 0x1c, 0x20, 0x20, 0x3e, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
  231. /* Walk */
  232. static const char PROGMEM walk[2][ANIM_SIZE] = {/* 'walk1', 32x22px */
  233. {
  234. 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x90, 0x90, 0x90, 0xa0, 0xc0, 0x80, 0x80, 0x80, 0x70, 0x08, 0x14, 0x08, 0x90, 0x10, 0x10, 0x08, 0xa4, 0x78, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x08, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0xea, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x20, 0x20, 0x3c, 0x0f, 0x11, 0x1f, 0x03, 0x06, 0x18, 0x20, 0x20, 0x3c, 0x0c, 0x12, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  235. },
  236. /* 'walk2', 32x22px */
  237. {
  238. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x20, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x28, 0x10, 0x20, 0x20, 0x20, 0x10, 0x48, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x20, 0xf8, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x30, 0xd5, 0x20, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x30, 0x0c, 0x02, 0x05, 0x09, 0x12, 0x1e, 0x02, 0x1c, 0x14, 0x08, 0x10, 0x20, 0x2c, 0x32, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  239. }};
  240. /* Run */
  241. static const char PROGMEM run[2][ANIM_SIZE] = {/* 'run1', 32x22px */
  242. {
  243. 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x08, 0xc8, 0xb0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x3c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xc4, 0xa4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc8, 0x58, 0x28, 0x2a, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x09, 0x04, 0x04, 0x04, 0x04, 0x02, 0x03, 0x02, 0x01, 0x01, 0x02, 0x02, 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
  244. },
  245. /* 'run2', 32x22px */
  246. {
  247. 0x00, 0x00, 0x00, 0xe0, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x78, 0x28, 0x08, 0x10, 0x20, 0x30, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xb0, 0x50, 0x55, 0x20, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x1e, 0x20, 0x20, 0x18, 0x0c, 0x14, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  248. }};
  249. /* Bark */
  250. static const char PROGMEM bark[2][ANIM_SIZE] = {/* 'bark1', 32x22px */
  251. {
  252. 0x00, 0xc0, 0x20, 0x10, 0xd0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x3c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc8, 0x48, 0x28, 0x2a, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x02, 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  253. },
  254. /* 'bark2', 32x22px */
  255. {
  256. 0x00, 0xe0, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x2c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x48, 0x28, 0x2a, 0x10, 0x0f, 0x20, 0x4a, 0x09, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x02, 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  257. }};
  258. /* Sneak */
  259. static const char PROGMEM sneak[2][ANIM_SIZE] = {/* 'sneak1', 32x22px */
  260. {
  261. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x40, 0x40, 0x80, 0x00, 0x80, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x21, 0xf0, 0x04, 0x02, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02, 0x04, 0x04, 0x04, 0x03, 0x01, 0x00, 0x00, 0x09, 0x01, 0x80, 0x80, 0xab, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x20, 0x20, 0x3c, 0x0f, 0x11, 0x1f, 0x02, 0x06, 0x18, 0x20, 0x20, 0x38, 0x08, 0x10, 0x18, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
  262. },
  263. /* 'sneak2', 32x22px */
  264. {
  265. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xa0, 0x20, 0x40, 0x80, 0xc0, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x41, 0xf0, 0x04, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02, 0x02, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x40, 0x55, 0x82, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x30, 0x0c, 0x02, 0x05, 0x09, 0x12, 0x1e, 0x04, 0x18, 0x10, 0x08, 0x10, 0x20, 0x28, 0x34, 0x06, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
  266. }};
  267. /* animation */
  268. void animate_luna(void) {
  269. /* jump */
  270. if (isJumping || !showedJump) {
  271. /* clear */
  272. oled_set_cursor(LUNA_X, LUNA_Y + 2);
  273. oled_write(" ", false);
  274. oled_set_cursor(LUNA_X, LUNA_Y - 1);
  275. showedJump = true;
  276. } else {
  277. /* clear */
  278. oled_set_cursor(LUNA_X, LUNA_Y - 1);
  279. oled_write(" ", false);
  280. oled_set_cursor(LUNA_X, LUNA_Y);
  281. }
  282. /* switch frame */
  283. current_frame = (current_frame + 1) % 2;
  284. /* current status */
  285. if (led_usb_state.caps_lock) {
  286. oled_write_raw_P(bark[current_frame], ANIM_SIZE);
  287. } else if (isSneaking) {
  288. oled_write_raw_P(sneak[current_frame], ANIM_SIZE);
  289. } else if (current_wpm <= MIN_WALK_SPEED) {
  290. oled_write_raw_P(sit[current_frame], ANIM_SIZE);
  291. } else if (current_wpm <= MIN_RUN_SPEED) {
  292. oled_write_raw_P(walk[current_frame], ANIM_SIZE);
  293. } else {
  294. oled_write_raw_P(run[current_frame], ANIM_SIZE);
  295. }
  296. }
  297. # if OLED_TIMEOUT > 0
  298. /* the animation prevents the normal timeout from occuring */
  299. if (last_input_activity_elapsed() > OLED_TIMEOUT && last_led_activity_elapsed() > OLED_TIMEOUT) {
  300. oled_off();
  301. return;
  302. } else {
  303. oled_on();
  304. }
  305. # endif
  306. /* animation timer */
  307. if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
  308. anim_timer = timer_read32();
  309. animate_luna();
  310. }
  311. }
  312. /* KEYBOARD PET END */
  313. oled_rotation_t oled_init_user(oled_rotation_t rotation) {
  314. if (is_keyboard_master()) {
  315. return OLED_ROTATION_270;
  316. }
  317. return rotation;
  318. }
  319. static void print_logo_narrow(void) {
  320. render_logo();
  321. }
  322. static void print_status_narrow(void) {
  323. /* Print current mode */
  324. oled_set_cursor(0, 0);
  325. if (show_lock == true) {
  326. oled_write_raw_P(locked_logo, sizeof(locked_logo));
  327. } else if (keymap_config.swap_lctl_lgui) {
  328. oled_write_raw_P(mac_logo, sizeof(mac_logo));
  329. } else {
  330. oled_write_raw_P(linux_logo, sizeof(linux_logo));
  331. }
  332. oled_set_cursor(0, 3);
  333. switch (get_highest_layer(default_layer_state)) {
  334. case _COLEMAK:
  335. oled_write_P(PSTR(" CLMK "), false);
  336. break;
  337. case _GAME:
  338. oled_write_P(PSTR(" GAME "), false);
  339. break;
  340. case _QWERTY:
  341. oled_write_P(PSTR("QWERT"), false);
  342. break;
  343. default:
  344. oled_write_P(PSTR("UNDEF"), false);
  345. }
  346. oled_set_cursor(0, 5);
  347. /* Print current layer */
  348. oled_write_P(PSTR("LAYER"), false);
  349. oled_set_cursor(0, 6);
  350. switch (get_highest_layer(layer_state)) {
  351. case _QWERTY:
  352. oled_write_P(PSTR("Base "), false);
  353. break;
  354. case _RAISE:
  355. oled_write_P(PSTR("Raise"), false);
  356. break;
  357. case _LOWER:
  358. oled_write_P(PSTR("Lower"), false);
  359. break;
  360. case _ADJUST:
  361. oled_write_P(PSTR(" Adj "), false);
  362. break;
  363. default:
  364. oled_write_P(PSTR("Undef"), false);
  365. }
  366. /* caps lock */
  367. oled_set_cursor(0, 8);
  368. oled_write_P(PSTR("CPSLK"), led_usb_state.caps_lock);
  369. /* KEYBOARD PET RENDER START */
  370. render_luna(0, 13);
  371. /* KEYBOARD PET RENDER END */
  372. }
  373. bool oled_task_user(void) {
  374. /* KEYBOARD PET VARIABLES START */
  375. current_wpm = get_current_wpm();
  376. led_usb_state = host_keyboard_led_state();
  377. /* KEYBOARD PET VARIABLES END */
  378. if (is_keyboard_master()) {
  379. print_status_narrow();
  380. } else {
  381. print_logo_narrow();
  382. }
  383. return false;
  384. }
  385. #endif
  386. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  387. switch (keycode) {
  388. case KC_QWERTY:
  389. if (show_lock == true) {
  390. return false;
  391. }
  392. if (record->event.pressed) {
  393. set_single_persistent_default_layer(_QWERTY);
  394. }
  395. return false;
  396. case KC_COLEMAK:
  397. if (show_lock == true) {
  398. return false;
  399. }
  400. if (record->event.pressed) {
  401. set_single_persistent_default_layer(_COLEMAK);
  402. }
  403. return false;
  404. case KC_GAME:
  405. if (show_lock == true) {
  406. return false;
  407. }
  408. if (record->event.pressed) {
  409. set_single_persistent_default_layer(_GAME);
  410. }
  411. return false;
  412. case KC_LOWER:
  413. if (record->event.pressed) {
  414. layer_on(_LOWER);
  415. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  416. } else {
  417. layer_off(_LOWER);
  418. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  419. }
  420. return false;
  421. case KC_RAISE:
  422. if (record->event.pressed) {
  423. layer_on(_RAISE);
  424. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  425. } else {
  426. layer_off(_RAISE);
  427. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  428. }
  429. return false;
  430. case KC_ADJUST:
  431. if (record->event.pressed) {
  432. layer_on(_ADJUST);
  433. } else {
  434. layer_off(_ADJUST);
  435. }
  436. return false;
  437. case KC_PRVWD:
  438. if (show_lock == true) {
  439. return false;
  440. }
  441. if (record->event.pressed) {
  442. if (keymap_config.swap_lctl_lgui) {
  443. register_mods(mod_config(MOD_LALT));
  444. register_code(KC_LEFT);
  445. } else {
  446. register_mods(mod_config(MOD_LCTL));
  447. register_code(KC_LEFT);
  448. }
  449. } else {
  450. if (keymap_config.swap_lctl_lgui) {
  451. unregister_mods(mod_config(MOD_LALT));
  452. unregister_code(KC_LEFT);
  453. } else {
  454. unregister_mods(mod_config(MOD_LCTL));
  455. unregister_code(KC_LEFT);
  456. }
  457. }
  458. break;
  459. case KC_NXTWD:
  460. if (show_lock == true) {
  461. return false;
  462. }
  463. if (record->event.pressed) {
  464. if (keymap_config.swap_lctl_lgui) {
  465. register_mods(mod_config(MOD_LALT));
  466. register_code(KC_RIGHT);
  467. } else {
  468. register_mods(mod_config(MOD_LCTL));
  469. register_code(KC_RIGHT);
  470. }
  471. } else {
  472. if (keymap_config.swap_lctl_lgui) {
  473. unregister_mods(mod_config(MOD_LALT));
  474. unregister_code(KC_RIGHT);
  475. } else {
  476. unregister_mods(mod_config(MOD_LCTL));
  477. unregister_code(KC_RIGHT);
  478. }
  479. }
  480. break;
  481. case KC_LSTRT:
  482. if (show_lock == true) {
  483. return false;
  484. }
  485. if (record->event.pressed) {
  486. if (keymap_config.swap_lctl_lgui) {
  487. //CMD-arrow on Mac, but we have CTL and GUI swapped
  488. register_mods(mod_config(MOD_LCTL));
  489. register_code(KC_LEFT);
  490. } else {
  491. register_code(KC_HOME);
  492. }
  493. } else {
  494. if (keymap_config.swap_lctl_lgui) {
  495. unregister_mods(mod_config(MOD_LCTL));
  496. unregister_code(KC_LEFT);
  497. } else {
  498. unregister_code(KC_HOME);
  499. }
  500. }
  501. break;
  502. case KC_LEND:
  503. if (show_lock == true) {
  504. return false;
  505. }
  506. if (record->event.pressed) {
  507. if (keymap_config.swap_lctl_lgui) {
  508. //CMD-arrow on Mac, but we have CTL and GUI swapped
  509. register_mods(mod_config(MOD_LCTL));
  510. register_code(KC_RIGHT);
  511. } else {
  512. register_code(KC_END);
  513. }
  514. } else {
  515. if (keymap_config.swap_lctl_lgui) {
  516. unregister_mods(mod_config(MOD_LCTL));
  517. unregister_code(KC_RIGHT);
  518. } else {
  519. unregister_code(KC_END);
  520. }
  521. }
  522. break;
  523. case KC_DLINE:
  524. if (show_lock == true) {
  525. return false;
  526. }
  527. if (record->event.pressed) {
  528. register_mods(mod_config(MOD_RCTL));
  529. register_code(KC_BSPC);
  530. } else {
  531. unregister_mods(mod_config(MOD_LCTL));
  532. unregister_code(KC_BSPC);
  533. }
  534. break;
  535. case KC_COPY:
  536. if (show_lock == true) {
  537. return false;
  538. }
  539. if (record->event.pressed) {
  540. register_mods(mod_config(MOD_LCTL));
  541. register_code(KC_C);
  542. } else {
  543. unregister_mods(mod_config(MOD_LCTL));
  544. unregister_code(KC_C);
  545. }
  546. return false;
  547. case KC_PASTE:
  548. if (show_lock == true) {
  549. return false;
  550. }
  551. if (record->event.pressed) {
  552. register_mods(mod_config(MOD_LCTL));
  553. register_code(KC_V);
  554. } else {
  555. unregister_mods(mod_config(MOD_LCTL));
  556. unregister_code(KC_V);
  557. }
  558. return false;
  559. case KC_CUT:
  560. if (show_lock == true) {
  561. return false;
  562. }
  563. if (record->event.pressed) {
  564. register_mods(mod_config(MOD_LCTL));
  565. register_code(KC_X);
  566. } else {
  567. unregister_mods(mod_config(MOD_LCTL));
  568. unregister_code(KC_X);
  569. }
  570. return false;
  571. break;
  572. case KC_UNDO:
  573. if (show_lock == true) {
  574. return false;
  575. }
  576. if (record->event.pressed) {
  577. register_mods(mod_config(MOD_LCTL));
  578. register_code(KC_Z);
  579. } else {
  580. unregister_mods(mod_config(MOD_LCTL));
  581. unregister_code(KC_Z);
  582. }
  583. return false;
  584. case KC_UNLOCK:
  585. if (record->event.pressed) {
  586. if (show_lock == true) {
  587. show_lock = false;
  588. print_status_narrow();
  589. } else {
  590. show_lock = true;
  591. print_status_narrow();
  592. }
  593. }
  594. }
  595. /* This stops any keypress to be sent to the computer when the keyboard is locked */
  596. if (show_lock == false) {
  597. return true;
  598. } else {
  599. return false;
  600. }
  601. }
  602. #ifdef ENCODER_ENABLE
  603. bool encoder_update_user(uint8_t index, bool clockwise) {
  604. if (index == 0) {
  605. if (clockwise) {
  606. tap_code(KC_VOLU);
  607. } else {
  608. tap_code(KC_VOLD);
  609. }
  610. } else if (index == 1) {
  611. if (clockwise) {
  612. tap_code(KC_MNXT);
  613. } else {
  614. tap_code(KC_MPRV);
  615. }
  616. }
  617. return true;
  618. }
  619. #endif