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.

247 lines
5.6 KiB

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