2020 February 29 Breaking Changes Update (#8064)
[jackhill/qmk/firmware.git] / keyboards / planck / keymaps / altgr / keymap.c
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
69 #include QMK_KEYBOARD_H
70 #ifdef STENO_ENABLE
71 #include "keymap_steno.h"
72 #endif
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 #ifndef SHIFT_SYMBOLS
94 ,_NUMSYM
95 ,_SYMREG
96 #endif
97 ,_EDIT
98 ,_QWERTY
99 ,_ADJUST
100 ,_END_LAYERS
101 };
102
103 enum planck_keycodes {
104 BASE = SAFE_RANGE
105 ,BASE1
106 ,BASE2
107 ,PLOVER
108 ,PLOEXIT
109 ,SM_CIRC // pseudo GUI_T(S(KC_6)) for shifted key-codes, see process_record_user()
110 ,SM_DLR // pseudo SFT_T(S(KC_4)) for shifted key-codes, see process_record_user()
111 ,SM_G // pseudo MT (MOD_LALT | MOD_LSFT, S(KC_G)) for shifted key-codes, see process_record_user()
112 ,SM_K // pseudo MT (MOD_LGUI | MOD_LSFT, S(KC_K)) for shifted key-codes, see process_record_user()
113 ,SM_PERC // pseudo ALT_T(S(KC_5)) for shifted key-codes, see process_record_user()
114 ,SM_LPRN // pseudo CTL_T(S(KC_9)) for shifted key-codes, see process_record_user()
115 ,SM_W // pseudo MT (MOD_LGUI | MOD_LSFT, S(KC_W)) for shifted key-codes, see process_record_user()
116 ,SL_LEFT // pseudo LT (_MOUSE, S(KC_LEFT)) for shifted key-codes, see process_record_user()
117 ,SP_DEL // pseudo LT (_MOUSE, KC_DEL) for shifted key-codes, see process_record_user()
118 ,SL_PIPE // pseudo LT (_ADJUST, S(KC_BSLS)) for shifted key-codes, see process_record_user()
119 ,SL_TAB // pseudo LT (_FNCKEY, S(KC_TAB)) for shifted key-codes, see process_record_user()
120 #ifdef CENTER_TT
121 ,TT_ESC
122 #endif
123 #ifdef STENO_ENABLE
124 ,PS_STNA = STN_A
125 ,PS_STNO = STN_O
126 ,PS_STNE = STN_E
127 ,PS_STNU = STN_U
128 #else
129 ,LT_C = LT (_NUMBER, KC_C)
130 ,LT_V = LT (_FNCKEY, KC_V)
131 ,LT_N = LT (_EDIT, KC_N)
132 ,LT_M = LT (_SYMBOL, KC_M)
133 #endif
134 ,PS_BASE
135 };
136
137 // modifier keys
138 #define AT_B ALT_T(KC_B)
139 #define AT_DOWN ALT_T(KC_DOWN)
140 #define CT_RGHT CTL_T(KC_RGHT)
141 #define GT_C GUI_T(KC_C)
142 #define GT_UP GUI_T(KC_UP)
143 #define MT_E MT (MOD_LCTL | MOD_LALT, KC_E)
144 #define MT_X MT (MOD_LALT | MOD_LSFT, KC_X)
145 #define ST_A SFT_T(KC_A)
146 #ifdef HOME_MODS
147 #define HOME_K GUI_T(KC_K)
148 #define HOME_H CTL_T(KC_H)
149 #define HOME_E ALT_T(KC_E)
150 #define HOME_A SFT_T(KC_A)
151 #if defined(BEAKLMU) || defined(BEAKLSP) || defined(BEAKLGR)
152 #define HOME_T SFT_T(KC_T)
153 #define HOME_R ALT_T(KC_R)
154 #define HOME_S CTL_T(KC_S)
155 #define HOME_W GUI_T(KC_W)
156 #else
157 #define HOME_T SFT_T(KC_T)
158 #define HOME_S ALT_T(KC_S)
159 #define HOME_N GUI_T(KC_N)
160 #define HOME_B CTL_T(KC_B)
161 #endif
162 #else
163 #define HOME_K KC_K
164 #define HOME_H KC_H
165 #define HOME_E KC_E
166 #define HOME_A KC_A
167 #define HOME_T KC_T
168 #define HOME_S KC_S
169 #define HOME_N KC_N
170 #define HOME_B KC_B
171 #endif
172
173 #define S_DOWN S (KC_DOWN)
174 #define S_LEFT S (KC_LEFT)
175 #define S_RGHT S (KC_RGHT)
176 #define S_TAB S (KC_TAB)
177 #define S_UP S (KC_UP)
178
179 #include "common/tapdance.h"
180
181 // keycodes
182 #define ___x___ KC_TRNS
183 #define ___fn__ KC_TRNS
184 #undef _______
185 #define _______ KC_NO
186
187 #define COPY LCTL(KC_C)
188 #define CUT LCTL(KC_X)
189 #define EOT LCTL(KC_D)
190 #define NAK LCTL(KC_U)
191 #define PASTE LCTL(KC_V)
192 #define UNDO LCTL(KC_Z)
193 #define TMCOPY LALT(LCTL(KC_C))
194 #define TMPASTE LALT(LCTL(KC_V))
195 #define LT_BSLS LT (_MOUSE, KC_BSLS) // see process_record_user() for extended handling
196 #define LT_BSPC LT (_EDIT, KC_BSPC)
197 #define SP_LEFT LT (_EDIT, KC_LEFT)
198 #define LT_ESC LT (_NUMBER, KC_ESC)
199 #define LT_LEFT LT (_SYMBOL, KC_LEFT) // see process_record_user() for extended handling
200 #define SP_BSPC LT (_SYMBOL, KC_BSPC) // see process_record_user() for extended handling
201 #define LT_TAB LT (_FNCKEY, KC_TAB)
202 #define LT_INS LT (_FNCKEY, KC_INS)
203 #define LT_ALTG LT (_FNCKEY, KC_RALT)
204 #define ADJUST MO (_ADJUST)
205 #define OS_ALT OSM (MOD_LALT)
206 #define OS_CTL OSM (MOD_LCTL)
207 #define OS_GUI OSM (MOD_LGUI)
208 #define OS_SFT OSM (MOD_LSFT)
209 #define OS_CALT OSM (MOD_LALT | MOD_LCTL)
210 #define OS_CGUI OSM (MOD_LGUI | MOD_LCTL)
211 #define OS_CSFT OSM (MOD_LSFT | MOD_LCTL)
212 #define OS_SALT OSM (MOD_LALT | MOD_LSFT)
213 #define OS_SGUI OSM (MOD_LGUI | MOD_LSFT)
214
215 #ifdef CENTER_TT
216 #ifdef BEAKLSP
217 #define CNTR_TL OSM (MOD_LSFT)
218 #else
219 #define CNTR_TL TT (_TTFNCKEY)
220 #endif
221 #define CNTR_TR KC_CAPS
222 #define CNTR_HL TT (_TTCURSOR)
223 #define CNTR_HR TT (_TTMOUSE)
224 #define CNTR_BL TT (_TTNUMBER)
225 #define CNTR_BR TT (_TTREGEX)
226 #else
227 #define CNTR_TL OSM (MOD_LALT | MOD_LCTL)
228 #define CNTR_TR OSM (MOD_LGUI | MOD_LCTL)
229 #define CNTR_HL OSM (MOD_LALT | MOD_LSFT)
230 #define CNTR_HR OSM (MOD_LGUI | MOD_LSFT)
231 #define CNTR_BL TD (_CAPS)
232 #define CNTR_BR OSM (MOD_LSFT | MOD_LCTL)
233 #endif
234
235 #ifdef THUMB_0
236 #define LT_EQL LT (_ADJUST, KC_EQL)
237 #else
238 #define LT_0 LT (_ADJUST, KC_0)
239 #endif
240 #ifndef SHIFT_SYMBOLS
241 #define LT_A LT (_NUMSYM, KC_A)
242 #define LT_LFTX LT (_SYMREG, KC_LEFT)
243 #endif
244
245 // ........................................................ Default Alpha Layout
246
247 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
248
249 #include "beakl.h"
250 #include "colemak.h"
251 #include "qwerty.h"
252 #include "common/steno_layout.h"
253
254 // ...................................................... Number / Function Keys
255
256 #include "common/number_fkey_layout.h"
257
258 // ......................................................... Symbol / Navigation
259
260 #include "common/symbol_guifn_layout.h"
261
262 // ............................................................... Toggle Layers
263
264 #ifdef CENTER_TT
265 #include "common/toggle_layout.h"
266 #endif
267
268 // ......................................................... Short Cuts / Adjust
269
270 #include "common/chord_layout.h"
271
272 };
273
274 // ...................................................................... Sounds
275
276 #include "common/sounds.h"
277
278 // ........................................................... User Keycode Trap
279
280 #include "common/keycode_functions.h"
281
282 #define BASE_1 1
283 #define BASE_2 2
284 #define BASE_12 3
285 static uint8_t base_n = 0;
286
287 bool process_record_user(uint16_t keycode, keyrecord_t *record)
288 {
289 switch (keycode) {
290 case BASE1:
291 if (record->event.pressed) {
292 base_n = base_n | BASE_1;
293 if (base_n == BASE_12) {
294 base_layer();
295 }
296 }
297 else {
298 base_n = base_n & ~BASE_1;
299 }
300 return false;
301 case BASE2:
302 if (record->event.pressed) {
303 base_n = base_n | BASE_2;
304 if (base_n == BASE_12) {
305 base_layer();
306 }
307 }
308 else {
309 base_n = base_n & ~BASE_2;
310 }
311 return false;
312 case AT_DOWN:
313 #ifdef HOME_MODS
314 case HOME_E:
315 #if defined(BEAKLMU) || defined(BEAKLSP) || defined(BEAKLGR)
316 case HOME_R:
317 #else
318 case HOME_S:
319 #endif
320 #endif
321 tap_mods(record, KC_LALT);
322 break;
323 case CT_RGHT:
324 #ifdef HOME_MODS
325 case HOME_K:
326 #if defined(BEAKLMU) || defined(BEAKLSP) || defined(BEAKLGR)
327 case HOME_W:
328 #else
329 case HOME_B:
330 #endif
331 #endif
332 tap_mods(record, KC_LGUI);
333 break;
334 case GT_UP:
335 #ifdef HOME_MODS
336 case HOME_H:
337 #if defined(BEAKLMU) || defined(BEAKLSP) || defined(BEAKLGR)
338 case HOME_S:
339 #else
340 case HOME_N:
341 #endif
342 #endif
343 tap_mods(record, KC_LCTL);
344 break;
345 #ifdef HOME_MODS
346 case HOME_A:
347 case HOME_T:
348 tap_mods(record, KC_LSFT);
349 break;
350 #endif
351 #ifdef CENTER_TT
352 case TT_ESC:
353 clear_tt(); // exit TT layer
354 return false;
355 #endif
356 case LT_ESC:
357 #ifdef CENTER_TT
358 if (tt_keycode != 0) {
359 clear_tt(); // exit TT layer
360 return false;
361 }
362 #endif
363 tap_layer(record, _NUMBER);
364 break;
365 case LT_LEFT:
366 case SP_BSPC:
367 tap_layer(record, _SYMBOL);
368 // LT (_SYMBOL, KC_LEFT) left right combination layer
369 thumb_layer(record, RIGHT, 0, 0, _SYMBOL, _LSHIFT);
370 break;
371 case OS_ALT:
372 tap_mods(record, KC_LALT);
373 break;
374 case OS_CTL:
375 tap_mods(record, KC_LCTL);
376 break;
377 case OS_GUI:
378 tap_mods(record, KC_LGUI);
379 break;
380 case SM_CIRC:
381 // GUI_T(S(KC_6))
382 mt_shift(record, KC_LGUI, 0, KC_6);
383 break;
384 case SM_DLR:
385 // SFT_T(S(KC_4))
386 mt_shift(record, KC_LSFT, 0, KC_4);
387 break;
388 case SM_G:
389 // MT(MOD_LALT | MOD_LSFT, S(KC_G))
390 mt_shift(record, KC_LALT, KC_LSFT, KC_G);
391 break;
392 case SM_K:
393 // MT(MOD_LGUI | MOD_LSFT, S(KC_K))
394 mt_shift(record, KC_LGUI, KC_LSFT, KC_K);
395 break;
396 case SM_W:
397 // MT(MOD_LGUI | MOD_LSFT, S(KC_W))
398 mt_shift(record, KC_LGUI, KC_LSFT, KC_W);
399 break;
400 case SM_LPRN:
401 // CTL_T(S(KC_9))
402 mt_shift(record, KC_LCTL, 0, KC_9);
403 break;
404 case SM_PERC:
405 // ALT_T(S(KC_5))
406 mt_shift(record, KC_LALT, 0, KC_5);
407 break;
408 case LT_BSLS:
409 tap_layer(record, _MOUSE);
410 // LT (_MOUSE, KC_BSLS) left right combination layer, see #define LT_BSLS
411 thumb_layer(record, LEFT, 0, 0, _MOUSE, _SYMBOL);
412 break;
413 case SL_LEFT:
414 tap_layer(record, _MOUSE);
415 // LT (_MOUSE, S(KC_LEFT)) left right combination layer
416 thumb_layer(record, RIGHT, SHIFT, KC_LEFT, _MOUSE, _LSHIFT);
417 break;
418 case SP_DEL:
419 tap_layer(record, _MOUSE);
420 // LT (_MOUSE, S(KC_LEFT)) left right combination layer
421 thumb_layer(record, RIGHT, NOSHIFT, KC_DEL, _MOUSE, _LSHIFT);
422 break;
423 case SL_PIPE:
424 // LT (_ADJUST, S(KC_BSLS)) emulation
425 lt_shift(record, KC_BSLS, _ADJUST);
426 break;
427 case SL_TAB:
428 // LT (_FNCKEY, S(KC_TAB)) emulation
429 lt_shift(record, KC_TAB, _FNCKEY);
430 break;
431 case TD_ENT:
432 tap_layer(record, _RSHIFT);
433 // LT (_RSHIFT, KC_ENT) emulation, see tap dance enter
434 break;
435 case TD_SPC:
436 tap_layer(record, _LSHIFT);
437 // LT (_LSHIFT, KC_SPC) left right combination layer, see tap dance TD_SPC
438 thumb_layer(record, LEFT, 0, 0, _LSHIFT, _SYMBOL);
439 break;
440 #ifdef CENTER_TT
441 case CNTR_TL:
442 case CNTR_TR:
443 case CNTR_HL:
444 case CNTR_HR:
445 case CNTR_BL:
446 case CNTR_BR:
447 if (tt_keycode != keycode && tt_keycode != 0) {
448 clear_tt(); // return to base layer first if different TT layer selected
449 }
450 tt_keycode = keycode;
451 break;
452 #endif
453 // #ifdef STENO_ENABLE
454 // case PS_STNA:
455 // stn_layer(record, STN_A, _NUMBER);
456 // break;
457 // case PS_STNO:
458 // stn_layer(record, STN_O, _FNCKEY);
459 // break;
460 // case PS_STNE:
461 // stn_layer(record, STN_E, _EDIT);
462 // break;
463 // case PS_STNU:
464 // stn_layer(record, STN_U, _SYMBOL);
465 // break;
466 // #endif
467 case PS_BASE:
468 if (record->event.pressed) {
469 base_layer();
470 }
471 return false;
472 case PLOVER:
473 steno(record);
474 return false;
475 case PLOEXIT:
476 steno_exit(record);
477 return false;
478 }
479 return true;
480 }
481
482 #include "common/init.h"