keymap.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. /* Copyright 2020-2021 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. // New keys
  21. CLO_TAP, // Close the next key press
  22. };
  23. // Close tap feature based on a post from drashna
  24. // https://www.reddit.com/r/olkb/comments/citkbx/double_key_press_modifier_qmkwould_work_like/ev9cue8/
  25. // Will insert the closing equivalent key and move the cursor inside.
  26. // For example clo_tap and then ( will result in (|), where | is the
  27. // cursor. For " it will be "|" as the close equivalent key is the
  28. // same key.
  29. enum close_tap_modes {
  30. CLO_DISABLED = 0b000,
  31. CLO_PRESSED = 0b001, // Close tap key is pressed
  32. CLO_ACTIVE = 0b010, // Close tap next keypress
  33. CLO_USED = 0b100, // Turn off when close tap key is released
  34. };
  35. #define CLO_RELEASE(flag) flag & ~CLO_PRESSED
  36. static enum close_tap_modes close_tap_it = CLO_DISABLED;
  37. enum layers {
  38. _DEFAULT,
  39. _LOWER,
  40. _RAISE,
  41. _NAV,
  42. _ADJUST,
  43. };
  44. #define MO_ADJT MO(_ADJUST)
  45. #define L_RAISE OSL(_RAISE)
  46. #define L_LOWER OSL(_LOWER)
  47. #define L_NAV MO(_NAV)
  48. #define EU_TDOT RSA(KC_SLSH)
  49. #define EU_CDOT RALT(KC_EQUAL)
  50. #define EU_DEG RALT(KC_SCLN)
  51. // clang-format off
  52. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  53. /*
  54. * Base Layer: Default
  55. *
  56. * ,-------------------------------------------. ,-------------------------------------------.
  57. * | Esc | Q | W | E | R | T | | Y | U | I | O | P | Del |
  58. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  59. * | Tab | A | S | D | F | G | | H | J | K | L | ; | ' |
  60. * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  61. * | LShift | Z | X | C | V | B | Lead | RAISE| | LOWER|BSpace| N | M | , | . | / | RShift |
  62. * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
  63. * | MPlay| GUI | LCtrl| Space| LALT | | RCtrl| Enter| NAV | RALT |Scroll|
  64. * | | | | | | | | | | | Lock |
  65. * `----------------------------------' `----------------------------------'
  66. */
  67. [_DEFAULT] = LAYOUT(
  68. KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL,
  69. KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
  70. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LEAD, L_RAISE, L_LOWER, KC_BSPC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
  71. KC_MPLY,KC_LGUI,KC_LCTL, KC_SPACE, KC_LALT, KC_RCTL, KC_ENT, L_NAV, KC_RALT, KC_SLCK
  72. ),
  73. /*
  74. * Lower Layer: Left symbols
  75. *
  76. * ,-------------------------------------------. ,-------------------------------------------.
  77. * | | ! | @ | # | $ | % | | F6 | F7 | F8 | F9 | F10 | |
  78. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  79. * | | | | _ | \ | - | + | | F12 | | | | | |
  80. * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  81. * | | ° | : | ( | ) | × | |ADJUST| | | |CLOTAP| | | | | |
  82. * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
  83. * | | | | | | | | | | | |
  84. * | | | | | | | | | | | |
  85. * `----------------------------------' `----------------------------------'
  86. */
  87. [_LOWER] = LAYOUT(
  88. _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______,
  89. _______, KC_PIPE, KC_UNDS, KC_BSLS, KC_MINS, KC_PLUS, KC_F12, _______, _______, _______, _______, _______,
  90. _______, EU_DEG, KC_COLN, KC_LPRN, KC_RPRN, EU_CDOT, _______, MO_ADJT, _______, _______, CLO_TAP, _______, _______, _______, _______, _______,
  91. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  92. ),
  93. /*
  94. * Raise Layer: Right symbols + state
  95. *
  96. * ,-------------------------------------------. ,-------------------------------------------.
  97. * | | F1 | F2 | F3 | F4 | F5 | | ^ | & | * | ~ | ? | |
  98. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  99. * | | | | | | F11 | | = | { | } | [ | ] | ` |
  100. * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  101. * | | | | | |CLOTAP| | | |ADJUST| | … | " | < | > | / |CapsLock|
  102. * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
  103. * | Mute | | | | | | | | | |Insert|
  104. * | | | | | | | | | | | |
  105. * `----------------------------------' `----------------------------------'
  106. */
  107. [_RAISE] = LAYOUT(
  108. _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_CIRC, KC_AMPR, KC_ASTR, KC_TILDE,KC_QUES, _______,
  109. _______, _______, _______, _______, _______, KC_F11, KC_EQUAL,KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_GRV,
  110. _______, _______, _______, _______, _______, CLO_TAP, _______, _______, MO_ADJT, _______, EU_TDOT, KC_DQUO, KC_LT, KC_GT, _______, KC_CAPS,
  111. KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS
  112. ),
  113. /*
  114. * Navigation Layer: Number/Function keys, navigation
  115. *
  116. * ,-------------------------------------------. ,-------------------------------------------.
  117. * | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
  118. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  119. * | | | | | | | | | Left | Up | Down | Right| |
  120. * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  121. * | | | | | | | | | | | | | | | | | |
  122. * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
  123. * | | | | | | | | | | | |
  124. * | | | | | | | | | | | |
  125. * `----------------------------------' `----------------------------------'
  126. */
  127. [_NAV] = LAYOUT(
  128. _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
  129. _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, _______,
  130. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  131. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  132. ),
  133. /*
  134. * Adjust Layer: RGB
  135. *
  136. * ,-------------------------------------------. ,-------------------------------------------.
  137. * | | | | | | | | | | | | | |
  138. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  139. * | | TOG | SAI | HUI | VAI | MOD | | | | | | | |
  140. * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  141. * | | | SAD | HUD | VAD | RMOD | | | | | | | | | | | |
  142. * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
  143. * | | | | | | | | | | | |
  144. * | | | | | | | | | | | |
  145. * `----------------------------------' `----------------------------------'
  146. */
  147. [_ADJUST] = LAYOUT(
  148. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  149. _______, RGB_TOG, RGB_SAI, RGB_HUI, RGB_VAI, RGB_MOD, _______, _______, _______, _______, _______, _______,
  150. _______, _______, RGB_SAD, RGB_HUD, RGB_VAD, RGB_RMOD,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  151. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  152. ),
  153. // /*
  154. // * Layer template
  155. // *
  156. // * ,-------------------------------------------. ,-------------------------------------------.
  157. // * | | | | | | | | | | | | | |
  158. // * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  159. // * | | | | | | | | | | | | | |
  160. // * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
  161. // * | | | | | | | | | | | | | | | | | |
  162. // * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
  163. // * | | | | | | | | | | | |
  164. // * | | | | | | | | | | | |
  165. // * `----------------------------------' `----------------------------------'
  166. // */
  167. // [_LAYERINDEX] = LAYOUT(
  168. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  169. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  170. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  171. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  172. // ),
  173. };
  174. // clang-format on
  175. /* void keyboard_post_init_user(void) { */
  176. /* rgblight_setrgb(51, 135, 204); */
  177. /* } */
  178. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  179. if (record->event.pressed) {
  180. switch (keycode) {
  181. case CLO_TAP:
  182. close_tap_it = close_tap_it & CLO_ACTIVE?
  183. CLO_USED:
  184. CLO_ACTIVE|CLO_PRESSED;
  185. return false;
  186. case KC_LEAD:
  187. close_tap_it = CLO_DISABLED;
  188. return true;
  189. }
  190. } else if (close_tap_it & CLO_ACTIVE &&
  191. keycode != CLO_TAP &&
  192. keycode != OSL(_RAISE) &&
  193. keycode != OSL(_LOWER) &&
  194. keycode != MO(_NAV)) {
  195. close_tap_it = close_tap_it & CLO_PRESSED?
  196. close_tap_it | CLO_USED:
  197. CLO_DISABLED;
  198. switch(keycode)
  199. {
  200. case KC_LPRN:
  201. tap_code16(KC_RPRN);
  202. tap_code16(KC_LEFT);
  203. break;
  204. case KC_RPRN:
  205. tap_code16(KC_LEFT);
  206. tap_code16(KC_LPRN);
  207. break;
  208. case KC_LCBR:
  209. tap_code16(KC_RCBR);
  210. tap_code16(KC_LEFT);
  211. break;
  212. case KC_RCBR:
  213. tap_code16(KC_LEFT);
  214. tap_code16(KC_LCBR);
  215. break;
  216. case KC_LBRC:
  217. tap_code16(KC_RBRC);
  218. tap_code16(KC_LEFT);
  219. break;
  220. case KC_RBRC:
  221. tap_code16(KC_LEFT);
  222. tap_code16(KC_LBRC);
  223. break;
  224. case KC_LT:
  225. tap_code16(KC_GT);
  226. tap_code16(KC_LEFT);
  227. break;
  228. case KC_GT:
  229. tap_code16(KC_LEFT);
  230. tap_code16(KC_LT);
  231. break;
  232. default:
  233. tap_code16(keycode);
  234. tap_code16(KC_LEFT);
  235. break;
  236. }
  237. } else {
  238. switch (keycode) {
  239. case CLO_TAP:
  240. close_tap_it = close_tap_it & CLO_USED?
  241. CLO_DISABLED:
  242. CLO_RELEASE(close_tap_it);
  243. }
  244. }
  245. return true;
  246. }
  247. //layer_state_t layer_state_set_user(layer_state_t state) { return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); }
  248. #ifdef OLED_ENABLE
  249. oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_180; }
  250. // clang-format off
  251. static void render_qmk_logo(void) {
  252. static const char PROGMEM qmk_logo[] = {
  253. 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
  254. 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
  255. 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0};
  256. oled_write_P(qmk_logo, false);
  257. }
  258. // clang-format on
  259. static void render_static_info(void) {
  260. render_qmk_logo();
  261. oled_write_P(PSTR("Kyria rev1.0\n"), false);
  262. oled_write_P(PSTR("Keymap: plattfot v2\n"), false);
  263. }
  264. static void render_status(void) {
  265. // QMK Logo and version information
  266. render_qmk_logo();
  267. oled_write_P(PSTR("Kyria rev1.0\n"), false);
  268. oled_write_P(PSTR("v" QMK_VERSION "\n"), false);
  269. // Host Keyboard Layer Status
  270. oled_write_P(PSTR("Layer: "), false);
  271. switch (get_highest_layer(layer_state)) {
  272. case _DEFAULT:
  273. oled_write_P(PSTR("base\n"), false);
  274. break;
  275. case _LOWER:
  276. oled_write_P(PSTR("<-sym/fun->\n"), false);
  277. break;
  278. case _RAISE:
  279. oled_write_P(PSTR("<-fun/sym->\n"), false);
  280. break;
  281. case _NAV:
  282. oled_write_P(PSTR("num/nav\n"), false);
  283. break;
  284. case _ADJUST:
  285. oled_write_P(PSTR("adjust\n"), false);
  286. break;
  287. default:
  288. oled_write_P(PSTR("undefined\n"), false);
  289. }
  290. // Host Keyboard LED Status and Double tap
  291. led_t led_state = host_keyboard_led_state();
  292. if (led_state.num_lock) {
  293. oled_write_P(PSTR("NUMLCK "), false);
  294. } else if (close_tap_it) {
  295. oled_write_P(PSTR("Close "), false);
  296. } else {
  297. oled_write_P(PSTR(" "), false);
  298. }
  299. if (led_state.caps_lock) {
  300. oled_write_P(PSTR("CAPLCK "), false);
  301. } else if (close_tap_it) {
  302. oled_write_P(PSTR("Tap "), false);
  303. } else {
  304. oled_write_P(PSTR(" "), false);
  305. }
  306. oled_write_P(led_state.scroll_lock ? PSTR("SCRLCK ") : PSTR(" "), false);
  307. }
  308. void oled_task_user(void) {
  309. if (is_keyboard_master()) {
  310. render_status(); // Renders the current keyboard state (layer, lock, caps, scroll, etc)
  311. } else {
  312. render_static_info();
  313. }
  314. }
  315. #endif
  316. #ifdef ENCODER_ENABLE
  317. bool encoder_update_user(uint8_t index, bool clockwise) {
  318. if (index == 0) {
  319. switch (get_highest_layer(layer_state)) {
  320. case _LOWER:
  321. // Skip/Prev song
  322. if (clockwise) {
  323. tap_code(KC_MNXT);
  324. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  325. } else {
  326. tap_code(KC_MPRV);
  327. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  328. }
  329. break;
  330. case _NAV:
  331. // Brightness control
  332. if (clockwise) {
  333. tap_code(KC_BRIU);
  334. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  335. } else {
  336. tap_code(KC_BRID);
  337. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  338. }
  339. break;
  340. default:
  341. // Volume control
  342. if (clockwise) {
  343. tap_code(KC_VOLU);
  344. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  345. } else {
  346. tap_code(KC_VOLD);
  347. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  348. }
  349. break;
  350. }
  351. } else if (index == 1) {
  352. switch (get_highest_layer(layer_state)) {
  353. case _RAISE:
  354. // Scroll through the workspaces
  355. if (clockwise) {
  356. tap_code16(G(KC_GT));
  357. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  358. } else {
  359. tap_code16(G(KC_LT));
  360. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  361. }
  362. break;
  363. default:
  364. // Scrolling
  365. if (clockwise) {
  366. tap_code(KC_PGDN);
  367. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  368. } else {
  369. tap_code(KC_PGUP);
  370. clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
  371. }
  372. break;
  373. }
  374. }
  375. return true;
  376. }
  377. #endif
  378. LEADER_EXTERNS();
  379. void matrix_scan_user(void) {
  380. LEADER_DICTIONARY() {
  381. leading = false;
  382. leader_end();
  383. // Sway navigation
  384. SEQ_ONE_KEY(KC_Q) { // Jump to workspace 1
  385. SEND_STRING(SS_LGUI("1"));
  386. }
  387. SEQ_ONE_KEY(KC_W) { // Jump to workspace 2
  388. SEND_STRING(SS_LGUI("2"));
  389. }
  390. SEQ_ONE_KEY(KC_E) { // Jump to workspace 3
  391. SEND_STRING(SS_LGUI("3"));
  392. }
  393. SEQ_ONE_KEY(KC_R) { // Jump to workspace 4
  394. SEND_STRING(SS_LGUI("4"));
  395. }
  396. SEQ_ONE_KEY(KC_T) { // Jump to workspace 5
  397. SEND_STRING(SS_LGUI("5"));
  398. }
  399. SEQ_ONE_KEY(KC_Y) { // Jump to workspace 6
  400. SEND_STRING(SS_LGUI("6"));
  401. }
  402. SEQ_ONE_KEY(KC_U) { // Jump to workspace 7
  403. SEND_STRING(SS_LGUI("7"));
  404. }
  405. SEQ_ONE_KEY(KC_I) { // Jump to workspace 8
  406. SEND_STRING(SS_LGUI("8"));
  407. }
  408. SEQ_ONE_KEY(KC_O) { // Jump to workspace 9
  409. SEND_STRING(SS_LGUI("9"));
  410. }
  411. SEQ_ONE_KEY(KC_P) { // Jump to workspace 0
  412. SEND_STRING(SS_LGUI("0"));
  413. }
  414. SEQ_ONE_KEY(KC_G) { // View scratch pad
  415. SEND_STRING(SS_LGUI("-"));
  416. }
  417. // Sway move window
  418. SEQ_TWO_KEYS(KC_M, KC_Q) { // Move to workspace 1
  419. SEND_STRING(SS_LSFT(SS_LGUI("1")));
  420. }
  421. SEQ_TWO_KEYS(KC_M, KC_W) { // Move to workspace 2
  422. SEND_STRING(SS_LSFT(SS_LGUI("2")));
  423. }
  424. SEQ_TWO_KEYS(KC_M, KC_E) { // Move to workspace 3
  425. SEND_STRING(SS_LSFT(SS_LGUI("3")));
  426. }
  427. SEQ_TWO_KEYS(KC_M, KC_R) { // Move to workspace 4
  428. SEND_STRING(SS_LSFT(SS_LGUI("4")));
  429. }
  430. SEQ_TWO_KEYS(KC_M, KC_T) { // Move to workspace 5
  431. SEND_STRING(SS_LSFT(SS_LGUI("5")));
  432. }
  433. SEQ_TWO_KEYS(KC_M, KC_Y) { // Move to workspace 6
  434. SEND_STRING(SS_LSFT(SS_LGUI("6")));
  435. }
  436. SEQ_TWO_KEYS(KC_M, KC_U) { // Move to workspace 7
  437. SEND_STRING(SS_LSFT(SS_LGUI("7")));
  438. }
  439. SEQ_TWO_KEYS(KC_M, KC_I) { // Move to workspace 8
  440. SEND_STRING(SS_LSFT(SS_LGUI("8")));
  441. }
  442. SEQ_TWO_KEYS(KC_M, KC_O) { // Move to workspace 9
  443. SEND_STRING(SS_LSFT(SS_LGUI("9")));
  444. }
  445. SEQ_TWO_KEYS(KC_M, KC_P) { // Move to workspace 0
  446. SEND_STRING(SS_LSFT(SS_LGUI("0")));
  447. }
  448. SEQ_TWO_KEYS(KC_M, KC_G) { // Move to scratch pad
  449. SEND_STRING(SS_LSFT(SS_LGUI("-")));
  450. }
  451. }
  452. }