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