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.

197 lines
6.4 KiB

  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. layer_on(_QWERTY);
  67. }
  68. return false;
  69. case LOWER:
  70. if (record->event.pressed) {
  71. layer_on(_LOWER);
  72. } else {
  73. layer_off(_LOWER);
  74. }
  75. return false;
  76. case RAISE:
  77. if (record->event.pressed) {
  78. layer_on(_RAISE);
  79. } else {
  80. layer_off(_RAISE);
  81. }
  82. return false;
  83. case ADJUST:
  84. if (record->event.pressed) {
  85. layer_on(_ADJUST);
  86. } else {
  87. layer_off(_ADJUST);
  88. }
  89. return false;
  90. // == Macros START ===
  91. case IARROW:
  92. if (record->event.pressed) SEND_STRING("<-");
  93. return false;
  94. case ARROW:
  95. if (record->event.pressed) SEND_STRING("->");
  96. return false;
  97. case F_ARROW:
  98. if (record->event.pressed) SEND_STRING("=>");
  99. return false;
  100. case GREP:
  101. if (record->event.pressed) SEND_STRING(" | grep ");
  102. return false;
  103. case CLN_EQ:
  104. if (record->event.pressed) SEND_STRING(":=");
  105. return false;
  106. // == Macros END ===
  107. // == Multi Os START ===
  108. case KC_HOME: // make the home behave the same on OSX
  109. if (record->event.pressed && onMac) {
  110. SEND_STRING(SS_LCTRL("a"));
  111. return false;
  112. }
  113. case KC_END: // make the end behave the same on OSX
  114. if (record->event.pressed && onMac) {
  115. tap_code16(C(KC_E));
  116. return false;
  117. }
  118. case AC_A: // Accent á
  119. if (record->event.pressed) SEND_STRING(SS_LALT("e") "a");
  120. return false;
  121. case AC_E: // Accent é
  122. if (record->event.pressed) SEND_STRING(SS_LALT("e") "e");
  123. return false;
  124. case AC_I: // Accent í
  125. if (record->event.pressed) SEND_STRING(SS_LALT("e") "i");
  126. return false;
  127. case AC_O: // Accent ó
  128. if (record->event.pressed) SEND_STRING(SS_LALT("e") "o");
  129. return false;
  130. case CUT:
  131. if (record->event.pressed) return CMD(KC_X);
  132. case COPY:
  133. if (record->event.pressed) {
  134. onMac ? SEND_STRING(SS_LGUI("c")) : SEND_STRING(SS_LCTRL("c"));
  135. }
  136. return false;
  137. case PASTE:
  138. if (record->event.pressed) {
  139. onMac ? SEND_STRING(SS_LGUI("v")) : SEND_STRING(SS_LCTRL("v"));
  140. }
  141. return false;
  142. case SAVE:
  143. if (record->event.pressed) {
  144. onMac ? SEND_STRING(SS_LGUI("s")) : SEND_STRING(SS_LCTRL("s"));
  145. }
  146. return false;
  147. case UNDO:
  148. if (record->event.pressed) {
  149. onMac ? SEND_STRING(SS_LGUI("z")) : SEND_STRING(SS_LCTRL("z"));
  150. }
  151. return false;
  152. case REDO:
  153. if (record->event.pressed) {
  154. onMac ? SEND_STRING(SS_LGUI(SS_LSFT("z"))) : SEND_STRING(SS_LCTRL("y"));
  155. }
  156. return false;
  157. case FIND:
  158. if (record->event.pressed) {
  159. onMac ? SEND_STRING(SS_LGUI("f")) : SEND_STRING(SS_LCTRL("f"));
  160. }
  161. return false;
  162. case WIN_TO_RIGHT:
  163. if (record->event.pressed) {
  164. onMac ? tap_code16(SGUI(A(KC_RIGHT))) : tap_code16(G(KC_RIGHT));
  165. }
  166. return false;
  167. case WIN_TO_LEFT:
  168. if (record->event.pressed) {
  169. onMac ? tap_code16(SGUI(A(KC_LEFT))) : tap_code16(G(KC_LEFT));
  170. }
  171. return false;
  172. case CHG_LAYOUT:
  173. if (record->event.pressed) {
  174. onMac ? SEND_STRING(SS_LCTRL(" ")) : SEND_STRING(SS_LCTRL("f"));
  175. }
  176. return false;
  177. // == Multi Os END ===
  178. #ifdef RGBLIGHT_ENABLE
  179. case RGB_SLD:
  180. if (record->event.pressed) {
  181. rgblight_mode(1);
  182. }
  183. return false;
  184. break;
  185. // First time alt + tab, and alt stays sticky. Next press we just send tab. Any other key releases the alt
  186. #endif
  187. }
  188. // =============== ALT_TAB single key handling
  189. return process_alt_tab(keycode, record);
  190. };