]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/planck/keymaps/priyadi/keymap.c
move GRV to ESC position
[qmk_firmware.git] / keyboards / planck / keymaps / priyadi / 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 #include "planck.h"
5 #include "action_layer.h"
6 #ifdef AUDIO_ENABLE
7   #include "audio.h"
8   #include "musical_notes.h"
9 #endif
10 #include "eeconfig.h"
11 #include "process_unicode.h"
12 #include "quantum.h"
13 // #define TOLELOT_ENABLE
14 #define DOUBLESPACE_LAYER_ENABLE
15 #define LAYOUT_DVORAK
16 #define LAYOUT_COLEMAK
17 #define LAYOUT_WORKMAN
18 #define LAYOUT_NORMAN
19
20 // so i can copy & paste stuff from my other planck-like keyboards
21 #define KEYMAP( \
22     k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \
23     k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, \
24     k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, \
25     k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c \
26 ) \
27 { \
28     {k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c}, \
29     {k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c}, \
30     {k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c}, \
31     {k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c} \
32 }
33
34 // Fillers to make layering clearer
35 #define _______ KC_TRNS
36 #define XXXXXXX KC_NO
37 #define G(x) LGUI(x)
38 #define KC_WWWB KC_WWW_BACK
39 #define KC_WWWF KC_WWW_FORWARD
40
41 // hybrid right-alt & scroll lock (mapped to Compose in OS)
42 #undef KC_RALT
43 #define KC_RALT MT(MOD_RALT, KC_SLCK)
44
45 bool capslock = false;
46
47 #ifdef DOUBLESPACE_LAYER_ENABLE
48 bool lspace_active = false;
49 bool rspace_active = false;
50 bool lspace_emitted = false;
51 bool rspace_emitted = false;
52 bool space_layer_entered = false;
53 #endif
54
55 void turn_off_capslock(void);
56 extern keymap_config_t keymap_config;
57
58 enum layers {
59   _QWERTY,
60   _DVORAK,
61   _COLEMAK,
62   _WORKMAN,
63   _NORMAN,
64   _DEFAULT_LAYER_MAX = _NORMAN,
65
66   _PUNC,
67   _NUM,
68   _FUNC,
69
70   _GREEKU,
71   _GREEKL,
72
73   _EMOJI,
74   _GUI,
75   _SYS,
76 };
77
78 // double-space layer
79 #define _SPACE _GUI
80
81 enum planck_keycodes {
82   // layouts
83   QWERTY = SAFE_RANGE,
84   DVORAK,
85   COLEMAK,
86   WORKMAN,
87   NORMAN,
88
89   // layer switchers
90   PUNC,
91   NUM,
92   FUNC,
93   EMOJI,
94   GUI,
95   GREEK,
96
97   // os switchers
98   LINUX,
99   WIN,
100   OSX,
101
102   // others
103   LSPACE,
104   RSPACE,
105   GLOW,
106   AUDIO,
107
108   // stubs
109   OUT_BLE
110 };
111
112 // unicode map
113
114 enum unicode_name {
115   GRIN, // grinning face 😊
116   TJOY, // tears of joy 😂
117   SMILE, // grining face with smiling eyes 😁
118   HEART, // heart ❤
119   EYERT, // smiling face with heart shaped eyes 😍
120   CRY, // crying face 😭
121   SMEYE, // smiling face with smiling eyes 😊
122   UNAMU, // unamused 😒
123   KISS, // kiss 😘
124   HART2, // two hearts 💕
125   WEARY, // weary 😩
126   OKHND, // ok hand sign 👌
127   PENSV, // pensive 😔
128   SMIRK, // smirk 😏
129   RECYC, // recycle ♻
130   WINK, // wink 😉
131   THMUP, // thumb up 👍
132   THMDN, // thumb down 👎
133   PRAY, // pray 🙏
134   PHEW, // relieved 😌
135   MUSIC, // musical notes
136   FLUSH, // flushed 😳
137   CELEB, // celebration 🙌
138   CRY2, // crying face 😢
139   COOL, // smile with sunglasses 😎
140   NOEVS, // see no evil
141   NOEVH, // hear no evil
142   NOEVK, // speak no evil
143   POO, // pile of poo
144   EYES, // eyes
145   VIC, // victory hand
146   BHART, // broken heart
147   SLEEP, // sleeping face
148   SMIL2, // smiling face with open mouth & sweat
149   HUNRD, // 100
150   CONFU, // confused
151   TONGU, // face with tongue & winking eye
152   DISAP, // disappointed
153   YUMMY, // face savoring delicious food
154   CLAP, // hand clapping
155   FEAR, // face screaming in fear
156   HORNS, // smiling face with horns
157   HALO, // smiling face with halo
158   BYE, // waving hand
159   SUN, // sun
160   MOON, // moon
161   SKULL, // skull
162
163   // greek letters
164   UALPH,
165   UBETA,
166   UGAMM,
167   UDELT,
168   UEPSI,
169   UZETA,
170   UETA,
171   UTHET,
172   UIOTA,
173   UKAPP,
174   ULAMB,
175   UMU,
176   UNU,
177   UXI,
178   UOMIC,
179   UPI,
180   URHO,
181   USIGM,
182   UTAU,
183   UUPSI,
184   UPHI,
185   UCHI,
186   UPSI,
187   UOMEG,
188
189   LALPH,
190   LBETA,
191   LGAMM,
192   LDELT,
193   LEPSI,
194   LZETA,
195   LETA,
196   LTHET,
197   LIOTA,
198   LKAPP,
199   LLAMB,
200   LMU,
201   LNU,
202   LXI,
203   LOMIC,
204   LPI,
205   LRHO,
206   LSIGM,
207   LTAU,
208   LUPSI,
209   LPHI,
210   LCHI,
211   LPSI,
212   LOMEG,
213
214   FSIGM,
215 };
216
217 const uint32_t PROGMEM unicode_map[] = {
218   [GRIN] = 0x1F600,
219   [TJOY] = 0x1F602,
220   [SMILE] = 0x1F601,
221   [HEART] = 0x2764,
222   [EYERT] = 0x1f60d,
223   [CRY] = 0x1f62d,
224   [SMEYE] = 0x1F60A,
225   [UNAMU] = 0x1F612,
226   [KISS] = 0x1F618,
227   [HART2] = 0x1F495,
228   [WEARY] = 0x1F629,
229   [OKHND] = 0x1F44C,
230   [PENSV] = 0x1F614,
231   [SMIRK] = 0x1F60F,
232   [RECYC] = 0x267B,
233   [WINK] = 0x1F609,
234   [THMUP] = 0x1F44D,
235   [THMDN] = 0x1F44E,
236   [PRAY] = 0x1F64F,
237   [PHEW] = 0x1F60C,
238   [MUSIC] = 0x1F3B6,
239   [FLUSH] = 0x1F633,
240   [CELEB] = 0x1F64C,
241   [CRY2] = 0x1F622,
242   [COOL] = 0x1F60E,
243   [NOEVS] = 0x1F648,
244   [NOEVH] = 0x1F649,
245   [NOEVK] = 0x1F64A,
246   [POO] = 0x1F4A9,
247   [EYES] = 0x1F440,
248   [VIC] = 0x270C,
249   [BHART] = 0x1F494,
250   [SLEEP] = 0x1F634,
251   [SMIL2] = 0x1F605,
252   [HUNRD] = 0x1F4AF,
253   [CONFU] = 0x1F615,
254   [TONGU] = 0x1F61C,
255   [DISAP] = 0x1F61E,
256   [YUMMY] = 0x1F60B,
257   [CLAP] = 0x1F44F,
258   [FEAR] = 0x1F631,
259   [HORNS] = 0x1F608,
260   [HALO] = 0x1F607,
261   [BYE] = 0x1F44B,
262   [SUN] = 0x2600,
263   [MOON] = 0x1F314,
264   [SKULL] = 0x1F480,
265
266   // greek letters
267   [UALPH] = 0x0391,
268   [UBETA] = 0x0392,
269   [UGAMM] = 0x0393,
270   [UDELT] = 0x0394,
271   [UEPSI] = 0x0395,
272   [UZETA] = 0x0396,
273   [UETA] = 0x0397,
274   [UTHET] = 0x0398,
275   [UIOTA] = 0x0399,
276   [UKAPP] = 0x039A,
277   [ULAMB] = 0x039B,
278   [UMU] = 0x039C,
279   [UNU] = 0x039D,
280   [UXI] = 0x039E,
281   [UOMIC] = 0x039F,
282   [UPI] = 0x03A0,
283   [URHO] = 0x03A1,
284   [USIGM] = 0x03A3,
285   [UTAU] = 0x03A4,
286   [UUPSI] = 0x03A5,
287   [UPHI] = 0x03A6,
288   [UCHI] = 0x03A7,
289   [UPSI] = 0x03A8,
290   [UOMEG] = 0x03A9,
291   [LALPH] = 0x03B1,
292   [LBETA] = 0x03B2,
293   [LGAMM] = 0x03B3,
294   [LDELT] = 0x03B4,
295   [LEPSI] = 0x03B5,
296   [LZETA] = 0x03B6,
297   [LETA] = 0x03B7,
298   [LTHET] = 0x03B8,
299   [LIOTA] = 0x03B9,
300   [LKAPP] = 0x03BA,
301   [LLAMB] = 0x03BB,
302   [LMU] = 0x03BC,
303   [LNU] = 0x03BD,
304   [LXI] = 0x03BE,
305   [LOMIC] = 0x03BF,
306   [LPI] = 0x03C0,
307   [LRHO] = 0x03C1,
308   [LSIGM] = 0x03C3,
309   [LTAU] = 0x03C4,
310   [LUPSI] = 0x03C5,
311   [LPHI] = 0x03C6,
312   [LCHI] = 0x03C7,
313   [LPSI] = 0x03C8,
314   [LOMEG] = 0x03C9,
315   [FSIGM] = 0x03C2,
316 };
317
318 // hybrid right-gui & scroll lock (mapped to Compose in OS)
319 #undef KC_RALT
320 #define KC_RALT MT(MOD_RALT, KC_SLCK)
321
322 // keymaps
323
324 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
325
326 /* Qwerty
327  * ,-----------------------------------------------------------------------------------.
328  * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
329  * |------+------+------+------+------+-------------+------+------+------+------+------|
330  * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   '  |Enter |
331  * |------+------+------+------+------+------|------+------+------+------+------+------|
332  * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Shift |
333  * |------+------+------+------+------+------+------+------+------+------+------+------|
334  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
335  * `-----------------------------------------------------------------------------------'
336  */
337 [_QWERTY] = KEYMAP(
338   KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC,
339   KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_QUOT, KC_ENT ,
340   KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,
341   KC_LCTL, KC_LALT, KC_LGUI, PUNC,    NUM,     LSPACE,  RSPACE,  FUNC,    GREEK,   KC_RGUI, KC_RALT, KC_RCTL
342 ),
343
344 /* Dvorak
345  * ,-----------------------------------------------------------------------------------.
346  * | Tab  |   '  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp |
347  * |------+------+------+------+------+-------------+------+------+------+------+------|
348  * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |Enter |
349  * |------+------+------+------+------+------|------+------+------+------+------+------|
350  * | Shift|   /  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Shift |
351  * |------+------+------+------+------+------+------+------+------+------+------+------|
352  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
353  * `-----------------------------------------------------------------------------------'
354  */
355 #ifdef LAYOUT_DVORAK
356 [_DVORAK] = KEYMAP(
357   _______, KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    _______,
358   _______, KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    _______,
359   _______, KC_SLSH, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    _______,
360   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
361 ),
362 #endif
363
364 /* Colemak
365  * ,-----------------------------------------------------------------------------------.
366  * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
367  * |------+------+------+------+------+-------------+------+------+------+------+------|
368  * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |Enter |
369  * |------+------+------+------+------+------|------+------+------+------+------+------|
370  * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Shift |
371  * |------+------+------+------+------+------+------+------+------+------+------+------|
372  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
373  * `-----------------------------------------------------------------------------------'
374  */
375
376 #ifdef LAYOUT_COLEMAK
377 [_COLEMAK] = KEYMAP(
378   _______, KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_QUOT, _______,
379   _______, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    _______,
380   _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
381   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
382 ),
383 #endif
384
385 /* Norman
386  * ,-----------------------------------------------------------------------------------.
387  * | Tab  |   Q  |   W  |   D  |   F  |   K  |   J  |   U  |   R  |   L  |   ;  | Bksp |
388  * |------+------+------+------+------+-------------+------+------+------+------+------|
389  * | Esc  |   A  |   S  |   E  |   T  |   G  |   Y  |   N  |   I  |   O  |   H  |Enter |
390  * |------+------+------+------+------+------|------+------+------+------+------+------|
391  * | Shift|   Z  |   X  |   C  |   V  |   B  |   P  |   M  |   ,  |   .  |   /  |Shift |
392  * |------+------+------+------+------+------+------+------+------+------+------+------|
393  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
394  * `-----------------------------------------------------------------------------------'
395  */
396
397 #ifdef LAYOUT_NORMAN
398 [_NORMAN] = KEYMAP(
399   _______, KC_Q,    KC_W,    KC_D,    KC_F,    KC_K,    KC_J,    KC_U,    KC_R,    KC_L,    KC_QUOT, _______,
400   _______, KC_A,    KC_S,    KC_E,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_I,    KC_O,    KC_H,    _______,
401   _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_P,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
402   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
403 ),
404 #endif
405
406 /* Workman
407  * ,-----------------------------------------------------------------------------------.
408  * | Tab  |   Q  |   D  |   R  |   W  |   B  |   J  |   F  |   U  |   P  |   ;  | Bksp |
409  * |------+------+------+------+------+-------------+------+------+------+------+------|
410  * | Esc  |   A  |   S  |   H  |   T  |   G  |   Y  |   N  |   E  |   O  |   I  |Enter |
411  * |------+------+------+------+------+------|------+------+------+------+------+------|
412  * | Shift|   Z  |   X  |   M  |   C  |   V  |   K  |   K  |   ,  |   .  |   /  |Shift |
413  * |------+------+------+------+------+------+------+------+------+------+------+------|
414  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
415  * `-----------------------------------------------------------------------------------'
416  */
417
418 #ifdef LAYOUT_WORKMAN
419 [_WORKMAN] = KEYMAP(
420   _______, KC_Q,    KC_D,    KC_R,    KC_W,    KC_B,    KC_J,    KC_F,    KC_U,    KC_P,    KC_QUOT, _______,
421   _______, KC_A,    KC_S,    KC_H,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_E,    KC_O,    KC_I,    _______,
422   _______, KC_Z,    KC_X,    KC_M,    KC_C,    KC_V,    KC_K,    KC_L,    KC_COMM, KC_DOT,  KC_SLSH, _______,
423   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
424 ),
425 #endif
426
427 /* Punc
428  * ,-----------------------------------------------------------------------------------.
429  * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  |   `  |
430  * |------+------+------+------+------+-------------+------+------+------+------+------|
431  * |      |   *  |   \  |   -  |   =  |   /  |      |   (  |   )  |   <  |   >  |      |
432  * |------+------+------+------+------+------|------+------+------+------+------+------|
433  * |   &  |   ^  |   |  |   _  |   +  |   ?  |      |   [  |   ]  |   {  |   }  |   :  |
434  * |------+------+------+------+------+------+------+------+------+------+------+------|
435  * |      |      |      |      |      |             |      |      |      |      |      |
436  * `-----------------------------------------------------------------------------------'
437  */
438 [_PUNC] = KEYMAP(
439   KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______,
440   KC_GRV,  KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, XXXXXXX, KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
441   KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, XXXXXXX, KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, KC_COLN,
442   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
443 ),
444
445 /* Num
446  * ,-----------------------------------------------------------------------------------.
447  * |   ~  |   !  |   @  |   #  |   $  |   %  |   A  |   7  |   8  |   9  |   D  |   `  |
448  * |------+------+------+------+------+-------------+------+------+------+------+------|
449  * |      |   *  |   \  |   -  |   =  |   /  |   B  |   4  |   5  |   6  |   E  |      |
450  * |------+------+------+------+------+------|------+------+------+------+------+------|
451  * |   &  |   ^  |   |  |   _  |   +  |   ?  |   C  |   1  |   2  |   3  |   F  |  :   |
452  * |------+------+------+------+------+------+------+------+------+------+------+------|
453  * |      |      |      |      |      |      |   x  |   0  |   ,  |   .  |      |      |
454  * `-----------------------------------------------------------------------------------'
455  */
456 [_NUM] = KEYMAP(
457   KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, S(KC_A),    KC_7,    KC_8,    KC_9, S(KC_D), _______,
458   KC_GRV,  KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, S(KC_B),    KC_4,    KC_5,    KC_6, S(KC_E), _______,
459   KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C),    KC_1,    KC_2,    KC_3, S(KC_F), KC_COLN,
460   _______, _______, _______, _______, _______, _______, _______,    KC_0, KC_COMM,  KC_DOT, KC_X,    _______
461 ),
462
463 /* Func
464  * ,-----------------------------------------------------------------------------------.
465  * |      |  F1  |  F2  |  F3  |  F4  |      |      | PgUp |  Up  | PgDn | PgUp | Del  |
466  * |------+------+------+------+------+-------------+------+------+------+------+------|
467  * |      |  F5  |  F6  |  F7  |  F8  |PrtSc |      | Left | Down | Right| PgDn | Ins  |
468  * |------+------+------+------+------+------|------+------+------+------+------+------|
469  * |      |  F9  |  F10 |  F11 |  F12 |      |      |      | Home |  End |      |      |
470  * |------+------+------+------+------+------+------+------+------+------+------+------|
471  * |      |      |      |      |      |             |      |      |      |      |      |
472  * `-----------------------------------------------------------------------------------'
473  */
474 [_FUNC] = KEYMAP(
475   XXXXXXX,   KC_F1,   KC_F2,   KC_F3,   KC_F4, XXXXXXX, XXXXXXX, KC_PGUP,   KC_UP, KC_PGDN, KC_PGUP,  KC_DEL,
476   XXXXXXX,   KC_F5,   KC_F6,   KC_F7,  KC_F8,KC_PSCREEN,XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN,  KC_INS,
477   _______,   KC_F9,  KC_F10,  KC_F11,  KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME,  KC_END, XXXXXXX, _______,
478   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
479 ),
480
481 /* Uppercase Greek
482  * ,-----------------------------------------------------------------------------------.
483  * |      |      |      |      |      |      |      |      |      |      |      |      |
484  * |------+------+------+------+------+-------------+------+------+------+------+------|
485  * |      |      |      |      |      |      |      |      |      |      |      |      |
486  * |------+------+------+------+------+------+------+------+------+------+------+------|
487  * |      |      |      |      |      |      |      |      |      |      |      |      |
488  * |------+------+------+------+------+------+------+------+------+------+------+------|
489  * |      |      |      |      |      |      |      |      |      |      |      |      |
490  * `-----------------------------------------------------------------------------------'
491  */
492 [_GREEKU] = KEYMAP(
493   _______, _______, _______,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC),  X(UPI), _______,
494   _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA),  X(UXI),X(UKAPP),X(ULAMB), _______, _______,
495   _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA),  X(UNU),  X(UMU), _______, _______, _______, _______,
496   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
497 ),
498
499 /* Lowercase Greek
500  * ,-----------------------------------------------------------------------------------.
501  * |      |      |      |      |      |      |      |      |      |      |      |      |
502  * |------+------+------+------+------+-------------+------+------+------+------+------|
503  * |      |      |      |      |      |      |      |      |      |      |      |      |
504  * |------+------+------+------+------+------+------+------+------+------+------+------|
505  * |      |      |      |      |      |      |      |      |      |      |      |      |
506  * |------+------+------+------+------+------+------+------+------+------+------+------|
507  * |      |      |      |      |      |      |      |      |      |      |      |      |
508  * `-----------------------------------------------------------------------------------'
509  */
510 [_GREEKL] = KEYMAP(
511   _______, _______,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC),  X(LPI), _______,
512   _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA),  X(LXI),X(LKAPP),X(LLAMB), _______, _______,
513   _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA),  X(LNU),  X(LMU), _______, _______, _______, _______,
514   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
515 ),
516
517 /* Emoji
518  * ,-----------------------------------------------------------------------------------.
519  * |      |      |      |      |      |      |      |      |      |      |      |      |
520  * |------+------+------+------+------+-------------+------+------+------+------+------|
521  * |      |      |      |      |      |      |      |      |      |      |      |      |
522  * |------+------+------+------+------+------+------+------+------+------+------+------|
523  * |      |      |      |      |      |      |      |      |      |      |      |      |
524  * |------+------+------+------+------+------+------+------+------+------+------+------|
525  * |      |      |      |      |      |      |      |      |      |      |      |      |
526  * `-----------------------------------------------------------------------------------'
527  */
528 [_EMOJI] = KEYMAP(
529   X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
530   X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART),  X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
531   X(THMDN),X(SLEEP), X(CLAP),  X(CRY),  X(VIC),X(BHART),  X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
532     X(POO), X(EYES), _______,X(HUNRD), X(SKULL),X(HORNS), X(HALO), X(FEAR),X(YUMMY),_______,X(DISAP),X(NOEVK)
533 ),
534
535 /* GUI
536  * ,-----------------------------------------------------------------------------------.
537  * |      |  D1  |  D2  |  D3  |  D4  |  D5  |  D6  |  D7  |  D8  |  D9  |  D10 |      |
538  * |------+------+------+------+------+-------------+------+------+------+------+------|
539  * |      |      | Vol- | Mute | Vol+ |      |      | Prev |      | Next |      |      |
540  * |------+------+------+------+------+------+------+------+------+------+------+------|
541  * |      |      | Prev | Play | Next |      |      |      |      |      |      |      |
542  * |------+------+------+------+------+------+------+------+------+------+------+------|
543  * |      |      |      |      |      |      |      |      |      |      |      |      |
544  * `-----------------------------------------------------------------------------------'
545  */
546 [_GUI] = KEYMAP(
547   XXXXXXX, G(KC_1), G(KC_2), G(KC_3), G(KC_4), G(KC_5), G(KC_6), G(KC_7), G(KC_8), G(KC_9), G(KC_0), XXXXXXX,
548   XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
549   XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, KC_SPC,  KC_SPC,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
550   XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX
551 ),
552
553 /* Sys
554  * ,-----------------------------------------------------------------------------------.
555  * |      |Qwerty| Win  |      |Reset |      |      | USB  |      |      |      |      |
556  * |------+------+------+------+------+-------------+------+------+------+------+------|
557  * |      |Audio |      |Dvorak|      | Glow |      |      |WorkMn|Linux |      |      |
558  * |------+------+------+------+------+------+------+------+------+------+------+------|
559  * |      |      |      |Colmak|      | BLE  |Norman|MacOS |      |      |      |      |
560  * |------+------+------+------+------+------+------+------+------+------+------+------|
561  * |      |      |      |      |      |      |      |      |      |      |      |      |
562  * `-----------------------------------------------------------------------------------'
563  */
564 [_SYS] = KEYMAP(
565   XXXXXXX, QWERTY,  WIN,     XXXXXXX, RESET,   XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
566   XXXXXXX, FC_TOG,  XXXXXXX, DVORAK,  XXXXXXX, GLOW,    XXXXXXX, XXXXXXX, WORKMAN, LINUX,   XXXXXXX, XXXXXXX,
567   XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BLE, NORMAN,  OSX,     XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
568   _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______
569 ),
570
571 };
572
573 #ifdef AUDIO_ENABLE
574 float tone_startup[][2]    = SONG(STARTUP_SOUND);
575 float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
576 float tone_colemak[][2]    = SONG(COLEMAK_SOUND);
577 float tone_workman[][2]    = SONG(DVORAK_SOUND);
578 float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
579 float tone_linux[][2] = SONG(CAPS_LOCK_ON_SOUND);
580 float tone_windows[][2] = SONG(SCROLL_LOCK_ON_SOUND);
581 float tone_osx[][2] = SONG(NUM_LOCK_ON_SOUND);
582 float tone_click[][2] = SONG(MUSICAL_NOTE(_F3, 2));
583 float tone_release[][2] = SONG(MUSICAL_NOTE(_A3, 2));
584 float tone_tolelot[][2] = SONG(Q__NOTE(_E5), Q__NOTE(_C5), Q__NOTE(_D5));
585 #endif
586
587 void persistant_default_layer_set(uint16_t default_layer) {
588   eeconfig_update_default_layer(default_layer);
589   default_layer_set(default_layer);
590 }
591
592 #ifdef DOUBLESPACE_LAYER_ENABLE
593 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
594   if (pressed) {
595     *isactive = true;
596     if (*otheractive) {
597       layer_on(_SPACE);
598       space_layer_entered = true;
599     }
600   } else {
601     *isactive = false;
602     if (space_layer_entered) {
603       layer_off(_SPACE);
604       if (!*otheractive) {
605         space_layer_entered = false;
606       }
607     } else {
608       if (!*isemitted) {
609         register_code(KC_SPC);
610         unregister_code(KC_SPC);
611       }
612       *isemitted = false;
613     }
614   }
615 }
616 #endif
617
618 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
619   // faux clicky
620   // if (record->event.pressed) PLAY_NOTE_ARRAY(tone_click, false, 0);
621   #ifdef AUDIO_ENABLE
622   #ifdef TOLELOT_ENABLE
623   if (record->event.pressed) {
624     PLAY_NOTE_ARRAY(tone_tolelot, false, 0);
625   }
626   #else
627   if (record->event.pressed) {
628     PLAY_NOTE_ARRAY(tone_click, false, 0);
629   } else {
630     PLAY_NOTE_ARRAY(tone_release, false, 0);
631   }
632   #endif
633   #endif
634
635   bool lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
636   bool rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
637
638 #ifdef DOUBLESPACE_LAYER_ENABLE
639   // double-space: send space immediately if any other key depressed before space is released
640   if ((lspace_active ^ rspace_active)
641       && keycode != LSPACE
642       && keycode != RSPACE
643       && record->event.pressed)
644   {
645     if (lspace_active) {
646       if (!lspace_emitted) {
647         register_code(KC_SPC);
648         unregister_code(KC_SPC);
649       }
650       lspace_emitted = true;
651     }
652     if (rspace_active) {
653       if (!rspace_emitted) {
654         register_code(KC_SPC);
655         unregister_code(KC_SPC);
656       }
657       rspace_emitted = true;
658     }
659   }
660 #endif
661
662   switch (keycode) {
663
664 #ifdef DOUBLESPACE_LAYER_ENABLE
665     // double-space enter space layer
666     case LSPACE:
667       process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
668       return false;
669       break;
670     case RSPACE:
671       process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
672       return false;
673       break;
674 #endif
675
676     // handle greek layer shift
677     // handle both shift = capslock
678     case KC_LSFT:
679     case KC_RSFT:
680       ;
681       uint8_t layer = biton32(layer_state);
682       if (layer == _GREEKU || layer == _GREEKL) {
683         if (record->event.pressed) {
684           layer_on(_GREEKU);
685           layer_off(_GREEKL);
686         } else {
687           if (lshift ^ rshift) { // if only one shift was pressed
688             layer_on(_GREEKL);
689             layer_off(_GREEKU);
690           }
691         }
692       } else {
693         if (record->event.pressed) {
694           if (lshift ^ rshift) { // if only one shift was pressed
695             register_code(KC_CAPS);
696             unregister_code(KC_CAPS);
697           }
698         }
699       }
700       return true;
701       break;
702
703     // press both ctrls to activate SYS layer
704     case KC_LCTL:
705     case KC_RCTL:
706       ;
707       bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
708       bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
709       if (record->event.pressed) {
710         if (lctrl ^ rctrl) { // if only one ctrl was pressed
711           layer_on(_SYS);
712         }
713       } else {
714         layer_off(_SYS);
715       }
716       return true;
717       break;
718
719     // QWERTZ style comma and dot: semicolon and colon when shifted
720     case KC_COMM:
721       if (record->event.pressed) {
722         if (lshift || rshift) {
723           if (lshift) unregister_code(KC_LSFT);
724           if (rshift) unregister_code(KC_RSFT);
725           register_code(KC_SCLN);
726           unregister_code(KC_SCLN);
727           if (lshift) register_code(KC_LSFT);
728           if (rshift) register_code(KC_RSFT);
729         } else {
730           register_code(KC_COMM);
731           unregister_code(KC_COMM);
732         }
733       }
734       return false;
735       break;
736     case KC_DOT:
737       if (record->event.pressed) {
738         if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
739           register_code(KC_SCLN);
740           unregister_code(KC_SCLN);
741         } else {
742           register_code(KC_DOT);
743           unregister_code(KC_DOT);
744         }
745       }
746       return false;
747       break;
748
749     // layout switcher
750     case QWERTY:
751       if (record->event.pressed) {
752         persistant_default_layer_set(1UL<<_QWERTY);
753       }
754       return false;
755       break;
756 #ifdef LAYOUT_DVORAK
757     case DVORAK:
758       if (record->event.pressed) {
759         persistant_default_layer_set(1UL<<_DVORAK);
760       }
761       return false;
762       break;
763 #endif
764 #ifdef LAYOUT_COLEMAK
765     case COLEMAK:
766       if (record->event.pressed) {
767         persistant_default_layer_set(1UL<<_COLEMAK);
768       }
769       return false;
770       break;
771 #endif
772 #ifdef LAYOUT_WORKMAN
773     case WORKMAN:
774       if (record->event.pressed) {
775         persistant_default_layer_set(1UL<<_WORKMAN);
776       }
777       return false;
778       break;
779 #endif
780 #ifdef LAYOUT_NORMAN
781     case NORMAN:
782       if (record->event.pressed) {
783         persistant_default_layer_set(1UL<<_NORMAN);
784       }
785       return false;
786       break;
787 #endif
788
789     // layer switchers
790     case PUNC:
791       if (record->event.pressed) {
792         layer_on(_PUNC);
793         update_tri_layer(_PUNC, _GREEKL, _EMOJI);
794       } else {
795         layer_off(_PUNC);
796         update_tri_layer(_PUNC, _GREEKL, _EMOJI);
797       }
798       return false;
799       break;
800
801     case GREEK:
802       if (record->event.pressed) {
803         if (lshift || rshift) {
804           layer_on(_GREEKU);
805           layer_off(_GREEKL);
806         } else {
807           layer_on(_GREEKL);
808           layer_off(_GREEKU);
809           update_tri_layer(_PUNC, _GREEKL, _EMOJI);
810         }
811       } else {
812         layer_off(_GREEKU);
813         layer_off(_GREEKL);
814         update_tri_layer(_PUNC, _GREEKL, _EMOJI);
815       }
816       return false;
817       break;
818
819     case NUM:
820       if (record->event.pressed) {
821         layer_on(_NUM);
822       } else {
823         layer_off(_NUM);
824       }
825       return false;
826       break;
827     case FUNC:
828       if (record->event.pressed) {
829         layer_on(_FUNC);
830       } else {
831         layer_off(_FUNC);
832       }
833       return false;
834       break;
835
836     // OS switchers
837     case LINUX:
838       set_unicode_input_mode(UC_LNX);
839       #ifdef AUDIO_ENABLE
840         PLAY_NOTE_ARRAY(tone_linux, false, 0);
841       #endif
842       return false;
843       break;
844     case WIN:
845       set_unicode_input_mode(UC_WINC);
846       #ifdef AUDIO_ENABLE
847         PLAY_NOTE_ARRAY(tone_windows, false, 0);
848       #endif
849       return false;
850       break;
851     case OSX:
852       set_unicode_input_mode(UC_OSX);
853       #ifdef AUDIO_ENABLE
854         PLAY_NOTE_ARRAY(tone_osx, false, 0);
855       #endif
856       return false;
857       break;
858
859     // faux clicky toggle, TBD
860     case FC_TOG:
861       return true;
862       break;
863
864   }
865   return true;
866 }
867
868 void matrix_init_user(void) {
869   #ifdef AUDIO_ENABLE
870       startup_user();
871   #endif
872   set_unicode_input_mode(UC_LNX);
873 }
874
875 #ifdef AUDIO_ENABLE
876
877 void startup_user()
878 {
879     _delay_ms(20); // gets rid of tick
880     PLAY_NOTE_ARRAY(tone_startup, false, 0);
881 }
882
883 void shutdown_user()
884 {
885     PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
886     _delay_ms(150);
887     stop_all_notes();
888 }
889
890 #endif
891
892 void matrix_scan_user(void) {
893 }
894
895 void led_set_user(uint8_t usb_led) {
896 }
897
898 void turn_off_capslock() {
899   if (capslock) {
900     register_code(KC_CAPS);
901     unregister_code(KC_CAPS);
902   }
903 }