]> git.donarmstrong.com Git - qmk_firmware.git/blob - layouts/community/ergodox/qwerty_code_friendly/keymap.c
[Keyboard] Add QMK configurator JSON for Alice PCB (#6397)
[qmk_firmware.git] / layouts / community / ergodox / qwerty_code_friendly / keymap.c
1 /* -*- Mode:C; c-basic-offset:2; tab-width:2; indent-tabs-mode:nil; evil-indent-convert-tabs:t; -*- */
2
3 #include QMK_KEYBOARD_H
4 #include "debug.h"
5 #include "action_layer.h"
6 #include "version.h"
7
8 /**
9  * See `readme.md` for notes on each define.
10  */
11
12 /**
13  * Optionally support 80 key layout.
14  *
15  * No default keys defined: use 'CFQ_USER_K80_L0K0' .. etc.
16  */
17 /* #define CFQ_USE_80_KEYS */
18
19 /** Personal preference (enable by passing 'EXTRAFLAGS=...' to make). */
20 /* #define CFQ_USE_MOMENTARY_LAYER_KEYS */
21
22 /** Holding right/left or left/right shift for single or double quote pair */
23 /* #define CFQ_USE_SHIFT_QUOTES */
24
25 #define CFQ_USE_DYNAMIC_MACRO
26
27
28 #if !defined(CFQ_USER_KEY0)
29 #  define CFQ_USER_KEY0 KC_BSPC
30 #endif
31 #if !defined(CFQ_USER_KEY1)
32 #  define CFQ_USER_KEY1 CFQ_KC_FN1
33 #endif
34 #if !defined(CFQ_USER_KEY2)
35 #  define CFQ_USER_KEY2 KC_INS
36 #endif
37 #if !defined(CFQ_USER_KEY3)
38 #  define CFQ_USER_KEY3 KC_NLCK
39 #endif
40 #if !defined(CFQ_USER_KEY4)
41 #  define CFQ_USER_KEY4 KC_BSPC
42 #endif
43 #if !defined(CFQ_USER_KEY5)
44 #  define CFQ_USER_KEY5 KC_DELT
45 #endif
46 #if !defined(CFQ_USER_KEY6)
47 #  define CFQ_USER_KEY6 KC_CAPS
48 #endif
49 #if !defined(CFQ_USER_KEY7)
50 #  define CFQ_USER_KEY7 CFQ_KC_FN3
51 #endif
52 #if !defined(CFQ_USER_KEY8)
53 #  define CFQ_USER_KEY8 KC_DEL
54 #endif
55
56 #ifdef CFQ_USE_80_KEYS
57 #  define LAYOUT_ergodox_76_or_80 LAYOUT_ergodox_80
58 #  define K80(a) CFQ_USER_K80_##a
59 #else
60 #  define LAYOUT_ergodox_76_or_80( \
61         k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, \
62         k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, \
63         k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, \
64         k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, \
65          \
66         k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, \
67         k50, k51, k52, k53, k54, k55, k56, k57, k58, k59, \
68         k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, \
69         k70, k71, k72, k73, k74, k75, k76, k77, k78, k79) \
70   LAYOUT_ergodox( \
71           k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, \
72           k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, \
73           k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, \
74           k30, k31, k32, k33,           k36, k37, k38, k39, \
75            \
76           k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, \
77           k50, k51, k52, k53, k54, k55, k56, k57, k58, k59, \
78           k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, \
79           k70, k71, k72, k73, k74,           k77, k78, k79)
80 #  define K80(a) KC_TRNS
81 #endif
82
83 /**
84  * Used to generate lines below:
85  * \code{.py}
86  * text = '#  ifndef CFQ_USER_K80_L0K0\n#    define CFQ_USER_K80_L0K0 KC_TRNS\n#  endif'
87  * print('\n'.join([text.replace('L0', f'L{l}').replace('K0', f'K{k}') for l in range(3) for k in range(4)]))
88  * \endcode
89  */
90 #ifdef CFQ_USE_80_KEYS
91 #  ifndef CFQ_USER_K80_L0K0
92 #    define CFQ_USER_K80_L0K0 KC_TRNS
93 #  endif
94 #  ifndef CFQ_USER_K80_L0K1
95 #    define CFQ_USER_K80_L0K1 KC_TRNS
96 #  endif
97 #  ifndef CFQ_USER_K80_L0K2
98 #    define CFQ_USER_K80_L0K2 KC_TRNS
99 #  endif
100 #  ifndef CFQ_USER_K80_L0K3
101 #    define CFQ_USER_K80_L0K3 KC_TRNS
102 #  endif
103 #  ifndef CFQ_USER_K80_L1K0
104 #    define CFQ_USER_K80_L1K0 KC_TRNS
105 #  endif
106 #  ifndef CFQ_USER_K80_L1K1
107 #    define CFQ_USER_K80_L1K1 KC_TRNS
108 #  endif
109 #  ifndef CFQ_USER_K80_L1K2
110 #    define CFQ_USER_K80_L1K2 KC_TRNS
111 #  endif
112 #  ifndef CFQ_USER_K80_L1K3
113 #    define CFQ_USER_K80_L1K3 KC_TRNS
114 #  endif
115 #  ifndef CFQ_USER_K80_L2K0
116 #    define CFQ_USER_K80_L2K0 KC_TRNS
117 #  endif
118 #  ifndef CFQ_USER_K80_L2K1
119 #    define CFQ_USER_K80_L2K1 KC_TRNS
120 #  endif
121 #  ifndef CFQ_USER_K80_L2K2
122 #    define CFQ_USER_K80_L2K2 KC_TRNS
123 #  endif
124 #  ifndef CFQ_USER_K80_L2K3
125 #    define CFQ_USER_K80_L2K3 KC_TRNS
126 #  endif
127 #  ifndef CFQ_USER_K80_L3K0
128 #    define CFQ_USER_K80_L3K0 KC_TRNS
129 #  endif
130 #  ifndef CFQ_USER_K80_L3K1
131 #    define CFQ_USER_K80_L3K1 KC_TRNS
132 #  endif
133 #  ifndef CFQ_USER_K80_L3K2
134 #    define CFQ_USER_K80_L3K2 KC_TRNS
135 #  endif
136 #  ifndef CFQ_USER_K80_L3K3
137 #    define CFQ_USER_K80_L3K3 KC_TRNS
138 #  endif
139 #endif
140
141 #ifndef CFQ_WORD_A
142 #define CFQ_WORD_A ""
143 #endif
144 #ifndef CFQ_WORD_B
145 #define CFQ_WORD_B ""
146 #endif
147 #ifndef CFQ_WORD_C
148 #define CFQ_WORD_C ""
149 #endif
150 #ifndef CFQ_WORD_D
151 #define CFQ_WORD_D ""
152 #endif
153 #ifndef CFQ_WORD_E
154 #define CFQ_WORD_E ""
155 #endif
156 #ifndef CFQ_WORD_F
157 #define CFQ_WORD_F ""
158 #endif
159 #ifndef CFQ_WORD_G
160 #define CFQ_WORD_G ""
161 #endif
162 #ifndef CFQ_WORD_H
163 #define CFQ_WORD_H ""
164 #endif
165 #ifndef CFQ_WORD_I
166 #define CFQ_WORD_I ""
167 #endif
168 #ifndef CFQ_WORD_J
169 #define CFQ_WORD_J ""
170 #endif
171 #ifndef CFQ_WORD_K
172 #define CFQ_WORD_K ""
173 #endif
174 #ifndef CFQ_WORD_L
175 #define CFQ_WORD_L ""
176 #endif
177 #ifndef CFQ_WORD_M
178 #define CFQ_WORD_M ""
179 #endif
180 #ifndef CFQ_WORD_N
181 #define CFQ_WORD_N ""
182 #endif
183 #ifndef CFQ_WORD_O
184 #define CFQ_WORD_O ""
185 #endif
186 #ifndef CFQ_WORD_P
187 #define CFQ_WORD_P ""
188 #endif
189 #ifndef CFQ_WORD_Q
190 #define CFQ_WORD_Q ""
191 #endif
192 #ifndef CFQ_WORD_R
193 #define CFQ_WORD_R ""
194 #endif
195 #ifndef CFQ_WORD_S
196 #define CFQ_WORD_S ""
197 #endif
198 #ifndef CFQ_WORD_T
199 #define CFQ_WORD_T ""
200 #endif
201 #ifndef CFQ_WORD_U
202 #define CFQ_WORD_U ""
203 #endif
204 #ifndef CFQ_WORD_V
205 #define CFQ_WORD_V ""
206 #endif
207 #ifndef CFQ_WORD_W
208 #define CFQ_WORD_W ""
209 #endif
210 #ifndef CFQ_WORD_X
211 #define CFQ_WORD_X ""
212 #endif
213 #ifndef CFQ_WORD_Y
214 #define CFQ_WORD_Y ""
215 #endif
216 #ifndef CFQ_WORD_Z
217 #define CFQ_WORD_Z ""
218 #endif
219
220 /* lower and title capitals versions (setup at start). */
221 static char *cfq_word_lut[2][26] = {
222   {
223     CFQ_WORD_A, CFQ_WORD_B, CFQ_WORD_C, CFQ_WORD_D, CFQ_WORD_E, CFQ_WORD_F,
224     CFQ_WORD_G, CFQ_WORD_H, CFQ_WORD_I, CFQ_WORD_J, CFQ_WORD_K, CFQ_WORD_L,
225     CFQ_WORD_M, CFQ_WORD_N, CFQ_WORD_O, CFQ_WORD_P, CFQ_WORD_Q, CFQ_WORD_R,
226     CFQ_WORD_S, CFQ_WORD_T, CFQ_WORD_U, CFQ_WORD_V, CFQ_WORD_W, CFQ_WORD_X,
227     CFQ_WORD_Y, CFQ_WORD_Z,
228   },
229   {NULL}
230 };
231
232 /* Storage for title-caps strings. */
233 static char cfq_word_lut_title_caps[
234     sizeof(CFQ_WORD_A) + sizeof(CFQ_WORD_B) + sizeof(CFQ_WORD_C) + sizeof(CFQ_WORD_D) +
235     sizeof(CFQ_WORD_E) + sizeof(CFQ_WORD_F) + sizeof(CFQ_WORD_G) + sizeof(CFQ_WORD_H) +
236     sizeof(CFQ_WORD_I) + sizeof(CFQ_WORD_J) + sizeof(CFQ_WORD_K) + sizeof(CFQ_WORD_L) +
237     sizeof(CFQ_WORD_M) + sizeof(CFQ_WORD_N) + sizeof(CFQ_WORD_O) + sizeof(CFQ_WORD_P) +
238     sizeof(CFQ_WORD_Q) + sizeof(CFQ_WORD_R) + sizeof(CFQ_WORD_S) + sizeof(CFQ_WORD_T) +
239     sizeof(CFQ_WORD_U) + sizeof(CFQ_WORD_V) + sizeof(CFQ_WORD_W) + sizeof(CFQ_WORD_X) +
240     sizeof(CFQ_WORD_Y) + sizeof(CFQ_WORD_Z)
241 ];
242
243 #define LAYER_BASE 0 /* default layer */
244 #define LAYER_KPAD 1 /* keypad */
245 #define LAYER_MDIA 2 /* media keys */
246 #define LAYER_FKEY 3 /* F-Keys & Words */
247
248 enum custom_keycodes {
249   PLACEHOLDER = SAFE_RANGE, /* can always be here */
250   RGB_SLD,
251
252   M_BRACKET_IN_CBR,
253   M_BRACKET_IN_PRN,
254   M_BRACKET_IN_BRC,
255   M_BRACKET_IN_ANG,
256   M_BRACKET_OUT_CBR,
257   M_BRACKET_OUT_PRN,
258   M_BRACKET_OUT_BRC,
259   M_BRACKET_OUT_ANG,
260   M_ARROW_RMINUS,
261   M_ARROW_LMINUS,
262   M_ARROW_REQL,
263   M_ARROW_LEQL,
264
265   /* allow user defined words for each character:
266    * use CFQ_WORD_[A-Z] defines. */
267   M_WORD_A, M_WORD_B, M_WORD_C, M_WORD_D, M_WORD_E, M_WORD_F,
268   M_WORD_G, M_WORD_H, M_WORD_I, M_WORD_J, M_WORD_K, M_WORD_L,
269   M_WORD_M, M_WORD_N, M_WORD_O, M_WORD_P, M_WORD_Q, M_WORD_R,
270   M_WORD_S, M_WORD_T, M_WORD_U, M_WORD_V, M_WORD_W, M_WORD_X,
271   M_WORD_Y, M_WORD_Z,
272
273 #ifdef CFQ_USE_DYNAMIC_MACRO
274   DYNAMIC_MACRO_RANGE,
275 #endif
276 };
277
278 #ifdef CFQ_USE_DYNAMIC_MACRO
279 #  include "dynamic_macro.h"
280 #else
281    /* avoid ifdef's in keymap */
282 #  define DYN_REC_START1 KC_TRNS
283 #  define DYN_REC_START2 KC_TRNS
284 #  define DYN_MACRO_PLAY1 KC_TRNS
285 #  define DYN_MACRO_PLAY2 KC_TRNS
286 #  define DYN_REC_STOP KC_TRNS
287 #endif
288
289 #ifdef CFQ_USE_MOMENTARY_LAYER_KEYS
290 #define CFQ_KC_FN1 MO(1)
291 #define CFQ_KC_FN2 MO(2)
292 #define CFQ_KC_FN3 MO(3)
293 #else
294 #define CFQ_KC_FN1 TT(1)
295 #define CFQ_KC_FN2 TT(2)
296 #define CFQ_KC_FN3 TT(3)
297 #endif
298
299 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
300 /* Keymap 0: Basic layer
301  * .--------------------------------------------------.  .--------------------------------------------------.
302  * | Grave  |   !  |   @  |   #  |   $  |   %  |   {  |  |  }   |   ^  |   &  |   *  |   -  |   =  | BSpace |
303  * |--------+------+------+------+------+------+------|  |------+------+------+------+------+------+--------|
304  * | Tab    |   Q  |   W  |   E  |   R  |   T  |   (  |  |  )   |   Y  |   U  |   I  |   O  |   P  |   \    |
305  * |--------+------+------+------+------+------|      |  |      |------+------+------+------+------+--------|
306  * | Esc    |   A  |   S  |   D  |   F  |   G  |------|  |------|   H  |   J  |   K  |   L  |   ;  |   '    |
307  * |--------+------+------+------+------+------|   [  |  |  ]   |------+------+------+------+------+--------|
308  * | LShift |   Z  |   X  |   C  |   V  |   B  |      |  |      |   N  |   M  |   ,  |   .  |   /  | RShift |
309  * '--------+------+------+------+------+-------------'  '-------------+------+------+------+------+--------'
310  *   | LCtl |Super | Alt  | ~L1  |Space |                              | Left | Down | Up   |Right | Del  |
311  *   '----------------------------------'                              '----------------------------------'
312  *                                      .-------------.  .-------------.
313  *                                      | Ins  |NumClk|  | Home | End  |
314  *                               .------+------+------|  |------+------+------.
315  *                               |      |      |CapsLk|  | PgUp |      |      |
316  *                               |BSpace| Del  |------|  |------| ~L2  |Enter |
317  *                               |      |      | ~L3  |  | PgDn |      |      |
318  *                               '--------------------'  '--------------------'
319  *
320  * Optional overrides: see CFQ_USER_KEY# defines.
321  *
322  * .--------------------------------------------------.  .--------------------------------------------------.
323  * |        |      |      |      |      |      |      |  |      |      |      |      |      |      | USR0   |
324  * |--------+------+------+------+------+------+------|  |------+------+------+------+------+------+--------|
325  * |        |      |      |      |      |      |      |  |      |      |      |      |      |      |        |
326  * |--------+------+------+------+------+------|      |  |      |------+------+------+------+------+--------|
327  * |        |      |      |      |      |      |------|  |------|      |      |      |      |      |        |
328  * |--------+------+------+------+------+------|      |  |      |------+------+------+------+------+--------|
329  * |        |      |      |      |      |      |      |  |      |      |      |      |      |      |        |
330  * '--------+------+------+------+------+-------------'  '-------------+------+------+------+------+--------'
331  *   |      |      |      | USR1 |      |                              |      |      |      |      | USR8 |
332  *   '----------------------------------'                              '----------------------------------'
333  *                                      .-------------.  .-------------.
334  *                                      | USR2 | USR3 |  |      |      |
335  *                               .------+------+------|  |------+------+------.
336  *                               |      |      | USR6 |  |      |      |      |
337  *                               | USR4 | USR5 |------|  |------|      |      |
338  *                               |      |      | USR7 |  |      |      |      |
339  *                               '--------------------'  '--------------------'
340  */
341
342 /* If it accepts an argument (i.e, is a function), it doesn't need KC_.
343  * Otherwise, it needs KC_* */
344 [LAYER_BASE] = LAYOUT_ergodox_76_or_80(  /* layer 0 : default */
345   /* left hand */
346   KC_GRV,  KC_EXLM, KC_AT,   KC_HASH,       KC_DLR, KC_PERC, KC_LCBR,
347   KC_TAB,  KC_Q,    KC_W,    KC_E,          KC_R,   KC_T,    KC_LPRN,
348   KC_ESC,  KC_A,    KC_S,    KC_D,          KC_F,   KC_G,
349   KC_LSFT, KC_Z,    KC_X,    KC_C,          KC_V,   KC_B,    KC_LBRC,
350   KC_LCTL, KC_LGUI, KC_LALT, CFQ_USER_KEY1, KC_SPC,
351                                                     CFQ_USER_KEY2, CFQ_USER_KEY3,
352                                      K80(L0K0),     K80(L0K1),     CFQ_USER_KEY6,
353                                      CFQ_USER_KEY4, CFQ_USER_KEY5, CFQ_USER_KEY7,
354   /* right hand */
355   KC_RCBR,     KC_CIRC, KC_AMPR, KC_ASTR,KC_MINS, KC_EQL,    CFQ_USER_KEY0,
356   KC_RPRN,     KC_Y,    KC_U,    KC_I,   KC_O,    KC_P,      KC_BSLS,
357                KC_H,    KC_J,    KC_K,   KC_L,    KC_SCLN,   KC_QUOT,
358   KC_RBRC,     KC_N,    KC_M,    KC_COMM,KC_DOT,  KC_SLSH,   KC_RSFT,
359                         KC_LEFT, KC_DOWN,KC_UP,   KC_RGHT,   CFQ_USER_KEY8,
360   KC_HOME, KC_END,
361   KC_PGUP, K80(L0K2),  K80(L0K3),
362   KC_PGDN, CFQ_KC_FN2, KC_ENT
363 ),
364 /* Keymap 1: KeyPad, Macro Record
365  *
366  * .--------------------------------------------------.  .--------------------------------------------------.
367  * |        |      |      |      |      |      |  {}  |  |  }{  |      |NumLck|   /  |   *  |   -  |        |
368  * |--------+------+------+------+------+------+------|  |------+------+------+------+------+------+--------|
369  * |        |      |      |      |      |  =>  |  ()  |  |  )(  |  <=  |   7  |   8  |   9  |   +  |        |
370  * |--------+------+------+------+------+------|      |  |      |------+------+------+------+------+--------|
371  * |        |      |      |      |      |  ->  |------|  |------|  <-  |   4  |   5  |   6  |   +  |        |
372  * |--------+------+------+------+------+------|  []  |  |  ][  |------+------+------+------+------+--------|
373  * |        |      |      |      |      |  <>  |      |  |      |  ><  |   1  |   2  |   3  | Enter|        |
374  * '--------+------+------+------+------+-------------'  '-------------+------+------+------+------+--------'
375  *   |      |      |      |      |      |                              |   0  |      |   .  | Enter|      |
376  *   '----------------------------------'                              '----------------------------------'
377  *                                      .-------------.  .-------------.
378  *                                      |Start1|Start2|  |      |      |
379  *                               .------+------+------|  |------+------+------.
380  *                               |      |      | Stop |  |      |      |      |
381  *                               |Play1 |Play2 |------|  |------|      |      |
382  *                               |      |      |      |  |      |      |      |
383  *                               '--------------------'  '--------------------'
384  */
385 /* KEYPAD & MACRO */
386 [LAYER_KPAD] = LAYOUT_ergodox_76_or_80(
387   /* left hand */
388   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          M_BRACKET_IN_CBR,
389   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M_ARROW_REQL,     M_BRACKET_IN_PRN,
390   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M_ARROW_RMINUS,
391   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M_BRACKET_IN_ANG, M_BRACKET_IN_BRC,
392   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
393                                                DYN_REC_START1,   DYN_REC_START2,
394                               K80(L1K0),       K80(L1K1),        DYN_REC_STOP,
395                               DYN_MACRO_PLAY1, DYN_MACRO_PLAY2,  KC_TRNS,
396   /* right hand */
397   M_BRACKET_OUT_CBR, KC_TRNS,           KC_NLCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS,  KC_TRNS,
398   M_BRACKET_OUT_PRN, M_ARROW_LEQL,      KC_KP_7, KC_KP_8,     KC_KP_9,        KC_KP_PLUS,  KC_TRNS,
399                      M_ARROW_LMINUS,    KC_KP_4, KC_KP_5,     KC_KP_6,        KC_KP_PLUS,  KC_TRNS,
400   M_BRACKET_OUT_BRC, M_BRACKET_OUT_ANG, KC_KP_1, KC_KP_2,     KC_KP_3,        KC_KP_ENTER, KC_TRNS,
401                                         KC_KP_0, KC_TRNS,     KC_KP_DOT,      KC_KP_ENTER, KC_TRNS,
402   KC_TRNS, KC_TRNS,
403   KC_TRNS, K80(L1K2), K80(L1K3),
404   KC_TRNS, KC_TRNS, KC_TRNS
405 ),
406 /* Keymap 2: FKeys, media & mouse keys
407  *
408  * .--------------------------------------------------.  .--------------------------------------------------.
409  * |        |      |      |      |      |      |      |  | Mute |      |  F10 |  F11 |  F12 |      |        |
410  * |--------+------+------+------+------+------+------|  |------+------+------+------+------+------+--------|
411  * |        |      |      | MsUp |      |      |MWhlUp|  |VolUp |      |  F7  |  F8  |  F9  |      |        |
412  * |--------+------+------+------+------+------|      |  |      |------+------+------+------+------+--------|
413  * |        |      |MsLeft|MsDown|MsRght|      |------|  |------|      |  F4  |  F5  |  F6  |      |        |
414  * |--------+------+------+------+------+------|MWhlDn|  |VolDn |------+------+------+------+------+--------|
415  * |        |      | Rclk | Mclk | Lclk |      |      |  |      |      |  F1  |  F2  |  F3  |      |        |
416  * '--------+------+------+------+------+-------------'  '-------------+------+------+------+------+--------'
417  *   |      |      |      |      |      |                              |      |      |      |      |      |
418  *   '----------------------------------'                              '----------------------------------'
419  *                                      .-------------.  .-------------.
420  *                                      |      |      |  | MRwd | MFwd |
421  *                               .------+------+------|  |------+------+------.
422  *                               |      |      |      |  | MPrv |      |      |
423  *                               |      |      |------|  |------|      | Play |
424  *                               |      |      |      |  | MNxt |      |      |
425  *                               '--------------------'  '--------------------'
426  */
427 /* MEDIA, MOUSE & NUMBERS */
428 [LAYER_MDIA] = LAYOUT_ergodox_76_or_80(
429   /* left hand */
430   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
431   KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_WH_U,
432   KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
433   KC_TRNS, KC_TRNS, KC_BTN2, KC_BTN3, KC_BTN1, KC_TRNS, KC_WH_D,
434   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
435                                       KC_TRNS,   KC_TRNS,
436                            K80(L2K0), K80(L2K1), KC_TRNS,
437                            KC_TRNS,   KC_TRNS,   KC_TRNS,
438   /* right hand */
439   KC_MUTE,  KC_TRNS, KC_F10,  KC_F11,  KC_F12,  KC_TRNS, KC_TRNS,
440   KC_VOLU,  KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_TRNS, KC_TRNS,
441             KC_TRNS, KC_F4,   KC_F5,   KC_F6,   KC_TRNS, KC_TRNS,
442   KC_VOLD,  KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_TRNS, KC_TRNS,
443                      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
444   KC_MRWD, KC_MFFD,
445   KC_MPRV, K80(L2K2), K80(L2K3),
446   KC_MNXT, KC_TRNS, KC_MPLY
447 ),
448 /* Keymap 3: Entire Words (one for each key) & Numbers
449  *
450  * .--------------------------------------------------.  .--------------------------------------------------.
451  * |        |   1  |   2  |   3  |   4  |   5  |      |  |      |   6  |   7  |   8  |   9  |   0  |        |
452  * |--------+------+------+------+------+------+------|  |------+------+------+------+------+------+--------|
453  * |        |   Q  |   W  |   E  |   R  |   T  |      |  |      |   Y  |   U  |   I  |   O  |   P  |        |
454  * |--------+------+------+------+------+------|      |  |      |------+------+------+------+------+--------|
455  * |        |   A  |   S  |   D  |   F  |   G  |------|  |------|   H  |   J  |   K  |   L  |      |        |
456  * |--------+------+------+------+------+------|      |  |      |------+------+------+------+------+--------|
457  * |        |   Z  |   X  |   C  |   V  |   B  |      |  |      |   N  |   M  |      |      |      |        |
458  * '--------+------+------+------+------+-------------'  '-------------+------+------+------+------+--------'
459  *   |      |      |      |      |      |                              |      |      |      |      |      |
460  *   '----------------------------------'                              '----------------------------------'
461  *                                      .-------------.  .-------------.
462  *                                      |      |      |  |      |      |
463  *                               .------+------+------|  |------+------+------.
464  *                               |      |      |      |  |      |      |      |
465  *                               |      |      |------|  |------|      |      |
466  *                               |      |      |      |  |      |      |      |
467  *                               '--------------------'  '--------------------'
468  */
469
470 /* FKEY & WORDS */
471 [LAYER_FKEY] = LAYOUT_ergodox_76_or_80(
472   /* left hand */
473   KC_TRNS, KC_1,     KC_2,     KC_3,     KC_4,     KC_5,     KC_TRNS,
474   KC_TRNS, M_WORD_Q, M_WORD_W, M_WORD_E, M_WORD_R, M_WORD_T, KC_TRNS,
475   KC_TRNS, M_WORD_A, M_WORD_S, M_WORD_D, M_WORD_F, M_WORD_G,
476   KC_TRNS, M_WORD_Z, M_WORD_X, M_WORD_C, M_WORD_V, M_WORD_B, KC_TRNS,
477   KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,
478                                                     KC_TRNS,   KC_TRNS,
479                                          K80(L3K0), K80(L3K1), KC_TRNS,
480                                          KC_TRNS,   KC_TRNS,   KC_TRNS,
481   /* right hand */
482   KC_TRNS, KC_6,     KC_7,     KC_8,     KC_9,     KC_0,     KC_TRNS,
483   KC_TRNS, M_WORD_Y, M_WORD_U, M_WORD_I, M_WORD_O, M_WORD_P, KC_TRNS,
484            M_WORD_H, M_WORD_J, M_WORD_K, M_WORD_L, KC_TRNS,  KC_TRNS,
485   KC_TRNS, M_WORD_N, M_WORD_M, KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,
486                      KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,
487   KC_TRNS, KC_TRNS,
488   KC_TRNS, K80(L3K2), K80(L3K3),
489   KC_TRNS, KC_TRNS, KC_TRNS
490 ),
491 };
492
493 #define WITHOUT_MODS(...) \
494   do { \
495     uint8_t _real_mods = get_mods(); \
496     clear_mods(); \
497     { __VA_ARGS__ } \
498     set_mods(_real_mods); \
499   } while (0)
500
501 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
502 #ifdef CFQ_USE_DYNAMIC_MACRO
503   if (!process_record_dynamic_macro(keycode, record)) {
504     return false;
505   }
506 #endif
507   switch (keycode) {
508     /* dynamically generate these. */
509     case RGB_SLD:
510       if (record->event.pressed) {
511 #ifdef RGBLIGHT_ENABLE
512         rgblight_mode(1);
513 #endif
514       }
515       return false;
516       break;
517     case M_BRACKET_IN_CBR:  /* {} */
518       if (record->event.pressed) {
519         SEND_STRING("{}" SS_TAP(X_LEFT));
520         return false;
521       }
522       break;
523     case M_BRACKET_IN_PRN:  /* () */
524       if (record->event.pressed) {
525         SEND_STRING("()" SS_TAP(X_LEFT));
526         return false;
527       }
528       break;
529     case M_BRACKET_IN_BRC:  /* [] */
530       if (record->event.pressed) {
531         SEND_STRING("[]" SS_TAP(X_LEFT));
532         return false;
533       }
534       break;
535     case M_BRACKET_IN_ANG:  /* <> */
536       if (record->event.pressed) {
537         SEND_STRING("<>" SS_TAP(X_LEFT));
538         return false;
539       }
540       break;
541     case M_BRACKET_OUT_CBR:  /* }{ */
542       if (record->event.pressed) {
543         SEND_STRING("}{" SS_TAP(X_LEFT));
544         return false;
545       }
546       break;
547     case M_BRACKET_OUT_PRN:  /* )( */
548       if (record->event.pressed) {
549         SEND_STRING(")(" SS_TAP(X_LEFT));
550         return false;
551       }
552       break;
553     case M_BRACKET_OUT_BRC:  /* ][ */
554       if (record->event.pressed) {
555         SEND_STRING("][" SS_TAP(X_LEFT));
556         return false;
557       }
558       break;
559     case M_BRACKET_OUT_ANG:  /* >< */
560       if (record->event.pressed) {
561         SEND_STRING("><" SS_TAP(X_LEFT));
562         return false;
563       }
564       break;
565     case M_ARROW_LMINUS:  /* <- */
566       if (record->event.pressed) {
567         SEND_STRING("<-");
568         return false;
569       }
570       break;
571     case M_ARROW_RMINUS:  /* -> */
572       if (record->event.pressed) {
573         SEND_STRING("->");
574         return false;
575       }
576       break;
577     case M_ARROW_LEQL:  /* <= */
578       if (record->event.pressed) {
579         SEND_STRING("<=");
580         return false;
581       }
582       break;
583     case M_ARROW_REQL:  /* => */
584       if (record->event.pressed) {
585         SEND_STRING("=>");
586         return false;
587       }
588       break;
589 #ifdef CFQ_USE_SHIFT_QUOTES
590     case KC_LSHIFT:  /* '' */
591       if (record->event.pressed && (keyboard_report->mods & (MOD_BIT(KC_RSFT)))) {
592         WITHOUT_MODS({
593             SEND_STRING("''" SS_TAP(X_LEFT) SS_DOWN(X_RSHIFT) SS_DOWN(X_LSHIFT));
594           });
595         return false;
596       }
597       break;
598     case KC_RSHIFT:  /* "" */
599       if (record->event.pressed && (keyboard_report->mods & (MOD_BIT(KC_LSFT)))) {
600         WITHOUT_MODS({
601             SEND_STRING("\x22\x22" SS_TAP(X_LEFT) SS_DOWN(X_LSHIFT) SS_DOWN(X_RSHIFT));
602           });
603         return false;
604       }
605       break;
606 #endif  /* CFQ_USE_SHIFT_QUOTES */
607     case M_WORD_A...M_WORD_Z:
608     {
609       uint8_t shift_index = (keyboard_report->mods & (MOD_BIT(KC_RSFT) | MOD_BIT(KC_LSFT))) ? 1 : 0;
610       const char *word = cfq_word_lut[shift_index][keycode - M_WORD_A];
611       if (record->event.pressed) {
612         if (*word) {
613           WITHOUT_MODS({
614               send_string(word);
615             });
616         }
617         return false;
618       }
619       break;
620     }
621   }
622
623   return true;
624 }
625
626 /* Runs just one time when the keyboard initializes. */
627 void matrix_init_user(void) {
628
629   /* Duplicate 'cfq_word_lut[0][...]' into 'cfq_word_lut[1][...]' */
630   {
631     char *d = cfq_word_lut_title_caps;
632     for (uint16_t i = 0; i < 26; i++) {
633       char *s = cfq_word_lut[0][i];
634       cfq_word_lut[1][i] = d;
635       while ((*d++ = *s++)) {}
636     }
637   }
638   /* Title caps. */
639   for (uint16_t i = 0; i < 26; i++) {
640     char *w = cfq_word_lut[1][i];
641     bool prev_is_alpha = false;
642     if (*w) {
643       while (*w) {
644         bool is_lower = (*w >= 'a' && *w <= 'z');
645         bool is_upper = (*w >= 'A' && *w <= 'Z');
646         if (prev_is_alpha == false && is_lower) {
647           *w -= ('a' - 'A');
648         }
649         prev_is_alpha = is_lower || is_upper;
650         w++;
651       }
652     }
653   }
654 };
655
656 /* Runs constantly in the background, in a loop. */
657 void matrix_scan_user(void) {
658
659   uint8_t layer = biton32(layer_state);
660
661   ergodox_board_led_off();
662   ergodox_right_led_1_off();
663   ergodox_right_led_2_off();
664   ergodox_right_led_3_off();
665   switch (layer) {
666     case 1:
667       ergodox_right_led_1_on();
668       break;
669     case 2:
670       ergodox_right_led_2_on();
671       break;
672     case 3:
673       ergodox_right_led_3_on();
674       break;
675     default:
676       /* none */
677       break;
678   }
679
680 };