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