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