keymap.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. #include QMK_KEYBOARD_H
  2. // readme
  3. // This keyboard layout is based on the [Workman Dead layout](https://github.com/ojbucao/Workman/tree/master/mac#workman-dead-for-programmers), which uses the comma as a dead key to trigger a second layer.
  4. // Since I have more keys at my disposal on the ErgoDox, I moved the dead key to the bottom right. There are still a lot of
  5. // blanks so still discovering what I like.
  6. // If you aren't familiar with a dead key, the idea is that you tap the dead key which switches the layout. the next key you hit
  7. // triggers the key you pressed AND switches the layout back to the original. For now I do this with a super kludgey macro and I
  8. // look forward to learning about a more elegant way to do the same thing. Until then, this will have to do.
  9. enum layer_names {
  10. BASE, // default layer
  11. SYMB, // symbols
  12. MDIA, // media keys
  13. DEAD // dead version of the symbols layer
  14. };
  15. enum custom_keycodes {
  16. M_100 = SAFE_RANGE,
  17. M_101,
  18. M_102,
  19. M_103,
  20. M_104,
  21. M_105,
  22. M_106,
  23. M_107,
  24. M_108,
  25. M_109,
  26. M_110,
  27. M_111,
  28. M_112,
  29. M_113,
  30. M_114,
  31. M_115,
  32. M_116,
  33. M_117,
  34. M_118,
  35. M_119,
  36. M_120,
  37. M_121,
  38. M_122,
  39. M_123,
  40. M_124,
  41. M_125,
  42. M_126,
  43. M_127,
  44. M_128,
  45. M_129,
  46. M_130
  47. };
  48. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  49. /* Keymap 0: Basic layer
  50. *
  51. * ,--------------------------------------------------. ,--------------------------------------------------.
  52. * | ` | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - |
  53. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  54. * | Tab | Q | D | R | W | B | L1 | | L1 | J | F | U | P | ; | |
  55. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  56. * | Hyper | A | S | H | T | G |------| |------| Y | N | E | O | I | ' |
  57. * |--------+------+------+------+------+------| | | Meh |------+------+------+------+------+--------|
  58. * | LShift | Z | X | M | C | V | | | | K | L | , | . |//Ctrl| RShift |
  59. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  60. * | | | CTRL | OPT | CMD | | Left | Down | Up | Right| L3 |
  61. * `----------------------------------' `----------------------------------'
  62. * ,-------------. ,-------------.
  63. * | | | | | |
  64. * ,------|------|------| |------+--------+------.
  65. * | | | Home | | PgUp | | |
  66. * |Bckspc| Space|------| |------| Space |Enter |
  67. * | | | End | | PgDn | | |
  68. * `--------------------' `----------------------'
  69. */
  70. // If it accepts an argument (i.e, is a function), it doesn't need KC_.
  71. // Otherwise, it needs KC_*
  72. [BASE] = LAYOUT_ergodox( // layer 0 : default
  73. // left hand
  74. KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT,
  75. KC_TAB, KC_Q, KC_D, KC_R, KC_W, KC_B, TG(SYMB),
  76. ALL_T(KC_ESC), KC_A, KC_S, KC_H, KC_T, KC_G,
  77. KC_LSFT, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_NO,
  78. KC_NO, KC_NO, KC_LCTL,KC_LALT,KC_LGUI,
  79. KC_NO, KC_NO,
  80. KC_HOME,
  81. KC_BSPC,KC_SPC,KC_END,
  82. // right hand
  83. KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
  84. TG(SYMB), KC_J, KC_F, KC_U, KC_P, KC_SCLN, KC_BSLS,
  85. KC_Y, KC_N, KC_E, KC_O, KC_I, KC_QUOT,
  86. MEH_T(KC_NO),KC_K, KC_L, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT,
  87. KC_LEFT,KC_DOWN,KC_UP, KC_RGHT, TG(DEAD),
  88. KC_NO, KC_NO,
  89. KC_PGUP,
  90. KC_PGDN,KC_SPC,KC_ENT
  91. ),
  92. /* Keymap 1: Symbol Layer
  93. *
  94. * ,--------------------------------------------------. ,--------------------------------------------------.
  95. * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
  96. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  97. * | | % | & | ? | + | @ | | | | $ | _ | [ | ] | ! | F12 |
  98. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  99. * | | / | ( | = | 0 | { |------| |------| } | 1 | * | ) | - | " |
  100. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  101. * | | 6 | 7 | 8 | 9 | | | | | | \ | 2 | 3 | 4 | 5 | |
  102. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  103. * | | | | | | | | | | | |
  104. * `----------------------------------' `----------------------------------'
  105. * ,-------------. ,-------------.
  106. * | | | | | |
  107. * ,------|------|------| |------+------+------.
  108. * | | | | | | | |
  109. * | | |------| |------| | |
  110. * | | | | | | | |
  111. * `--------------------' `--------------------'
  112. */
  113. // SYMBOLS
  114. [SYMB] = LAYOUT_ergodox(
  115. // left hand
  116. KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
  117. KC_TRNS, KC_PERC, KC_AMPR, LSFT(KC_SLSH), LSFT(KC_EQL), KC_AT, KC_TRNS,
  118. KC_TRNS, KC_SLSH, KC_LPRN, KC_EQL, KC_0, LSFT(KC_LBRC),
  119. KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_PIPE, KC_TRNS,
  120. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  121. KC_TRNS,KC_TRNS,
  122. KC_TRNS,
  123. KC_TRNS,KC_TRNS,KC_TRNS,
  124. // right hand
  125. KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
  126. KC_TRNS, KC_DLR, KC_UNDERSCORE, KC_LBRC, KC_RBRC, KC_EXLM, KC_F12,
  127. KC_RCBR, KC_1, KC_ASTR, KC_RPRN, KC_MINS, KC_QUOT,
  128. KC_TRNS, KC_SLSH, KC_2, KC_3, KC_4, KC_5, KC_TRNS,
  129. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  130. KC_TRNS, KC_TRNS,
  131. KC_TRNS,
  132. KC_TRNS, KC_TRNS, KC_TRNS
  133. ),
  134. /* Keymap 2: Media and mouse keys
  135. *
  136. * ,--------------------------------------------------. ,--------------------------------------------------.
  137. * | | | | | | | | | | | | | | | |
  138. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  139. * | | | | MsUp | | | | | | | | | | | |
  140. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  141. * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
  142. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  143. * | | | | | | | | | | | | Prev | Next | | |
  144. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  145. * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
  146. * `----------------------------------' `----------------------------------'
  147. * ,-------------. ,-------------.
  148. * | | | | | |
  149. * ,------|------|------| |------+------+------.
  150. * | | | | | | |Brwser|
  151. * | | |------| |------| |Back |
  152. * | | | | | | | |
  153. * `--------------------' `--------------------'
  154. */
  155. // MEDIA AND MOUSE
  156. [MDIA] = LAYOUT_ergodox(
  157. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  158. KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
  159. KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
  160. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  161. KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
  162. KC_TRNS, KC_TRNS,
  163. KC_TRNS,
  164. KC_TRNS, KC_TRNS, KC_TRNS,
  165. // right hand
  166. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  167. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  168. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
  169. KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
  170. KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
  171. KC_TRNS, KC_TRNS,
  172. KC_TRNS,
  173. KC_TRNS, KC_TRNS, KC_WBAK
  174. ),
  175. /* Keymap 4: Dead Symbol Layer
  176. *
  177. * ,--------------------------------------------------. ,--------------------------------------------------.
  178. * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
  179. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  180. * | | % | & | ? | + | @ | | | | $ | _ | [ | ] | ! | F12 |
  181. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  182. * | | / | ( | = | 0 | { |------| |------| } | 1 | * | ) | - | " |
  183. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  184. * | | 6 | 7 | 8 | 9 | | | | | | \ | 2 | 3 | 4 | 5 | |
  185. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  186. * | | | | | | | | | | | |
  187. * `----------------------------------' `----------------------------------'
  188. * ,-------------. ,-------------.
  189. * | | | | | |
  190. * ,------|------|------| |------+------+------.
  191. * | | | | | | | |
  192. * | | |------| |------| | |
  193. * | | | | | | | |
  194. * `--------------------' `--------------------'
  195. */
  196. // SYMBOLS
  197. [DEAD] = LAYOUT_ergodox(
  198. // left hand
  199. KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
  200. KC_TRNS, M_100, M_101, M_102, M_103, M_104, KC_TRNS,
  201. KC_TRNS, M_109, M_110, M_111, M_112, M_113,
  202. KC_TRNS, M_120, M_121, M_122, M_123, M_124, KC_TRNS,
  203. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  204. KC_TRNS,KC_TRNS,
  205. KC_TRNS,
  206. KC_TRNS,KC_TRNS,KC_TRNS,
  207. // right hand
  208. KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
  209. KC_TRNS, M_105, M_106, M_107, M_108, M_130, KC_F12,
  210. M_114, M_115, M_116, M_117, M_118, M_119,
  211. KC_TRNS, M_125, M_126, M_127, M_128, M_129, KC_TRNS,
  212. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  213. KC_TRNS, KC_TRNS,
  214. KC_TRNS,
  215. KC_TRNS, KC_TRNS, KC_TRNS
  216. ),
  217. };
  218. void tap_dead_code(uint16_t keycode) {
  219. layer_clear();
  220. tap_code16(keycode);
  221. layer_on(DEAD);
  222. }
  223. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  224. switch (keycode) {
  225. case M_100:
  226. if (record->event.pressed) {
  227. tap_dead_code(S(KC_5));
  228. }
  229. return false;
  230. case M_101:
  231. if (record->event.pressed) {
  232. tap_dead_code(S(KC_7));
  233. }
  234. return false;
  235. case M_102:
  236. if (record->event.pressed) {
  237. tap_dead_code(S(KC_SLSH));
  238. }
  239. return false;
  240. case M_103:
  241. if (record->event.pressed) {
  242. tap_dead_code(S(KC_EQL));
  243. }
  244. return false;
  245. case M_104:
  246. if (record->event.pressed) {
  247. tap_dead_code(S(KC_2));
  248. }
  249. return false;
  250. case M_105:
  251. if (record->event.pressed) {
  252. tap_dead_code(S(KC_4));
  253. }
  254. return false;
  255. case M_106:
  256. if (record->event.pressed) {
  257. tap_dead_code(S(KC_MINS));
  258. }
  259. return false;
  260. case M_107:
  261. if (record->event.pressed) {
  262. tap_dead_code(KC_LBRC);
  263. }
  264. return false;
  265. case M_108:
  266. if (record->event.pressed) {
  267. tap_dead_code(KC_RBRC);
  268. }
  269. return false;
  270. case M_109:
  271. if (record->event.pressed) {
  272. tap_dead_code(KC_SLSH);
  273. }
  274. return false;
  275. case M_110:
  276. if (record->event.pressed) {
  277. tap_dead_code(S(KC_9));
  278. }
  279. return false;
  280. case M_111:
  281. if (record->event.pressed) {
  282. tap_dead_code(KC_EQL);
  283. }
  284. return false;
  285. case M_112:
  286. if (record->event.pressed) {
  287. tap_dead_code(KC_0);
  288. }
  289. return false;
  290. case M_113:
  291. if (record->event.pressed) {
  292. tap_dead_code(S(KC_LBRC));
  293. }
  294. return false;
  295. case M_114:
  296. if (record->event.pressed) {
  297. tap_dead_code(S(KC_RBRC));
  298. }
  299. return false;
  300. case M_115:
  301. if (record->event.pressed) {
  302. tap_dead_code(KC_1);
  303. }
  304. return false;
  305. case M_116:
  306. if (record->event.pressed) {
  307. tap_dead_code(S(KC_8));
  308. }
  309. return false;
  310. case M_117:
  311. if (record->event.pressed) {
  312. tap_dead_code(S(KC_0));
  313. }
  314. return false;
  315. case M_118:
  316. if (record->event.pressed) {
  317. tap_dead_code(KC_MINS);
  318. }
  319. return false;
  320. case M_119:
  321. if (record->event.pressed) {
  322. tap_dead_code(S(KC_QUOT));
  323. }
  324. return false;
  325. case M_120:
  326. if (record->event.pressed) {
  327. tap_dead_code(KC_6);
  328. }
  329. return false;
  330. case M_121:
  331. if (record->event.pressed) {
  332. tap_dead_code(KC_7);
  333. }
  334. return false;
  335. case M_122:
  336. if (record->event.pressed) {
  337. tap_dead_code(KC_8);
  338. }
  339. return false;
  340. case M_123:
  341. if (record->event.pressed) {
  342. tap_dead_code(KC_9);
  343. }
  344. return false;
  345. case M_124:
  346. if (record->event.pressed) {
  347. tap_dead_code(S(KC_BSLS));
  348. }
  349. return false;
  350. case M_125:
  351. if (record->event.pressed) {
  352. tap_dead_code(KC_BSLS);
  353. }
  354. return false;
  355. case M_126:
  356. if (record->event.pressed) {
  357. tap_dead_code(KC_2);
  358. }
  359. return false;
  360. case M_127:
  361. if (record->event.pressed) {
  362. tap_dead_code(KC_3);
  363. }
  364. return false;
  365. case M_128:
  366. if (record->event.pressed) {
  367. tap_dead_code(KC_4);
  368. }
  369. return false;
  370. case M_129:
  371. if (record->event.pressed) {
  372. tap_dead_code(KC_5);
  373. }
  374. return false;
  375. case M_130:
  376. if (record->event.pressed) {
  377. tap_dead_code(S(KC_1));
  378. }
  379. return false;
  380. }
  381. return true;
  382. }
  383. // Runs constantly in the background, in a loop.
  384. void matrix_scan_user(void) {
  385. ergodox_board_led_off();
  386. ergodox_right_led_1_off();
  387. ergodox_right_led_2_off();
  388. ergodox_right_led_3_off();
  389. switch (get_highest_layer(layer_state)) {
  390. // TODO: Make this relevant to the ErgoDox EZ.
  391. case 1:
  392. ergodox_right_led_1_on();
  393. break;
  394. case 2:
  395. ergodox_right_led_2_on();
  396. break;
  397. default:
  398. // none
  399. break;
  400. }
  401. }