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