keymap.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. /* -*- Mode:C; c-basic-offset:2; tab-width:2; indent-tabs-mode:nil; evil-indent-convert-tabs:t; -*- */
  2. #include QMK_KEYBOARD_H
  3. #include "debug.h"
  4. #include "action_layer.h"
  5. #include "version.h"
  6. /**
  7. * See `readme.md` for notes on each define.
  8. */
  9. /* Personal preference (enable by passing EXTRAFLAGS=... to make). */
  10. /* #define CFQ_USE_MOMENTARY_LAYER_KEYS */
  11. /* Holding right/left or left/right shift for single or double quote pair */
  12. /* #define CFQ_USE_SHIFT_QUOTES */
  13. #define CFQ_USE_DYNAMIC_MACRO
  14. #if !defined(CFQ_USER_KEY0)
  15. # define CFQ_USER_KEY0 KC_BSPC
  16. #endif
  17. #if !defined(CFQ_USER_KEY1)
  18. # define CFQ_USER_KEY1 CFQ_KC_FN1
  19. #endif
  20. #if !defined(CFQ_USER_KEY2)
  21. # define CFQ_USER_KEY2 KC_INS
  22. #endif
  23. #if !defined(CFQ_USER_KEY3)
  24. # define CFQ_USER_KEY3 KC_NLCK
  25. #endif
  26. #if !defined(CFQ_USER_KEY4)
  27. # define CFQ_USER_KEY4 KC_BSPC
  28. #endif
  29. #if !defined(CFQ_USER_KEY5)
  30. # define CFQ_USER_KEY5 KC_DELT
  31. #endif
  32. #if !defined(CFQ_USER_KEY6)
  33. # define CFQ_USER_KEY6 KC_CAPS
  34. #endif
  35. #if !defined(CFQ_USER_KEY7)
  36. # define CFQ_USER_KEY7 CFQ_KC_FN3
  37. #endif
  38. #if !defined(CFQ_USER_KEY8)
  39. # define CFQ_USER_KEY8 KC_DEL
  40. #endif
  41. #ifndef CFQ_WORD_A
  42. #define CFQ_WORD_A ""
  43. #endif
  44. #ifndef CFQ_WORD_B
  45. #define CFQ_WORD_B ""
  46. #endif
  47. #ifndef CFQ_WORD_C
  48. #define CFQ_WORD_C ""
  49. #endif
  50. #ifndef CFQ_WORD_D
  51. #define CFQ_WORD_D ""
  52. #endif
  53. #ifndef CFQ_WORD_E
  54. #define CFQ_WORD_E ""
  55. #endif
  56. #ifndef CFQ_WORD_F
  57. #define CFQ_WORD_F ""
  58. #endif
  59. #ifndef CFQ_WORD_G
  60. #define CFQ_WORD_G ""
  61. #endif
  62. #ifndef CFQ_WORD_H
  63. #define CFQ_WORD_H ""
  64. #endif
  65. #ifndef CFQ_WORD_I
  66. #define CFQ_WORD_I ""
  67. #endif
  68. #ifndef CFQ_WORD_J
  69. #define CFQ_WORD_J ""
  70. #endif
  71. #ifndef CFQ_WORD_K
  72. #define CFQ_WORD_K ""
  73. #endif
  74. #ifndef CFQ_WORD_L
  75. #define CFQ_WORD_L ""
  76. #endif
  77. #ifndef CFQ_WORD_M
  78. #define CFQ_WORD_M ""
  79. #endif
  80. #ifndef CFQ_WORD_N
  81. #define CFQ_WORD_N ""
  82. #endif
  83. #ifndef CFQ_WORD_O
  84. #define CFQ_WORD_O ""
  85. #endif
  86. #ifndef CFQ_WORD_P
  87. #define CFQ_WORD_P ""
  88. #endif
  89. #ifndef CFQ_WORD_Q
  90. #define CFQ_WORD_Q ""
  91. #endif
  92. #ifndef CFQ_WORD_R
  93. #define CFQ_WORD_R ""
  94. #endif
  95. #ifndef CFQ_WORD_S
  96. #define CFQ_WORD_S ""
  97. #endif
  98. #ifndef CFQ_WORD_T
  99. #define CFQ_WORD_T ""
  100. #endif
  101. #ifndef CFQ_WORD_U
  102. #define CFQ_WORD_U ""
  103. #endif
  104. #ifndef CFQ_WORD_V
  105. #define CFQ_WORD_V ""
  106. #endif
  107. #ifndef CFQ_WORD_W
  108. #define CFQ_WORD_W ""
  109. #endif
  110. #ifndef CFQ_WORD_X
  111. #define CFQ_WORD_X ""
  112. #endif
  113. #ifndef CFQ_WORD_Y
  114. #define CFQ_WORD_Y ""
  115. #endif
  116. #ifndef CFQ_WORD_Z
  117. #define CFQ_WORD_Z ""
  118. #endif
  119. /* lower and title capitals versions (setup at start). */
  120. static char *cfq_word_lut[2][26] = {
  121. {
  122. CFQ_WORD_A, CFQ_WORD_B, CFQ_WORD_C, CFQ_WORD_D, CFQ_WORD_E, CFQ_WORD_F,
  123. CFQ_WORD_G, CFQ_WORD_H, CFQ_WORD_I, CFQ_WORD_J, CFQ_WORD_K, CFQ_WORD_L,
  124. CFQ_WORD_M, CFQ_WORD_N, CFQ_WORD_O, CFQ_WORD_P, CFQ_WORD_Q, CFQ_WORD_R,
  125. CFQ_WORD_S, CFQ_WORD_T, CFQ_WORD_U, CFQ_WORD_V, CFQ_WORD_W, CFQ_WORD_X,
  126. CFQ_WORD_Y, CFQ_WORD_Z,
  127. },
  128. {NULL}
  129. };
  130. /* Storage for title-caps strings. */
  131. static char cfq_word_lut_title_caps[
  132. sizeof(CFQ_WORD_A) + sizeof(CFQ_WORD_B) + sizeof(CFQ_WORD_C) + sizeof(CFQ_WORD_D) +
  133. sizeof(CFQ_WORD_E) + sizeof(CFQ_WORD_F) + sizeof(CFQ_WORD_G) + sizeof(CFQ_WORD_H) +
  134. sizeof(CFQ_WORD_I) + sizeof(CFQ_WORD_J) + sizeof(CFQ_WORD_K) + sizeof(CFQ_WORD_L) +
  135. sizeof(CFQ_WORD_M) + sizeof(CFQ_WORD_N) + sizeof(CFQ_WORD_O) + sizeof(CFQ_WORD_P) +
  136. sizeof(CFQ_WORD_Q) + sizeof(CFQ_WORD_R) + sizeof(CFQ_WORD_S) + sizeof(CFQ_WORD_T) +
  137. sizeof(CFQ_WORD_U) + sizeof(CFQ_WORD_V) + sizeof(CFQ_WORD_W) + sizeof(CFQ_WORD_X) +
  138. sizeof(CFQ_WORD_Y) + sizeof(CFQ_WORD_Z)
  139. ];
  140. #define BASE 0 /* default layer */
  141. #define SYMB 1 /* symbols */
  142. #define MDIA 2 /* media keys */
  143. #define WORD 3 /* experimental keys */
  144. enum custom_keycodes {
  145. PLACEHOLDER = SAFE_RANGE, /* can always be here */
  146. RGB_SLD,
  147. M_BRACKET_IN_CBR,
  148. M_BRACKET_IN_PRN,
  149. M_BRACKET_IN_BRC,
  150. M_BRACKET_IN_ANG,
  151. M_BRACKET_OUT_CBR,
  152. M_BRACKET_OUT_PRN,
  153. M_BRACKET_OUT_BRC,
  154. M_BRACKET_OUT_ANG,
  155. M_ARROW_RMINUS,
  156. M_ARROW_LMINUS,
  157. M_ARROW_REQL,
  158. M_ARROW_LEQL,
  159. /* allow user defined words for each character:
  160. * use CFQ_WORD_[A-Z] defines. */
  161. M_WORD_A, M_WORD_B, M_WORD_C, M_WORD_D, M_WORD_E, M_WORD_F,
  162. M_WORD_G, M_WORD_H, M_WORD_I, M_WORD_J, M_WORD_K, M_WORD_L,
  163. M_WORD_M, M_WORD_N, M_WORD_O, M_WORD_P, M_WORD_Q, M_WORD_R,
  164. M_WORD_S, M_WORD_T, M_WORD_U, M_WORD_V, M_WORD_W, M_WORD_X,
  165. M_WORD_Y, M_WORD_Z,
  166. #ifdef CFQ_USE_DYNAMIC_MACRO
  167. DYNAMIC_MACRO_RANGE,
  168. #endif
  169. };
  170. #ifdef CFQ_USE_DYNAMIC_MACRO
  171. #include "dynamic_macro.h"
  172. #endif
  173. #ifdef CFQ_USE_MOMENTARY_LAYER_KEYS
  174. #define CFQ_KC_FN1 MO(1)
  175. #define CFQ_KC_FN2 MO(2)
  176. #define CFQ_KC_FN3 MO(3)
  177. #else
  178. #define CFQ_KC_FN1 KC_FN1
  179. #define CFQ_KC_FN2 KC_FN2
  180. #define CFQ_KC_FN3 KC_FN3
  181. #endif
  182. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  183. /* Keymap 0: Basic layer
  184. * ,--------------------------------------------------. ,--------------------------------------------------.
  185. * | Grave | ! | @ | # | $ | % | { | | } | ^ | & | * | - | = | BSpace |
  186. * |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
  187. * | Tab | Q | W | E | R | T | ( | | ) | Y | U | I | O | P | \ |
  188. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  189. * | Esc | A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
  190. * |--------+------+------+------+------+------| [ | | ] |------+------+------+------+------+--------|
  191. * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift |
  192. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  193. * | LCtl |Super | Alt | ~L1 |Space | | Left | Down | Up |Right | Del |
  194. * `----------------------------------' `----------------------------------'
  195. * ,-------------. ,-------------.
  196. * | Ins |NumClk| | Home | End |
  197. * ,------+------+------| |------+------+------.
  198. * | | |CapsLk| | PgUp | | |
  199. * |BSpace| Del |------| |------| ~L2 |Enter |
  200. * | | | ~L3 | | PgDn | | |
  201. * `--------------------' `--------------------'
  202. *
  203. * Optional overrides: see CFQ_USER_KEY# defines.
  204. *
  205. * ,--------------------------------------------------. ,--------------------------------------------------.
  206. * | | | | | | | | | | | | | | | USR0 |
  207. * |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
  208. * | | | | | | | | | | | | | | | |
  209. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  210. * | | | | | | |------| |------| | | | | | |
  211. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  212. * | | | | | | | | | | | | | | | |
  213. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  214. * | | | | USR1 | | | | | | | USR8 |
  215. * `----------------------------------' `----------------------------------'
  216. * ,-------------. ,-------------.
  217. * | USR2 | USR3 | | | |
  218. * ,------+------+------| |------+------+------.
  219. * | | | USR6 | | | | |
  220. * | USR4 | USR5 |------| |------| | |
  221. * | | | USR7 | | | | |
  222. * `--------------------' `--------------------'
  223. */
  224. /* If it accepts an argument (i.e, is a function), it doesn't need KC_.
  225. * Otherwise, it needs KC_* */
  226. [BASE] = LAYOUT_ergodox( /* layer 0 : default */
  227. /* left hand */
  228. KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_LCBR,
  229. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LPRN,
  230. KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G,
  231. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC,
  232. KC_LCTL, KC_LGUI, KC_LALT, CFQ_USER_KEY1, KC_SPC,
  233. CFQ_USER_KEY2, CFQ_USER_KEY3,
  234. CFQ_USER_KEY6,
  235. CFQ_USER_KEY4, CFQ_USER_KEY5, CFQ_USER_KEY7,
  236. /* right hand */
  237. KC_RCBR, KC_CIRC, KC_AMPR, KC_ASTR,KC_MINS, KC_EQL, CFQ_USER_KEY0,
  238. KC_RPRN, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
  239. KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
  240. KC_RBRC, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT,
  241. KC_LEFT, KC_DOWN,KC_UP, KC_RGHT, CFQ_USER_KEY8,
  242. KC_HOME, KC_END,
  243. KC_PGUP,
  244. KC_PGDN, CFQ_KC_FN2, KC_ENT
  245. ),/* Keymap 1: KeyPad, Macro Record
  246. *
  247. * ,--------------------------------------------------. ,--------------------------------------------------.
  248. * | | | | | | | {} | | }{ | |NumLck| / | * | - | |
  249. * |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
  250. * | | | | | | => | () | | )( | <= | 7 | 8 | 9 | + | |
  251. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  252. * | | | | | | -> |------| |------| <- | 4 | 5 | 6 | + | |
  253. * |--------+------+------+------+------+------| [] | | ][ |------+------+------+------+------+--------|
  254. * | | | | | | <> | | | | >< | 1 | 2 | 3 | Enter| |
  255. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  256. * | | | | | | | 0 | | . | Enter| |
  257. * `----------------------------------' `----------------------------------'
  258. * ,-------------. ,--------------.
  259. * |Start1|Start2| | | |
  260. * ,------+------+------| |------+-------+------.
  261. * | | | Stop | | | | |
  262. * |Play1 |Play2 |------| |------| | |
  263. * | | | | | | | |
  264. * `--------------------' `---------------------'
  265. */
  266. /* SYMBOLS */
  267. [SYMB] = LAYOUT_ergodox(
  268. /* left hand */
  269. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M_BRACKET_IN_CBR,
  270. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M_ARROW_REQL, M_BRACKET_IN_PRN,
  271. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M_ARROW_RMINUS,
  272. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M_BRACKET_IN_ANG, M_BRACKET_IN_BRC,
  273. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  274. #ifdef CFQ_USE_DYNAMIC_MACRO
  275. DYN_REC_START1, DYN_REC_START2,
  276. DYN_REC_STOP,
  277. DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, KC_TRNS,
  278. #else
  279. KC_TRNS, KC_TRNS,
  280. KC_TRNS,
  281. KC_TRNS, KC_TRNS, KC_TRNS,
  282. #endif
  283. /* right hand */
  284. M_BRACKET_OUT_CBR, KC_TRNS, KC_NLCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, KC_TRNS,
  285. M_BRACKET_OUT_PRN, M_ARROW_LEQL, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, KC_TRNS,
  286. M_ARROW_LMINUS, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, KC_TRNS,
  287. M_BRACKET_OUT_BRC, M_BRACKET_OUT_ANG, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, KC_TRNS,
  288. KC_KP_0, KC_TRNS, KC_KP_DOT, KC_KP_ENTER, KC_TRNS,
  289. KC_TRNS, KC_TRNS,
  290. KC_TRNS,
  291. KC_TRNS, KC_TRNS, KC_TRNS
  292. ),
  293. /* Keymap 2: F-Keys, media and mouse keys
  294. *
  295. * ,--------------------------------------------------. ,--------------------------------------------------.
  296. * | | | | | | | | | | | | | | | |
  297. * |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
  298. * | | | | MsUp | | |MWhlUp| | | | | | | | |
  299. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  300. * | | |MsLeft|MsDown|MsRght| |------| |------| Left | Down | Up |Right | | |
  301. * |--------+------+------+------+------+------|MWhlDn| | |------+------+------+------+------+--------|
  302. * | | | Rclk | Mclk | Lclk | | | | | | | | | | |
  303. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  304. * | | | | | | | | | | | |
  305. * `----------------------------------' `----------------------------------'
  306. * ,-------------. ,-------------.
  307. * | MRwd | MFwd | | MPrv | MNxt |
  308. * ,------+------+------| |------+------+------.
  309. * | | | | |VolUp | | |
  310. * | Mute | |------| |------| | Play |
  311. * | | | | |VolDn | | |
  312. * `--------------------' `--------------------'
  313. */
  314. /* MEDIA AND MOUSE */
  315. [MDIA] = LAYOUT_ergodox(
  316. /* left hand */
  317. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  318. KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_WH_U,
  319. KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
  320. KC_TRNS, KC_TRNS, KC_BTN2, KC_BTN3, KC_BTN1, KC_TRNS, KC_WH_D,
  321. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  322. KC_MRWD, KC_MFFD,
  323. KC_TRNS,
  324. KC_MUTE, KC_TRNS, KC_TRNS,
  325. /* right hand */
  326. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  327. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  328. KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TRNS, KC_TRNS,
  329. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  330. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  331. KC_MPRV, KC_MNXT,
  332. KC_VOLU,
  333. KC_VOLD, KC_TRNS, KC_MPLY
  334. ),
  335. /* Keymap 3: Entire Words (one for each key)
  336. *
  337. * ,--------------------------------------------------. ,--------------------------------------------------.
  338. * | | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | |
  339. * |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
  340. * | | Q | W | E | R | T | | | | Y | U | I | O | P | |
  341. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  342. * | | A | S | D | F | G |------| |------| H | J | K | L | | |
  343. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  344. * | | Z | X | C | V | B | | | | N | M | | | | |
  345. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  346. * | | | | | | | | | | | |
  347. * `----------------------------------' `----------------------------------'
  348. * ,-------------. ,-------------.
  349. * | | | | | |
  350. * ,------+------+------| |------+------+------.
  351. * | | | | | | | |
  352. * | | |------| |------| | |
  353. * | | | | | | | |
  354. * `--------------------' `--------------------'
  355. */
  356. /* WORDS */
  357. [WORD] = LAYOUT_ergodox(
  358. /* left hand */
  359. KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11,
  360. KC_TRNS, M_WORD_Q, M_WORD_W, M_WORD_E, M_WORD_R, M_WORD_T, KC_TRNS,
  361. KC_TRNS, M_WORD_A, M_WORD_S, M_WORD_D, M_WORD_F, M_WORD_G,
  362. KC_TRNS, M_WORD_Z, M_WORD_X, M_WORD_C, M_WORD_V, M_WORD_B, KC_TRNS,
  363. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  364. KC_TRNS, KC_TRNS,
  365. KC_TRNS,
  366. KC_TRNS, KC_TRNS, KC_TRNS,
  367. /* right hand */
  368. KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS,
  369. KC_TRNS, M_WORD_Y, M_WORD_U, M_WORD_I, M_WORD_O, M_WORD_P, KC_TRNS,
  370. M_WORD_H, M_WORD_J, M_WORD_K, M_WORD_L, KC_TRNS, KC_TRNS,
  371. KC_TRNS, M_WORD_N, M_WORD_M, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  372. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  373. KC_TRNS, KC_TRNS,
  374. KC_TRNS,
  375. KC_TRNS, KC_TRNS, KC_TRNS
  376. ),
  377. };
  378. const uint16_t PROGMEM fn_actions[] = {
  379. [1] = ACTION_LAYER_TAP_TOGGLE(SYMB), /* FN1 - Momentary Layer 1 (Symbols) */
  380. [2] = ACTION_LAYER_TAP_TOGGLE(MDIA), /* FN2 - Momentary Layer 2 (Media) */
  381. [3] = ACTION_LAYER_TAP_TOGGLE(WORD), /* FN3 - Momentary Layer 3 (Words) */
  382. };
  383. #define WITHOUT_MODS(...) \
  384. do { \
  385. uint8_t _real_mods = get_mods(); \
  386. clear_mods(); \
  387. { __VA_ARGS__ } \
  388. set_mods(_real_mods); \
  389. } while (0)
  390. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  391. #ifdef CFQ_USE_DYNAMIC_MACRO
  392. if (!process_record_dynamic_macro(keycode, record)) {
  393. return false;
  394. }
  395. #endif
  396. switch (keycode) {
  397. /* dynamically generate these. */
  398. case RGB_SLD:
  399. if (record->event.pressed) {
  400. #ifdef RGBLIGHT_ENABLE
  401. rgblight_mode(1);
  402. #endif
  403. }
  404. return false;
  405. break;
  406. case M_BRACKET_IN_CBR: /* {} */
  407. if (record->event.pressed) {
  408. SEND_STRING("{}" SS_TAP(X_LEFT));
  409. return false;
  410. }
  411. break;
  412. case M_BRACKET_IN_PRN: /* () */
  413. if (record->event.pressed) {
  414. SEND_STRING("()" SS_TAP(X_LEFT));
  415. return false;
  416. }
  417. break;
  418. case M_BRACKET_IN_BRC: /* [] */
  419. if (record->event.pressed) {
  420. SEND_STRING("[]" SS_TAP(X_LEFT));
  421. return false;
  422. }
  423. break;
  424. case M_BRACKET_IN_ANG: /* <> */
  425. if (record->event.pressed) {
  426. SEND_STRING("<>" SS_TAP(X_LEFT));
  427. return false;
  428. }
  429. break;
  430. case M_BRACKET_OUT_CBR: /* }{ */
  431. if (record->event.pressed) {
  432. SEND_STRING("}{" SS_TAP(X_LEFT));
  433. return false;
  434. }
  435. break;
  436. case M_BRACKET_OUT_PRN: /* )( */
  437. if (record->event.pressed) {
  438. SEND_STRING(")(" SS_TAP(X_LEFT));
  439. return false;
  440. }
  441. break;
  442. case M_BRACKET_OUT_BRC: /* ][ */
  443. if (record->event.pressed) {
  444. SEND_STRING("][" SS_TAP(X_LEFT));
  445. return false;
  446. }
  447. break;
  448. case M_BRACKET_OUT_ANG: /* >< */
  449. if (record->event.pressed) {
  450. SEND_STRING("><" SS_TAP(X_LEFT));
  451. return false;
  452. }
  453. break;
  454. case M_ARROW_LMINUS: /* <- */
  455. if (record->event.pressed) {
  456. SEND_STRING("<-");
  457. return false;
  458. }
  459. break;
  460. case M_ARROW_RMINUS: /* -> */
  461. if (record->event.pressed) {
  462. SEND_STRING("->");
  463. return false;
  464. }
  465. break;
  466. case M_ARROW_LEQL: /* <= */
  467. if (record->event.pressed) {
  468. SEND_STRING("<=");
  469. return false;
  470. }
  471. break;
  472. case M_ARROW_REQL: /* => */
  473. if (record->event.pressed) {
  474. SEND_STRING("=>");
  475. return false;
  476. }
  477. break;
  478. #ifdef CFQ_USE_SHIFT_QUOTES
  479. case KC_LSHIFT: /* '' */
  480. if (record->event.pressed && (keyboard_report->mods & (MOD_BIT(KC_RSFT)))) {
  481. WITHOUT_MODS({
  482. SEND_STRING("''" SS_TAP(X_LEFT) SS_DOWN(X_RSHIFT) SS_DOWN(X_LSHIFT));
  483. });
  484. return false;
  485. }
  486. break;
  487. case KC_RSHIFT: /* "" */
  488. if (record->event.pressed && (keyboard_report->mods & (MOD_BIT(KC_LSFT)))) {
  489. WITHOUT_MODS({
  490. SEND_STRING("\x22\x22" SS_TAP(X_LEFT) SS_DOWN(X_LSHIFT) SS_DOWN(X_RSHIFT));
  491. });
  492. return false;
  493. }
  494. break;
  495. #endif /* CFQ_USE_SHIFT_QUOTES */
  496. case M_WORD_A...M_WORD_Z:
  497. {
  498. uint8_t shift_index = (keyboard_report->mods & (MOD_BIT(KC_RSFT) | MOD_BIT(KC_LSFT))) ? 1 : 0;
  499. const char *word = cfq_word_lut[shift_index][keycode - M_WORD_A];
  500. if (record->event.pressed) {
  501. if (*word) {
  502. WITHOUT_MODS({
  503. send_string(word);
  504. });
  505. }
  506. return false;
  507. }
  508. break;
  509. }
  510. }
  511. return true;
  512. }
  513. /* Runs just one time when the keyboard initializes. */
  514. void matrix_init_user(void) {
  515. /* Duplicate 'cfq_word_lut[0][...]' into 'cfq_word_lut[1][...]' */
  516. {
  517. char *d = cfq_word_lut_title_caps;
  518. for (uint16_t i = 0; i < 26; i++) {
  519. char *s = cfq_word_lut[0][i];
  520. cfq_word_lut[1][i] = d;
  521. while ((*d++ = *s++)) {}
  522. }
  523. }
  524. /* Title caps. */
  525. for (uint16_t i = 0; i < 26; i++) {
  526. char *w = cfq_word_lut[1][i];
  527. bool prev_is_alpha = false;
  528. if (*w) {
  529. while (*w) {
  530. bool is_lower = (*w >= 'a' && *w <= 'z');
  531. bool is_upper = (*w >= 'A' && *w <= 'Z');
  532. if (prev_is_alpha == false && is_lower) {
  533. *w -= ('a' - 'A');
  534. }
  535. prev_is_alpha = is_lower || is_upper;
  536. w++;
  537. }
  538. }
  539. }
  540. };
  541. /* Runs constantly in the background, in a loop. */
  542. void matrix_scan_user(void) {
  543. uint8_t layer = biton32(layer_state);
  544. ergodox_board_led_off();
  545. ergodox_right_led_1_off();
  546. ergodox_right_led_2_off();
  547. ergodox_right_led_3_off();
  548. switch (layer) {
  549. case 1:
  550. ergodox_right_led_1_on();
  551. break;
  552. case 2:
  553. ergodox_right_led_2_on();
  554. break;
  555. case 3:
  556. ergodox_right_led_3_on();
  557. break;
  558. default:
  559. /* none */
  560. break;
  561. }
  562. };