You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

366 lines
18 KiB

  1. #include "ergodox_ez.h"
  2. #include "debug.h"
  3. #include "action_layer.h"
  4. // README
  5. // 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.
  6. // 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
  7. // blanks so still discovering what I like.
  8. // 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
  9. // 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
  10. // look forward to learning about a more elegant way to do the same thing. Until then, this will have to do.
  11. // TODO: Define layer names that make sense for the ErgoDox EZ.
  12. #define BASE 0 // default layer
  13. #define SYMB 1 // symbols
  14. #define MDIA 2 // media keys
  15. #define DEAD 3 // dead version of the symbols layer
  16. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  17. /* Keymap 0: Basic layer
  18. *
  19. * ,--------------------------------------------------. ,--------------------------------------------------.
  20. * | ` | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - |
  21. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  22. * | Tab | Q | D | R | W | B | L1 | | L1 | J | F | U | P | ; | |
  23. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  24. * | Hyper | A | S | H | T | G |------| |------| Y | N | E | O | I | ' |
  25. * |--------+------+------+------+------+------| | | Meh |------+------+------+------+------+--------|
  26. * | LShift | Z | X | M | C | V | | | | K | L | , | . |//Ctrl| RShift |
  27. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  28. * | | | CTRL | OPT | CMD | | Left | Down | Up | Right| L3 |
  29. * `----------------------------------' `----------------------------------'
  30. * ,-------------. ,-------------.
  31. * | | | | | |
  32. * ,------|------|------| |------+--------+------.
  33. * | | | Home | | PgUp | | |
  34. * |Bckspc| Space|------| |------| Space |Enter |
  35. * | | | End | | PgDn | | |
  36. * `--------------------' `----------------------'
  37. */
  38. // If it accepts an argument (i.e, is a function), it doesn't need KC_.
  39. // Otherwise, it needs KC_*
  40. [BASE] = KEYMAP( // layer 0 : default
  41. // left hand
  42. KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT,
  43. KC_TAB, KC_Q, KC_D, KC_R, KC_W, KC_B, TG(1),
  44. ALL_T(KC_ESC), KC_A, KC_S, KC_H, KC_T, KC_G,
  45. KC_LSFT, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_NO,
  46. KC_NO, KC_NO, KC_LCTL,KC_LALT,KC_LGUI,
  47. KC_NO, KC_NO,
  48. KC_HOME,
  49. KC_BSPC,KC_SPC,KC_END,
  50. // right hand
  51. KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
  52. TG(1), KC_J, KC_F, KC_U, KC_P, KC_SCLN, KC_BSLS,
  53. KC_Y, KC_N, KC_E, KC_O, KC_I, KC_QUOT,
  54. MEH_T(KC_NO),KC_K, KC_L, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT,
  55. KC_LEFT,KC_DOWN,KC_UP, KC_RGHT, KC_FN4,
  56. KC_NO, KC_NO,
  57. KC_PGUP,
  58. KC_PGDN,KC_SPC,KC_ENT
  59. ),
  60. /* Keymap 1: Symbol Layer
  61. *
  62. * ,--------------------------------------------------. ,--------------------------------------------------.
  63. * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
  64. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  65. * | | % | & | ? | + | @ | | | | $ | _ | [ | ] | ! | F12 |
  66. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  67. * | | / | ( | = | 0 | { |------| |------| } | 1 | * | ) | - | " |
  68. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  69. * | | 6 | 7 | 8 | 9 | | | | | | \ | 2 | 3 | 4 | 5 | |
  70. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  71. * | | | | | | | | | | | |
  72. * `----------------------------------' `----------------------------------'
  73. * ,-------------. ,-------------.
  74. * | | | | | |
  75. * ,------|------|------| |------+------+------.
  76. * | | | | | | | |
  77. * | | |------| |------| | |
  78. * | | | | | | | |
  79. * `--------------------' `--------------------'
  80. */
  81. // SYMBOLS
  82. [SYMB] = KEYMAP(
  83. // left hand
  84. KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
  85. KC_TRNS, KC_PERC, KC_AMPR, LSFT(KC_SLSH), LSFT(KC_EQL), KC_AT, KC_TRNS,
  86. KC_TRNS, KC_SLSH, KC_LPRN, KC_EQL, KC_0, LSFT(KC_LBRC),
  87. KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_PIPE, KC_TRNS,
  88. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  89. KC_TRNS,KC_TRNS,
  90. KC_TRNS,
  91. KC_TRNS,KC_TRNS,KC_TRNS,
  92. // right hand
  93. KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
  94. KC_TRNS, KC_DLR, KC_UNDERSCORE, KC_LBRC, KC_RBRC, KC_EXLM, KC_F12,
  95. KC_RCBR, KC_1, KC_ASTR, KC_RPRN, KC_MINS, KC_QUOT,
  96. KC_TRNS, KC_SLSH, KC_2, KC_3, KC_4, KC_5, KC_TRNS,
  97. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  98. KC_TRNS, KC_TRNS,
  99. KC_TRNS,
  100. KC_TRNS, KC_TRNS, KC_TRNS
  101. ),
  102. /* Keymap 2: Media and mouse keys
  103. *
  104. * ,--------------------------------------------------. ,--------------------------------------------------.
  105. * | | | | | | | | | | | | | | | |
  106. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  107. * | | | | MsUp | | | | | | | | | | | |
  108. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  109. * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
  110. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  111. * | | | | | | | | | | | | Prev | Next | | |
  112. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  113. * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
  114. * `----------------------------------' `----------------------------------'
  115. * ,-------------. ,-------------.
  116. * | | | | | |
  117. * ,------|------|------| |------+------+------.
  118. * | | | | | | |Brwser|
  119. * | | |------| |------| |Back |
  120. * | | | | | | | |
  121. * `--------------------' `--------------------'
  122. */
  123. // MEDIA AND MOUSE
  124. [MDIA] = KEYMAP(
  125. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  126. KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
  127. KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
  128. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  129. KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
  130. KC_TRNS, KC_TRNS,
  131. KC_TRNS,
  132. KC_TRNS, KC_TRNS, KC_TRNS,
  133. // right hand
  134. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  135. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  136. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
  137. KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
  138. KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
  139. KC_TRNS, KC_TRNS,
  140. KC_TRNS,
  141. KC_TRNS, KC_TRNS, KC_WBAK
  142. ),
  143. /* Keymap 4: Dead Symbol Layer
  144. *
  145. * ,--------------------------------------------------. ,--------------------------------------------------.
  146. * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
  147. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  148. * | | % | & | ? | + | @ | | | | $ | _ | [ | ] | ! | F12 |
  149. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  150. * | | / | ( | = | 0 | { |------| |------| } | 1 | * | ) | - | " |
  151. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  152. * | | 6 | 7 | 8 | 9 | | | | | | \ | 2 | 3 | 4 | 5 | |
  153. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  154. * | | | | | | | | | | | |
  155. * `----------------------------------' `----------------------------------'
  156. * ,-------------. ,-------------.
  157. * | | | | | |
  158. * ,------|------|------| |------+------+------.
  159. * | | | | | | | |
  160. * | | |------| |------| | |
  161. * | | | | | | | |
  162. * `--------------------' `--------------------'
  163. */
  164. // SYMBOLS
  165. [DEAD] = KEYMAP(
  166. // left hand
  167. KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
  168. KC_TRNS, M(100), M(101), M(102), M(103), M(104), KC_TRNS,
  169. KC_TRNS, M(109), M(110), M(111), M(112), M(113),
  170. KC_TRNS, M(120), M(121), M(122), M(123), M(124), KC_TRNS,
  171. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  172. KC_TRNS,KC_TRNS,
  173. KC_TRNS,
  174. KC_TRNS,KC_TRNS,KC_TRNS,
  175. // right hand
  176. KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
  177. KC_TRNS, M(105), M(106), M(107), M(108), M(130), KC_F12,
  178. M(114), M(115), M(116), M(117), M(118), M(119),
  179. KC_TRNS, M(125), M(126), M(127), M(128), M(129), KC_TRNS,
  180. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  181. KC_TRNS, KC_TRNS,
  182. KC_TRNS,
  183. KC_TRNS, KC_TRNS, KC_TRNS
  184. ),
  185. };
  186. const uint16_t PROGMEM fn_actions[] = {
  187. [1] = ACTION_LAYER_TAP_TOGGLE(SYMB), // FN1 - Momentary Layer 1 (Symbols)
  188. [2] = ACTION_LAYER_ON(BASE,0), // FN2 - Go back to the base layer
  189. [3] = ACTION_LAYER_ON(DEAD,0),
  190. [4] = ACTION_LAYER_TOGGLE(DEAD),
  191. };
  192. const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
  193. {
  194. // MACRODOWN only works in this function
  195. switch(id) {
  196. case 0:
  197. if (record->event.pressed) {
  198. register_code(KC_RSFT);
  199. } else {
  200. unregister_code(KC_RSFT);
  201. }
  202. break;
  203. case 100:
  204. layer_clear();
  205. return MACRODOWN(D(LSFT), T(5), U(LSFT), T(FN4), END);
  206. break;
  207. case 101:
  208. layer_clear();
  209. return MACRODOWN(D(LSFT), T(7), U(LSFT), T(FN4), END);
  210. break;
  211. case 102:
  212. layer_clear();
  213. return MACRODOWN(D(LSFT), T(SLSH), U(LSFT), T(FN4), END);
  214. break;
  215. case 103:
  216. layer_clear();
  217. return MACRODOWN(D(LSFT), T(EQL), U(LSFT), T(FN4), END);
  218. break;
  219. case 104:
  220. layer_clear();
  221. return MACRODOWN(D(LSFT), T(2), U(LSFT), T(FN4), END);
  222. break;
  223. case 105:
  224. layer_clear();
  225. return MACRODOWN(D(LSFT), T(4), U(LSFT), T(FN4), END);
  226. break;
  227. case 106:
  228. layer_clear();
  229. return MACRODOWN(D(LSFT), T(MINS), U(LSFT), T(FN4), END);
  230. break;
  231. case 107:
  232. layer_clear();
  233. return MACRODOWN(T(LBRC), T(FN4), END);
  234. break;
  235. case 108:
  236. layer_clear();
  237. return MACRODOWN(T(RBRC), T(FN4), END);
  238. break;
  239. case 130:
  240. layer_clear();
  241. return MACRODOWN(D(LSFT), T(1), U(LSFT), T(FN4), END);
  242. break;
  243. case 109:
  244. layer_clear();
  245. return MACRODOWN(T(SLSH), T(FN4), END);
  246. break;
  247. case 110:
  248. layer_clear();
  249. return MACRODOWN(D(LSFT), T(9), U(LSFT), T(FN4), END);
  250. break;
  251. case 111:
  252. layer_clear();
  253. return MACRODOWN(T(EQL), T(FN4), END);
  254. break;
  255. case 112:
  256. layer_clear();
  257. return MACRODOWN(T(0), T(FN4), END);
  258. break;
  259. case 113:
  260. layer_clear();
  261. return MACRODOWN(D(LSFT), T(LBRC), U(LSFT), T(FN4), END);
  262. break;
  263. case 114:
  264. layer_clear();
  265. return MACRODOWN(D(LSFT), T(RBRC), U(LSFT), T(FN4), END);
  266. break;
  267. case 115:
  268. layer_clear();
  269. return MACRODOWN(T(1), T(FN4), END);
  270. break;
  271. case 116:
  272. layer_clear();
  273. return MACRODOWN(D(LSFT), T(8), U(LSFT), T(FN4), END);
  274. break;
  275. case 117:
  276. layer_clear();
  277. return MACRODOWN(D(LSFT), T(0), U(LSFT), T(FN4), END);
  278. break;
  279. case 118:
  280. layer_clear();
  281. return MACRODOWN(T(MINS), T(FN4), END);
  282. break;
  283. case 119:
  284. layer_clear();
  285. return MACRODOWN(D(LSFT), T(QUOT), U(LSFT), T(FN4), END);
  286. break;
  287. case 120:
  288. layer_clear();
  289. return MACRODOWN(T(6), T(FN4), END);
  290. break;
  291. case 121:
  292. layer_clear();
  293. return MACRODOWN(T(7), T(FN4), END);
  294. break;
  295. case 122:
  296. layer_clear();
  297. return MACRODOWN(T(8), T(FN4), END);
  298. break;
  299. case 123:
  300. layer_clear();
  301. return MACRODOWN(T(9), T(FN4), END);
  302. break;
  303. case 124:
  304. layer_clear();
  305. return MACRODOWN(D(LSFT), T(BSLS), U(LSFT), T(FN4), END);
  306. break;
  307. case 125:
  308. layer_clear();
  309. return MACRODOWN(T(BSLS), T(FN4), END);
  310. break;
  311. case 126:
  312. layer_clear();
  313. return MACRODOWN(T(2), T(FN4), END);
  314. break;
  315. case 127:
  316. layer_clear();
  317. return MACRODOWN(T(3), T(FN4), END);
  318. break;
  319. case 128:
  320. layer_clear();
  321. return MACRODOWN(T(4), T(FN4), END);
  322. break;
  323. case 129:
  324. layer_clear();
  325. return MACRODOWN(T(5), T(FN4), END);
  326. break;
  327. default:
  328. return MACRO_NONE;
  329. }
  330. return MACRO_NONE;
  331. };
  332. // Runs just one time when the keyboard initializes.
  333. void matrix_init_user(void) {
  334. };
  335. // Runs constantly in the background, in a loop.
  336. void matrix_scan_user(void) {
  337. uint8_t layer = biton32(layer_state);
  338. ergodox_board_led_off();
  339. ergodox_right_led_1_off();
  340. ergodox_right_led_2_off();
  341. ergodox_right_led_3_off();
  342. switch (layer) {
  343. // TODO: Make this relevant to the ErgoDox EZ.
  344. case 1:
  345. ergodox_right_led_1_on();
  346. break;
  347. case 2:
  348. ergodox_right_led_2_on();
  349. break;
  350. default:
  351. // none
  352. break;
  353. }
  354. };