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