2020 February 29 Breaking Changes Update (#8064)
[jackhill/qmk/firmware.git] / keyboards / planck / keymaps / hiea / 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 ,_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
98enum 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
216const 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
252static uint8_t base_n = 0;
253
254bool 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"