keymap.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1. /* Copyright 2020 Fredrik Salomonsson <plattfot@gmail.com>
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include QMK_KEYBOARD_H
  17. #include "version.h"
  18. enum custom_keycodes {
  19. PLACEHOLDER = SAFE_RANGE, // can always be here
  20. // Macros, where | is the cursor
  21. M_LRBRC, // [|]
  22. M_LRCBR, // {|}
  23. M_LRPRN, // (|)
  24. M_LRABR, // <|>
  25. M_DQUOT, // '|'
  26. // New keys
  27. DBL_TAP, // Repeat next key
  28. };
  29. // Double Tap feature based on post from drashna
  30. // https://www.reddit.com/r/olkb/comments/citkbx/double_key_press_modifier_qmkwould_work_like/ev9cue8/
  31. static bool double_tap_it = false;
  32. enum layers {
  33. _DEFAULT,
  34. _LOWER,
  35. _RAISE,
  36. _NAV,
  37. _ADJUST,
  38. };
  39. // clang-format off
  40. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  41. /*
  42. * Base Layer: Default
  43. *
  44. * ,-------------------------------------------. ,-------------------------------------------.
  45. * | ` | Q | W | E | R | T | | Y | U | I | O | P | Å |
  46. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  47. * | Tab | A | S | D | F | G | | H | J | K | L | ; : | ' " |
  48. * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  49. * | LShift | Z | X | C | V | B | Lead | RAISE| | LOWER|DBLTAP| N | M | , < | . > | / ? | RShift |
  50. * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
  51. * | MPlay| GUI | LCtrl| Space| LALT | | Enter|BSpace| NAV |LCTL+ |Worksp|
  52. * | | | | | | | | | |LALT |toggle|
  53. * `----------------------------------' `----------------------------------'
  54. */
  55. [_DEFAULT] = LAYOUT(
  56. KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,
  57. KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
  58. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LEAD, OSL(_RAISE), OSL(_LOWER), DBL_TAP, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
  59. KC_MPLY, KC_LGUI, KC_LCTL, KC_SPACE, KC_LALT, KC_ENT, KC_BSPC, MO(_NAV), LCTL(KC_LALT), LGUI(KC_B)
  60. ),
  61. /*
  62. * Lower Layer: Symbols
  63. *
  64. * ,-------------------------------------------. ,-------------------------------------------.
  65. * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
  66. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  67. * | | | | _ | \ | - | + | | = | { | } | [ | ] | '' |
  68. * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  69. * | | [] | {} | () | <> | | | | | | | | | < | > | ? | |
  70. * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
  71. * | Mute | | | | | | | | | | |
  72. * | | | | | | | | | | | |
  73. * `----------------------------------' `----------------------------------'
  74. */
  75. [_LOWER] = LAYOUT(
  76. KC_TILDE,KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______,
  77. _______, KC_PIPE, KC_UNDS, KC_BSLS, KC_MINS, KC_PLUS, KC_EQUAL,KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, M_DQUOT,
  78. _______, M_LRBRC, M_LRCBR, M_LRPRN, M_LRABR, _______, _______, _______, _______, _______, _______, _______, KC_LT, KC_GT, KC_QUES, _______,
  79. KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______
  80. ),
  81. /*
  82. * Raise Layer: Function keys
  83. *
  84. * ,-------------------------------------------. ,-------------------------------------------.
  85. * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | |
  86. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  87. * | | | | | | F11 | | F12 | | | | | |
  88. * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  89. * | | | | | | |ScLock| | | | Ins | | | | | |CapsLock|
  90. * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
  91. * | | | | | | | | | | RAlt | |
  92. * | | | | | | | | | | | |
  93. * `----------------------------------' `----------------------------------'
  94. */
  95. [_RAISE] = LAYOUT(
  96. _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______,
  97. _______, _______, _______, _______, _______, KC_F11, KC_F12, _______, _______, _______, _______, _______,
  98. _______, _______, _______, _______, _______, _______, KC_SLCK, _______, _______, KC_INS, _______, _______, _______, _______, _______, KC_CAPS,
  99. _______, _______, _______, _______, _______, _______, _______, _______, KC_RALT, _______
  100. ),
  101. /*
  102. * Navigation Layer: Number keys, navigation, modification
  103. *
  104. * ,-------------------------------------------. ,-------------------------------------------.
  105. * | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
  106. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  107. * | | | Esc | Del | | | | | Left | Up | Down | Right| |
  108. * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  109. * | | | | | | | | | | | | | | | | | |
  110. * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
  111. * | | | | | | | | | | RCtrl| |
  112. * | | | | | | | | | | | |
  113. * `----------------------------------' `----------------------------------'
  114. */
  115. [_NAV] = LAYOUT(
  116. _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
  117. _______, _______, KC_ESC, KC_DEL, _______, _______, _______, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, _______,
  118. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  119. _______, _______, _______, _______, _______, _______, _______, _______, KC_RCTL, _______
  120. ),
  121. /*
  122. * Adjust Layer: RGB
  123. *
  124. * ,-------------------------------------------. ,-------------------------------------------.
  125. * | | | | | | | | | | | | | |
  126. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  127. * | | TOG | SAI | HUI | VAI | MOD | | | | | | | |
  128. * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  129. * | | | SAD | HUD | VAD | RMOD | | | | | | | | | | | |
  130. * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
  131. * | | | | | | | | | | | |
  132. * | | | | | | | | | | | |
  133. * `----------------------------------' `----------------------------------'
  134. */
  135. [_ADJUST] = LAYOUT(
  136. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  137. _______, RGB_TOG, RGB_SAI, RGB_HUI, RGB_VAI, RGB_MOD, _______, _______, _______, _______, _______, _______,
  138. _______, _______, RGB_SAD, RGB_HUD, RGB_VAD, RGB_RMOD,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  139. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  140. ),
  141. // /*
  142. // * Layer template
  143. // *
  144. // * ,-------------------------------------------. ,-------------------------------------------.
  145. // * | | | | | | | | | | | | | |
  146. // * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  147. // * | | | | | | | | | | | | | |
  148. // * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  149. // * | | | | | | | | | | | | | | | | | |
  150. // * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
  151. // * | | | | | | | | | | | |
  152. // * | | | | | | | | | | | |
  153. // * `----------------------------------' `----------------------------------'
  154. // */
  155. // [_LAYERINDEX] = LAYOUT(
  156. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  157. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  158. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  159. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  160. // ),
  161. };
  162. // clang-format on
  163. /* void keyboard_post_init_user(void) { */
  164. /* rgblight_setrgb(51, 135, 204); */
  165. /* } */
  166. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  167. if (record->event.pressed) {
  168. switch (keycode) {
  169. case M_LRPRN:
  170. // Double tap gets messed up with macros, turning it off
  171. double_tap_it = false;
  172. SEND_STRING("()" SS_TAP(X_LEFT));
  173. return false;
  174. case M_LRCBR:
  175. double_tap_it = false;
  176. SEND_STRING("{}" SS_TAP(X_LEFT));
  177. return false;
  178. case M_LRBRC:
  179. double_tap_it = false;
  180. SEND_STRING("[]" SS_TAP(X_LEFT));
  181. return false;
  182. case M_LRABR:
  183. double_tap_it = false;
  184. SEND_STRING("<>" SS_TAP(X_LEFT));
  185. return false;
  186. case M_DQUOT:
  187. double_tap_it = false;
  188. SEND_STRING("''" SS_TAP(X_LEFT));
  189. return false;
  190. case DBL_TAP:
  191. double_tap_it = !double_tap_it;
  192. return false;
  193. case KC_LEAD:
  194. double_tap_it = false;
  195. return true;
  196. }
  197. } else if (double_tap_it &&
  198. keycode != DBL_TAP &&
  199. keycode != OSL(_RAISE) &&
  200. keycode != OSL(_LOWER) &&
  201. keycode != MO(_NAV)) {
  202. double_tap_it = false;
  203. tap_code16(keycode);
  204. }
  205. return true;
  206. }
  207. layer_state_t layer_state_set_user(layer_state_t state) { return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); }
  208. #ifdef OLED_DRIVER_ENABLE
  209. oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_180; }
  210. // clang-format off
  211. static void render_kyria_logo(void) {
  212. static const char PROGMEM kyria_logo[] = {
  213. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128,192,224,240,112,120, 56, 60, 28, 30, 14, 14, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 14, 14, 30, 28, 60, 56,120,112,240,224,192,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  214. 0, 0, 0, 0, 0, 0, 0,192,224,240,124, 62, 31, 15, 7, 3, 1,128,192,224,240,120, 56, 60, 28, 30, 14, 14, 7, 7,135,231,127, 31,255,255, 31,127,231,135, 7, 7, 14, 14, 30, 28, 60, 56,120,240,224,192,128, 1, 3, 7, 15, 31, 62,124,240,224,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  215. 0, 0, 0, 0,240,252,255, 31, 7, 1, 0, 0,192,240,252,254,255,247,243,177,176, 48, 48, 48, 48, 48, 48, 48,120,254,135, 1, 0, 0,255,255, 0, 0, 1,135,254,120, 48, 48, 48, 48, 48, 48, 48,176,177,243,247,255,254,252,240,192, 0, 0, 1, 7, 31,255,252,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  216. 0, 0, 0,255,255,255, 0, 0, 0, 0, 0,254,255,255, 1, 1, 7, 30,120,225,129,131,131,134,134,140,140,152,152,177,183,254,248,224,255,255,224,248,254,183,177,152,152,140,140,134,134,131,131,129,225,120, 30, 7, 1, 1,255,255,254, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0,255,255, 0, 0,192,192, 48, 48, 0, 0,240,240, 0, 0, 0, 0, 0, 0,240,240, 0, 0,240,240,192,192, 48, 48, 48, 48,192,192, 0, 0, 48, 48,243,243, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48,192,192, 0, 0, 0, 0, 0,
  217. 0, 0, 0,255,255,255, 0, 0, 0, 0, 0,127,255,255,128,128,224,120, 30,135,129,193,193, 97, 97, 49, 49, 25, 25,141,237,127, 31, 7,255,255, 7, 31,127,237,141, 25, 25, 49, 49, 97, 97,193,193,129,135, 30,120,224,128,128,255,255,127, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0, 63, 63, 3, 3, 12, 12, 48, 48, 0, 0, 0, 0, 51, 51, 51, 51, 51, 51, 15, 15, 0, 0, 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 63, 63, 48, 48, 0, 0, 12, 12, 51, 51, 51, 51, 51, 51, 63, 63, 0, 0, 0, 0, 0,
  218. 0, 0, 0, 0, 15, 63,255,248,224,128, 0, 0, 3, 15, 63,127,255,239,207,141, 13, 12, 12, 12, 12, 12, 12, 12, 30,127,225,128, 0, 0,255,255, 0, 0,128,225,127, 30, 12, 12, 12, 12, 12, 12, 12, 13,141,207,239,255,127, 63, 15, 3, 0, 0,128,224,248,255, 63, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  219. 0, 0, 0, 0, 0, 0, 0, 3, 7, 15, 62,124,248,240,224,192,128, 1, 3, 7, 15, 30, 28, 60, 56,120,112,112,224,224,225,231,254,248,255,255,248,254,231,225,224,224,112,112,120, 56, 60, 28, 30, 15, 7, 3, 1,128,192,224,240,248,124, 62, 15, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  220. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 7, 15, 14, 30, 28, 60, 56,120,112,112,112,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,112,112,112,120, 56, 60, 28, 30, 14, 15, 7, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  221. };
  222. oled_write_raw_P(kyria_logo, sizeof(kyria_logo));
  223. }
  224. static void render_qmk_logo(void) {
  225. static const char PROGMEM qmk_logo[] = {
  226. 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
  227. 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
  228. 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0};
  229. oled_write_P(qmk_logo, false);
  230. }
  231. // clang-format on
  232. static void render_status(void) {
  233. // QMK Logo and version information
  234. render_qmk_logo();
  235. oled_write_P(PSTR("Kyria rev1.0\n"), false);
  236. oled_write_P(PSTR("v" QMK_VERSION "\n"), false);
  237. // Host Keyboard Layer Status
  238. oled_write_P(PSTR("Layer: "), false);
  239. switch (get_highest_layer(layer_state)) {
  240. case _DEFAULT:
  241. oled_write_P(PSTR("plattfot\n"), false);
  242. break;
  243. case _LOWER:
  244. oled_write_P(PSTR("symbols\n"), false);
  245. break;
  246. case _RAISE:
  247. oled_write_P(PSTR("function keys\n"), false);
  248. break;
  249. case _NAV:
  250. oled_write_P(PSTR("numbers/navi\n"), false);
  251. break;
  252. case _ADJUST:
  253. oled_write_P(PSTR("adjust\n"), false);
  254. break;
  255. default:
  256. oled_write_P(PSTR("undefined\n"), false);
  257. }
  258. // Host Keyboard LED Status and Double tap
  259. led_t led_state = host_keyboard_led_state();
  260. if (led_state.num_lock) {
  261. oled_write_P(PSTR("NUMLCK "), false);
  262. } else if (double_tap_it) {
  263. oled_write_P(PSTR("Double "), false);
  264. } else {
  265. oled_write_P(PSTR(" "), false);
  266. }
  267. if (led_state.caps_lock) {
  268. oled_write_P(PSTR("CAPLCK "), false);
  269. } else if (double_tap_it) {
  270. oled_write_P(PSTR("Tap "), false);
  271. } else {
  272. oled_write_P(PSTR(" "), false);
  273. }
  274. oled_write_P(led_state.scroll_lock ? PSTR("SCRLCK ") : PSTR(" "), false);
  275. }
  276. void oled_task_user(void) {
  277. if (is_keyboard_master()) {
  278. render_status(); // Renders the current keyboard state (layer, lock, caps, scroll, etc)
  279. } else {
  280. render_kyria_logo();
  281. }
  282. }
  283. #endif
  284. #ifdef ENCODER_ENABLE
  285. bool encoder_update_user(uint8_t index, bool clockwise) {
  286. if (index == 0) {
  287. switch (get_highest_layer(layer_state)) {
  288. case _LOWER:
  289. // Skip/Prev song
  290. if (clockwise) {
  291. tap_code(KC_MNXT);
  292. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  293. } else {
  294. tap_code(KC_MPRV);
  295. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  296. }
  297. break;
  298. default:
  299. // Volume control
  300. if (clockwise) {
  301. tap_code(KC_VOLU);
  302. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  303. } else {
  304. tap_code(KC_VOLD);
  305. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  306. }
  307. break;
  308. }
  309. } else if (index == 1) {
  310. switch (get_highest_layer(layer_state)) {
  311. case _RAISE:
  312. // Credit to Thomas Baart for this
  313. // See https://docs.splitkb.com/hc/en-us/articles/360010513760-How-can-I-use-a-rotary-encoder-
  314. if (clockwise) {
  315. tap_code16(C(KC_TAB));
  316. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  317. } else {
  318. tap_code16(S(C(KC_TAB)));
  319. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  320. }
  321. break;
  322. default:
  323. // Scrolling
  324. if (clockwise) {
  325. tap_code(KC_PGDN);
  326. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  327. } else {
  328. tap_code(KC_PGUP);
  329. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  330. }
  331. break;
  332. }
  333. }
  334. return true;
  335. }
  336. #endif
  337. LEADER_EXTERNS();
  338. void matrix_scan_user(void) {
  339. LEADER_DICTIONARY() {
  340. leading = false;
  341. leader_end();
  342. // Sway navigation
  343. SEQ_ONE_KEY(KC_Q) { // Jump to workspace 1
  344. SEND_STRING(SS_LGUI("1"));
  345. }
  346. SEQ_ONE_KEY(KC_W) { // Jump to workspace 2
  347. SEND_STRING(SS_LGUI("2"));
  348. }
  349. SEQ_ONE_KEY(KC_E) { // Jump to workspace 3
  350. SEND_STRING(SS_LGUI("3"));
  351. }
  352. SEQ_ONE_KEY(KC_R) { // Jump to workspace 4
  353. SEND_STRING(SS_LGUI("4"));
  354. }
  355. SEQ_ONE_KEY(KC_T) { // Jump to workspace 5
  356. SEND_STRING(SS_LGUI("5"));
  357. }
  358. SEQ_ONE_KEY(KC_Y) { // Jump to workspace 6
  359. SEND_STRING(SS_LGUI("6"));
  360. }
  361. SEQ_ONE_KEY(KC_U) { // Jump to workspace 7
  362. SEND_STRING(SS_LGUI("7"));
  363. }
  364. SEQ_ONE_KEY(KC_I) { // Jump to workspace 8
  365. SEND_STRING(SS_LGUI("8"));
  366. }
  367. SEQ_ONE_KEY(KC_O) { // Jump to workspace 9
  368. SEND_STRING(SS_LGUI("9"));
  369. }
  370. SEQ_ONE_KEY(KC_P) { // Jump to workspace 0
  371. SEND_STRING(SS_LGUI("0"));
  372. }
  373. SEQ_ONE_KEY(KC_G) { // View scratch pad
  374. SEND_STRING(SS_LGUI("-"));
  375. }
  376. // Sway move window
  377. SEQ_TWO_KEYS(KC_M, KC_Q) { // Move to workspace 1
  378. SEND_STRING(SS_LSFT(SS_LGUI("1")));
  379. }
  380. SEQ_TWO_KEYS(KC_M, KC_W) { // Move to workspace 2
  381. SEND_STRING(SS_LSFT(SS_LGUI("2")));
  382. }
  383. SEQ_TWO_KEYS(KC_M, KC_E) { // Move to workspace 3
  384. SEND_STRING(SS_LSFT(SS_LGUI("3")));
  385. }
  386. SEQ_TWO_KEYS(KC_M, KC_R) { // Move to workspace 4
  387. SEND_STRING(SS_LSFT(SS_LGUI("4")));
  388. }
  389. SEQ_TWO_KEYS(KC_M, KC_T) { // Move to workspace 5
  390. SEND_STRING(SS_LSFT(SS_LGUI("5")));
  391. }
  392. SEQ_TWO_KEYS(KC_M, KC_Y) { // Move to workspace 6
  393. SEND_STRING(SS_LSFT(SS_LGUI("6")));
  394. }
  395. SEQ_TWO_KEYS(KC_M, KC_U) { // Move to workspace 7
  396. SEND_STRING(SS_LSFT(SS_LGUI("7")));
  397. }
  398. SEQ_TWO_KEYS(KC_M, KC_I) { // Move to workspace 8
  399. SEND_STRING(SS_LSFT(SS_LGUI("8")));
  400. }
  401. SEQ_TWO_KEYS(KC_M, KC_O) { // Move to workspace 9
  402. SEND_STRING(SS_LSFT(SS_LGUI("9")));
  403. }
  404. SEQ_TWO_KEYS(KC_M, KC_P) { // Move to workspace 0
  405. SEND_STRING(SS_LSFT(SS_LGUI("0")));
  406. }
  407. SEQ_TWO_KEYS(KC_M, KC_G) { // Move to scratch pad
  408. SEND_STRING(SS_LSFT(SS_LGUI("-")));
  409. }
  410. }
  411. }