process_records.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #include "process_records.h"
  2. #include "alt_tab.h"
  3. extern bool onMac;
  4. // ======== INCREMENTAL MACROS STUFF =============
  5. #define MAX_INCREMENTAL_MACRO 20
  6. #define TAP_ROTATION_TIMEOUT 400
  7. uint16_t latest_kc = 0;
  8. uint16_t latest_rotation = 0;
  9. int key_count = 0;
  10. const char incremental_macros[][MAX_INCREMENTAL_MACRO] = {"String1" SS_TAP(X_HOME) "X-", "String2" SS_TAP(X_HOME)};
  11. bool process_incremental_macro(uint16_t kc) {
  12. if (kc < INC_MACROS_START || kc > INC_MACROS_END) {
  13. return false;
  14. }
  15. int macro_idx = (int)(kc - INC_MACROS_START) - 1;
  16. char tempstring[3] = {0};
  17. tempstring[0] = incremental_macros[macro_idx][key_count];
  18. // Special cases of SS_TAP SS_UP and SS_DOWN, they require two characters so get both once and skip on next iteration
  19. if (tempstring[0] == '\1' || tempstring[0] == '\2' || tempstring[0] == '\3') {
  20. tempstring[1] = incremental_macros[macro_idx][++key_count];
  21. }
  22. if (tempstring[0] == '\0') {
  23. key_count = 0;
  24. }
  25. send_string(tempstring);
  26. return true;
  27. };
  28. void refresh_incremental_macros(uint16_t kc) {
  29. if (kc == latest_kc) {
  30. if ((timer_elapsed(latest_rotation) > TAP_ROTATION_TIMEOUT) || (key_count >= MAX_INCREMENTAL_MACRO))
  31. key_count = 0;
  32. else
  33. key_count++;
  34. } else {
  35. key_count = 0;
  36. latest_kc = kc;
  37. }
  38. latest_rotation = timer_read();
  39. }
  40. // Send control or GUI depending if we are on windows or mac
  41. bool CMD(uint16_t kc) {
  42. if (onMac) {
  43. tap_code16(LGUI(kc));
  44. } else {
  45. tap_code16(LCTL(kc));
  46. }
  47. return false;
  48. }
  49. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  50. bool pressed = record->event.pressed;
  51. if (pressed) {
  52. refresh_incremental_macros(keycode);
  53. if (process_incremental_macro(keycode)) {
  54. return false;
  55. }
  56. switch (keycode) {
  57. case MAC_TGL:
  58. onMac = !onMac;
  59. onMac ? SEND_STRING("On mac") : SEND_STRING("Not on MAC");
  60. return false;
  61. }
  62. }
  63. switch (keycode) {
  64. case QWERTY:
  65. if (record->event.pressed) {
  66. #ifdef AUDIO_ENABLE
  67. PLAY_SONG(tone_qwerty);
  68. #endif
  69. layer_on(_QWERTY);
  70. }
  71. return false;
  72. case LOWER:
  73. if (record->event.pressed) {
  74. layer_on(_LOWER);
  75. } else {
  76. layer_off(_LOWER);
  77. }
  78. return false;
  79. case RAISE:
  80. if (record->event.pressed) {
  81. layer_on(_RAISE);
  82. } else {
  83. layer_off(_RAISE);
  84. }
  85. return false;
  86. case ADJUST:
  87. if (record->event.pressed) {
  88. layer_on(_ADJUST);
  89. } else {
  90. layer_off(_ADJUST);
  91. }
  92. return false;
  93. // == Macros START ===
  94. case IARROW:
  95. if (record->event.pressed) SEND_STRING("<-");
  96. return false;
  97. case ARROW:
  98. if (record->event.pressed) SEND_STRING("->");
  99. return false;
  100. case F_ARROW:
  101. if (record->event.pressed) SEND_STRING("=>");
  102. return false;
  103. case GREP:
  104. if (record->event.pressed) SEND_STRING(" | grep ");
  105. return false;
  106. case CLN_EQ:
  107. if (record->event.pressed) SEND_STRING(":=");
  108. return false;
  109. // == Macros END ===
  110. // == Multi Os START ===
  111. case KC_HOME: // make the home behave the same on OSX
  112. if (record->event.pressed && onMac) {
  113. SEND_STRING(SS_LCTRL("a"));
  114. return false;
  115. }
  116. case KC_END: // make the end behave the same on OSX
  117. if (record->event.pressed && onMac) {
  118. tap_code16(C(KC_E));
  119. return false;
  120. }
  121. case AC_A: // Accent á
  122. if (record->event.pressed) SEND_STRING(SS_LALT("e") "a");
  123. return false;
  124. case AC_E: // Accent é
  125. if (record->event.pressed) SEND_STRING(SS_LALT("e") "e");
  126. return false;
  127. case AC_I: // Accent í
  128. if (record->event.pressed) SEND_STRING(SS_LALT("e") "i");
  129. return false;
  130. case AC_O: // Accent ó
  131. if (record->event.pressed) SEND_STRING(SS_LALT("e") "o");
  132. return false;
  133. case CUT:
  134. if (record->event.pressed) return CMD(KC_X);
  135. case COPY:
  136. if (record->event.pressed) {
  137. onMac ? SEND_STRING(SS_LGUI("c")) : SEND_STRING(SS_LCTRL("c"));
  138. }
  139. return false;
  140. case PASTE:
  141. if (record->event.pressed) {
  142. onMac ? SEND_STRING(SS_LGUI("v")) : SEND_STRING(SS_LCTRL("v"));
  143. }
  144. return false;
  145. case SAVE:
  146. if (record->event.pressed) {
  147. onMac ? SEND_STRING(SS_LGUI("s")) : SEND_STRING(SS_LCTRL("s"));
  148. }
  149. return false;
  150. case UNDO:
  151. if (record->event.pressed) {
  152. onMac ? SEND_STRING(SS_LGUI("z")) : SEND_STRING(SS_LCTRL("z"));
  153. }
  154. return false;
  155. case REDO:
  156. if (record->event.pressed) {
  157. onMac ? SEND_STRING(SS_LGUI(SS_LSFT("z"))) : SEND_STRING(SS_LCTRL("y"));
  158. }
  159. return false;
  160. case FIND:
  161. if (record->event.pressed) {
  162. onMac ? SEND_STRING(SS_LGUI("f")) : SEND_STRING(SS_LCTRL("f"));
  163. }
  164. return false;
  165. case WIN_TO_RIGHT:
  166. if (record->event.pressed) {
  167. onMac ? tap_code16(SGUI(A(KC_RIGHT))) : tap_code16(G(KC_RIGHT));
  168. }
  169. return false;
  170. case WIN_TO_LEFT:
  171. if (record->event.pressed) {
  172. onMac ? tap_code16(SGUI(A(KC_LEFT))) : tap_code16(G(KC_LEFT));
  173. }
  174. return false;
  175. case CHG_LAYOUT:
  176. if (record->event.pressed) {
  177. onMac ? SEND_STRING(SS_LCTRL(" ")) : SEND_STRING(SS_LCTRL("f"));
  178. }
  179. return false;
  180. // == Multi Os END ===
  181. #ifdef RGBLIGHT_ENABLE
  182. case RGB_SLD:
  183. if (record->event.pressed) {
  184. rgblight_mode(1);
  185. }
  186. return false;
  187. break;
  188. // First time alt + tab, and alt stays sticky. Next press we just send tab. Any other key releases the alt
  189. #endif
  190. }
  191. // =============== ALT_TAB single key handling
  192. return process_alt_tab(keycode, record);
  193. };