keymap.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. /*
  2. Copyright 2018 Jacob Jerrell <jacob.jerrell@gmail.com>
  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. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. #include QMK_KEYBOARD_H
  15. #include "bocaj.h"
  16. #ifdef UNICODEMAP_ENABLE
  17. #include "bocaj_unicode.h"
  18. #endif // UNICODEMAP_ENABLE
  19. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  20. /* Software Workman / QWERTY - http://www.keyboard-layout-editor.com/#/gists/b6c016a22a9d31381a276a603a42fe5f
  21. .---------------------------------------------. .---------------------------------------------.
  22. | ESC | 1 | 2 | 3 | 4 | 5 | -> | ! - | 6 | 7 | 8 | 9 | 0 | = |
  23. !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
  24. | DEL | Q | W | E | R | T | ( | ! ) | Y | U | I | O | P | \ |
  25. !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
  26. | ADJST | A | S | D | F | G |-------! !-------! H | J | K | L | ; | ' |
  27. !-------+-----+-----+-----x-----x-----! HYP ! ! MEH !-----x-----x-----+-----+-----+-------!
  28. | SHIFT | Z | X | C | V | B | { | ! } | N | M | , | . | / | SHIFT |
  29. '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
  30. | GAME | NUM | VRS | UP | LFT | .---------------. .---------------. ! RGT | DWN | RSE | LWR | ADJ |
  31. '------------------------------' | APP | HOME | ! PGUP | ESC | '------------------------------'
  32. .-------+-------+-------! !-------+-------+-------.
  33. ! SPACE ! | END | ! PGDN | ! ENTER !
  34. ! / ! BSPCE !-------! !-------! TAB ! / !
  35. | LOWER | | COPY | ! PASTE | | RAISE |
  36. '-----------------------' '-----------------------'
  37. */
  38. [_SWRKMN] = LAYOUT_ergodox_pretty_wrapper(
  39. KC_ESC, ______________________NUMBER_LEFT________________________, JJ_ARRW, KC_MINUS, ______________________NUMBER_RIGHT_______________________, KC_EQUAL,
  40. KC_DEL, _______________________SWORKMAN_L1_______________________, KC_LPRN, KC_RPRN, _______________________SWORKMAN_R1_______________________, KC_BSLS,
  41. KC_ADJS,_______________________SWORKMAN_L2_______________________, _______________________SWORKMAN_R2_______________________, KC_QUOTE,
  42. KC_LSFT,_______________________SWORKMAN_L3_______________________, HYP_LBK, MEH_RBK, _______________________SWORKMAN_R3_______________________, KC_RSFT,
  43. ___________________ERGODOX_BOTTOM_LEFT___________________, ___________________ERGODOX_BOTTOM_RIGHT__________________,
  44. ______________________ERGODOX_THUMBS_____________________
  45. ),
  46. /* Hardware Workman - http://www.keyboard-layout-editor.com/#/gists/7a07cb982ec3597ba3e3d947554225f1
  47. .---------------------------------------------. .---------------------------------------------.
  48. | ESC | 1 | 2 | 3 | 4 | 5 | -> | ! - | 6 | 7 | 8 | 9 | 0 | = |
  49. !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
  50. | DEL | Q | D | R | W | B | ( | ! ) | J | F | U | P | ; | \ |
  51. !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
  52. | ADJST | A | S | H | T | G |-------! !-------! Y | N | E | O | I | ' |
  53. !-------+-----+-----+-----x-----x-----! HYP ! ! MEH !-----x-----x-----+-----+-----+-------!
  54. | SHIFT | Z | X | M | C | V | { | ! } | K | L | , | . | / | SHIFT |
  55. '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
  56. | GAME | NUM | VRS | UP | LFT | .---------------. .---------------. ! RGT | DWN | RSE | LWR | ADJ |
  57. '------------------------------' | APP | HOME | ! PGUP | ESC | '------------------------------'
  58. .-------+-------+-------! !-------+-------+-------.
  59. ! SPACE ! | END | ! PGDN | ! ENTER !
  60. ! / ! BSPCE !-------! !-------! TAB ! / !
  61. | LOWER | | COPY | ! PASTE | | RAISE |
  62. '-----------------------' '-----------------------'
  63. */
  64. [_HWRKMN] = LAYOUT_ergodox_pretty_wrapper(
  65. KC_ESC, ______________________NUMBER_LEFT________________________, JJ_ARRW, KC_MINUS, ______________________NUMBER_RIGHT_______________________, KC_EQUAL,
  66. KC_DEL, _______________________HWORKMAN_L1_______________________, KC_LPRN, KC_RPRN, _______________________HWORKMAN_R1_______________________, KC_BSLS,
  67. KC_ADJS,_______________________HWORKMAN_L2_______________________, _______________________HWORKMAN_R2_______________________, KC_QUOTE,
  68. KC_LSFT,_______________________HWORKMAN_L3_______________________, HYP_LBK, MEH_RBK, _______________________HWORKMAN_R3_______________________, KC_RSFT,
  69. ___________________ERGODOX_BOTTOM_LEFT___________________, ___________________ERGODOX_BOTTOM_RIGHT__________________,
  70. ______________________ERGODOX_THUMBS_____________________
  71. ),
  72. /* Lower - http://www.keyboard-layout-editor.com/#/gists/f1d745a88d1c48ab55e095efd9e7a43a
  73. .---------------------------------------------. .---------------------------------------------.
  74. | | F1 | F2 | F3 | F4 | F5 | | ! | F6 | F7 | F8 | F9 | F10 | |
  75. !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
  76. | ` | 1 | 2 | 3 | 4 | 5 | | ! | 6 | 7 | 8 | 9 | 0 | |
  77. !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
  78. | | | | | | |-------! !-------! | | | | | |
  79. !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
  80. | | | | | | | | ! | | | | | | |
  81. '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
  82. | | | | | | .---------------. .---------------. ! | | | | |
  83. '------------------------------' | | | ! | | '------------------------------'
  84. .-------+-------+-------! !-------+-------+-------.
  85. ! ! | | ! | ! !
  86. ! ! !-------! !-------! ! !
  87. | | | | ! | | |
  88. '-----------------------' '-----------------------'
  89. */
  90. [_LOWER] = LAYOUT_ergodox_pretty_wrapper(
  91. _______,_______________________FUNC_LEFT_________________________, _______, _______, _______________________FUNC_RIGHT________________________, _______,
  92. KC_GRV ,______________________NUMBER_LEFT________________________, _______, _______, ______________________NUMBER_RIGHT_______________________, _______,
  93. _______,_________________________________________________________, _________________________________________________________, _______,
  94. _______,_________________________________________________________, _______, _______, _________________________________________________________, _______,
  95. _________________________________________________________, _________________________________________________________,
  96. ______________________ERGODOX_THUMBS_____________________
  97. ),
  98. /* Raise - http://www.keyboard-layout-editor.com/#/gists/e0f591ec2ce9f24675a02d15c7048b25
  99. .---------------------------------------------. .---------------------------------------------.
  100. | | F1 | F2 | F3 | F4 | F5 | | ! _ | F6 | F7 | F8 | F9 | F10 | |
  101. !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
  102. | ~ | ! | @ | # | $ | % | | ! | ^ | & | * | ( | ) | |
  103. !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
  104. | | | | | | |-------! !-------! | | | | | |
  105. !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
  106. | | | | | | | | ! | | | | | | |
  107. '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
  108. | | | | | | .---------------. .---------------. ! | | | | |
  109. '------------------------------' | | | ! | | '------------------------------'
  110. .-------+-------+-------! !-------+-------+-------.
  111. ! ! | | ! | ! !
  112. ! ! !-------! !-------! ! !
  113. | | | | ! | | |
  114. '-----------------------' '-----------------------'
  115. */
  116. [_RAISE] = LAYOUT_ergodox_pretty_wrapper(
  117. _______,_______________________FUNC_LEFT_________________________, _______, KC_UNDS, _______________________FUNC_RIGHT________________________, _______,
  118. KC_TILD,______________________SPECIAL_LEFT_______________________, _______, _______, ______________________SPECIAL_RIGHT______________________, _______,
  119. _______,_________________________________________________________, _________________________________________________________, _______,
  120. _______,_________________________________________________________, _______, _______, _________________________________________________________, _______,
  121. _________________________________________________________, _________________________________________________________,
  122. ______________________ERGODOX_THUMBS_____________________
  123. ),
  124. /* Adjust - http://www.keyboard-layout-editor.com/#/gists/dedeae17b35a5d5f745a42aaea78f007
  125. .---------------------------------------------. .---------------------------------------------.
  126. | | | | | | | EPRM | ! EPRM | | | | | | |
  127. !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
  128. | | | | | | | | ! | | 7 | 8 | 9 | * | |
  129. !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
  130. | | 🔇 | 🔉 | 🔊 | LCK | |-------! !-------! | 4 | 5 | 6 | + | SWRKM |
  131. !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
  132. | | | | | | | | ! | | 1 | 2 | 3 | - | HWRKM |
  133. '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
  134. | | | | | | .---------------. .---------------. ! 0 | . | , | = | |
  135. '------------------------------' | | | ! | | '------------------------------'
  136. .-------+-------+-------! !-------+-------+-------.
  137. ! ! | | ! | ! !
  138. ! ! !-------! !-------! ! !
  139. | | | | ! | | |
  140. '-----------------------' '-----------------------'
  141. */
  142. [_ADJUST] = LAYOUT_ergodox_pretty_wrapper(
  143. XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, KC_EPRM, KC_EPRM, XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX,
  144. XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, KC_PAST, XXXXXXX,
  145. _______,KC__MUTE, KC__VOLDOWN, KC__VOLUP, MC_LOCK, XXXXXXX, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, KC_SWRK,
  146. XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, KC_PMNS, KC_HWRK,
  147. XXXXXXX,_______,XXXXXXX,XXXXXXX,XXXXXXX, KC_KP_0, KC_PDOT, KC_COMM, KC_PEQL, _______,
  148. ______________________ERGODOX_THUMBS_____________________
  149. ),
  150. // Diablo - http://www.keyboard-layout-editor.com/#/gists/28476e4237e77d4835ac8a9d7e5f9b2c
  151. [_DIABLO] = LAYOUT_ergodox_pretty_wrapper(
  152. KC_ESC , KC_V , KC_D ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  153. KC_TAB , KC_S , KC_I , KC_F , KC_T , KC_J ,XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, XXXXXXX, XXXXXXX,
  154. KC_Q , KC_1 , KC_2 , KC_3 , KC_4 , KC_M , XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, XXXXXXX, XXXXXXX,
  155. KC_LSFT,KC_D3_1 ,KC_D3_2 ,KC_D3_3 ,KC_D3_4 ,XXXXXXX ,XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, XXXXXXX, XXXXXXX,
  156. _______,ALT_T(KC_Z) ,KC_G ,KC_Y ,XXXXXXX , KC_KP_0, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  157. XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,
  158. XXXXXXX, XXXXXXX,
  159. KC_BTN1,KC_BTN2,KC_DIABLO_CLEAR, XXXXXXX,XXXXXXX,XXXXXXX
  160. )
  161. };
  162. // Defines actions for my custom keycodes
  163. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  164. switch (keycode) {
  165. // KC_COPY and KC_PASTE have problems with different hardware/software mappings
  166. // e.g. If the mappings conflict, KC_COPY will send Cmd+M which minimizes the
  167. // window and is very annoying. JJ_COPY and JJ_PASTE fix this by sending the
  168. // raw character rather than the KC_* code
  169. case JJ_COPY:
  170. if (!record->event.pressed) {
  171. SEND_STRING(SS_LGUI("c"));
  172. }
  173. return false;
  174. break;
  175. case JJ_PASTE:
  176. if (!record->event.pressed) {
  177. SEND_STRING(SS_LGUI("v"));
  178. }
  179. return false;
  180. break;
  181. case JJ_ARRW:
  182. if (!record->event.pressed) {
  183. SEND_STRING("->");
  184. }
  185. return false;
  186. break;
  187. case KC_SWRK:
  188. if (!record->event.pressed) {
  189. set_single_persistent_default_layer(_SWRKMN);
  190. layer_move(_SWRKMN);
  191. ergodox_blink_all_leds();
  192. ergodox_blink_all_leds();
  193. }
  194. return false;
  195. break;
  196. case KC_HWRK:
  197. if (!record->event.pressed) {
  198. set_single_persistent_default_layer(_HWRKMN);
  199. layer_move(_HWRKMN);
  200. ergodox_blink_all_leds();
  201. ergodox_blink_all_leds();
  202. }
  203. return false;
  204. break;
  205. case KC_EPRM:
  206. if (!record->event.pressed) {
  207. ergodox_blink_all_leds();
  208. eeconfig_init();
  209. }
  210. return false;
  211. break;
  212. case MC_LOCK:
  213. if (!record->event.pressed) {
  214. layer_move(_HWRKMN);
  215. SEND_STRING(SS_LCTRL(SS_LGUI("q")));
  216. }
  217. return false;
  218. break;
  219. case KC_DIABLO_CLEAR:
  220. #ifdef TAP_DANCE_ENABLE
  221. if (record->event.pressed) {
  222. uint8_t dtime;
  223. for (dtime = 0; dtime < 4; dtime++) {
  224. diablo_key_time[dtime] = diablo_times[0];
  225. }
  226. }
  227. #endif // TAP_DANCE_ENABLE
  228. return false;
  229. break;
  230. }
  231. return true;
  232. }
  233. void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); };
  234. // Diablo III Fun stuff
  235. //define diablo macro timer variables
  236. uint16_t diablo_timer[4];
  237. uint8_t diablo_times[] = { 0, 1, 3, 5, 10, 30 };
  238. uint8_t diablo_key_time[4];
  239. // has the correct number of seconds elapsed (as defined by diablo_times)
  240. bool check_dtimer(uint8_t dtimer) { return (timer_elapsed(diablo_timer[dtimer]) < (diablo_key_time[dtimer] * 1000)) ? false : true; };
  241. // Cycle through the times for the macro, starting at 0, for disabled.
  242. // Max of six values, so don't exceed
  243. void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data, uint8_t diablo_key) {
  244. if (state->count >= 7) {
  245. diablo_key_time[diablo_key] = diablo_times[0];
  246. reset_tap_dance(state);
  247. } else {
  248. diablo_key_time[diablo_key] = diablo_times[state->count - 1];
  249. }
  250. }
  251. // Would rather have one function for all of this, but no idea how to do that...
  252. void diablo_tapdance1(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 0); }
  253. void diablo_tapdance2(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 1); }
  254. void diablo_tapdance3(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 2); }
  255. void diablo_tapdance4(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 3); }
  256. //Tap Dance Definitions
  257. qk_tap_dance_action_t tap_dance_actions[] = {
  258. // tap once to disable, and more to enable timed micros
  259. [TD_D3_1] = ACTION_TAP_DANCE_FN(diablo_tapdance1),
  260. [TD_D3_2] = ACTION_TAP_DANCE_FN(diablo_tapdance2),
  261. [TD_D3_3] = ACTION_TAP_DANCE_FN(diablo_tapdance3),
  262. [TD_D3_4] = ACTION_TAP_DANCE_FN(diablo_tapdance4),
  263. };
  264. // Sends the key press to system, but only if on the Diablo layer
  265. void send_diablo_keystroke(uint8_t diablo_key) {
  266. if (biton32(layer_state) == _DIABLO) {
  267. switch (diablo_key) {
  268. case 0:
  269. tap(KC_1); break;
  270. case 1:
  271. tap(KC_2); break;
  272. case 2:
  273. tap(KC_3); break;
  274. case 3:
  275. tap(KC_4); break;
  276. }
  277. }
  278. }
  279. // Checks each of the 4 timers/keys to see if enough time has elapsed
  280. // Runs the "send string" command if enough time has passed, and resets the timer.
  281. void run_diablo_macro_check(void) {
  282. uint8_t dtime;
  283. for (dtime = 0; dtime < 4; dtime++) {
  284. if (check_dtimer(dtime) && diablo_key_time[dtime]) {
  285. diablo_timer[dtime] = timer_read();
  286. send_diablo_keystroke(dtime);
  287. }
  288. }
  289. }
  290. void matrix_scan_user(void) {
  291. uint8_t layer = biton32(layer_state);
  292. ergodox_board_led_off();
  293. ergodox_right_led_1_off();
  294. ergodox_right_led_2_off();
  295. ergodox_right_led_3_off();
  296. switch (layer) {
  297. /*
  298. Lights are treated as binary here for easy identification.
  299. LED1 = 4; LED2 = 2; LED1 = 1
  300. This allows for up to 8 identified layers (default layers being no lights on)
  301. Which is way more than I should ever need
  302. */
  303. case _LOWER:
  304. ergodox_right_led_3_on();
  305. ergodox_right_led_3_set(10); // Default brightness is deadly in a dark room
  306. break;
  307. case _RAISE:
  308. ergodox_right_led_2_on();
  309. ergodox_right_led_2_set(10);
  310. break;
  311. case _ADJUST:
  312. ergodox_right_led_2_on();
  313. ergodox_right_led_2_set(10);
  314. ergodox_right_led_3_on();
  315. ergodox_right_led_3_set(10);
  316. break;
  317. case _DIABLO:
  318. ergodox_right_led_1_on();
  319. ergodox_right_led_1_set(10);
  320. break;
  321. default:
  322. // none
  323. break;
  324. }
  325. #ifdef TAP_DANCE_ENABLE
  326. run_diablo_macro_check();
  327. #endif
  328. };