50b5c6ad |
1 | // This is the canonical layout file for the Quantum project. If you want to add another keyboard, |
2 | // this is the style you want to emulate. |
3 | // |
4 | // To flash planck firmware |
5 | // ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ |
6 | // Reset keyboard or press hw reset button on base (hole) |
7 | // |
8 | // cd qmk_firmware/keyboards/planck |
9 | // sudo make KEYMAP=sdothum dfu |
10 | // |
11 | // sudo make clean (good practice before flashing) |
12 | // sudo make KEYMAP=sdothum (to compile check) |
13 | // |
14 | // Package requirements (for arch linux) |
15 | // ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ |
16 | // avr-gcc-atmel |
17 | // avr-libc-atmel |
18 | // dfu-programmer |
19 | // |
20 | // Notes |
21 | // ▔▔▔▔▔ |
22 | // ** E R G O W I D E S P L I T ** Layout |
23 | // |
24 | // Autocompletion tap dance key pairs (),[],{} are available from the |
25 | // number/symbol layer, as well as, numerous (un)shift key values |
26 | // |
27 | // The navigation pad provides a single hand right thumb activated cluster |
28 | // with left hand modifiers |
29 | // |
30 | // #define PRIVATE_STRING includes private_string.h, a user defined code |
31 | // block for the PRIV tap dance e.g. SEND_STRING("secret messape"), |
32 | // see function private() |
33 | // |
34 | // Modifier clusters |
35 | // ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ |
36 | // The num and sym keys together access the navigation pad layer |
37 | // |
38 | // ,-----------------------------------------------------------------------------------. |
39 | // | Ctrl | GUI | Alt | Esc | Space| Tab | Bksp | Ent | Left | Down | Up | Right| |
40 | // `-----------------------------------------------------------------------------------' |
41 | // |
42 | // Hint |
43 | // ▔▔▔▔ |
44 | // For sculpted keycaps such as Cherry or OEM profile, reverse the Alt, Num, |
45 | // Shift, Shift, Nav, Sym keycaps for more ergonomic thumb orientation and |
46 | // actuation |
47 | // |
48 | // Code |
49 | // ▔▔▔▔ |
50 | // This source is shamelessly based on the "default" planck layout |
51 | // |
52 | // #ifdef/#endif block structures are not indented, as syntax highlighting |
53 | // in vim is sufficient for identification |
54 | // |
55 | // c++ commenting style is used throughout |
56 | // |
57 | // Change history |
58 | // ▔▔▔▔▔▔▔▔▔▔▔▔▔▔ |
59 | // See http://thedarnedestthing.com/planck%20constant |
60 | // See http://thedarnedestthing.com/planck%20done |
61 | |
62 | |
63 | |
64 | // === N O T E === |
65 | // |
66 | // sudo CPATH=<keymap.c directory>/common make ... |
67 | |
68 | |
26eef35f |
69 | #include QMK_KEYBOARD_H |
50b5c6ad |
70 | #ifdef STENO_ENABLE |
71 | #include "keymap_steno.h" |
72 | #endif |
50b5c6ad |
73 | |
74 | extern keymap_config_t keymap_config; |
75 | |
76 | enum planck_layers { |
77 | _BASE = 0 |
78 | ,_SHIFT |
79 | ,_LSHIFT |
80 | ,_RSHIFT |
81 | ,_PLOVER |
82 | ,_NUMBER |
83 | ,_SYMBOL |
84 | ,_FNCKEY |
85 | ,_MOUSE |
86 | #ifdef CENTER_TT |
87 | ,_TTNUMBER |
88 | ,_TTREGEX |
89 | ,_TTFNCKEY |
90 | ,_TTCURSOR |
91 | ,_TTMOUSE |
92 | #endif |
93 | ,_EDIT |
94 | ,_ADJUST |
95 | ,_END_LAYERS |
96 | }; |
97 | |
98 | enum planck_keycodes { |
99 | BASE = SAFE_RANGE |
100 | ,BASE1 |
101 | ,BASE2 |
102 | ,PLOVER |
103 | ,SM_CIRC // pseudo GUI_T(S(KC_6)) for shifted key-codes, see process_record_user() |
104 | ,SM_DLR // pseudo SFT_T(S(KC_4)) for shifted key-codes, see process_record_user() |
105 | ,SM_G // pseudo MT (MOD_LALT | MOD_LSFT, S(KC_G)) for shifted key-codes, see process_record_user() |
106 | ,SM_H // pseudo MT (MOD_LCTL | MOD_LSFT, S(KC_H)) for shifted key-codes, see process_record_user() |
107 | ,SM_PERC // pseudo ALT_T(S(KC_5)) for shifted key-codes, see process_record_user() |
108 | ,SM_W // pseudo MT (MOD_LGUI | MOD_LSFT, S(KC_W)) for shifted key-codes, see process_record_user() |
109 | ,SL_LEFT // pseudo LT (_MOUSE, S(KC_LEFT)) for shifted key-codes, see process_record_user() |
110 | ,SP_DEL // pseudo LT (_MOUSE, KC_DEL) for shifted key-codes, see process_record_user() |
111 | ,SL_TAB // pseudo LT (_FNCKEY, S(KC_TAB)) for shifted key-codes, see process_record_user() |
112 | #ifdef CENTER_TT |
113 | ,TT_ESC |
114 | #endif |
115 | #ifdef STENO_ENABLE |
116 | ,PS_STNA = STN_A |
117 | ,PS_STNO = STN_O |
118 | ,PS_STNE = STN_E |
119 | ,PS_STNU = STN_U |
120 | #else |
121 | ,LT_C = LT (_NUMBER, KC_C) |
122 | ,LT_V = LT (_FNCKEY, KC_V) |
123 | ,LT_N = LT (_EDIT, KC_N) |
124 | ,LT_M = LT (_SYMBOL, KC_M) |
125 | #endif |
126 | }; |
127 | |
128 | // modifier keys |
129 | #define AT_B ALT_T(KC_B) |
130 | #define AT_DOWN ALT_T(KC_DOWN) |
131 | #define CT_RGHT CTL_T(KC_RGHT) |
132 | #define GT_C GUI_T(KC_C) |
133 | #define GT_UP GUI_T(KC_UP) |
134 | #define MT_E MT (MOD_LCTL | MOD_LALT, KC_E) |
135 | #define ST_A SFT_T(KC_A) |
136 | #ifdef HOME_MODS |
137 | #define HOME_H GUI_T(KC_H) |
138 | #define HOME_I CTL_T(KC_I) |
139 | #define HOME_E ALT_T(KC_E) |
140 | #define HOME_A SFT_T(KC_A) |
141 | #define HOME_T SFT_T(KC_T) |
142 | #define HOME_R ALT_T(KC_R) |
143 | #define HOME_S CTL_T(KC_S) |
144 | #define HOME_W GUI_T(KC_W) |
145 | #else |
146 | #define HOME_H KC_H |
147 | #define HOME_I KC_I |
148 | #define HOME_E KC_E |
149 | #define HOME_A KC_A |
150 | #define HOME_T KC_T |
151 | #define HOME_R KC_R |
152 | #define HOME_S KC_S |
153 | #define HOME_W KC_W |
154 | #endif |
155 | |
156 | #define S_DOWN S (KC_DOWN) |
157 | #define S_LEFT S (KC_LEFT) |
158 | #define S_RGHT S (KC_RGHT) |
159 | #define S_TAB S (KC_TAB) |
160 | #define S_UP S (KC_UP) |
161 | |
26eef35f |
162 | #include "common/tapdance.h" |
50b5c6ad |
163 | |
164 | // keycodes |
165 | #define ___x___ KC_TRNS |
166 | #define ___fn__ KC_TRNS |
3b2a484a |
167 | #undef _______ |
50b5c6ad |
168 | #define _______ KC_NO |
169 | |
170 | #define COPY LCTL(KC_C) |
171 | #define CUT LCTL(KC_X) |
172 | #define EOT LCTL(KC_D) |
173 | #define NAK LCTL(KC_U) |
174 | #define PASTE LCTL(KC_V) |
175 | #define UNDO LCTL(KC_Z) |
176 | #define TMCOPY LALT(LCTL(KC_C)) |
177 | #define TMPASTE LALT(LCTL(KC_V)) |
178 | #define LT_BSLS LT (_MOUSE, KC_BSLS) // see process_record_user() for extended handling |
179 | #define LT_BSPC LT (_EDIT, KC_BSPC) |
180 | #define SP_LEFT LT (_EDIT, KC_LEFT) |
181 | #define LT_ESC LT (_NUMBER, KC_ESC) |
182 | #define LT_LEFT LT (_SYMBOL, KC_LEFT) // see process_record_user() for extended handling |
183 | #define SP_BSPC LT (_SYMBOL, KC_BSPC) // see process_record_user() for extended handling |
184 | #define LT_TAB LT (_FNCKEY, KC_TAB) |
185 | #define LT_INS LT (_FNCKEY, KC_INS) |
186 | #define ADJUST MO (_ADJUST) |
187 | #define OS_ALT OSM (MOD_LALT) |
188 | #define OS_CTL OSM (MOD_LCTL) |
189 | #define OS_GUI OSM (MOD_LGUI) |
190 | #define OS_SFT OSM (MOD_LSFT) |
191 | |
192 | #ifdef CENTER_TT |
193 | #define CNTR_TL TT (_TTFNCKEY) |
194 | #define CNTR_TR KC_CAPS |
195 | #define CNTR_HL TT (_TTCURSOR) |
196 | #define CNTR_HR TT (_TTMOUSE) |
197 | #define CNTR_BL TT (_TTNUMBER) |
198 | #define CNTR_BR TT (_TTREGEX) |
199 | #else |
200 | #define CNTR_TL OSM (MOD_LALT | MOD_LCTL) |
201 | #define CNTR_TR OSM (MOD_LGUI | MOD_LCTL) |
202 | #define CNTR_HL OSM (MOD_LALT | MOD_LSFT) |
203 | #define CNTR_HR OSM (MOD_LGUI | MOD_LSFT) |
204 | #define CNTR_BL TD (_CAPS) |
205 | #define CNTR_BR OSM (MOD_LSFT | MOD_LCTL) |
206 | #endif |
207 | |
208 | #ifdef THUMB_0 |
209 | #define LT_EQL LT (_ADJUST, KC_EQL) |
210 | #else |
211 | #define LT_0 LT (_ADJUST, KC_0) |
212 | #endif |
213 | |
214 | // ........................................................ Default Alpha Layout |
215 | |
216 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
217 | |
218 | #include "hiea.h" |
26eef35f |
219 | #include "common/steno_layout.h" |
50b5c6ad |
220 | |
221 | // ...................................................... Number / Function Keys |
222 | |
26eef35f |
223 | #include "common/number_fkey_layout.h" |
50b5c6ad |
224 | |
225 | // ......................................................... Symbol / Navigation |
226 | |
26eef35f |
227 | #include "common/symbol_guifn_layout.h" |
50b5c6ad |
228 | |
229 | // ............................................................... Toggle Layers |
230 | |
231 | #ifdef CENTER_TT |
26eef35f |
232 | #include "common/toggle_layout.h" |
50b5c6ad |
233 | #endif |
234 | |
235 | // ......................................................... Short Cuts / Adjust |
236 | |
26eef35f |
237 | #include "common/chord_layout.h" |
50b5c6ad |
238 | |
239 | }; |
240 | |
241 | // ...................................................................... Sounds |
242 | |
26eef35f |
243 | #include "common/sounds.h" |
50b5c6ad |
244 | |
245 | // ........................................................... User Keycode Trap |
246 | |
26eef35f |
247 | #include "common/keycode_functions.h" |
50b5c6ad |
248 | |
249 | #define BASE_1 1 |
250 | #define BASE_2 2 |
251 | #define BASE_12 3 |
252 | static uint8_t base_n = 0; |
253 | |
254 | bool process_record_user(uint16_t keycode, keyrecord_t *record) |
255 | { |
256 | switch (keycode) { |
257 | case BASE1: |
258 | if (record->event.pressed) { |
259 | base_n = base_n | BASE_1; |
260 | if (base_n == BASE_12) { |
261 | base_layer(); |
262 | } |
263 | } |
264 | else { |
265 | base_n = base_n & ~BASE_1; |
266 | } |
267 | return false; |
268 | case BASE2: |
269 | if (record->event.pressed) { |
270 | base_n = base_n | BASE_2; |
271 | if (base_n == BASE_12) { |
272 | base_layer(); |
273 | } |
274 | } |
275 | else { |
276 | base_n = base_n & ~BASE_2; |
277 | } |
278 | return false; |
279 | case AT_DOWN: |
280 | #ifdef HOME_MODS |
281 | case HOME_E: |
282 | case HOME_R: |
283 | #endif |
284 | tap_mods(record, KC_LALT); |
285 | break; |
286 | case CT_RGHT: |
287 | #ifdef HOME_MODS |
288 | case HOME_H: |
289 | case HOME_W: |
290 | #endif |
291 | tap_mods(record, KC_LGUI); |
292 | break; |
293 | case GT_UP: |
294 | #ifdef HOME_MODS |
295 | case HOME_I: |
296 | case HOME_S: |
297 | #endif |
298 | tap_mods(record, KC_LCTL); |
299 | break; |
300 | #ifdef HOME_MODS |
301 | case HOME_A: |
302 | case HOME_T: |
303 | tap_mods(record, KC_LSFT); |
304 | break; |
305 | #endif |
306 | #ifdef CENTER_TT |
307 | case TT_ESC: |
308 | clear_tt(); // exit TT layer |
309 | return false; |
310 | #endif |
311 | case LT_ESC: |
312 | #ifdef CENTER_TT |
313 | if (tt_keycode != 0) { |
314 | clear_tt(); // exit TT layer |
315 | return false; |
316 | } |
317 | #endif |
318 | tap_layer(record, _NUMBER); |
319 | break; |
320 | case LT_LEFT: |
321 | case SP_BSPC: |
322 | tap_layer(record, _SYMBOL); |
323 | // LT (_SYMBOL, KC_LEFT) left right combination layer |
324 | thumb_layer(record, RIGHT, 0, 0, _SYMBOL, _LSHIFT); |
325 | break; |
326 | case OS_ALT: |
327 | tap_mods(record, KC_LALT); |
328 | break; |
329 | case OS_CTL: |
330 | tap_mods(record, KC_LCTL); |
331 | break; |
332 | case OS_GUI: |
333 | tap_mods(record, KC_LGUI); |
334 | break; |
335 | case SM_CIRC: |
336 | // GUI_T(S(KC_6)) |
337 | mt_shift(record, KC_LGUI, 0, KC_6); |
338 | break; |
339 | case SM_DLR: |
340 | // SFT_T(S(KC_4)) |
341 | mt_shift(record, KC_LSFT, 0, KC_4); |
342 | break; |
343 | case SM_G: |
344 | // MT(MOD_LALT | MOD_LSFT, S(KC_G)) |
345 | mt_shift(record, KC_LALT, KC_LSFT, KC_G); |
346 | break; |
347 | case SM_H: |
348 | // MT(MOD_LCTL | MOD_LSFT, S(KC_K)) |
349 | mt_shift(record, KC_LCTL, KC_LSFT, KC_H); |
350 | break; |
351 | case SM_W: |
352 | // MT(MOD_LGUI | MOD_LSFT, S(KC_W)) |
353 | mt_shift(record, KC_LGUI, KC_LSFT, KC_W); |
354 | break; |
355 | case SM_PERC: |
356 | // ALT_T(S(KC_5)) |
357 | mt_shift(record, KC_LALT, 0, KC_5); |
358 | break; |
359 | case LT_BSLS: |
360 | tap_layer(record, _MOUSE); |
361 | // LT (_MOUSE, KC_BSLS) left right combination layer, see #define LT_BSLS |
362 | thumb_layer(record, LEFT, 0, 0, _MOUSE, _SYMBOL); |
363 | break; |
364 | case SL_LEFT: |
365 | tap_layer(record, _MOUSE); |
366 | // LT (_MOUSE, S(KC_LEFT)) left right combination layer |
367 | thumb_layer(record, RIGHT, SHIFT, KC_LEFT, _MOUSE, _LSHIFT); |
368 | break; |
369 | case SP_DEL: |
370 | tap_layer(record, _MOUSE); |
371 | // LT (_MOUSE, S(KC_LEFT)) left right combination layer |
372 | thumb_layer(record, RIGHT, NOSHIFT, KC_DEL, _MOUSE, _LSHIFT); |
373 | break; |
374 | case SL_TAB: |
375 | // LT (_FNCKEY, S(KC_TAB)) emulation |
376 | lt_shift(record, KC_TAB, _FNCKEY); |
377 | break; |
378 | case TD_ENT: |
379 | tap_layer(record, _RSHIFT); |
380 | // LT (_RSHIFT, KC_ENT) emulation, see tap dance enter |
381 | break; |
382 | case TD_SPC: |
383 | tap_layer(record, _LSHIFT); |
384 | // LT (_LSHIFT, KC_SPC) left right combination layer, see tap dance TD_SPC |
385 | thumb_layer(record, LEFT, 0, 0, _LSHIFT, _SYMBOL); |
386 | break; |
387 | #ifdef CENTER_TT |
388 | case CNTR_TL: |
389 | case CNTR_TR: |
390 | case CNTR_HL: |
391 | case CNTR_HR: |
392 | case CNTR_BL: |
393 | case CNTR_BR: |
394 | if (tt_keycode != keycode && tt_keycode != 0) { |
395 | clear_tt(); // return to base layer first if different TT layer selected |
396 | } |
397 | tt_keycode = keycode; |
398 | break; |
399 | #endif |
400 | // #ifdef STENO_ENABLE |
401 | // case PS_STNA: |
402 | // stn_layer(record, STN_A, _NUMBER); |
403 | // break; |
404 | // case PS_STNO: |
405 | // stn_layer(record, STN_O, _FNCKEY); |
406 | // break; |
407 | // case PS_STNE: |
408 | // stn_layer(record, STN_E, _EDIT); |
409 | // break; |
410 | // case PS_STNU: |
411 | // stn_layer(record, STN_U, _SYMBOL); |
412 | // break; |
413 | // #endif |
414 | case PLOVER: |
415 | steno(record); |
416 | return false; |
417 | } |
418 | return true; |
419 | } |
420 | |
26eef35f |
421 | #include "common/init.h" |