keymap.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. #include "ergodox_ez.h"
  2. #include "led.h"
  3. #include "debug.h"
  4. #include "action_layer.h"
  5. #include "action_util.h"
  6. #define BASE 0 // default layer
  7. #define SYMB 1 // symbols layer
  8. #define MDIA 2 // media layer
  9. #define LOCK 3 // shift-lock layer
  10. #define LSymb 0 // left symbol-shift key
  11. #define LMdia 1 // left media-shift key
  12. #define LLock 2 // left shift-lock key
  13. #define RSymb 3 // right symbol-shift key
  14. #define RMdia 4 // right media-shift key
  15. #define RLock 5 // right shift-lock key
  16. #define MUL 6 // mouse up left
  17. #define MUR 7 // mouse up right
  18. #define MDL 8 // mouse down left
  19. #define MDR 9 // mouse down right
  20. /*
  21. * The Ordinary Layout for the Ergodox EZ keyboard, v3.14
  22. *
  23. * Modifications from default by Nicholas Keene ergodoxez@nicholaskeene.com
  24. *
  25. * Details: readme.md
  26. * https://github.com/nrrkeene/qmk_firmware/tree/master/keyboard/ergodox_ez/keymaps/ordinary
  27. */
  28. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  29. /******* Base Layer ********************************************************************************************************
  30. *
  31. * ,-----------------------------------------------------. ,-----------------------------------------------------.
  32. * | Lock `~ | 1 | 2 | 3 | 4 | 5 | ESC | | - | 6 | 7 | 8 | 9 | 0 | =+ Lock |
  33. * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
  34. * | Media Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \| Media |
  35. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  36. * | Symbol | A | S | D | F | G |------| |------| H | J | K | L | ; | '" Symbol |
  37. * |-----------+------+------+------+------+------|Shift | | Tab |------+------+------+------+------+-----------|
  38. * | LShift | Z | X | C | V | B | -Tab | | | N | M | , | . | / | RShift |
  39. * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
  40. * | LCtrl | Meh |Hyper | LAlt | LGui | | RGui | RAlt | Hyper| Meh | RCtrl |
  41. * `-----------------------------------' `-----------------------------------'
  42. * ,-------------. ,-------------.
  43. * | Home | End | | Left | Right|
  44. * ,------|------|------| |------+------+------.
  45. * | | | PgUp | | Up | | |
  46. * |Backsp| Del |------| |------| Enter| Space|
  47. * | | | PgDn | | Down | | |
  48. * `--------------------' `--------------------'
  49. */
  50. [BASE] = KEYMAP(
  51. // left hand
  52. F(LLock) ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_ESC
  53. ,F(LMdia) ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_LBRC
  54. ,M(LSymb) ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G
  55. ,KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,LSFT(KC_TAB)
  56. ,KC_LCTL ,KC_MEH ,KC_HYPR,KC_LALT,KC_LGUI
  57. ,KC_HOME,KC_END
  58. ,KC_PGUP
  59. ,KC_BSPC,KC_DEL ,KC_PGDN
  60. // right hand
  61. ,KC_MINS ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,F(RLock)
  62. ,KC_RBRC ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,F(RMdia)
  63. ,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,F(RSymb)
  64. ,KC_TAB ,KC_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH ,KC_RSFT
  65. ,KC_RGUI,KC_RALT,KC_HYPR ,KC_MEH ,KC_RCTL
  66. ,KC_LEFT ,KC_RGHT
  67. ,KC_UP
  68. ,KC_DOWN ,KC_ENT ,KC_SPC
  69. ),
  70. /******* Symbols Layer *****************************************************************************************************
  71. *
  72. * ,-----------------------------------------------------. ,-----------------------------------------------------.
  73. * | | F1 | F2 | F3 | F4 | F5 | Esc | | - | F6 | F7 | F8 | F9 | F10 | |
  74. * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
  75. * | | ! | @ | { | } | & | < | | > | | | 7 | 8 | 9 | / | |
  76. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  77. * | | # | $ | ( | ) | ` |------| |------| / | 4 | 5 | 6 | * | |
  78. * |-----------+------+------+------+------+------| Tab | | Shift|------+------+------+------+------+-----------|
  79. * | | % | ^ | [ | ] | ~ | | | -Tab| \ | 1 | 2 | 3 | - | |
  80. * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
  81. * | LCtrl | Meh |Hyper | LAlt | LGui | |RGui/0|RAlt/.|Hypr/=|Meh/+ |RCtrl/Ent|
  82. * `-----------------------------------' `-------------------------------------'
  83. * ,-------------. ,-------------.
  84. * | Left | Right| | Home | End |
  85. * ,------|------|------| |------+------+------.
  86. * | | | Up | | PgUp | | |
  87. * |Space |Enter |------| |------|BackSp| Del |
  88. * | | | Down | | PgDn | | |
  89. * `--------------------' `--------------------'
  90. */
  91. [SYMB] = KEYMAP(
  92. // left hand
  93. KC_TRNS ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_ESC
  94. ,KC_TRNS ,KC_EXLM ,KC_AT ,KC_LCBR ,KC_RCBR ,KC_AMPR ,LSFT(KC_COMM)
  95. ,KC_TRNS ,KC_HASH ,KC_DLR ,KC_LPRN ,KC_RPRN ,KC_GRV
  96. ,KC_TRNS ,KC_PERC ,KC_CIRC ,KC_LBRC ,KC_RBRC ,KC_TILD ,KC_TAB
  97. ,KC_LCTL ,KC_MEH ,KC_HYPR,KC_LALT ,KC_LGUI
  98. ,KC_LEFT ,KC_RGHT
  99. ,KC_UP
  100. ,KC_SPC ,KC_ENT ,KC_DOWN
  101. // right hand
  102. ,KC_MINS ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_TRNS
  103. ,LSFT(KC_DOT),KC_PIPE ,KC_7 ,KC_8 ,KC_9 ,KC_SLSH ,KC_TRNS
  104. ,KC_SLSH ,KC_4 ,KC_5 ,KC_6 ,KC_ASTR ,KC_TRNS
  105. ,LSFT(KC_TAB),KC_BSLS ,KC_1 ,KC_2 ,KC_3 ,KC_MINS ,KC_TRNS
  106. ,GUI_T(KC_0),ALT_T(KC_DOT),ALL_T(KC_EQL),MEH_T(KC_PLUS),CTL_T(KC_ENT)
  107. ,KC_HOME ,KC_END
  108. ,KC_PGUP
  109. ,KC_PGDN ,KC_BSPC ,KC_DEL
  110. ),
  111. /******* Media Layer *******************************************************************************************************
  112. *
  113. * ,---------------------------------------------------------------. ,---------------------------------------------------------------.
  114. * | | F11 | F12 | F13 | F14 | F15 | Esc | | | F16 | F17 | F18 | F19 | F20 | |
  115. * |------+---------+---------+---------+---------+----------------| |------+---------+---------+---------+---------+---------+------|
  116. * | |Shut Down|MouseUpLf|Mouse Up |MouseUpRg|Volume Up|Scroll| |Scroll|PrintScrn| Home | Up | PgUp | Mail | |
  117. * |------+---------+---------+---------+---------+---------| Up | | Up |---------+---------+---------+---------+---------+------|
  118. * | | Sleep |MouseLeft|MouseDown|MouseRght|Volume Dn|------| |------| Num Lock| Left | Down | Right | MyComp | |
  119. * |------+---------+---------+---------+---------+---------|Scroll| |Scroll|---------+---------+---------+---------+---------+------|
  120. * | | |MouseDnLf|MouseDown|MouseDnRg| Mute | Down | | Down | | End | Down | PgDn | | |
  121. * `------+---------+---------+---------+---------+----------------' `----------------+---------+---------+---------+---------+------'
  122. * |LCtrl| Meh | MClick | LClick | R Click| |Cmd/Insrt|Optn/Del | Hyper | Meh |RCtrl|
  123. * `---------------------------------------------' `---------------------------------------------'
  124. * ,-------------. ,-------------.
  125. * | Stop |Refrsh| | Prev | Next |
  126. * ,------|------|------| |------+------+------.
  127. * |Brwser|Brwser|Search| |VolUp | | |
  128. * |Back | Fwd |------| |------| Stop | Play-|
  129. * | | | Home | |VolDn | | Pause|
  130. * `--------------------' `--------------------'
  131. */
  132. [MDIA] = KEYMAP(
  133. // left hand
  134. KC_TRNS ,KC_F11 ,KC_F12 ,KC_F13 ,KC_F14 ,KC_F15 ,KC_ESC
  135. ,KC_TRNS ,KC_POWER ,M(MUL) ,KC_MS_U ,M(MUR) ,KC_VOLU ,KC_WH_U
  136. ,KC_TRNS ,KC_SLEP ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_VOLD
  137. ,KC_TRNS ,KC_NO ,M(MDL) ,KC_MS_D ,M(MDR) ,KC_MUTE ,KC_WH_D
  138. ,KC_LCTL ,KC_MEH ,KC_BTN3 ,KC_BTN1 ,KC_BTN2
  139. ,KC_WSTP ,KC_WREF
  140. ,KC_WSCH
  141. ,KC_WBAK ,KC_NO ,KC_WHOM
  142. // right hand
  143. ,KC_NO ,KC_F16 ,KC_F17 ,KC_F18 ,KC_F19 ,KC_F20 ,KC_TRNS
  144. ,KC_WH_U ,KC_PSCR ,KC_HOME ,KC_UP ,KC_PGUP ,KC_MAIL ,KC_TRNS
  145. ,KC_NLCK ,KC_LEFT ,KC_DOWN ,KC_RIGHT,KC_MYCM ,KC_TRNS
  146. ,KC_WH_D ,KC_NO ,KC_END ,KC_DOWN ,KC_PGDN ,KC_NO ,KC_TRNS
  147. ,GUI_T(KC_INS),ALT_T(KC_DEL),KC_HYPR ,KC_MEH ,KC_RCTL
  148. ,KC_MPRV ,KC_MNXT
  149. ,KC_VOLU
  150. ,KC_VOLD ,KC_MSTP ,KC_MPLY
  151. ),
  152. /******* Lock Layer ********************************************************************************************************
  153. *
  154. * ,-----------------------------------------------------. ,-----------------------------------------------------.
  155. * | | Esc | | | | | | | | | | | | Bspc | |
  156. * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
  157. * | | | | | | | | | | | | | | | |
  158. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  159. * | | | | | | |------| |------| | | | | | |
  160. * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
  161. * | Caps LOCK | | | | | | | | | | | | | | Caps LOCK |
  162. * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
  163. * | | | | | | | | | | | |
  164. * `----------------------------------' `----------------------------------'
  165. * ,-------------. ,-------------.
  166. * | | | | | |
  167. * ,------|------|------| |------+------+------.
  168. * | | | | | | | |
  169. * | | |------| |------| | |
  170. * | | | | | | | |
  171. * `--------------------' `--------------------'
  172. */
  173. [LOCK] = KEYMAP(
  174. // left hand
  175. KC_TRNS ,KC_ESC ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  176. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  177. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  178. ,KC_CAPS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  179. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  180. ,KC_TRNS ,KC_TRNS
  181. ,KC_TRNS
  182. ,KC_TRNS,KC_TRNS ,KC_TRNS
  183. // right hand
  184. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_BSPC ,KC_TRNS
  185. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  186. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  187. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_CAPS
  188. ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
  189. ,KC_TRNS ,KC_TRNS
  190. ,KC_TRNS
  191. ,KC_TRNS ,KC_TRNS ,KC_TRNS
  192. )
  193. };
  194. const uint16_t PROGMEM fn_actions[] = {
  195. // the six faux shift keys are implemented as macro taps
  196. [LSymb] = ACTION_MACRO_TAP(LSymb)
  197. ,[LMdia] = ACTION_MACRO_TAP(LMdia)
  198. ,[LLock] = ACTION_MACRO_TAP(LLock)
  199. ,[RSymb] = ACTION_MACRO_TAP(RSymb)
  200. ,[RMdia] = ACTION_MACRO_TAP(RMdia)
  201. ,[RLock] = ACTION_MACRO_TAP(RLock)
  202. };
  203. uint16_t symb_shift = 0; // there are two shift keys for each layer, and two lock
  204. uint16_t mdia_shift = 0; // keys; we increment a counter for each key pressed and
  205. uint16_t shift_lock = 0; // decrement when released.
  206. bool symb_lock = false; // when shift-lock is used in conjunction with a shift
  207. bool mdia_lock = false; // key the lock flag is toggled
  208. const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
  209. {
  210. switch(id) {
  211. // shift and lock between layers
  212. case LSymb:
  213. if (record->event.pressed) {
  214. symb_shift++;
  215. if(shift_lock) symb_lock = !symb_lock;
  216. layer_on(SYMB);
  217. } else {
  218. symb_shift--;
  219. if((!symb_shift) && (!symb_lock)) layer_off(SYMB);
  220. }
  221. break;
  222. case LMdia:
  223. if (record->event.pressed) {
  224. if (record->tap.count && !shift_lock) {
  225. register_code(KC_TAB);
  226. } else {
  227. mdia_shift++;
  228. if(shift_lock) mdia_lock = !mdia_lock;
  229. layer_on(MDIA);
  230. }
  231. } else {
  232. if(record->tap.count && !shift_lock) {
  233. unregister_code(KC_TAB);
  234. } else {
  235. mdia_shift--;
  236. if((!mdia_shift) && (!mdia_lock)) layer_off(MDIA);
  237. }
  238. }
  239. break;
  240. case LLock:
  241. if (record->event.pressed) {
  242. shift_lock++;
  243. if(symb_shift) symb_lock = !symb_lock;
  244. if(mdia_shift) mdia_lock = !mdia_lock;
  245. if(!record->tap.count && (keyboard_report->mods & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)))) {
  246. register_code(KC_CAPS);
  247. unregister_code(KC_CAPS);
  248. }
  249. layer_on(LOCK);
  250. } else {
  251. if(record->tap.count && !record->tap.interrupted && !symb_shift && !mdia_shift) {
  252. register_code(KC_GRV);
  253. unregister_code(KC_GRV);
  254. }
  255. shift_lock--;
  256. if(!shift_lock) layer_off(LOCK);
  257. }
  258. break;
  259. case RSymb:
  260. if (record->event.pressed) {
  261. if (record->tap.count && !shift_lock) {
  262. register_code(KC_QUOT);
  263. } else {
  264. symb_shift++;
  265. if(shift_lock) symb_lock = !symb_lock;
  266. layer_on(SYMB);
  267. }
  268. } else {
  269. if(record->tap.count && !shift_lock) {
  270. unregister_code(KC_QUOT);
  271. } else {
  272. symb_shift--;
  273. if((!symb_shift) && (!symb_lock)) layer_off(SYMB);
  274. }
  275. }
  276. break;
  277. case RMdia:
  278. if (record->event.pressed) {
  279. if (record->tap.count && !shift_lock) {
  280. register_code(KC_BSLS);
  281. } else {
  282. mdia_shift++;
  283. if(shift_lock) mdia_lock = !mdia_lock;
  284. layer_on(MDIA);
  285. }
  286. } else {
  287. if(record->tap.count && !shift_lock) {
  288. unregister_code(KC_BSLS);
  289. } else {
  290. mdia_shift--;
  291. if((!mdia_shift) && (!mdia_lock)) layer_off(MDIA);
  292. }
  293. }
  294. break;
  295. case RLock:
  296. if (record->event.pressed) {
  297. shift_lock++;
  298. if(symb_shift) symb_lock = !symb_lock;
  299. if(mdia_shift) mdia_lock = !mdia_lock;
  300. if(!record->tap.count && (keyboard_report->mods & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)))) {
  301. register_code(KC_CAPS);
  302. unregister_code(KC_CAPS);
  303. }
  304. layer_on(LOCK);
  305. } else {
  306. if (record->tap.count && !record->tap.interrupted && !symb_shift && !mdia_shift) {
  307. register_code(KC_EQL);
  308. unregister_code(KC_EQL);
  309. }
  310. shift_lock--;
  311. if(!shift_lock) layer_off(LOCK);
  312. }
  313. break;
  314. // mouse diagonals
  315. case MUL: // mouse up left
  316. if (record->event.pressed) {
  317. mousekey_on(KC_MS_UP);
  318. mousekey_on(KC_MS_LEFT);
  319. mousekey_send();
  320. } else {
  321. mousekey_off(KC_MS_UP);
  322. mousekey_off(KC_MS_LEFT);
  323. mousekey_send();
  324. }
  325. break;
  326. case MUR: // mouse up right
  327. if (record->event.pressed) {
  328. mousekey_on(KC_MS_UP);
  329. mousekey_on(KC_MS_RIGHT);
  330. mousekey_send();
  331. } else {
  332. mousekey_off(KC_MS_UP);
  333. mousekey_off(KC_MS_RIGHT);
  334. mousekey_send();
  335. }
  336. break;
  337. case MDL: // mouse down left
  338. if (record->event.pressed) {
  339. mousekey_on(KC_MS_DOWN);
  340. mousekey_on(KC_MS_LEFT);
  341. mousekey_send();
  342. } else {
  343. mousekey_off(KC_MS_DOWN);
  344. mousekey_off(KC_MS_LEFT);
  345. mousekey_send();
  346. }
  347. break;
  348. case MDR: // mouse down right
  349. if (record->event.pressed) {
  350. mousekey_on(KC_MS_DOWN);
  351. mousekey_on(KC_MS_RIGHT);
  352. mousekey_send();
  353. } else {
  354. mousekey_off(KC_MS_DOWN);
  355. mousekey_off(KC_MS_RIGHT);
  356. mousekey_send();
  357. }
  358. break;
  359. default:
  360. // none
  361. break;
  362. }
  363. return MACRO_NONE;
  364. };
  365. // Runs just one time when the keyboard initializes.
  366. void matrix_init_user(void) {
  367. };
  368. // Runs constantly in the background, in a loop.
  369. void matrix_scan_user(void) {
  370. // shift or caps lock turns on red light
  371. if((keyboard_report->mods & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT))) || (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) {
  372. ergodox_right_led_1_on();
  373. } else {
  374. ergodox_right_led_1_off();
  375. }
  376. // Symbol layer turns on green light
  377. if(layer_state & (1UL<<SYMB)) {
  378. ergodox_right_led_2_on();
  379. } else {
  380. ergodox_right_led_2_off();
  381. }
  382. // Media layer turns on blue light
  383. if(layer_state & (1UL<<MDIA)) {
  384. ergodox_right_led_3_on();
  385. } else {
  386. ergodox_right_led_3_off();
  387. }
  388. };