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.

293 lines
7.8 KiB

  1. #pragma once
  2. /*
  3. Copyright 2018 Eric Gebhart <e.a.gebhart@gmail.com>
  4. This program is free software: you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation, either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. #include "quantum.h"
  16. #include "process_keycode/process_tap_dance.h"
  17. #include "eeconfig.h"
  18. //#define ONESHOT_TAP_TOGGLE 2 /* Tapping this number of times holds the key until tapped once again. */
  19. void tap(uint16_t keycode);
  20. bool process_record_secrets(uint16_t keycode, keyrecord_t *record);
  21. typedef union {
  22. uint8_t raw;
  23. struct {
  24. bool clicky_enable :1;
  25. bool rgb_layer_change :1;
  26. bool is_overwatch :1;
  27. bool nuke_switch :1;
  28. };
  29. } userspace_config_t;
  30. // for the creation of dvorak keys on an Bepo keyboard at the OS layer.
  31. // so we can create an array of reasonable size
  32. // for our translation keys. We have to create a
  33. // good range of numbers
  34. #define GR(x) (x-SAFE_RANGE)
  35. uint8_t gr(uint8_t);
  36. void send_keycode(uint8_t);
  37. #define MOD_NONE 0x00
  38. // indexs for the keycode translation table.
  39. #define UNSHIFTED_KEY(key) key_translations[gr(key)][0][0]
  40. #define UNSHIFTED_MODS(key) key_translations[gr(key)][0][1]
  41. #define SHIFTED_KEY(key) key_translations[gr(key)][1][0]
  42. #define SHIFTED_MODS(key) key_translations[gr(key)][1][1]
  43. enum userspace_custom_keycodes {
  44. // keep the keycodes using the send_key function close to SAFE_RANGE
  45. // so the array of keycodes remains a reasonbale size.
  46. DB_1 = SAFE_RANGE, // can always be here
  47. DB_2,
  48. DB_3,
  49. DB_4,
  50. DB_5,
  51. DB_6,
  52. DB_7,
  53. DB_8,
  54. DB_9,
  55. DB_0,
  56. DB_GRV,
  57. DB_SCOLON,
  58. DB_SLASH,
  59. DB_BACKSLASH,
  60. DB_EQL,
  61. DB_DOT,
  62. DB_COMM,
  63. DB_QUOT,
  64. DB_MINUS,
  65. DB_RPRN,
  66. DB_LPRN,
  67. DB_RBRC,
  68. DB_LBRC,
  69. // for symbols layer
  70. DB_HASH,
  71. DB_LCBR,
  72. DB_RCBR,
  73. DB_PIPE,
  74. DB_TILD,
  75. DB_CIRC,
  76. DB_LESS,
  77. DB_GRTR,
  78. // End of dvorak on bepo translation keys.
  79. EPRM,
  80. VRSN,
  81. KC_DVORAK_ON_BEPO,
  82. KC_BEPO,
  83. KC_NORMAN,
  84. KC_QWERTY,
  85. KC_COLEMAK,
  86. KC_DVORAK,
  87. KC_WORKMAN,
  88. KC_MAKE,
  89. KC_RESET,
  90. KC_RGB_T,
  91. KC_SECRET_1,
  92. KC_SECRET_2,
  93. KC_SECRET_3,
  94. KC_SECRET_4,
  95. KC_SECRET_5,
  96. KC_CCCV
  97. };
  98. #define SFTGUI_T(kc) { MT(MOD_LGUI | MOD_LSFT, kc) }
  99. #define SFT_GUI_ESC MT(MOD_LSFT | MOD_LGUI, KC_PGDN) // shift LGUI or Escape.
  100. #define ALT_ENT ALT_T(KC_ENT) // Alt or enter
  101. #define CTL_SPC CTL_T(KC_SPC) // ctrl or space
  102. #define CTL_BSPC CTL_T(KC_BSPC) // ctrl or backspace
  103. #define ALT_DEL ALT_T(KC_DEL) // Alt or delete
  104. #define GUI_ESC GUI_T(KC_ESC) // Gui or escape
  105. #define ALGR_SYMB ALGR_T(TG(SYMB)) // Alt gre or toggle symbol layer
  106. // OSM keycodes, to keep things clean and easy to change
  107. #define KC_MLSF OSM(MOD_LSFT)
  108. #define KC_MRSF OSM(MOD_RSFT)
  109. #define OS_LGUI OSM(MOD_LGUI)
  110. #define OS_RGUI OSM(MOD_RGUI)
  111. #define OS_LSFT OSM(MOD_LSFT)
  112. #define OS_RSFT OSM(MOD_RSFT)
  113. #define OS_LCTL OSM(MOD_LCTL)
  114. #define OS_RCTL OSM(MOD_RCTL)
  115. #define OS_LALT OSM(MOD_LALT)
  116. #define OS_RALT OSM(MOD_RALT)
  117. #define ALT_APP ALT_T(KC_APP)
  118. #define MG_NKRO MAGIC_TOGGLE_NKRO
  119. //// TAP DANCE
  120. typedef struct {
  121. bool is_press_action;
  122. int state;
  123. } tdtap;
  124. enum {
  125. SINGLE_TAP = 1,
  126. SINGLE_HOLD = 2,
  127. DOUBLE_TAP = 3,
  128. DOUBLE_HOLD = 4,
  129. DOUBLE_SINGLE_TAP = 5, //send two single taps
  130. TRIPLE_TAP = 6,
  131. TRIPLE_HOLD = 7
  132. };
  133. //Tap Dance Declarations
  134. enum {
  135. TD_ESC_CAPS = 0,
  136. TD_TAB_BKTAB = 1,
  137. TD_MDIA_SYMB = 2,
  138. TD_HOME_END = 3,
  139. TD_XMONAD_ESC = 4,
  140. TD_DEF_LAYER_SW = 5,
  141. TD_DEF_OS_LAYER_SW = 6,
  142. TD_MOUSE_BTNS = 7,
  143. TD_DVORAK_BEPO = 8
  144. };
  145. // Tap dance
  146. #define TAB_BKTAB TD(TD_TAB_BKTAB) // Tab or backtab tapdance.
  147. #define MDIA_SYMB_KP_LAYERS TD(TD_MDIA_SYMB) // MDIA, symb, keypad, layouts layer tapdance toggle.
  148. #define DEF_LAYER_SW TD(TD_DEF_LAYER_SW) // dvorak, dvorak_on_bepo, bepo default layer
  149. #define DEF_OS_LAYER_SW TD(TD_DEF_OS_LAYER_SW) // dvorak, dvorak_on_bepo, bepo default layer
  150. #define HOME_END TD(TD_HOME_END) // home or end tapdance.
  151. #define XMONAD_ESC TD(TD_XMONAD_ESC) // Escape, dvorak, media or symb. - tap and hold tap dance. 1-4
  152. #define DVORAK_ET_BEPO TD(TD_DVORAK_BEPO) // Escape, dvorak, media or symb. - tap and hold tap dance. 1-4
  153. #define TDMOUSE_BTNS TD(TD_MOUSE_BTNS) // hmmm. 1-5
  154. // HOME ROW LAYER TOGGLE (LT) and Shift.
  155. // both sides of the home row have "shift, ___, media , symb, ___" and "___, symb, media, ___, shift".
  156. // so pinky fingers are shift when held and the index and second fingers are symbol and
  157. // media layers when held.
  158. // Dvorak
  159. // shift and layer switch on hold on the home row.
  160. #define KC_SFT_T_A SFT_T(KC_A)
  161. #define KC_SFT_T_S SFT_T(KC_S)
  162. #define KC_LT_SYMB_U LT(SYMB, KC_U)
  163. #define KC_LT_SYMB_H LT(SYMB, KC_H)
  164. #define KC_LT_MDIA_E LT(MDIA, KC_E)
  165. #define KC_LT_MDIA_T LT(MDIA, KC_T)
  166. // Need to add this to the others.
  167. #define KC_LT_KP_N LT(KEYPAD, KC_N)
  168. #define KC_LT_KP_O LT(KEYPAD, KC_O)
  169. // for dvorak on bepo
  170. #define BP_SFT_T_A SFT_T(BP_A)
  171. #define BP_SFT_T_S SFT_T(BP_S)
  172. #define BP_LT_SYMB_U LT(SYMB, BP_U)
  173. #define BP_LT_SYMB_H LT(MDIA, BP_H)
  174. #define BP_LT_MDIA_E LT(MDIA, BP_E)
  175. #define BP_LT_MDIA_T LT(MDIA, BP_T)
  176. // Need to add this to the others.
  177. #define BP_LT_KP_N LT(KEYPAD, BP_N)
  178. #define BP_LT_KP_O LT(KEYPAD, BP_O)
  179. // for bepo on bepo
  180. #define BP_SFT_T_T SFT_T(BP_T)
  181. #define BP_SFT_T_W SFT_T(BP_W)
  182. #define BP_LT_SYMB_I LT(SYMB_ON_BEPO, BP_I)
  183. #define BP_LT_MDIA_E LT(MDIA, BP_E)
  184. #define BP_LT_KP_U LT(KEYPAD, BP_U)
  185. #define BP_LT_SYMB_S LT(SYMB_ON_BEPO, BP_S)
  186. #define BP_LT_MDIA_R LT(MDIA, BP_R)
  187. #define BP_LT_KP_N LT(KEYPAD, BP_N)
  188. #define BP_SFT_T_A SFT_T(BP_A)
  189. #define BP_SFT_T_S SFT_T(BP_S)
  190. #define BP_SFT_T_E SFT_T(BP_E)
  191. #define BP_SFT_T_M SFT_T(BP_M)
  192. #define BP_SFT_T_ECRC SFT_T(BP_ECIR)
  193. #define BP_SFT_T_CCED SFT_T(BP_CCED)
  194. #define BP_LT_SYMB_COMM LT(SYMB,BP_COMM)
  195. //QWERTY
  196. #define KC_SFT_T_SCLN SFT_T(KC_SCLN)
  197. #define KC_LT_MDIA_D LT(MDIA, KC_D)
  198. #define KC_LT_MDIA_K LT(MDIA, KC_K)
  199. #define KC_LT_SYMB_F LT(SYMB, KC_F)
  200. #define KC_LT_SYMB_J LT(SYMB, KC_J)
  201. //COLEMAK
  202. #define KC_SFT_T_O SFT_T(KC_O)
  203. #define KC_LT_MDIA_S LT(MDIA, KC_S)
  204. #define KC_LT_SYMB_T LT(SYMB, KC_T)
  205. #define KC_LT_MDIA_E LT(MDIA, KC_E)
  206. #define KC_LT_SYMB_N LT(SYMB, KC_N)
  207. //WORKMAN
  208. #define KC_SFT_T_I SFT_T(KC_I)
  209. #define KC_LT_MDIA_H LT(MDIA, KC_H)
  210. //NORMAN
  211. // For keys on the homerow. Hold for shift, keypad,mouse,and smbol layers
  212. #define KC_SFT_T_U SFT_T(KC_U)
  213. #define KC_LT_MDIA_I LT(MDIA, KC_I)
  214. // The most portable copy/paste keys (windows (mostly), linux, and some terminal emulators).
  215. #define MK_CUT LSFT(KC_DEL) // shift + delete
  216. #define MK_COPY LCTL(KC_INS) // ctrl + insert
  217. #define MK_PASTE LSFT(KC_INS) // shift + insert
  218. #define ___ KC_TRNS
  219. #define XXX KC_NO
  220. // Blocking keys
  221. #define ___X___ XXX
  222. #define ___X2___ XXX, XXX
  223. #define ___X3___ ___X2___, XXX
  224. #define ___X5___ ___X3___, XXX, XXX
  225. #define ___X15___ ___X5___, ___X5___, ___X5___
  226. // Transparent keys
  227. #define ___2___ ___, ___
  228. #define ___3___ ___2___, ___
  229. #define ___4___ ___3___, ___
  230. #define ___5___ ___4___, ___
  231. #define ___6___ ___5___, ___
  232. #define ___14___ ___5___, ___4___, ___5___
  233. #define ___15___ ___5___, ___5___, ___5___
  234. int on_qwerty(void);
  235. int get_xmonad_layer(void);
  236. int cur_dance (qk_tap_dance_state_t *state);
  237. //for the x tap dance. Put it here so it can be used in any keymap
  238. void x_finished (qk_tap_dance_state_t *state, void *user_data);
  239. void x_reset (qk_tap_dance_state_t *state, void *user_data);