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.

297 lines
6.8 KiB

  1. /*
  2. Copyright 2021 Jakob Hærvig <jakob.haervig@gmail.com>
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. #include "quantum.h"
  15. #include "keymap_danish.h"
  16. enum userspace_layers {
  17. _DEADKEY = 14, // Change if more than 16 layers are required
  18. _NAV
  19. };
  20. enum userspace_custom_keycodes {
  21. //CU_GAME = SAFE_RANGE, // Toggle game mode on/off
  22. CU_NAV = SAFE_RANGE, // NAV | ESC
  23. #ifdef DANISH_ENABLE
  24. CU_LSFT, // LSFT | (
  25. CU_RSFT, // LSFT | )
  26. CU_COMM, // , | <
  27. CU_DOT, // . | >
  28. CU_SLSH, // / | ?
  29. CU_SCLN, // ; | :
  30. CU_QUOT, // ' | "
  31. CU_2, // 2 | @
  32. CU_4, // 4 | $
  33. CU_6, // 6 | ^
  34. CU_7, // 7 | &
  35. CU_8, // 8 | *
  36. CU_9, // 9 | (
  37. CU_0, // 0 | )
  38. CU_MINS, // - | _
  39. CU_EQL, // = | +
  40. CU_BSPC, // backspace | delete
  41. CU_LBRC, // [ | {
  42. CU_RBRC, // ] | }
  43. CU_BSLS, // \ | |
  44. #endif
  45. NEW_SAFE_RANGE // Use for keymap specific keycodes
  46. };
  47. #ifdef DANISH_ENABLE
  48. extern bool lshift;
  49. extern bool rshift;
  50. extern bool lshiftp;
  51. extern bool rshiftp;
  52. extern uint16_t lshift_timer;
  53. extern uint16_t rshift_timer;
  54. extern uint8_t prev_indx;
  55. extern uint16_t prev_kcs[6];
  56. void add_to_prev(uint16_t kc);
  57. void unreg_prev(void);
  58. extern bool esct;
  59. #endif
  60. extern bool navesc;
  61. extern uint16_t navesc_timer;
  62. void timer_timeout(void);
  63. void timer_timeout_keymap(void);
  64. bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
  65. #define CTRLX LCTL(KC_X)
  66. #define CTRLC LCTL(KC_C)
  67. #define CTRLV LCTL(KC_V)
  68. #define ALTF4 LALT(KC_F4)
  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. #define CTLENT CTL_T(KC_ENT)
  74. #define EMOJI LWIN(KC_DOT)
  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. tap_code(kc2); \
  129. add_to_prev(kc2); \
  130. } else { \
  131. tap_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. tap_code(kc2); \
  151. add_to_prev(kc2); \
  152. } else { \
  153. tap_code(kc1); \
  154. } \
  155. } else { \
  156. unregister_code(kc1); \
  157. unregister_code(kc2); \
  158. unreg_prev(); \
  159. if (lshift || rshift) \
  160. register_code(KC_LSFT); \
  161. else \
  162. unregister_code(KC_LSFT); \
  163. } \
  164. return false;
  165. // Norm AltGr
  166. #define NORM_ALGR(kc1, kc2) \
  167. if (record->event.pressed) { \
  168. timer_timeout(); \
  169. if (lshift || rshift) { \
  170. register_code(KC_ALGR); \
  171. unregister_code(KC_LSFT); \
  172. tap_code(kc2); \
  173. unregister_code(KC_ALGR); \
  174. } else { \
  175. unregister_code(KC_ALGR); \
  176. unregister_code(KC_LSFT); \
  177. tap_code(kc1); \
  178. } \
  179. } else { \
  180. unregister_code(kc1); \
  181. unregister_code(kc2); \
  182. } \
  183. return false;
  184. // Norm AltGr shift
  185. #define NORM_ALGRSHIFT(kc1, kc2) \
  186. if (record->event.pressed) { \
  187. timer_timeout(); \
  188. register_code(KC_LSFT); \
  189. register_code(KC_ALGR); \
  190. if (lshift || rshift) { \
  191. unregister_code(kc2); \
  192. tap_code(kc2); \
  193. unregister_code(KC_LSFT); \
  194. } else { \
  195. unregister_code(KC_LSFT); \
  196. unregister_code(kc1); \
  197. register_code(kc1); \
  198. } \
  199. unregister_code(KC_ALGR); \
  200. } else { \
  201. unregister_code(kc1); \
  202. unregister_code(kc2); \
  203. } \
  204. return false;
  205. // Inverted altgr status
  206. #define ALGR_SWITCH(kc1, kc2) \
  207. if (record->event.pressed) { \
  208. timer_timeout(); \
  209. register_code(KC_ALGR); \
  210. if (lshift || rshift) { \
  211. unregister_code(KC_LSFT); \
  212. unregister_code(kc2); \
  213. register_code(kc2); \
  214. unregister_code(KC_ALGR); \
  215. add_to_prev(kc2); \
  216. } else { \
  217. register_code(KC_LSFT); \
  218. unregister_code(kc1); \
  219. register_code(kc1); \
  220. unregister_code(KC_ALGR); \
  221. add_to_prev(kc1); \
  222. } \
  223. } else { \
  224. unregister_code(kc1); \
  225. unregister_code(kc2); \
  226. unreg_prev(); \
  227. if (lshift || rshift) \
  228. register_code(KC_LSFT); \
  229. else \
  230. unregister_code(KC_LSFT); \
  231. } \
  232. return false;
  233. // Always AltGr
  234. #define SHIFT_ALGR(kc1, kc2) \
  235. if (record->event.pressed) { \
  236. timer_timeout(); \
  237. unregister_code(KC_LSFT); \
  238. register_code(KC_ALGR); \
  239. if (lshift || rshift) { \
  240. unregister_code(kc2); \
  241. tap_code(kc2); \
  242. register_code(KC_LSFT); \
  243. } else { \
  244. unregister_code(kc1); \
  245. tap_code(kc1); \
  246. } \
  247. unregister_code(KC_ALGR); \
  248. } \
  249. return false;
  250. // Different keycode when Ctrl is pressed
  251. #define CTRL(kc1, kc2) \
  252. if(record->event.pressed) { \
  253. timer_timeout(); \
  254. if (lshift || rshift) \
  255. register_code(KC_LSFT); \
  256. else \
  257. unregister_code(KC_LSFT); \
  258. if (keyboard_report->mods & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))){ \
  259. register_code(kc2); \
  260. } else { \
  261. register_code(kc1); \
  262. } \
  263. } else { \
  264. unregister_code(kc1); \
  265. unregister_code(kc2); \
  266. } \
  267. return false;