]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/planck/keymaps/priyadi/keymap.c
Update my Planck layout
[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 // keymaps
314
315 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
316
317 /* Qwerty
318  * ,-----------------------------------------------------------------------------------.
319  * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
320  * |------+------+------+------+------+-------------+------+------+------+------+------|
321  * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   '  |Enter |
322  * |------+------+------+------+------+------|------+------+------+------+------+------|
323  * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Shift |
324  * |------+------+------+------+------+------+------+------+------+------+------+------|
325  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
326  * `-----------------------------------------------------------------------------------'
327  */
328 [_QWERTY] = KEYMAP(
329   KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC,
330   KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_QUOT, KC_ENT ,
331   KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,
332   KC_LCTL, KC_LALT, KC_LGUI, PUNC,    NUM,     LSPACE,  RSPACE,  FUNC,    GREEK,   KC_RGUI, KC_RALT, KC_RCTL
333 ),
334
335 /* Dvorak
336  * ,-----------------------------------------------------------------------------------.
337  * | Tab  |   '  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp |
338  * |------+------+------+------+------+-------------+------+------+------+------+------|
339  * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |Enter |
340  * |------+------+------+------+------+------|------+------+------+------+------+------|
341  * | Shift|   /  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Shift |
342  * |------+------+------+------+------+------+------+------+------+------+------+------|
343  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
344  * `-----------------------------------------------------------------------------------'
345  */
346 #ifdef LAYOUT_DVORAK
347 [_DVORAK] = KEYMAP(
348   _______, KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    _______,
349   _______, KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    _______,
350   _______, KC_SLSH, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    _______,
351   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
352 ),
353 #endif
354
355 /* Colemak
356  * ,-----------------------------------------------------------------------------------.
357  * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
358  * |------+------+------+------+------+-------------+------+------+------+------+------|
359  * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |Enter |
360  * |------+------+------+------+------+------|------+------+------+------+------+------|
361  * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Shift |
362  * |------+------+------+------+------+------+------+------+------+------+------+------|
363  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
364  * `-----------------------------------------------------------------------------------'
365  */
366
367 #ifdef LAYOUT_COLEMAK
368 [_COLEMAK] = KEYMAP(
369   _______, KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_QUOT, _______,
370   _______, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    _______,
371   _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
372   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
373 ),
374 #endif
375
376 /* Norman
377  * ,-----------------------------------------------------------------------------------.
378  * | Tab  |   Q  |   W  |   D  |   F  |   K  |   J  |   U  |   R  |   L  |   ;  | Bksp |
379  * |------+------+------+------+------+-------------+------+------+------+------+------|
380  * | Esc  |   A  |   S  |   E  |   T  |   G  |   Y  |   N  |   I  |   O  |   H  |Enter |
381  * |------+------+------+------+------+------|------+------+------+------+------+------|
382  * | Shift|   Z  |   X  |   C  |   V  |   B  |   P  |   M  |   ,  |   .  |   /  |Shift |
383  * |------+------+------+------+------+------+------+------+------+------+------+------|
384  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
385  * `-----------------------------------------------------------------------------------'
386  */
387
388 #ifdef LAYOUT_NORMAN
389 [_NORMAN] = KEYMAP(
390   _______, KC_Q,    KC_W,    KC_D,    KC_F,    KC_K,    KC_J,    KC_U,    KC_R,    KC_L,    KC_QUOT, _______,
391   _______, KC_A,    KC_S,    KC_E,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_I,    KC_O,    KC_H,    _______,
392   _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_P,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
393   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
394 ),
395 #endif
396
397 /* Workman
398  * ,-----------------------------------------------------------------------------------.
399  * | Tab  |   Q  |   D  |   R  |   W  |   B  |   J  |   F  |   U  |   P  |   ;  | Bksp |
400  * |------+------+------+------+------+-------------+------+------+------+------+------|
401  * | Esc  |   A  |   S  |   H  |   T  |   G  |   Y  |   N  |   E  |   O  |   I  |Enter |
402  * |------+------+------+------+------+------|------+------+------+------+------+------|
403  * | Shift|   Z  |   X  |   M  |   C  |   V  |   K  |   K  |   ,  |   .  |   /  |Shift |
404  * |------+------+------+------+------+------+------+------+------+------+------+------|
405  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
406  * `-----------------------------------------------------------------------------------'
407  */
408
409 #ifdef LAYOUT_WORKMAN
410 [_WORKMAN] = KEYMAP(
411   _______, KC_Q,    KC_D,    KC_R,    KC_W,    KC_B,    KC_J,    KC_F,    KC_U,    KC_P,    KC_QUOT, _______,
412   _______, KC_A,    KC_S,    KC_H,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_E,    KC_O,    KC_I,    _______,
413   _______, KC_Z,    KC_X,    KC_M,    KC_C,    KC_V,    KC_K,    KC_L,    KC_COMM, KC_DOT,  KC_SLSH, _______,
414   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
415 ),
416 #endif
417
418 /* Punc
419  * ,-----------------------------------------------------------------------------------.
420  * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  |   `  |
421  * |------+------+------+------+------+-------------+------+------+------+------+------|
422  * |      |   *  |   \  |   -  |   =  |   /  |      |   (  |   )  |   <  |   >  |      |
423  * |------+------+------+------+------+------|------+------+------+------+------+------|
424  * |   &  |   ^  |   |  |   _  |   +  |   ?  |      |   [  |   ]  |   {  |   }  |   :  |
425  * |------+------+------+------+------+------+------+------+------+------+------+------|
426  * |      |      |      |      |      |             |      |      |      |      |      |
427  * `-----------------------------------------------------------------------------------'
428  */
429 [_PUNC] = KEYMAP(
430   KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_GRV ,
431   XXXXXXX, KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, XXXXXXX, KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, XXXXXXX,
432   KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, XXXXXXX, KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, KC_COLN,
433   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
434 ),
435
436 /* Num
437  * ,-----------------------------------------------------------------------------------.
438  * |   ~  |   !  |   @  |   #  |   $  |   %  |   A  |   7  |   8  |   9  |   D  |   `  |
439  * |------+------+------+------+------+-------------+------+------+------+------+------|
440  * |      |   *  |   \  |   -  |   =  |   /  |   B  |   4  |   5  |   6  |   E  |      |
441  * |------+------+------+------+------+------|------+------+------+------+------+------|
442  * |   &  |   ^  |   |  |   _  |   +  |   ?  |   C  |   1  |   2  |   3  |   F  |  :   |
443  * |------+------+------+------+------+------+------+------+------+------+------+------|
444  * |      |      |      |      |      |      |   x  |   0  |   ,  |   .  |      |      |
445  * `-----------------------------------------------------------------------------------'
446  */
447 [_NUM] = KEYMAP(
448   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,
449   XXXXXXX, KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, S(KC_B),    KC_4,    KC_5,    KC_6, S(KC_E), _______,
450   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,
451   _______, _______, _______, _______, _______, _______, _______,    KC_0, KC_COMM,  KC_DOT, KC_X,    _______
452 ),
453
454 /* Func
455  * ,-----------------------------------------------------------------------------------.
456  * |      |  F1  |  F2  |  F3  |  F4  |      |      | PgUp |  Up  | PgDn | PgUp | Del  |
457  * |------+------+------+------+------+-------------+------+------+------+------+------|
458  * |      |  F5  |  F6  |  F7  |  F8  |PrtSc |      | Left | Down | Right| PgDn | Ins  |
459  * |------+------+------+------+------+------|------+------+------+------+------+------|
460  * |      |  F9  |  F10 |  F11 |  F12 |      |      |      | Home |  End |      |      |
461  * |------+------+------+------+------+------+------+------+------+------+------+------|
462  * |      |      |      |      |      |             |      |      |      |      |      |
463  * `-----------------------------------------------------------------------------------'
464  */
465 [_FUNC] = KEYMAP(
466   XXXXXXX,   KC_F1,   KC_F2,   KC_F3,   KC_F4, XXXXXXX, XXXXXXX, KC_PGUP,   KC_UP, KC_PGDN, KC_PGUP,  KC_DEL,
467   XXXXXXX,   KC_F5,   KC_F6,   KC_F7,  KC_F8,KC_PSCREEN,XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN,  KC_INS,
468   _______,   KC_F9,  KC_F10,  KC_F11,  KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME,  KC_END, XXXXXXX, _______,
469   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
470 ),
471
472 /* Uppercase Greek
473  * ,-----------------------------------------------------------------------------------.
474  * |      |      |      |      |      |      |      |      |      |      |      |      |
475  * |------+------+------+------+------+-------------+------+------+------+------+------|
476  * |      |      |      |      |      |      |      |      |      |      |      |      |
477  * |------+------+------+------+------+------+------+------+------+------+------+------|
478  * |      |      |      |      |      |      |      |      |      |      |      |      |
479  * |------+------+------+------+------+------+------+------+------+------+------+------|
480  * |      |      |      |      |      |      |      |      |      |      |      |      |
481  * `-----------------------------------------------------------------------------------'
482  */
483 [_GREEKU] = KEYMAP(
484   _______, _______, _______,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC),  X(UPI), _______,
485   _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA),  X(UXI),X(UKAPP),X(ULAMB), _______, _______,
486   _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA),  X(UNU),  X(UMU), _______, _______, _______, _______,
487   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
488 ),
489
490 /* Lowercase Greek
491  * ,-----------------------------------------------------------------------------------.
492  * |      |      |      |      |      |      |      |      |      |      |      |      |
493  * |------+------+------+------+------+-------------+------+------+------+------+------|
494  * |      |      |      |      |      |      |      |      |      |      |      |      |
495  * |------+------+------+------+------+------+------+------+------+------+------+------|
496  * |      |      |      |      |      |      |      |      |      |      |      |      |
497  * |------+------+------+------+------+------+------+------+------+------+------+------|
498  * |      |      |      |      |      |      |      |      |      |      |      |      |
499  * `-----------------------------------------------------------------------------------'
500  */
501 [_GREEKL] = KEYMAP(
502   _______, _______,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC),  X(LPI), _______,
503   _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA),  X(LXI),X(LKAPP),X(LLAMB), _______, _______,
504   _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA),  X(LNU),  X(LMU), _______, _______, _______, _______,
505   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
506 ),
507
508 /* Emoji
509  * ,-----------------------------------------------------------------------------------.
510  * |      |      |      |      |      |      |      |      |      |      |      |      |
511  * |------+------+------+------+------+-------------+------+------+------+------+------|
512  * |      |      |      |      |      |      |      |      |      |      |      |      |
513  * |------+------+------+------+------+------+------+------+------+------+------+------|
514  * |      |      |      |      |      |      |      |      |      |      |      |      |
515  * |------+------+------+------+------+------+------+------+------+------+------+------|
516  * |      |      |      |      |      |      |      |      |      |      |      |      |
517  * `-----------------------------------------------------------------------------------'
518  */
519 [_EMOJI] = KEYMAP(
520   X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
521   X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART),  X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
522   X(THMDN),X(SLEEP), X(CLAP),  X(CRY),  X(VIC),X(BHART),  X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
523     X(POO), X(EYES), _______,X(HUNRD), X(SKULL),X(HORNS), X(HALO), X(FEAR),X(YUMMY),_______,X(DISAP),X(NOEVK)
524 ),
525
526 /* GUI
527  * ,-----------------------------------------------------------------------------------.
528  * |      |  D1  |  D2  |  D3  |  D4  |  D5  |  D6  |  D7  |  D8  |  D9  |  D10 |      |
529  * |------+------+------+------+------+-------------+------+------+------+------+------|
530  * |      |      | Vol- | Mute | Vol+ |      |      | Prev |      | Next |      |      |
531  * |------+------+------+------+------+------+------+------+------+------+------+------|
532  * |      |      | Prev | Play | Next |      |      |      |      |      |      |      |
533  * |------+------+------+------+------+------+------+------+------+------+------+------|
534  * |      |      |      |      |      |      |      |      |      |      |      |      |
535  * `-----------------------------------------------------------------------------------'
536  */
537 [_GUI] = KEYMAP(
538   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,
539   XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
540   XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, KC_SPC,  KC_SPC,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
541   XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX
542 ),
543
544 /* Sys
545  * ,-----------------------------------------------------------------------------------.
546  * |      |Qwerty| Win  |      |Reset |      |      | USB  |      |      |      |      |
547  * |------+------+------+------+------+-------------+------+------+------+------+------|
548  * |      |Audio |      |Dvorak|      | Glow |      |      |WorkMn|Linux |      |      |
549  * |------+------+------+------+------+------+------+------+------+------+------+------|
550  * |      |      |      |Colmak|      | BLE  |Norman|MacOS |      |      |      |      |
551  * |------+------+------+------+------+------+------+------+------+------+------+------|
552  * |      |      |      |      |      |      |      |      |      |      |      |      |
553  * `-----------------------------------------------------------------------------------'
554  */
555 [_SYS] = KEYMAP(
556   XXXXXXX, QWERTY,  WIN,     XXXXXXX, RESET,   XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
557   XXXXXXX, AUDIO,   XXXXXXX, DVORAK,  XXXXXXX, GLOW,    XXXXXXX, XXXXXXX, WORKMAN, LINUX,   XXXXXXX, XXXXXXX,
558   XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BLE, NORMAN,  OSX,     XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
559   _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______
560 ),
561
562 };
563
564 #ifdef AUDIO_ENABLE
565 float tone_startup[][2]    = SONG(STARTUP_SOUND);
566 float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
567 float tone_colemak[][2]    = SONG(COLEMAK_SOUND);
568 float tone_workman[][2]    = SONG(DVORAK_SOUND);
569 float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
570 float tone_linux[][2] = SONG(CAPS_LOCK_ON_SOUND);
571 float tone_windows[][2] = SONG(SCROLL_LOCK_ON_SOUND);
572 float tone_osx[][2] = SONG(NUM_LOCK_ON_SOUND);
573 float tone_click[][2] = SONG(MUSICAL_NOTE(_F3, 2));
574 float tone_release[][2] = SONG(MUSICAL_NOTE(_A3, 2));
575 float tone_tolelot[][2] = SONG(Q__NOTE(_E5), Q__NOTE(_C5), Q__NOTE(_D5));
576 #endif
577
578 void persistant_default_layer_set(uint16_t default_layer) {
579   eeconfig_update_default_layer(default_layer);
580   default_layer_set(default_layer);
581 }
582
583 #ifdef DOUBLESPACE_LAYER_ENABLE
584 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
585   if (pressed) {
586     *isactive = true;
587     if (*otheractive) {
588       layer_on(_SPACE);
589       space_layer_entered = true;
590     }
591   } else {
592     *isactive = false;
593     if (space_layer_entered) {
594       layer_off(_SPACE);
595       if (!*otheractive) {
596         space_layer_entered = false;
597       }
598     } else {
599       if (!*isemitted) {
600         register_code(KC_SPC);
601         unregister_code(KC_SPC);
602       }
603       *isemitted = false;
604     }
605   }
606 }
607 #endif
608
609 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
610   // faux clicky
611   // if (record->event.pressed) PLAY_NOTE_ARRAY(tone_click, false, 0);
612   #ifdef AUDIO_ENABLE
613   #ifdef TOLELOT_ENABLE
614   if (record->event.pressed) {
615     PLAY_NOTE_ARRAY(tone_tolelot, false, 0);
616   }
617   #else
618   if (record->event.pressed) {
619     PLAY_NOTE_ARRAY(tone_click, false, 0);
620   } else {
621     PLAY_NOTE_ARRAY(tone_release, false, 0);
622   }
623   #endif
624   #endif
625
626   bool lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
627   bool rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
628
629 #ifdef DOUBLESPACE_LAYER_ENABLE
630   // double-space: send space immediately if any other key depressed before space is released
631   if ((lspace_active ^ rspace_active)
632       && keycode != LSPACE
633       && keycode != RSPACE
634       && record->event.pressed)
635   {
636     if (lspace_active) {
637       if (!lspace_emitted) {
638         register_code(KC_SPC);
639         unregister_code(KC_SPC);
640       }
641       lspace_emitted = true;
642     }
643     if (rspace_active) {
644       if (!rspace_emitted) {
645         register_code(KC_SPC);
646         unregister_code(KC_SPC);
647       }
648       rspace_emitted = true;
649     }
650   }
651 #endif
652
653   switch (keycode) {
654
655 #ifdef DOUBLESPACE_LAYER_ENABLE
656     // double-space enter space layer
657     case LSPACE:
658       process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
659       return false;
660       break;
661     case RSPACE:
662       process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
663       return false;
664       break;
665 #endif
666
667     // handle greek layer shift
668     // handle both shift = capslock
669     case KC_LSFT:
670     case KC_RSFT:
671       ;
672       uint8_t layer = biton32(layer_state);
673       if (layer == _GREEKU || layer == _GREEKL) {
674         if (record->event.pressed) {
675           layer_on(_GREEKU);
676           layer_off(_GREEKL);
677         } else {
678           if (lshift ^ rshift) { // if only one shift was pressed
679             layer_on(_GREEKL);
680             layer_off(_GREEKU);
681           }
682         }
683       } else {
684         if (record->event.pressed) {
685           if (lshift ^ rshift) { // if only one shift was pressed
686             register_code(KC_CAPS);
687             unregister_code(KC_CAPS);
688           }
689         }
690       }
691       return true;
692       break;
693
694     // press both ctrls to activate SYS layer
695     case KC_LCTL:
696     case KC_RCTL:
697       ;
698       bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
699       bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
700       if (record->event.pressed) {
701         if (lctrl ^ rctrl) { // if only one ctrl was pressed
702           layer_on(_SYS);
703         }
704       } else {
705         layer_off(_SYS);
706       }
707       return true;
708       break;
709
710     // QWERTZ style comma and dot: semicolon and colon when shifted
711     case KC_COMM:
712       if (record->event.pressed) {
713         if (lshift || rshift) {
714           if (lshift) unregister_code(KC_LSFT);
715           if (rshift) unregister_code(KC_RSFT);
716           register_code(KC_SCLN);
717           unregister_code(KC_SCLN);
718           if (lshift) register_code(KC_LSFT);
719           if (rshift) register_code(KC_RSFT);
720         } else {
721           register_code(KC_COMM);
722           unregister_code(KC_COMM);
723         }
724       }
725       return false;
726       break;
727     case KC_DOT:
728       if (record->event.pressed) {
729         if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
730           register_code(KC_SCLN);
731           unregister_code(KC_SCLN);
732         } else {
733           register_code(KC_DOT);
734           unregister_code(KC_DOT);
735         }
736       }
737       return false;
738       break;
739
740     // layout switcher
741     case QWERTY:
742       if (record->event.pressed) {
743         persistant_default_layer_set(1UL<<_QWERTY);
744       }
745       return false;
746       break;
747 #ifdef LAYOUT_DVORAK
748     case DVORAK:
749       if (record->event.pressed) {
750         persistant_default_layer_set(1UL<<_DVORAK);
751       }
752       return false;
753       break;
754 #endif
755 #ifdef LAYOUT_COLEMAK
756     case COLEMAK:
757       if (record->event.pressed) {
758         persistant_default_layer_set(1UL<<_COLEMAK);
759       }
760       return false;
761       break;
762 #endif
763 #ifdef LAYOUT_WORKMAN
764     case WORKMAN:
765       if (record->event.pressed) {
766         persistant_default_layer_set(1UL<<_WORKMAN);
767       }
768       return false;
769       break;
770 #endif
771 #ifdef LAYOUT_NORMAN
772     case NORMAN:
773       if (record->event.pressed) {
774         persistant_default_layer_set(1UL<<_NORMAN);
775       }
776       return false;
777       break;
778 #endif
779
780     // layer switchers
781     case PUNC:
782       if (record->event.pressed) {
783         layer_on(_PUNC);
784         update_tri_layer(_PUNC, _GREEKL, _EMOJI);
785       } else {
786         layer_off(_PUNC);
787         update_tri_layer(_PUNC, _GREEKL, _EMOJI);
788       }
789       return false;
790       break;
791
792     case GREEK:
793       if (record->event.pressed) {
794         if (lshift || rshift) {
795           layer_on(_GREEKU);
796           layer_off(_GREEKL);
797         } else {
798           layer_on(_GREEKL);
799           layer_off(_GREEKU);
800           update_tri_layer(_PUNC, _GREEKL, _EMOJI);
801         }
802       } else {
803         layer_off(_GREEKU);
804         layer_off(_GREEKL);
805         update_tri_layer(_PUNC, _GREEKL, _EMOJI);
806       }
807       return false;
808       break;
809
810     case NUM:
811       if (record->event.pressed) {
812         layer_on(_NUM);
813       } else {
814         layer_off(_NUM);
815       }
816       return false;
817       break;
818     case FUNC:
819       if (record->event.pressed) {
820         layer_on(_FUNC);
821       } else {
822         layer_off(_FUNC);
823       }
824       return false;
825       break;
826
827     // OS switchers
828     case LINUX:
829       set_unicode_input_mode(UC_LNX);
830       #ifdef AUDIO_ENABLE
831         PLAY_NOTE_ARRAY(tone_linux, false, 0);
832       #endif
833       return false;
834       break;
835     case WIN:
836       set_unicode_input_mode(UC_WINC);
837       #ifdef AUDIO_ENABLE
838         PLAY_NOTE_ARRAY(tone_windows, false, 0);
839       #endif
840       return false;
841       break;
842     case OSX:
843       set_unicode_input_mode(UC_OSX);
844       #ifdef AUDIO_ENABLE
845         PLAY_NOTE_ARRAY(tone_osx, false, 0);
846       #endif
847       return false;
848       break;
849
850     // faux clicky toggle, TBD
851     case AUDIO:
852       return false;
853       break;
854
855   }
856   return true;
857 }
858
859 void matrix_init_user(void) {
860   #ifdef AUDIO_ENABLE
861       startup_user();
862   #endif
863   set_unicode_input_mode(UC_LNX);
864 }
865
866 #ifdef AUDIO_ENABLE
867
868 void startup_user()
869 {
870     _delay_ms(20); // gets rid of tick
871     PLAY_NOTE_ARRAY(tone_startup, false, 0);
872 }
873
874 void shutdown_user()
875 {
876     PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
877     _delay_ms(150);
878     stop_all_notes();
879 }
880
881 #endif
882
883 void matrix_scan_user(void) {
884 }
885
886 void led_set_user(uint8_t usb_led) {
887 }
888
889 void turn_off_capslock() {
890   if (capslock) {
891     register_code(KC_CAPS);
892     unregister_code(KC_CAPS);
893   }
894 }