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.

464 lines
12 KiB

Art userspace (#9068) * added git codes * started git layer * finished structure for git layer. MOD: replaced mouse with mod keys on right hand * layout changing layer * mod enter. default qwerty layer. removed mods on number layer * workman layout. git log, show. blank enter and bsspace * config layer. toggleable ctrl/alt for OS * removed keymap comments * strings and combos layers. sarcasm and ctrl_ctv. RGB configs * reintroduced enter and bspace. delete backspace as a function. git push -u and checkout -b * string macros * OS specific home/end * OS mac & win keys. N delete global backspace * refactored backspace functions * ctrl lctv macro * base layer toggle fix * whitespace * BS + L for FF and chrome * replaced 1 keycode with userspace * added userspace config * remove comments * add another keycode with a variable * moved all keymaps and codes to common file * ctrl z mod * removed ctrl z * sipmlified OS functions * moved is_win to keyboard level * added mac alt tab * added ctrl tab in mac + clean up variables in art.h * tild string macro. added mac left/right + home/end * mac ctrl backspace * enum layers for default layout * added ergodone keymap * ergodone compiles * clean up * clean up * removed obsolete OS_HOME/END * removed var * added ctrl nav to split75 * ergodone clean up + caps lock fix 75 * fix mac ctrl alt on right handside. added mac alt tab left right * fix ergodone config override * fixed alt left right not working on mac * added OS ctr_alt * mac ctrl del. fix tild * simplified tild macro * git stash apply * send_string_remembering_lenght * shifted strings print * restored KC_BSPACE functionality * moved KC_BSPC * numpad layer on Fn * media lights * ergodone final clean up * ergodone GIT AND MEDIA layers * ergodone GIT LAYER switch * default behaviour for all modified keys on BASE layer * refactored logic for default keycodes * ergodone final layers * ctrl_cav for translation and ctrl_l fix * toggleable layer with numpad * comments * numpad layer * Update users/art/config.h Co-authored-by: Joel Challis <git@zvecr.com> * enable dynamic macros for split75 * git branch and develop/master * removed esc from Nav * ergodone: ctrl alt for shift layer * macros and right alt for ergodone * fix ergodone N_backspace not working on git layers * mac language switch with alt+shift * Update users/art/art.c Co-authored-by: Ryan <fauxpark@gmail.com> * Update users/art/art.c Co-authored-by: Ryan <fauxpark@gmail.com> * Update users/art/art.c Co-authored-by: Ryan <fauxpark@gmail.com> * Update keyboards/ergodone/keymaps/art/keymap.c Co-authored-by: Ryan <fauxpark@gmail.com> * Update users/art/art.h Co-authored-by: Ryan <fauxpark@gmail.com> * flashing leds to indicate current os * using rshift on shifted layers Co-authored-by: Joel Challis <git@zvecr.com> Co-authored-by: Ryan <fauxpark@gmail.com>
4 years ago
  1. #include "art.h"
  2. #include "string.h"
  3. __attribute__ ((weak))
  4. bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
  5. return true;
  6. }
  7. __attribute__ ((weak))
  8. void led_show_current_os(void) {
  9. }
  10. static bool mac_ctrl_on = false; //for switching tabs
  11. static bool mac_gui_on = false; //for switching languages
  12. static bool mac_alt_tab_on = false; //for switching windows
  13. static const char *key_up[2] = {SS_UP(X_LALT), SS_UP(X_LCTL)};
  14. static const char *key_down[2] = {SS_DOWN(X_LALT), SS_DOWN(X_LCTL)};
  15. int char_to_del = 1;
  16. static bool sarcasm_on = false;
  17. static bool sarcasm_key = false;
  18. void backspace_n_times(int times) {
  19. for (int i=0; i<times; i++) {
  20. SEND_STRING(SS_TAP(X_BSPC));
  21. }
  22. }
  23. void send_string_remembering_length(char *string) {
  24. send_string(string);
  25. char_to_del = strlen(string);
  26. }
  27. void send_shifted_strings(char *string1, char *string2) {
  28. if ( get_mods() & MOD_MASK_SHIFT ) {
  29. clear_mods();
  30. send_string_remembering_length(string2);
  31. } else {
  32. send_string_remembering_length(string1);
  33. }
  34. }
  35. void send_shifted_strings_add(char *string1, char *string2) {
  36. bool shifted = get_mods() & MOD_MASK_SHIFT;
  37. clear_mods();
  38. send_string_remembering_length(string1);
  39. if (shifted) {
  40. send_string(string2);
  41. char_to_del = strlen(string1) + strlen(string2);
  42. }
  43. }
  44. bool is_mac_with_base_layer_off(void) {
  45. return !is_win && !layer_state_is(BASE);
  46. }
  47. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  48. if (sarcasm_on) {
  49. sarcasm_key = ! sarcasm_key;
  50. if (sarcasm_key) {
  51. SEND_STRING(SS_TAP(X_CAPS));
  52. }
  53. }
  54. //Checking all other non-backspace keys to clear the backspace buffer. This is to prevent the bug of deleting N chars sometime after using a macro
  55. if (record->event.pressed && (keycode != KC_BSPACE && keycode != XXXXXXX)) {
  56. char_to_del = 1;
  57. }
  58. switch (keycode) {
  59. case KC_TAB:
  60. if (record->event.pressed && is_mac_with_base_layer_off()) {
  61. uint8_t mods = get_mods();
  62. uint8_t mod_state = mods & MOD_MASK_ALT;
  63. if (get_mods() & mod_state) {
  64. del_mods(mod_state);
  65. add_mods(MOD_LCTL);
  66. mac_alt_tab_on = true;
  67. }
  68. mod_state = mods & MOD_MASK_CTRL;
  69. if (get_mods() & mod_state && !mac_alt_tab_on) {
  70. del_mods(mod_state);
  71. add_mods(MOD_LGUI);
  72. mac_ctrl_on = true;
  73. }
  74. }
  75. break;
  76. case KC_LSFT:
  77. if (record->event.pressed && is_mac_with_base_layer_off()) {
  78. uint8_t mods = get_mods();
  79. uint8_t mod_state = mods & MOD_MASK_AG;
  80. if (get_mods() & mod_state) {
  81. del_mods(mod_state);
  82. add_mods(MOD_LGUI);
  83. mac_gui_on = true;
  84. SEND_STRING(SS_TAP(X_SPACE));
  85. return false;
  86. } else {
  87. return true;
  88. }
  89. }
  90. break;
  91. case KC_LEFT:
  92. case KC_RIGHT:
  93. if (record->event.pressed && is_mac_with_base_layer_off()) {
  94. /* && !mac_ctrl_on/!mac_alt_tab_on are required since setting the state while holding the key changes
  95. the modifier from OS's perspective. As a result, just the pressed key cannot be the single source
  96. of truth to determine which state we're in, and a separate bool is required */
  97. uint8_t mods = get_mods();
  98. uint8_t mod_state = mods & MOD_MASK_ALT;
  99. //Allows Ctrl <-/-> on Mac if Ctrl Tab is already pressed
  100. if (get_mods() & mod_state && mac_alt_tab_on && !mac_ctrl_on) {
  101. del_mods(mod_state);
  102. add_mods(MOD_LCTL);
  103. }
  104. mod_state = mods & MOD_MASK_CTRL;
  105. if (get_mods() & mod_state && !mac_alt_tab_on) {
  106. del_mods(mod_state);
  107. add_mods(MOD_LALT);
  108. mac_ctrl_on = true;
  109. }
  110. }
  111. break;
  112. case KC_DEL:
  113. if (record->event.pressed && is_mac_with_base_layer_off()) {
  114. uint8_t mod_state = get_mods() & MOD_MASK_CTRL;
  115. if (get_mods() & mod_state) {
  116. del_mods(mod_state);
  117. add_mods(MOD_LALT);
  118. mac_ctrl_on = true;
  119. }
  120. }
  121. break;
  122. case KC_LALT:
  123. if (!record->event.pressed && is_mac_with_base_layer_off()) {
  124. if (mac_alt_tab_on) {
  125. unregister_mods(MOD_LCTL);
  126. mac_alt_tab_on = false;
  127. return false;
  128. } else if (mac_gui_on) {
  129. SEND_STRING(SS_UP(X_LGUI));
  130. mac_gui_on = false;
  131. return false;
  132. }
  133. }
  134. break;
  135. case KC_RALT:
  136. if (!record->event.pressed && mac_alt_tab_on && is_mac_with_base_layer_off()) {
  137. unregister_mods(MOD_LCTL);
  138. mac_alt_tab_on = false;
  139. return false;
  140. }
  141. break;
  142. case KC_LCTL:
  143. case KC_RCTL:
  144. if (!record->event.pressed && mac_ctrl_on && is_mac_with_base_layer_off()) {
  145. SEND_STRING(SS_UP(X_LGUI) SS_UP(X_LALT));
  146. mac_ctrl_on = false;
  147. return false;
  148. }
  149. break;
  150. case KC_HOME:
  151. if (record->event.pressed && is_mac_with_base_layer_off()) {
  152. SEND_STRING(SS_LCTL(SS_TAP(X_LEFT)));
  153. return false;
  154. }
  155. break;
  156. case KC_END:
  157. if (record->event.pressed && is_mac_with_base_layer_off()) {
  158. SEND_STRING(SS_LCTL(SS_TAP(X_RIGHT)));
  159. return false;
  160. }
  161. break;
  162. case KC_BSPC:
  163. if (record->event.pressed) {
  164. if (char_to_del > 1) {
  165. layer_off(GIT_C);
  166. layer_off(GIT_S);
  167. backspace_n_times(char_to_del);
  168. char_to_del = 1;
  169. return false;
  170. }
  171. if (is_mac_with_base_layer_off()) {
  172. uint8_t mod_state = get_mods() & MOD_MASK_CTRL;
  173. if (get_mods() & mod_state) {
  174. del_mods(mod_state);
  175. add_mods(MOD_LALT);
  176. mac_ctrl_on = true;
  177. }
  178. }
  179. }
  180. break;
  181. /* -------------------------------------------------------------------------
  182. * CUSTOM MACROS
  183. * ------------------------------------------------------------------------ */
  184. case CTRL_CTV:
  185. if (record->event.pressed) {
  186. if ( get_mods() & MOD_MASK_SHIFT ) {
  187. clear_mods();
  188. SEND_STRING(SS_LCTL("ctv"));
  189. } else {
  190. SEND_STRING(SS_LCTL("ctv") SS_TAP(X_ENTER));
  191. }
  192. }
  193. break;
  194. case CTRL_LCTV:
  195. if (record->event.pressed) {
  196. if ( get_mods() & MOD_MASK_SHIFT ) {
  197. //Firefox
  198. clear_mods();
  199. SEND_STRING(SS_LCTL("lcP"));
  200. wait_ms(200);
  201. SEND_STRING(SS_LCTL("v") SS_TAP(X_ENTER));
  202. } else if ( get_mods() & MOD_MASK_CTRL ) {
  203. //Chrome
  204. clear_mods();
  205. SEND_STRING(SS_LCTL("lcNv") SS_TAP(X_ENTER));
  206. } else {
  207. SEND_STRING(SS_LCTL("lctv"));
  208. }
  209. }
  210. break;
  211. case CTRL_CAV:
  212. if (record->event.pressed) {
  213. SEND_STRING(SS_LCTL("c" SS_TAP(X_TAB)));
  214. wait_ms(50);
  215. SEND_STRING(SS_LCTL("av"));
  216. }
  217. break;
  218. case SARCASM:
  219. if (record->event.pressed) {
  220. sarcasm_on = !sarcasm_on;
  221. }
  222. break;
  223. /* -------------------------------------------------------------------------
  224. * OS TOGGLING
  225. * ------------------------------------------------------------------------ */
  226. case TOG_OS:
  227. if (record->event.pressed) {
  228. is_win = ! is_win;
  229. led_show_current_os();
  230. }
  231. break;
  232. case CTR_ALT:
  233. if (record->event.pressed) {
  234. send_string(key_down[is_win]);
  235. } else {
  236. send_string(key_up[is_win]);
  237. }
  238. break;
  239. case OS_CTRL:
  240. if (is_win) {
  241. if (record->event.pressed) {
  242. SEND_STRING(SS_DOWN(X_LCTL));
  243. } else {
  244. SEND_STRING(SS_UP(X_LCTL));
  245. }
  246. } else {
  247. if (record->event.pressed) {
  248. SEND_STRING(SS_DOWN(X_LGUI));
  249. } else {
  250. SEND_STRING(SS_UP(X_LGUI));
  251. }
  252. }
  253. break;
  254. case OS_WIN:
  255. if (is_win) {
  256. if (record->event.pressed) {
  257. SEND_STRING(SS_DOWN(X_LGUI));
  258. } else {
  259. SEND_STRING(SS_UP(X_LGUI));
  260. }
  261. } else {
  262. if (record->event.pressed) {
  263. SEND_STRING(SS_DOWN(X_LCTL));
  264. } else {
  265. SEND_STRING(SS_UP(X_LCTL));
  266. }
  267. }
  268. break;
  269. /* -------------------------------------------------------------------------
  270. * STRING MACROS
  271. * ------------------------------------------------------------------------ */
  272. // case :
  273. // if (record->event.pressed) {
  274. // send_string_remembering_length("");
  275. // }
  276. // break;
  277. // case :
  278. // if (record->event.pressed) {
  279. // send_string_remembering_length("", "");
  280. // }
  281. // break;
  282. case TILD_BLOCK:
  283. if (record->event.pressed) {
  284. SEND_STRING("```" SS_LSFT(SS_TAP(X_ENTER) SS_TAP(X_ENTER)) "```" SS_TAP(X_UP));
  285. char_to_del = 4;
  286. }
  287. break;
  288. case ADMINS:
  289. if (record->event.pressed) {
  290. send_shifted_strings_add("admin", "/aurora/status");
  291. }
  292. break;
  293. case PRESCRIPTION:
  294. if (record->event.pressed) {
  295. SEND_STRING("55\t12122019\t");
  296. char_to_del = 8;
  297. }
  298. break;
  299. case FOURS:
  300. if (record->event.pressed) {
  301. SEND_STRING("4444333322221111\t1\t12\t21\t123\n");
  302. char_to_del = 16;
  303. }
  304. break;
  305. case G_ADD:
  306. if (record->event.pressed) {
  307. send_string_remembering_length("git add ");
  308. }
  309. break;
  310. case G_BRCH:
  311. if (record->event.pressed) {
  312. send_shifted_strings_add("git branch ", "-d ");
  313. }
  314. break;
  315. case G_C:
  316. if (record->event.pressed) {
  317. send_string_remembering_length("git c[Heckout/Ommit]");
  318. layer_on(GIT_C);
  319. }
  320. break;
  321. case G_CHEC:
  322. if (!record->event.pressed) {
  323. bool shifted = get_mods() & MOD_MASK_SHIFT;
  324. clear_mods();
  325. backspace_n_times(15);
  326. SEND_STRING("heckout ");
  327. char_to_del = 13;
  328. if (shifted) {
  329. SEND_STRING("-b ");
  330. char_to_del = 16;
  331. }
  332. layer_off(GIT_C);
  333. }
  334. break;
  335. case G_COMM:
  336. if (!record->event.pressed) {
  337. bool shifted = get_mods() & MOD_MASK_SHIFT;
  338. clear_mods();
  339. backspace_n_times(15);
  340. SEND_STRING("ommit -");
  341. char_to_del = 15;
  342. if (shifted) {
  343. SEND_STRING("a");
  344. char_to_del = 16;
  345. }
  346. SEND_STRING("m \"\"" SS_TAP(X_LEFT));
  347. layer_off(GIT_C);
  348. }
  349. break;
  350. case G_DEV:
  351. if (record->event.pressed) {
  352. send_shifted_strings("develop", "master");
  353. }
  354. break;
  355. case G_DIFF:
  356. if (record->event.pressed) {
  357. send_string_remembering_length("git diff ");
  358. }
  359. break;
  360. case G_FTCH:
  361. if (record->event.pressed) {
  362. send_string_remembering_length("git fetch ");
  363. }
  364. break;
  365. case G_LOG:
  366. if (record->event.pressed) {
  367. send_string_remembering_length("git log ");
  368. }
  369. break;
  370. case G_MERG:
  371. if (record->event.pressed) {
  372. send_string_remembering_length("git merge ");
  373. }
  374. break;
  375. case G_P:
  376. if (record->event.pressed) {
  377. send_shifted_strings_add("git pu", "sh -u ");
  378. }
  379. break;
  380. case G_RST:
  381. if (record->event.pressed) {
  382. send_string_remembering_length("git reset ");
  383. }
  384. break;
  385. case G_S:
  386. if (!record->event.pressed) {
  387. send_string_remembering_length("git s[taSh/How/taTus]");
  388. layer_on(GIT_S);
  389. }
  390. break;
  391. case G_SHOW:
  392. if (!record->event.pressed) {
  393. backspace_n_times(16);
  394. SEND_STRING("how ");
  395. char_to_del = 9;
  396. layer_off(GIT_S);
  397. }
  398. break;
  399. case G_STSH:
  400. if (!record->event.pressed) {
  401. bool shifted = get_mods() & MOD_MASK_SHIFT;
  402. clear_mods();
  403. backspace_n_times(16);
  404. SEND_STRING("tash ");
  405. char_to_del = 10;
  406. if (shifted) {
  407. clear_mods();
  408. SEND_STRING("apply ");
  409. char_to_del = 16;
  410. }
  411. layer_off(GIT_S);
  412. }
  413. break;
  414. case G_STAT:
  415. if (!record->event.pressed) {
  416. backspace_n_times(16);
  417. SEND_STRING("tatus ");
  418. char_to_del = 11;
  419. layer_off(GIT_S);
  420. }
  421. break;
  422. case CTL_ALT_START ... CTL_ALT_END:
  423. if (record->event.pressed) {
  424. if (is_win) {
  425. tap_code16(LCTL(keycode - CTL_ALT_START));
  426. } else {
  427. tap_code16(LALT(keycode - CTL_ALT_START));
  428. }
  429. }
  430. break;
  431. }
  432. return process_record_keymap(keycode, record);
  433. }