diff options
Diffstat (limited to 'layouts/community/ergodox/bepo_csa/keymap.c')
-rw-r--r-- | layouts/community/ergodox/bepo_csa/keymap.c | 527 |
1 files changed, 527 insertions, 0 deletions
diff --git a/layouts/community/ergodox/bepo_csa/keymap.c b/layouts/community/ergodox/bepo_csa/keymap.c new file mode 100644 index 000000000..9526ea3f7 --- /dev/null +++ b/layouts/community/ergodox/bepo_csa/keymap.c | |||
@@ -0,0 +1,527 @@ | |||
1 | /* TypeMatrix-2030-like keymap */ | ||
2 | #include QMK_KEYBOARD_H | ||
3 | #include "debug.h" | ||
4 | #include "action_layer.h" | ||
5 | #include "action_util.h" | ||
6 | #include "led.h" | ||
7 | #include "keymap_extras/keymap_bepo.h" | ||
8 | #include "keymap_extras/keymap_canadian_multilingual.h" | ||
9 | |||
10 | enum layers { | ||
11 | LR_BASE, // default layer | ||
12 | LR_CSA, // BÉPO over Canadian Multilingual (CSA) | ||
13 | LR_CSA_SFT, // shifted BÉPO over CSA | ||
14 | LR_CSA_AGR, // altgr-ed BÉPO over CSA | ||
15 | LR_CSA_AGR_SFT, // altgr-shifted BÉPO over CSA | ||
16 | LR_NUMR, // numeric layer | ||
17 | LR_FN, // fn layer | ||
18 | }; | ||
19 | |||
20 | #define IS_CA_MULT_ENABLED() (layer_state & (1 << LR_CSA)) | ||
21 | |||
22 | enum macros { | ||
23 | // Characters that do not exist in CSA and must be implemented based on unicode support | ||
24 | // Note: these are intentionally declared first to be used as indexes in spec_chars below | ||
25 | UC_NDSH, // – | ||
26 | UC_MDSH, // — | ||
27 | UC_ELPS, // … | ||
28 | END_UC, // indicates the last unicode character macro | ||
29 | // other macros | ||
30 | M_CSA_SFT, // toggle shift on CSA | ||
31 | M_CSA_AGR_SFT, // toggle shift on LR_CSA_AGR (goes to LR_CSA_AGR_SFT) | ||
32 | M_CSA_SFT_AGR, // toggle AltGr on LR_CSA_SFT (goes to LR_CSA_AGR_SFT) | ||
33 | // macros for characters that need to be un-shifted in LR_CA_MULT_SHIFT | ||
34 | M_1, | ||
35 | M_2, | ||
36 | M_3, | ||
37 | M_4, | ||
38 | M_5, | ||
39 | M_6, | ||
40 | M_7, | ||
41 | M_8, | ||
42 | M_9, | ||
43 | M_0, | ||
44 | M_DEGR, | ||
45 | M_SCLN, | ||
46 | M_GRV, | ||
47 | M_NBSP, | ||
48 | // macros for characters that don't have a simple key combination in LR_CA_MULT_ALTGR | ||
49 | M_CRC, | ||
50 | // other layer macros | ||
51 | M_DBL0, // double 0 | ||
52 | M_FNLR, // fn layer | ||
53 | M_NMAL, // num+alt | ||
54 | }; | ||
55 | |||
56 | #define CSA(name) M(M_CSA_##name) // calls a CSA macro | ||
57 | |||
58 | const uint16_t unicode_chars[] = { | ||
59 | [UC_NDSH] = L'–', | ||
60 | [UC_MDSH] = L'—', | ||
61 | [UC_ELPS] = L'…', | ||
62 | }; | ||
63 | |||
64 | /* shortcut for unicode character macros */ | ||
65 | #define MUC(name) M(UC_##name) // calls a unicode macro | ||
66 | |||
67 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
68 | /* Basic layer | ||
69 | * | ||
70 | * ,--------------------------------------------------. ,--------------------------------------------------. | ||
71 | * | $ | " | « | » | ( | ) | Del | | Del | @ | + | - | / | * | W | | ||
72 | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| | ||
73 | * | Tab | B | É | P | O | È |Backsp| |Backsp| ^ | V | D | L | J | Z | | ||
74 | * |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| | ||
75 | * | = | A | U | I | E | , |------| |------| C | T | S | R | N | M | | ||
76 | * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| | ||
77 | * | LShift | À | Y | X | . | K | | | | ' | Q | G | H | F | RShift | | ||
78 | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' | ||
79 | * |LCtrl | fn | LGui |numAlt| LAlt | |Alt Gr| % | App | Ç | RCtrl| | ||
80 | * `----------------------------------' `----------------------------------' | ||
81 | * ,--------------. ,-------------. | ||
82 | * | Esc | num | | Left |Right | | ||
83 | * ,------+-------+------| |------+------+------. | ||
84 | * | | | PgUp | | Up | | | | ||
85 | * |Space | Home |------| |------| End |Space | | ||
86 | * | | | PgDn | | Down | | | | ||
87 | * `---------------------' `--------------------' | ||
88 | */ | ||
89 | // If it accepts an argument (i.e, is a function), it doesn't need KC_. | ||
90 | // Otherwise, it needs KC_* | ||
91 | [LR_BASE] = LAYOUT_ergodox( // layer 0 : default | ||
92 | // left hand | ||
93 | BP_DLR, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT, | ||
94 | KC_TAB, BP_B, BP_ECUT, BP_P, BP_O, BP_EGRV, KC_BSPC, | ||
95 | BP_EQL, BP_A, BP_U, BP_I, BP_E, BP_COMM, | ||
96 | KC_LSFT, BP_AGRV, BP_Y, BP_X, BP_DOT, BP_K, KC_ENT, | ||
97 | KC_LCTL, M(M_FNLR), KC_LGUI, M(M_NMAL), KC_LALT, | ||
98 | |||
99 | KC_ESC, TG(LR_NUMR), | ||
100 | KC_PGUP, | ||
101 | KC_SPC, KC_HOME, KC_PGDN, | ||
102 | |||
103 | // right hand | ||
104 | KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, BP_W, | ||
105 | KC_BSPC, BP_DCRC, BP_V, BP_D, BP_L, BP_J, BP_Z, | ||
106 | BP_C, BP_T, BP_S, BP_R, BP_N, BP_M, | ||
107 | KC_ENT, BP_APOS, BP_Q, BP_G, BP_H, BP_F, KC_RSFT, | ||
108 | BP_ALGR, BP_PERC, KC_APP, BP_CCED, KC_RCTL, | ||
109 | |||
110 | KC_LEFT, KC_RGHT, | ||
111 | KC_UP, | ||
112 | KC_DOWN, KC_END, KC_SPC | ||
113 | ), | ||
114 | /** | ||
115 | * Same as default but for use with Canadian Multilingual on OS side | ||
116 | */ | ||
117 | [LR_CSA] = LAYOUT_ergodox( | ||
118 | // left hand | ||
119 | KC_DLR, CSA_DQOT, CSA_LGIL, CSA_RGIL, KC_LPRN, KC_RPRN, KC_TRNS, | ||
120 | KC_TRNS, KC_B, CSA_ECUT, KC_P, KC_O, CSA_EGRV, KC_TRNS, | ||
121 | KC_EQL, KC_A, KC_U, KC_I, KC_E, KC_COMM, | ||
122 | CSA(SFT), CSA_AGRV, KC_Y, KC_X, KC_DOT, KC_K, KC_TRNS, | ||
123 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
124 | |||
125 | KC_TRNS, KC_TRNS, | ||
126 | KC_TRNS, | ||
127 | KC_TRNS, KC_TRNS, KC_TRNS, | ||
128 | |||
129 | // right hand | ||
130 | KC_TRNS, KC_AT, KC_PLUS, KC_MINS, CSA_SLSH, KC_ASTR, KC_W, | ||
131 | KC_TRNS, CSA_DCRC, KC_V, KC_D, KC_L, KC_J, KC_Z, | ||
132 | KC_C, KC_T, KC_S, KC_R, KC_N, KC_M, | ||
133 | KC_TRNS, CSA_APOS, KC_Q, KC_G, KC_H, KC_F, CSA(SFT), | ||
134 | MO(LR_CSA_AGR), KC_PERC, KC_TRNS, CSA_CCED, KC_LCTL, // RCTL has a special behaviour in CSA so use LCTL | ||
135 | |||
136 | KC_TRNS, KC_TRNS, | ||
137 | KC_TRNS, | ||
138 | KC_TRNS, KC_TRNS, KC_TRNS | ||
139 | ), | ||
140 | /* Shifted BÉPO over Canadian Multilingual | ||
141 | * | ||
142 | * ,--------------------------------------------------. ,--------------------------------------------------. | ||
143 | * | # | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | | | ||
144 | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| | ||
145 | * | | | | | | | | | | ! | | | | | | | ||
146 | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| | ||
147 | * | ° | | | | | ; |------| |------| | | | | | | | ||
148 | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| | ||
149 | * | | | | | : | | | | | ? | | | | | | | ||
150 | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' | ||
151 | * | | | | | | | | ` | | | | | ||
152 | * `----------------------------------' `-----------------------------------' | ||
153 | * ,-------------. ,-------------. | ||
154 | * | | | | | | | ||
155 | * ,------|------|------| |------+------+------. | ||
156 | * | | | | | | | | | ||
157 | * | | |------| |------| | | | ||
158 | * | | | | | | | | | ||
159 | * `--------------------' `--------------------' | ||
160 | */ | ||
161 | [LR_CSA_SFT] = LAYOUT_ergodox( | ||
162 | // left hand | ||
163 | KC_HASH, M(M_1), M(M_2), M(M_3), M(M_4), M(M_5), KC_TRNS, | ||
164 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
165 | M(M_DEGR),KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M(M_SCLN), | ||
166 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_COLN, KC_TRNS, KC_TRNS, | ||
167 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
168 | |||
169 | KC_TRNS, KC_TRNS, | ||
170 | KC_TRNS, | ||
171 | M(M_NBSP), KC_TRNS, KC_TRNS, | ||
172 | |||
173 | // right hand | ||
174 | KC_TRNS, M(M_6), M(M_7), M(M_8), M(M_9), M(M_0), KC_TRNS, | ||
175 | KC_TRNS, KC_EXLM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
176 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
177 | KC_TRNS, CSA_QEST, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
178 | CSA(SFT_AGR), M(M_GRV), KC_TRNS, KC_TRNS, KC_TRNS, | ||
179 | |||
180 | KC_TRNS, KC_TRNS, | ||
181 | KC_TRNS, | ||
182 | KC_TRNS, KC_TRNS, M(M_NBSP) | ||
183 | ), | ||
184 | /* AltGr-ed BÉPO over Canadian Multilingual | ||
185 | * "////" indicates that the key is disabled (unsupported bépo character) | ||
186 | * | ||
187 | * ,--------------------------------------------------. ,--------------------------------------------------. | ||
188 | * | – | — | < | > | [ | ] | | | | ^ | ± | //// | ÷ | × | dead ˘ | | ||
189 | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| | ||
190 | * | | | |dead '| & | œ |dead `| | | | ¡ |dead ˇ| ð | //// | ij | ////// | | ||
191 | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| | ||
192 | * | ////// | æ | ù |dead "| € | ̛’ |------| |------| © | þ | ß | ® |dead ~| dead ¯ | | ||
193 | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| | ||
194 | * | | \ | { | } | … | ~ | | | | ¿ |dead °| μ | //// |dead ˛| | | ||
195 | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' | ||
196 | * | | | | | | | | //// | |dead ¸| | | ||
197 | * `----------------------------------' `-----------------------------------' | ||
198 | * ,-------------. ,-------------. | ||
199 | * | | | | | | | ||
200 | * ,------|------|------| |------+------+------. | ||
201 | * | | | | | | | | | ||
202 | * | _ | |------| |------| | _ | | ||
203 | * | | | | | | | | | ||
204 | * `--------------------' `--------------------' | ||
205 | */ | ||
206 | [LR_CSA_AGR] = LAYOUT_ergodox( | ||
207 | // left hand | ||
208 | MUC(NDSH), MUC(MDSH), CSA_LESS, CSA_GRTR, CSA_LBRC, CSA_RBRC, KC_TRNS, | ||
209 | KC_TRNS, CSA_PIPE, CSA_DACT, KC_AMPR, CSA_OE, CSA_DGRV, KC_TRNS, | ||
210 | KC_NO, CSA_AE, CSA_UGRV, CSA_DTRM, CSA_EURO, CSA_RQOT, | ||
211 | CSA(AGR_SFT), CSA_BSLS, CSA_LCBR, CSA_RCBR, MUC(ELPS), CSA_TILD, KC_TRNS, | ||
212 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
213 | |||
214 | KC_TRNS, KC_TRNS, | ||
215 | KC_TRNS, | ||
216 | KC_UNDS, CSA(AGR_SFT), KC_TRNS, | ||
217 | |||
218 | // right hand | ||
219 | KC_TRNS, M(M_CRC), CSA_PSMS, KC_NO, CSA_DVSN, CSA_TIMS, CSA_DBRV, | ||
220 | KC_TRNS, CSA_IXLM, CSA_DCAR, CSA_ETH, KC_NO, CSA_IJ, KC_NO, | ||
221 | CSA_CPRT, CSA_THRN, CSA_SRPS, CSA_RTM, CSA_DTLD, CSA_DMCR, | ||
222 | KC_TRNS, CSA_IQST, CSA_DRNG, CSA_MU, KC_NO, CSA_DOGO, CSA(AGR_SFT), | ||
223 | KC_TRNS, KC_NO, KC_TRNS, CSA_DCED, KC_TRNS, | ||
224 | |||
225 | KC_TRNS, KC_TRNS, | ||
226 | KC_TRNS, | ||
227 | KC_TRNS, CSA(AGR_SFT), KC_UNDS | ||
228 | ), | ||
229 | /* AltGr-shifted BÉPO over Canadian Multilingual | ||
230 | * "////" indicates that the key is disabled (unsupported bépo character or unused in bépo) | ||
231 | * | ||
232 | * ,--------------------------------------------------. ,--------------------------------------------------. | ||
233 | * | ¶ | //// | “ | ” | //// | //// | | | | //// | ¬ | ¼ | ½ | ¾ | ////// | | ||
234 | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| | ||
235 | * | | ¦ | ˝ | § | Œ | ` | | | | //// | //// | Ð | //// | IJ | ////// | | ||
236 | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| | ||
237 | * | ////// | Æ | Ù |dead-˙| //// | //// |------| |------| //// | Þ | ẞ | ™ | //// | º | | ||
238 | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| | ||
239 | * | | //// | ‘ | ’ | //// | //// | | | | //// | //// | //// | //// | ª | | | ||
240 | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' | ||
241 | * | | | | | | | | | | | | | ||
242 | * `----------------------------------' `----------------------------------' | ||
243 | * ,-------------. ,-------------. | ||
244 | * | | | | | | | ||
245 | * ,------|------|------| |------+------+------. | ||
246 | * | | | | | | | | | ||
247 | * | | |------| |------| | | | ||
248 | * | | | | | | | | | ||
249 | * `--------------------' `--------------------' | ||
250 | */ | ||
251 | [LR_CSA_AGR_SFT] = LAYOUT_ergodox( | ||
252 | // left hand | ||
253 | CSA_PARG, KC_NO, CSA_LDQT, CSA_RDQT, KC_NO, KC_NO, KC_TRNS, | ||
254 | KC_TRNS, CSA_BPIP, CSA_DDCT, CSA_SECT, S(CSA_OE), M(M_GRV), KC_TRNS, | ||
255 | KC_NO, S(CSA_AE), S(CSA_UGRV), CSA_DDTA, KC_NO, KC_NO, | ||
256 | CSA(AGR_SFT), KC_NO, CSA_LQOT, CSA_RQOT, KC_NO, KC_NO, KC_TRNS, | ||
257 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
258 | |||
259 | KC_TRNS, KC_TRNS, | ||
260 | KC_TRNS, | ||
261 | KC_TRNS, CSA(AGR_SFT), KC_TRNS, | ||
262 | |||
263 | // right hand | ||
264 | KC_TRNS, KC_NO, CSA_NEGT, CSA_1QRT, CSA_1HLF, CSA_3QRT, KC_NO, | ||
265 | KC_TRNS, KC_NO, KC_NO, S(CSA_ETH), KC_NO, S(CSA_IJ), KC_NO, | ||
266 | KC_NO, S(CSA_THRN), S(CSA_SRPS), CSA_TM, KC_NO, CSA_ORDO, | ||
267 | KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, CSA_ORDA, CSA(AGR_SFT), | ||
268 | CSA(SFT_AGR), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
269 | |||
270 | KC_TRNS, KC_TRNS, | ||
271 | KC_TRNS, | ||
272 | KC_TRNS, CSA(AGR_SFT), KC_TRNS | ||
273 | ), | ||
274 | /* Numeric Layer | ||
275 | * | ||
276 | * ,--------------------------------------------------. ,--------------------------------------------------. | ||
277 | * | | F1 | F2 | F3 | F4 | F5 | | | | | | Tab | / | * | - | | ||
278 | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| | ||
279 | * | | F6 | F7 | F8 | F9 | F10 | | | | | Home | 7 | 8 | 9 | + | | ||
280 | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| | ||
281 | * | | F11 | F12 | | | |------| |------| Up | End | 4 | 5 | 6 | + | | ||
282 | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| | ||
283 | * | | | | | | | | | Left | Down | Right| 1 | 2 | 3 |KpEnter | | ||
284 | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' | ||
285 | * | | | | | | | | 0 | 00 | . |Etr/Ctl| | ||
286 | * `----------------------------------' `-----------------------------------' | ||
287 | * ,-------------. ,-------------. | ||
288 | * | | | |n.lock|c.lock| | ||
289 | * ,------|------|------| |------+------+------. | ||
290 | * | | | | | | | | | ||
291 | * | | |------| |------| | | | ||
292 | * | | | | | | | | | ||
293 | * `--------------------' `--------------------' | ||
294 | */ | ||
295 | // SYMBOLS | ||
296 | [LR_NUMR] = LAYOUT_ergodox( | ||
297 | // left hand | ||
298 | KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, | ||
299 | KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, | ||
300 | KC_TRNS, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, | ||
301 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
302 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
303 | |||
304 | KC_TRNS,KC_TRNS, | ||
305 | KC_TRNS, | ||
306 | KC_TRNS, KC_TRNS,KC_TRNS, | ||
307 | |||
308 | // right hand | ||
309 | KC_TRNS, KC_F6, KC_F7, KC_TAB, KC_PSLS, KC_PAST, KC_PMNS, | ||
310 | KC_TRNS, KC_TRNS, KC_HOME, KC_P7, KC_P8, KC_P9, KC_PPLS, | ||
311 | KC_UP, KC_END, KC_P4, KC_P5, KC_P6, KC_PPLS, | ||
312 | KC_LEFT, KC_DOWN, KC_RGHT, KC_P1, KC_P2, KC_P3, KC_PENT, | ||
313 | KC_TRNS, KC_P0, M(M_DBL0),KC_PDOT, CTL_T(KC_PENT), | ||
314 | |||
315 | KC_NLCK, KC_CAPS, | ||
316 | KC_TRNS, | ||
317 | KC_TRNS, KC_TRNS, KC_TRNS | ||
318 | ), | ||
319 | /* fn layer | ||
320 | * | ||
321 | * ,--------------------------------------------------. ,--------------------------------------------------. | ||
322 | * |~CA-mult| | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk| | ||
323 | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| | ||
324 | * | | | | | | |VolUp | | | | | | | | Pause | | ||
325 | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| | ||
326 | * | RESET | | | Calc | Mail |Browsr|------| |------| | | | | | | | ||
327 | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| | ||
328 | * | | App | cut | copy |paste | Mute |VolDn | | | | | | | | | | ||
329 | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' | ||
330 | * | | | | | | | | | | | | | ||
331 | * `----------------------------------' `----------------------------------' | ||
332 | * ,-------------. ,-------------. | ||
333 | * | | | | | | | ||
334 | * ,------|------|------| |------+------+------. | ||
335 | * | | | Next | | | | | | ||
336 | * | Mute | play |------| |------| | | | ||
337 | * | | | Prev | | | | | | ||
338 | * `--------------------' `--------------------' | ||
339 | */ | ||
340 | // MEDIA AND MOUSE | ||
341 | [LR_FN] = LAYOUT_ergodox( | ||
342 | TG(LR_CSA), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, | ||
343 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, | ||
344 | RESET, KC_TRNS, KC_TRNS, KC_CALC, KC_MAIL, KC_WHOM, | ||
345 | KC_TRNS, KC_APP, S(KC_DELT), LCTL(KC_INS),S(KC_INS), KC_MUTE, KC_VOLD, | ||
346 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
347 | |||
348 | KC_TRNS, KC_TRNS, | ||
349 | KC_MPRV, | ||
350 | KC_MUTE, KC_MPLY, KC_MNXT, | ||
351 | |||
352 | // right hand | ||
353 | KC_INS, KC_EJCT, KC_PWR, KC_SLEP, KC_WAKE, KC_PSCR, KC_SLCK, | ||
354 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PAUS, | ||
355 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
356 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
357 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
358 | |||
359 | KC_TRNS, KC_TRNS, | ||
360 | KC_TRNS, | ||
361 | KC_TRNS, KC_TRNS, KC_TRNS | ||
362 | ), | ||
363 | }; | ||
364 | |||
365 | const uint16_t PROGMEM fn_actions[] = { | ||
366 | }; | ||
367 | |||
368 | void hold_shift(void) { | ||
369 | register_code(KC_LSHIFT); | ||
370 | } | ||
371 | |||
372 | void release_shift(void) { | ||
373 | unregister_code(KC_LSHIFT); | ||
374 | } | ||
375 | |||
376 | uint16_t hextokeycode(int hex) { | ||
377 | if (hex == 0x0) { | ||
378 | return KC_P0; | ||
379 | } else if (hex < 0xA) { | ||
380 | return KC_P1 + (hex - 0x1); | ||
381 | } else { | ||
382 | return KC_A + (hex - 0xA); | ||
383 | } | ||
384 | } | ||
385 | |||
386 | void send_unicode(uint16_t unicode) | ||
387 | { | ||
388 | // For more info on how this works per OS, see here: https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_code_input | ||
389 | // Implemented for Windows: | ||
390 | // Pressing ALT followed by + followed by the unicode code point in hex. | ||
391 | // Requires registry key HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad set to String 1 | ||
392 | register_code(KC_LALT); | ||
393 | register_code(KC_PPLS); | ||
394 | unregister_code(KC_PPLS); | ||
395 | |||
396 | for (int i = 12; i >= 0; i -= 4) { | ||
397 | register_code(hextokeycode((unicode >> i) & 0xF)); | ||
398 | unregister_code(hextokeycode((unicode >> i) & 0xF)); | ||
399 | } | ||
400 | |||
401 | unregister_code(KC_LALT); | ||
402 | } | ||
403 | |||
404 | const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | ||
405 | { | ||
406 | // MACRODOWN only works in this function | ||
407 | switch(id) { | ||
408 | case 0 ... END_UC: | ||
409 | if (record->event.pressed) { | ||
410 | send_unicode(unicode_chars[id]); | ||
411 | } | ||
412 | break; | ||
413 | case M_CSA_SFT: | ||
414 | // BÉPO over CSA: toggle shift layer | ||
415 | layer_invert(LR_CSA_SFT); | ||
416 | if (record->event.pressed) { | ||
417 | hold_shift(); | ||
418 | } else { | ||
419 | release_shift(); | ||
420 | } | ||
421 | break; | ||
422 | case M_CSA_SFT_AGR: | ||
423 | // BÉPO over CSA: from shift layer, momentary altgr+shift layer | ||
424 | layer_invert(LR_CSA_AGR); | ||
425 | layer_invert(LR_CSA_AGR_SFT); | ||
426 | if (record->event.pressed) { | ||
427 | // shift not needed for LR_CSA_AGR_SFT | ||
428 | release_shift(); | ||
429 | } else { | ||
430 | // back to shift layer | ||
431 | hold_shift(); | ||
432 | } | ||
433 | break; | ||
434 | case M_CSA_AGR_SFT: | ||
435 | // BÉPO over CSA: from altgr layer, momentary altgr+shift layer | ||
436 | layer_invert(LR_CSA_SFT); | ||
437 | layer_invert(LR_CSA_AGR_SFT); | ||
438 | break; | ||
439 | case M_1 ... M_0: | ||
440 | case M_DEGR: | ||
441 | case M_SCLN: | ||
442 | case M_GRV: | ||
443 | case M_NBSP: | ||
444 | // macros of the shift layer that require to release shift | ||
445 | if (record->event.pressed) { | ||
446 | release_shift(); | ||
447 | switch (id) { | ||
448 | case M_1 ... M_0: | ||
449 | register_code(KC_1 + (id - M_1)); | ||
450 | break; | ||
451 | case M_DEGR: | ||
452 | return MACRO(DOWN(CSA_ALTGR), D(SCLN), END); | ||
453 | case M_SCLN: | ||
454 | return MACRO(D(SCLN), END); | ||
455 | case M_GRV: | ||
456 | return MACRO(I(75), DOWN(CSA_ALTGR), TYPE(CSA_DCRC), UP(CSA_ALTGR), T(SPACE), END); | ||
457 | case M_NBSP: | ||
458 | // use weak mod such that pressing another key will not be affected | ||
459 | add_weak_mods(MOD_BIT(CSA_ALTGR)); | ||
460 | return MACRO(D(SPACE), END); | ||
461 | } | ||
462 | } else { | ||
463 | hold_shift(); | ||
464 | switch (id) { | ||
465 | case M_1 ... M_0: | ||
466 | unregister_code(KC_1 + (id - M_1)); | ||
467 | break; | ||
468 | case M_DEGR: | ||
469 | return MACRO(UP(CSA_ALTGR), U(SCLN), END); | ||
470 | case M_SCLN: | ||
471 | return MACRO(U(SCLN), END); | ||
472 | case M_NBSP: | ||
473 | del_weak_mods(MOD_BIT(CSA_ALTGR)); | ||
474 | return MACRO(U(SPACE), END); | ||
475 | } | ||
476 | } | ||
477 | break; | ||
478 | case M_CRC: | ||
479 | if (record->event.pressed) { | ||
480 | return MACRO(I(75), TYPE(CSA_DCRC), T(SPACE), END); | ||
481 | } | ||
482 | break; | ||
483 | case M_DBL0: | ||
484 | if (record->event.pressed) { | ||
485 | return MACRO( I(25), T(P0), T(P0), END ); | ||
486 | } | ||
487 | break; | ||
488 | case M_FNLR: | ||
489 | layer_invert(LR_NUMR); | ||
490 | layer_invert(LR_FN); | ||
491 | break; | ||
492 | case M_NMAL: | ||
493 | layer_invert(LR_NUMR); | ||
494 | if (record->event.pressed) { | ||
495 | register_code(KC_LALT); | ||
496 | } else { | ||
497 | unregister_code(KC_LALT); | ||
498 | } | ||
499 | break; | ||
500 | } | ||
501 | return MACRO_NONE; | ||
502 | }; | ||
503 | |||
504 | // Runs just one time when the keyboard initializes. | ||
505 | void matrix_init_user(void) { | ||
506 | }; | ||
507 | |||
508 | // Runs constantly in the background, in a loop. | ||
509 | void matrix_scan_user(void) { | ||
510 | |||
511 | ergodox_board_led_off(); | ||
512 | ergodox_right_led_1_off(); | ||
513 | ergodox_right_led_2_off(); | ||
514 | ergodox_right_led_3_off(); | ||
515 | // led 1: numeric layer | ||
516 | if (layer_state & (1 << LR_NUMR)) { | ||
517 | ergodox_right_led_1_on(); | ||
518 | } | ||
519 | // led 2: BÉPO over Canadian Multilingual | ||
520 | if (IS_CA_MULT_ENABLED()) { | ||
521 | ergodox_right_led_2_on(); | ||
522 | } | ||
523 | // led 3: caps lock | ||
524 | if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) { | ||
525 | ergodox_right_led_3_on(); | ||
526 | } | ||
527 | }; | ||