keymap.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. #include "ergodox.h"
  2. #include "debug.h"
  3. #include "action_layer.h"
  4. #include "version.h"
  5. #define BASE 0 // default layer
  6. #define ARRW 1 // function, media, arrow keys
  7. #define NUMP 2 // numpad
  8. #define INTL 3 // international symbols
  9. // Fillers to make layering more clear
  10. #define _______ KC_TRNS
  11. #define XXXXXXX KC_NO
  12. // Tap Dance Codes
  13. enum {
  14. SLASH,
  15. WHACK,
  16. };
  17. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  18. // If it accepts an argument (i.e, is a function), it doesn't need KC_.
  19. // Otherwise, it needs KC_*
  20. /* layer 0 : default
  21. *
  22. * ,--------------------------------------------------. ,--------------------------------------------------.
  23. * | ` | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | BCKSPC |
  24. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  25. * | TAB | Q | W | E | R | T | HOME | | PGUP | Y | U | I | O | P | DELETE |
  26. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  27. * | NOOP | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER |
  28. * |--------+------+------+------+------+------| END | | PGDN |------+------+------+------+------+--------|
  29. * | (/LSFT | Z | X | C | V | B | | | | N | M | , | . | UP | )/RSFT |
  30. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  31. * | LCTRL | LGUI | MENU | ' | NOOP | | [ | ] | LEFT | DOWN | RIGHT |
  32. * `------------------------------------' `------------------------------------'
  33. * ,-------------. ,-------------.
  34. * |PRTSCR| ESC | | VOL- | VOL+ |
  35. * ,------|------|------| |------+------+------.
  36. * | ALT/ | | NUMLK| | MUTE | | ALT/ |
  37. * | SPC | SLASH|------| |------|WHACK | SPC |
  38. * | | | LAY3 | | LAY2 | | |
  39. * `--------------------' `--------------------'
  40. */
  41. [BASE] = KEYMAP(
  42. // left hand
  43. KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6,
  44. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME,
  45. XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G,
  46. KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END,
  47. KC_LCTL, KC_LGUI, KC_MENU, KC_QUOT, XXXXXXX,
  48. KC_INS, KC_ESC,
  49. KC_NLCK,
  50. ALT_T(KC_SPC), TD(SLASH), TG(INTL),
  51. // right hand
  52. KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
  53. KC_PGUP, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL,
  54. KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENTER,
  55. KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_RSPC,
  56. KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_RGHT,
  57. KC_VOLD, KC_VOLU,
  58. KC_MUTE,
  59. TG(NUMP), TD(WHACK), ALT_T(KC_SPC)
  60. ),
  61. /* layer 1 : functions and arrows
  62. *
  63. * ,--------------------------------------------------. ,--------------------------------------------------.
  64. * | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | |
  65. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  66. * | | | | UP | | | | | | | | | | | INSERT |
  67. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  68. * | | | LEFT | DOWN |RIGHT | |------| |------| LEFT | DOWN | UP | RIGHT| | |
  69. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  70. * | |M_PREV|M_STOP|M_PLPS|M_NEXT| | | | | | | | | UP | |
  71. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  72. * | | | | | | | | | LEFT | DOWN | RIGHT |
  73. * `------------------------------------' `------------------------------------'
  74. * ,-------------. ,-------------.
  75. * |SYSREQ| PAUSE| | | |
  76. * ,------|------|------| |------+------+------.
  77. * | | | SCRLK| | | | |
  78. * | | |------| |------| | |
  79. * | | | | | | | |
  80. * `--------------------' `--------------------'
  81. */
  82. [ARRW] = KEYMAP(
  83. // left hand
  84. _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
  85. _______, _______, _______, KC_UP, _______, _______, _______,
  86. _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______,
  87. _______, _______, _______, _______, _______, _______, _______,
  88. _______, _______, _______, _______, _______,
  89. KC_SYSREQ, KC_PAUSE,
  90. KC_SLCK,
  91. _______, _______, _______,
  92. // right hand
  93. KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,
  94. _______, _______, _______, _______, _______, _______, KC_INS,
  95. KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______,
  96. _______, _______, _______, _______, _______, KC_UP, _______,
  97. _______, _______, KC_LEFT, KC_DOWN, KC_RGHT,
  98. _______, _______,
  99. _______,
  100. _______, _______, _______
  101. ),
  102. /* layer 2 : numberpad
  103. *
  104. * ,--------------------------------------------------. ,--------------------------------------------------.
  105. * | | | | | | | | | | | | | | | |
  106. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  107. * | | | | | | | | | | | | | | | |
  108. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  109. * | | | | | | |------| |------| | | | | | |
  110. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  111. * | | | | | | | | | | | | | | | |
  112. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  113. * | | | | | | | | | | | |
  114. * `------------------------------------' `------------------------------------'
  115. * ,-------------. ,-------------.
  116. * | | | | | |
  117. * ,------|------|------| |------+------+------.
  118. * | | | | | | | |
  119. * | | |------| |------| | |
  120. * | | | | | | | |
  121. * `--------------------' `--------------------'
  122. */
  123. [NUMP] = KEYMAP(
  124. // left hand
  125. _______, _______, _______, _______, _______, _______, _______,
  126. _______, _______, _______, _______, _______, _______, _______,
  127. _______, _______, _______, _______, _______, _______,
  128. _______, _______, _______, _______, _______, _______, _______,
  129. _______, _______, _______, _______, _______,
  130. _______, _______,
  131. _______,
  132. _______, _______, _______,
  133. // right hand
  134. _______, _______, _______, _______, _______, _______, _______,
  135. _______, _______, _______, _______, _______, _______, _______,
  136. _______, _______, _______, _______, _______, _______,
  137. _______, _______, _______, _______, _______, _______, _______,
  138. _______, _______, _______, _______, _______,
  139. _______, _______,
  140. _______,
  141. _______, _______, _______
  142. ),
  143. /* layer 3: International symbols, etc
  144. *
  145. * ,--------------------------------------------------. ,--------------------------------------------------.
  146. * | | | | | | | | | | | | | | | |
  147. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  148. * | | | | | | | | | | | | | | | |
  149. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  150. * | | | | | | |------| |------| | | | | | |
  151. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  152. * | | | | | | | | | | | | | | | |
  153. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  154. * | | | | | | | | | | | |
  155. * `------------------------------------' `------------------------------------'
  156. * ,-------------. ,-------------.
  157. * | | | | | |
  158. * ,------|------|------| |------+------+------.
  159. * | | | | | | | |
  160. * | | |------| |------| | |
  161. * | | | | | | | |
  162. * `--------------------' `--------------------'
  163. */
  164. [INTL] = KEYMAP(
  165. // left hand
  166. _______, _______, _______, _______, _______, _______, _______,
  167. _______, _______, _______, _______, _______, _______, _______,
  168. _______, _______, _______, _______, _______, _______,
  169. _______, _______, _______, _______, _______, _______, _______,
  170. _______, _______, _______, _______, _______,
  171. _______, _______,
  172. _______,
  173. _______, _______, _______,
  174. // right hand
  175. _______, _______, _______, _______, _______, _______, _______,
  176. _______, _______, _______, _______, _______, _______, _______,
  177. _______, _______, _______, _______, _______, _______,
  178. _______, _______, _______, _______, _______, _______, _______,
  179. _______, _______, _______, _______, _______,
  180. _______, _______,
  181. _______,
  182. _______, _______, _______
  183. ),
  184. };
  185. // See https://github.com/algernon/ergodox-layout/blob/master/keymap.c
  186. // When holding the SLASH or WHACK key, the ARRW layer activates while the key is held.
  187. // Tapping the key produces the / or \ key. Double-tapping it toggles the ARRW layer
  188. // on until a third tap.
  189. typedef struct {
  190. bool layer_toggle;
  191. bool sticky;
  192. } td_ta_state_t;
  193. static void ang_tap_dance_s_finished (qk_tap_dance_state_t *state, void *user_data) {
  194. td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
  195. if (td_ta->sticky) {
  196. td_ta->sticky = false;
  197. td_ta->layer_toggle = false;
  198. layer_off (ARRW);
  199. return;
  200. }
  201. if (state->count == 1 && !state->pressed) {
  202. register_code (KC_SLSH);
  203. td_ta->sticky = false;
  204. td_ta->layer_toggle = false;
  205. } else {
  206. td_ta->layer_toggle = true;
  207. layer_on (ARRW);
  208. td_ta->sticky = (state->count == 2);
  209. }
  210. }
  211. static void ang_tap_dance_s_reset (qk_tap_dance_state_t *state, void *user_data) {
  212. td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
  213. if (!td_ta->layer_toggle)
  214. unregister_code (KC_SLSH);
  215. if (!td_ta->sticky)
  216. layer_off (ARRW);
  217. }
  218. static void ang_tap_dance_w_finished (qk_tap_dance_state_t *state, void *user_data) {
  219. td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
  220. if (td_ta->sticky) {
  221. td_ta->sticky = false;
  222. td_ta->layer_toggle = false;
  223. layer_off (ARRW);
  224. return;
  225. }
  226. if (state->count == 1 && !state->pressed) {
  227. register_code (KC_BSLS);
  228. td_ta->sticky = false;
  229. td_ta->layer_toggle = false;
  230. } else {
  231. td_ta->layer_toggle = true;
  232. layer_on (ARRW);
  233. td_ta->sticky = (state->count == 2);
  234. }
  235. }
  236. static void ang_tap_dance_w_reset (qk_tap_dance_state_t *state, void *user_data) {
  237. td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
  238. if (!td_ta->layer_toggle)
  239. unregister_code (KC_BSLS);
  240. if (!td_ta->sticky)
  241. layer_off (ARRW);
  242. }
  243. qk_tap_dance_action_t tap_dance_actions[] = {
  244. [SLASH] = {
  245. .fn = { NULL, ang_tap_dance_s_finished, ang_tap_dance_s_reset },
  246. .user_data = (void *)&((td_ta_state_t) { false, false })
  247. },
  248. [WHACK] = {
  249. .fn = { NULL, ang_tap_dance_w_finished, ang_tap_dance_w_reset },
  250. .user_data = (void *)&((td_ta_state_t) { false, false })
  251. }
  252. };
  253. // Runs just one time when the keyboard initializes.
  254. void matrix_init_user(void) {
  255. };
  256. // Runs constantly in the background, in a loop.
  257. void matrix_scan_user(void) {
  258. uint8_t layer = biton32(layer_state);
  259. ergodox_board_led_off();
  260. ergodox_right_led_1_off();
  261. ergodox_right_led_2_off();
  262. ergodox_right_led_3_off();
  263. switch (layer) {
  264. case 1:
  265. ergodox_right_led_1_on();
  266. break;
  267. case 2:
  268. ergodox_right_led_2_on();
  269. break;
  270. case 3:
  271. ergodox_right_led_3_on();
  272. break;
  273. default:
  274. // none
  275. break;
  276. }
  277. };