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