spacebarracecar.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  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 GUIU LGUI(KC_UP)
  70. #define GUID LGUI(KC_DOWN)
  71. #define GUIL LGUI(KC_LEFT)
  72. #define GUIR RGUI(KC_RIGHT)
  73. /*
  74. Templates for Keys, with custom shifted and non shifted Characters
  75. */
  76. // Normal shift status
  77. #define SHIFT_NORM(kc1, kc2) \
  78. if (record->event.pressed) { \
  79. timer_timeout(); \
  80. if (lshift || rshift) { \
  81. register_code(KC_LSFT); \
  82. unregister_code(kc2); \
  83. register_code(kc2); \
  84. add_to_prev(kc2); \
  85. } else { \
  86. unregister_code(KC_LSFT); \
  87. unregister_code(kc1); \
  88. register_code(kc1); \
  89. } \
  90. } else { \
  91. unregister_code(kc1); \
  92. unregister_code(kc2); \
  93. } \
  94. return false;
  95. // Inverted shift status
  96. #define SHIFT_SWITCH(kc1, kc2) \
  97. if (record->event.pressed) { \
  98. timer_timeout(); \
  99. if (lshift || rshift) { \
  100. unregister_code(KC_LSFT); \
  101. unregister_code(kc2); \
  102. register_code(kc2); \
  103. add_to_prev(kc2); \
  104. } else { \
  105. register_code(KC_LSFT); \
  106. unregister_code(kc1); \
  107. register_code(kc1); \
  108. add_to_prev(kc1); \
  109. } \
  110. } else { \
  111. unregister_code(kc1); \
  112. unregister_code(kc2); \
  113. unreg_prev(); \
  114. if (lshift || rshift) \
  115. register_code(KC_LSFT); \
  116. else \
  117. unregister_code(KC_LSFT); \
  118. } \
  119. return false;
  120. // Always shifted
  121. #define SHIFT_ALL(kc1, kc2) \
  122. if (record->event.pressed) { \
  123. timer_timeout(); \
  124. register_code(KC_LSFT); \
  125. if (lshift || rshift) { \
  126. unregister_code(kc2); \
  127. register_code(kc2); \
  128. add_to_prev(kc2); \
  129. } else { \
  130. unregister_code(kc1); \
  131. register_code(kc1); \
  132. add_to_prev(kc1); \
  133. } \
  134. } else { \
  135. unregister_code(kc1); \
  136. unregister_code(kc2); \
  137. unreg_prev(); \
  138. if (lshift || rshift) \
  139. register_code(KC_LSFT); \
  140. else \
  141. unregister_code(KC_LSFT); \
  142. } \
  143. return false;
  144. // Never shifted
  145. #define SHIFT_NO(kc1, kc2) \
  146. if (record->event.pressed) { \
  147. timer_timeout(); \
  148. unregister_code(KC_LSFT); \
  149. if (lshift || rshift) { \
  150. unregister_code(kc2); \
  151. register_code(kc2); \
  152. add_to_prev(kc2); \
  153. } else { \
  154. unregister_code(kc1); \
  155. register_code(kc1); \
  156. } \
  157. } else { \
  158. unregister_code(kc1); \
  159. unregister_code(kc2); \
  160. unreg_prev(); \
  161. if (lshift || rshift) \
  162. register_code(KC_LSFT); \
  163. else \
  164. unregister_code(KC_LSFT); \
  165. } \
  166. return false;
  167. // Always AltGr
  168. #define SHIFT_ALGR(kc1, kc2) \
  169. if (record->event.pressed) { \
  170. timer_timeout(); \
  171. unregister_code(KC_LSFT); \
  172. register_code(DE_ALGR); \
  173. if (lshift || rshift) { \
  174. unregister_code(kc2); \
  175. register_code(kc2); \
  176. unregister_code(kc2); \
  177. register_code(KC_LSFT); \
  178. } else { \
  179. unregister_code(kc1); \
  180. register_code(kc1); \
  181. unregister_code(kc1); \
  182. } \
  183. unregister_code(DE_ALGR); \
  184. } \
  185. return false;
  186. // Different keycode when Ctrl is pressed
  187. #define CTRL(kc1, kc2) \
  188. if(record->event.pressed) { \
  189. timer_timeout(); \
  190. if (lshift || rshift) \
  191. register_code(KC_LSFT); \
  192. else \
  193. unregister_code(KC_LSFT); \
  194. if (keyboard_report->mods & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))){ \
  195. register_code(kc2); \
  196. } else { \
  197. register_code(kc1); \
  198. } \
  199. } else { \
  200. unregister_code(kc1); \
  201. unregister_code(kc2); \
  202. } \
  203. return false;
  204. // Template for keys on deadkey layer (mostly Umlaute)
  205. #define UML(kc) \
  206. if(record->event.pressed) { \
  207. timer_timeout(); \
  208. if (lshift || rshift) \
  209. register_code(KC_LSFT); \
  210. else \
  211. unregister_code(KC_LSFT); \
  212. register_code(kc); \
  213. unregister_code(kc); \
  214. layer_off(_DEADKEY); \
  215. } \
  216. return false;