process_records.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include "ridingqwerty.h"
  4. #include "dict.h"
  5. __attribute__ ((weak))
  6. bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
  7. return true;
  8. }
  9. __attribute__ ((weak))
  10. bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
  11. return true;
  12. }
  13. /*
  14. typedef union {
  15. struct {
  16. uint8_t aesthetic : 1,
  17. spongebob : 1,
  18. uppercase : 1,
  19. australia : 1,
  20. unusued : 4;
  21. };
  22. uint8_t all;
  23. } mode_config_t;
  24. */
  25. mode_config_t mode = {.all = 0U};
  26. bool randword_seed = false;
  27. uint8_t user_mod_state;
  28. uint16_t rand_key;
  29. uint16_t temp_keycode;
  30. uint32_t user_key_timer;
  31. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  32. #ifdef CONSOLE_ENABLE
  33. uprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
  34. #endif
  35. temp_keycode = keycode;
  36. if ((mode.all != 0U) && ((keycode != DB(TAB) || keycode != ED(ESC)) && ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)))) {
  37. temp_keycode &= 0xFF;
  38. }
  39. if (mode.spongebob) {
  40. switch(temp_keycode) {
  41. case KC_A ... KC_Z:
  42. if (record->event.pressed) {
  43. (mode.uppercase ^= 1) == 0 ? tap_code16(S(temp_keycode)) : tap_code(temp_keycode);
  44. }
  45. return false;
  46. }
  47. }
  48. if (mode.aesthetic) {
  49. switch(temp_keycode) {
  50. #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE)
  51. case KC_A:
  52. if (record->event.pressed) {
  53. send_unicode_string("Λ ");
  54. }
  55. return false;
  56. case KC_E:
  57. if (record->event.pressed) {
  58. send_unicode_string("Ξ ");
  59. }
  60. return false;
  61. #else
  62. case A:
  63. case E:
  64. if (record->event.pressed) {
  65. tap_code16(S(temp_keycode));
  66. tap_code(KC_SPC);
  67. }
  68. return false;
  69. #endif
  70. case KC_B ... KC_D:
  71. case KC_F ... KC_Z:
  72. if (record->event.pressed) {
  73. tap_code16(S(temp_keycode));
  74. tap_code(KC_SPC);
  75. }
  76. return false;
  77. case KC_1 ... KC_0:
  78. if (record->event.pressed) {
  79. tap_code(temp_keycode);
  80. tap_code(KC_SPC);
  81. }
  82. return false;
  83. case KC_BSPC:
  84. if (record->event.pressed) {
  85. tap_code(KC_BSPC);
  86. tap_code(KC_BSPC);
  87. }
  88. return false;
  89. case KC_SPC:
  90. if (record->event.pressed) {
  91. tap_code(KC_SPC);
  92. tap_code(KC_SPC);
  93. tap_code(KC_SPC);
  94. }
  95. return false;
  96. }
  97. }
  98. if (mode.australia) {
  99. switch(temp_keycode) {
  100. // IDEMPOTENT
  101. case KC_L:
  102. case KC_O:
  103. case KC_S:
  104. case KC_Z:
  105. case KC_8:
  106. case KC_0:
  107. if (record->event.pressed) {
  108. tap_code(temp_keycode);
  109. tap_code(KC_LEFT);
  110. }
  111. return false;
  112. // INVERSE
  113. case KC_B:
  114. if (record->event.pressed) {
  115. tap_code(KC_Q);
  116. tap_code(KC_LEFT);
  117. }
  118. return false;
  119. case KC_Q:
  120. if (record->event.pressed) {
  121. tap_code(KC_B);
  122. tap_code(KC_LEFT);
  123. }
  124. return false;
  125. case KC_D:
  126. if (record->event.pressed) {
  127. tap_code(KC_P);
  128. tap_code(KC_LEFT);
  129. }
  130. return false;
  131. case KC_P:
  132. if (record->event.pressed) {
  133. tap_code(KC_D);
  134. tap_code(KC_LEFT);
  135. }
  136. return false;
  137. case KC_N:
  138. if (record->event.pressed) {
  139. tap_code(KC_U);
  140. tap_code(KC_LEFT);
  141. }
  142. return false;
  143. case KC_U:
  144. if (record->event.pressed) {
  145. tap_code(KC_N);
  146. tap_code(KC_LEFT);
  147. }
  148. return false;
  149. case KC_6:
  150. if (record->event.pressed) {
  151. tap_code(KC_9);
  152. tap_code(KC_LEFT);
  153. }
  154. return false;
  155. case KC_9:
  156. if (record->event.pressed) {
  157. tap_code(KC_6);
  158. tap_code(KC_LEFT);
  159. }
  160. return false;
  161. // TRANSLATE
  162. case KC_A:
  163. if (record->event.pressed) {
  164. register_unicode(0x0250); // ɐ
  165. tap_code(KC_LEFT);
  166. return false;
  167. }
  168. break;
  169. case KC_C:
  170. if (record->event.pressed) {
  171. register_unicode(0x0254); // ɔ
  172. tap_code(KC_LEFT);
  173. return false;
  174. }
  175. break;
  176. case KC_E:
  177. if (record->event.pressed) {
  178. register_unicode(0x01DD); // ǝ
  179. tap_code(KC_LEFT);
  180. return false;
  181. }
  182. break;
  183. case KC_F:
  184. if (record->event.pressed) {
  185. register_unicode(0x025F); // ɟ
  186. tap_code(KC_LEFT);
  187. return false;
  188. }
  189. break;
  190. case KC_G:
  191. if (record->event.pressed) {
  192. register_unicode(0x0183); // ƃ
  193. tap_code(KC_LEFT);
  194. return false;
  195. }
  196. break;
  197. case KC_H:
  198. if (record->event.pressed) {
  199. register_unicode(0x0265); // ɥ
  200. tap_code(KC_LEFT);
  201. return false;
  202. }
  203. break;
  204. case KC_I:
  205. if (record->event.pressed) {
  206. register_unicode(0x1D09); // ᴉ
  207. tap_code(KC_LEFT);
  208. return false;
  209. }
  210. break;
  211. case KC_J:
  212. if (record->event.pressed) {
  213. register_unicode(0x027E); // ɾ
  214. tap_code(KC_LEFT);
  215. return false;
  216. }
  217. break;
  218. case KC_K:
  219. if (record->event.pressed) {
  220. register_unicode(0x029E); // ʞ
  221. tap_code(KC_LEFT);
  222. return false;
  223. }
  224. break;
  225. case KC_M:
  226. if (record->event.pressed) {
  227. register_unicode(0x026F); // ɯ
  228. tap_code(KC_LEFT);
  229. return false;
  230. }
  231. break;
  232. case KC_R:
  233. if (record->event.pressed) {
  234. register_unicode(0x0279); // ɹ
  235. tap_code(KC_LEFT);
  236. return false;
  237. }
  238. break;
  239. case KC_T:
  240. if (record->event.pressed) {
  241. register_unicode(0x0287); // ʇ
  242. tap_code(KC_LEFT);
  243. return false;
  244. }
  245. break;
  246. case KC_V:
  247. if (record->event.pressed) {
  248. register_unicode(0x028C); // ʌ
  249. tap_code(KC_LEFT);
  250. return false;
  251. }
  252. break;
  253. case KC_W:
  254. if (record->event.pressed) {
  255. register_unicode(0x028D); // ʍ
  256. tap_code(KC_LEFT);
  257. return false;
  258. }
  259. break;
  260. case KC_X:
  261. if (record->event.pressed) {
  262. register_unicode(0x2717); // ✗
  263. tap_code(KC_LEFT);
  264. return false;
  265. }
  266. break;
  267. case KC_Y:
  268. if (record->event.pressed) {
  269. register_unicode(0x028E); // ʎ
  270. tap_code(KC_LEFT);
  271. return false;
  272. }
  273. break;
  274. case KC_1:
  275. if (record->event.pressed) {
  276. register_unicode(0x0269); // ɩ
  277. tap_code(KC_LEFT);
  278. return false;
  279. }
  280. break;
  281. case KC_2:
  282. if (record->event.pressed) {
  283. register_unicode(0x3139); // ㄹ
  284. tap_code(KC_LEFT);
  285. return false;
  286. }
  287. break;
  288. case KC_3:
  289. if (record->event.pressed) {
  290. register_unicode(0x0190); // Ɛ
  291. tap_code(KC_LEFT);
  292. return false;
  293. }
  294. break;
  295. case KC_4:
  296. if (record->event.pressed) {
  297. register_unicode(0x3123); // ㄣ
  298. tap_code(KC_LEFT);
  299. return false;
  300. }
  301. break;
  302. case KC_5:
  303. if (record->event.pressed) {
  304. register_unicode(0x03DB); // ϛ
  305. tap_code(KC_LEFT);
  306. return false;
  307. }
  308. break;
  309. case KC_7:
  310. if (record->event.pressed) {
  311. register_unicode(0x3125); // ㄥ
  312. tap_code(KC_LEFT);
  313. }
  314. return false;
  315. // CONTROLS
  316. case KC_ENT:
  317. if (record->event.pressed) {
  318. tap_code(KC_END);
  319. tap_code(KC_ENTER);
  320. }
  321. return false;
  322. case KC_BSPC:
  323. if (record->event.pressed) {
  324. tap_code(KC_DEL);
  325. }
  326. return false;
  327. case KC_SPC:
  328. if (record->event.pressed) {
  329. tap_code(KC_SPC);
  330. tap_code(KC_LEFT);
  331. }
  332. return false;
  333. }
  334. }
  335. switch(keycode) {
  336. case VERSION:
  337. if (!record->event.pressed) {
  338. send_string_with_delay_P(PSTR(QMK_KEYBOARD ":" QMK_KEYMAP "\nVersion:" QMK_VERSION ", built: " QMK_BUILDDATE "\n"), MACRO_TIMER);
  339. }
  340. break;
  341. case QWERTY ... COLEMAK:
  342. #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE)
  343. case GREEK ... HIRAGAN:
  344. #endif
  345. if (record->event.pressed) {
  346. //set_single_persistent_default_layer(keycode - QWERTY);
  347. default_layer_set(1U << (keycode - QWERTY));
  348. }
  349. break;
  350. case MAKE:
  351. if (record->event.pressed) {
  352. user_mod_state = get_mods() & MOD_MASK_CTRL;
  353. if (user_mod_state) {
  354. clear_mods();
  355. send_string_with_delay_P(PSTR("sleep 1 && "), MACRO_TIMER);
  356. }
  357. send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), MACRO_TIMER);
  358. if (user_mod_state) {
  359. send_string_with_delay_P(PSTR(":flash\n"), MACRO_TIMER);
  360. reset_keyboard();
  361. } else {
  362. send_string_with_delay_P(PSTR("\n"), MACRO_TIMER);
  363. }
  364. }
  365. break;
  366. case RNGWORD:
  367. if (randword_seed == false) {
  368. randword_seed = true;
  369. srand(timer_read32());
  370. }
  371. rand_key = rand() % NUMBER_OF_WORDS;
  372. if (record->event.pressed) {
  373. send_string(dict[rand_key]);
  374. tap_code(KC_SPC);
  375. }
  376. break;
  377. case RG_QUOT:
  378. if (record->event.pressed) {
  379. #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE)
  380. user_mod_state = get_mods() & MOD_MASK_ALT;
  381. if (user_mod_state) {
  382. unregister_mods(MOD_BIT(KC_RALT));
  383. register_unicode(0x00B0); // °
  384. set_mods(user_mod_state);
  385. return false;
  386. }
  387. #endif
  388. user_key_timer = timer_read32();
  389. layer_on(_NUMBER);
  390. register_mods(MOD_BIT(KC_RGUI));
  391. } else {
  392. unregister_mods(MOD_BIT(KC_RGUI));
  393. layer_off(_NUMBER);
  394. if (timer_elapsed32(user_key_timer) < TAPPING_TERM) {
  395. tap_code(KC_QUOT);
  396. }
  397. }
  398. return false; break;
  399. case TESTING:
  400. /*
  401. if (record->event.pressed) {
  402. int length = snprintf( NULL, 0, "%lu", test_number );
  403. char* str = malloc( length + 1 );
  404. snprintf( str, length + 1, "%lu", test_number );
  405. send_string(str);
  406. free(str);
  407. // make CFLAGS+="-lc -specs=nosys.specs" board:keymap
  408. }
  409. */
  410. break;
  411. case CCCV: // One key copy/paste
  412. if (record->event.pressed) {
  413. user_key_timer = timer_read32();
  414. } else {
  415. if (timer_elapsed32(user_key_timer) > TAPPING_TERM) { // Hold, copy
  416. register_code(KC_LCTL);
  417. tap_code(KC_C);
  418. unregister_code(KC_LCTL);
  419. } else { // Tap, paste
  420. register_code(KC_LCTL);
  421. tap_code(KC_V);
  422. unregister_code(KC_LCTL);
  423. }
  424. }
  425. break;
  426. case SEED:
  427. if (record->event.pressed) {
  428. srand(timer_read32());
  429. }
  430. break;
  431. case SARCASM:
  432. if (record->event.pressed) {
  433. if (!(mode.spongebob ^= 1)) { mode.all = 0U; };
  434. }
  435. break;
  436. case VPRWAVE:
  437. if (record->event.pressed) {
  438. if (!(mode.aesthetic ^= 1)) { mode.all = 0U; };
  439. }
  440. break;
  441. case STRAYA:
  442. if (record->event.pressed) {
  443. if (!(mode.australia ^= 1)) { mode.all = 0U; };
  444. }
  445. break;
  446. default:
  447. if (record->event.pressed && record->event.key.col == 4 && record->event.key.row == 1) {
  448. if (get_mods() & MOD_BIT(KC_RALT)) {
  449. unregister_mods(MOD_BIT(KC_RALT));
  450. //register_unicode(0x262D); // ☭
  451. tap_code(KC_BSPC);
  452. set_mods(MOD_BIT(KC_RALT));
  453. return false;
  454. }
  455. }
  456. break;
  457. }
  458. return process_record_keymap(keycode, record) &&
  459. process_record_secrets(keycode, record);
  460. }