2
0

spacebarracecar.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. #pragma once
  2. #include "quantum.h"
  3. #include "keymap_german.h"
  4. enum userspace_layers {
  5. _DEADKEY = 14, // Change if more than 16 layers are required
  6. _NAV
  7. };
  8. enum userspace_custom_keycodes {
  9. CU_GAME = SAFE_RANGE, // Toggle game mode on/off
  10. CU_NAV, // NAV | ESC
  11. KC_P00, // Numpad double zero
  12. #ifdef GERMAN_ENABLE
  13. CU_LSFT, // LSFT | (
  14. CU_RSFT, // LSFT | )
  15. CU_COMM, // , | <
  16. CU_DOT, // . | >
  17. CU_SLSH, // / | ?
  18. CU_SCLN, // ; | :
  19. CU_QUOT, // ' | Enable deadkey layer
  20. CU_GRV, // ` | ~
  21. CU_CIRC, // ^
  22. CU_3, // 3 | #
  23. CU_6, // 6 | ^
  24. CU_7, // 7 | &
  25. CU_8, // 8 | *
  26. CU_9, // 9 | (
  27. CU_0, // 0 | )
  28. CU_EQL, // = | +
  29. CU_LBRC, // [ | {
  30. CU_RBRC, // ] | }
  31. CU_BSLS, // \ | |
  32. CU_Z, // Z | Y in conjunction with ctrl
  33. CU_Y, // Y | Z in conjunction wiht ctrl
  34. CU_ESCT, // Toggle escape of grv and circ on/off
  35. // Deadkey Layer
  36. CU_AE, // Ä
  37. CU_OE, // Ö
  38. CU_UE, // Ü
  39. CU_SS, // ß
  40. CU_DDQ, // "
  41. CU_ED, // Escape deadkey layer
  42. #endif
  43. #ifdef RGBLIGHT_ENABLE
  44. CU_RGBV, // Cycle through RGB brightness
  45. #endif
  46. NEW_SAFE_RANGE // Use for keymap specific keycodes
  47. };
  48. #ifdef GERMAN_ENABLE
  49. extern bool lshift;
  50. extern bool rshift;
  51. extern bool lshiftp;
  52. extern bool rshiftp;
  53. extern uint16_t lshift_timer;
  54. extern uint16_t rshift_timer;
  55. extern uint8_t prev_indx;
  56. extern uint16_t prev_kcs[6];
  57. void add_to_prev(uint16_t kc);
  58. void unreg_prev(void);
  59. extern bool esct;
  60. #endif
  61. extern bool navesc;
  62. extern uint16_t navesc_timer;
  63. extern bool game;
  64. void timer_timeout(void);
  65. bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
  66. #define CTRLX LCTL(KC_X)
  67. #define CTRLC LCTL(KC_C)
  68. #define CTRLV LCTL(KC_V)
  69. #define ALTF4 LALT(KC_F4)
  70. #define GUIU LGUI(KC_UP)
  71. #define GUID LGUI(KC_DOWN)
  72. #define GUIL LGUI(KC_LEFT)
  73. #define GUIR RGUI(KC_RIGHT)
  74. #define CTLENT CTL_T(KC_ENT)
  75. /*
  76. Templates for Keys, with custom shifted and non shifted Characters
  77. */
  78. // Normal shift status
  79. #define SHIFT_NORM(kc1, kc2) \
  80. if (record->event.pressed) { \
  81. timer_timeout(); \
  82. if (lshift || rshift) { \
  83. register_code(KC_LSFT); \
  84. unregister_code(kc2); \
  85. register_code(kc2); \
  86. add_to_prev(kc2); \
  87. } else { \
  88. unregister_code(KC_LSFT); \
  89. unregister_code(kc1); \
  90. register_code(kc1); \
  91. } \
  92. } else { \
  93. unregister_code(kc1); \
  94. unregister_code(kc2); \
  95. } \
  96. return false;
  97. // Inverted shift status
  98. #define SHIFT_SWITCH(kc1, kc2) \
  99. if (record->event.pressed) { \
  100. timer_timeout(); \
  101. if (lshift || rshift) { \
  102. unregister_code(KC_LSFT); \
  103. unregister_code(kc2); \
  104. register_code(kc2); \
  105. add_to_prev(kc2); \
  106. } else { \
  107. register_code(KC_LSFT); \
  108. unregister_code(kc1); \
  109. register_code(kc1); \
  110. add_to_prev(kc1); \
  111. } \
  112. } else { \
  113. unregister_code(kc1); \
  114. unregister_code(kc2); \
  115. unreg_prev(); \
  116. if (lshift || rshift) \
  117. register_code(KC_LSFT); \
  118. else \
  119. unregister_code(KC_LSFT); \
  120. } \
  121. return false;
  122. // Always shifted
  123. #define SHIFT_ALL(kc1, kc2) \
  124. if (record->event.pressed) { \
  125. timer_timeout(); \
  126. register_code(KC_LSFT); \
  127. if (lshift || rshift) { \
  128. unregister_code(kc2); \
  129. register_code(kc2); \
  130. add_to_prev(kc2); \
  131. } else { \
  132. unregister_code(kc1); \
  133. register_code(kc1); \
  134. add_to_prev(kc1); \
  135. } \
  136. } else { \
  137. unregister_code(kc1); \
  138. unregister_code(kc2); \
  139. unreg_prev(); \
  140. if (lshift || rshift) \
  141. register_code(KC_LSFT); \
  142. else \
  143. unregister_code(KC_LSFT); \
  144. } \
  145. return false;
  146. // Never shifted
  147. #define SHIFT_NO(kc1, kc2) \
  148. if (record->event.pressed) { \
  149. timer_timeout(); \
  150. unregister_code(KC_LSFT); \
  151. if (lshift || rshift) { \
  152. unregister_code(kc2); \
  153. register_code(kc2); \
  154. add_to_prev(kc2); \
  155. } else { \
  156. unregister_code(kc1); \
  157. register_code(kc1); \
  158. } \
  159. } else { \
  160. unregister_code(kc1); \
  161. unregister_code(kc2); \
  162. unreg_prev(); \
  163. if (lshift || rshift) \
  164. register_code(KC_LSFT); \
  165. else \
  166. unregister_code(KC_LSFT); \
  167. } \
  168. return false;
  169. // Always AltGr
  170. #define SHIFT_ALGR(kc1, kc2) \
  171. if (record->event.pressed) { \
  172. timer_timeout(); \
  173. unregister_code(KC_LSFT); \
  174. register_code(KC_ALGR); \
  175. if (lshift || rshift) { \
  176. unregister_code(kc2); \
  177. register_code(kc2); \
  178. unregister_code(kc2); \
  179. register_code(KC_LSFT); \
  180. } else { \
  181. unregister_code(kc1); \
  182. register_code(kc1); \
  183. unregister_code(kc1); \
  184. } \
  185. unregister_code(KC_ALGR); \
  186. } \
  187. return false;
  188. // Different keycode when Ctrl is pressed
  189. #define CTRL(kc1, kc2) \
  190. if(record->event.pressed) { \
  191. timer_timeout(); \
  192. if (lshift || rshift) \
  193. register_code(KC_LSFT); \
  194. else \
  195. unregister_code(KC_LSFT); \
  196. if (keyboard_report->mods & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))){ \
  197. register_code(kc2); \
  198. } else { \
  199. register_code(kc1); \
  200. } \
  201. } else { \
  202. unregister_code(kc1); \
  203. unregister_code(kc2); \
  204. } \
  205. return false;
  206. // Template for keys on deadkey layer (mostly Umlaute)
  207. #define UML(kc) \
  208. if(record->event.pressed) { \
  209. timer_timeout(); \
  210. if (lshift || rshift) \
  211. register_code(KC_LSFT); \
  212. else \
  213. unregister_code(KC_LSFT); \
  214. register_code(kc); \
  215. unregister_code(kc); \
  216. layer_off(_DEADKEY); \
  217. } \
  218. return false;