]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/planck/keymaps/priyadi/keymap.c
Add keycodes to turn on, turn off and toggle faux clicky
[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
14 // #define TOLELOT_ENABLE
15
16 extern keymap_config_t keymap_config;
17
18 enum layers {
19   _QWERTY,
20   _COLEMAK,
21   _WORKMAN,
22   _PUNC,
23   _NUM,
24   _FUNC,
25   _EMOJI,
26   _GREEKU,
27   _GREEKL,
28   _GUI,
29 };
30
31 enum planck_keycodes {
32   // layouts
33   QWERTY = SAFE_RANGE,
34   COLEMAK,
35   WORKMAN,
36
37   // layer switchers
38   PUNC,
39   NUM,
40   FUNC,
41   EMOJI,
42   GUI,
43   GREEK,
44
45   // os switchers
46   LINUX,
47   WIN,
48   OSX,
49 };
50
51 // Fillers to make layering clearer
52
53 #define _______ KC_TRNS
54 #define XXXXXXX KC_NO
55
56 // unicode map
57
58 enum unicode_name {
59   GRIN, // grinning face 😊
60   TJOY, // tears of joy 😂
61   SMILE, // grining face with smiling eyes 😁
62   HEART, // heart ❤
63   EYERT, // smiling face with heart shaped eyes 😍
64   CRY, // crying face 😭
65   SMEYE, // smiling face with smiling eyes 😊
66   UNAMU, // unamused 😒
67   KISS, // kiss 😘
68   HART2, // two hearts 💕
69   WEARY, // weary 😩
70   OKHND, // ok hand sign 👌
71   PENSV, // pensive 😔
72   SMIRK, // smirk 😏
73   RECYC, // recycle ♻
74   WINK, // wink 😉
75   THMUP, // thumb up 👍
76   THMDN, // thumb down 👎
77   PRAY, // pray 🙏
78   PHEW, // relieved 😌
79   MUSIC, // musical notes
80   FLUSH, // flushed 😳
81   CELEB, // celebration 🙌
82   CRY2, // crying face 😢
83   COOL, // smile with sunglasses 😎
84   NOEVS, // see no evil
85   NOEVH, // hear no evil
86   NOEVK, // speak no evil
87   POO, // pile of poo
88   EYES, // eyes
89   VIC, // victory hand
90   BHART, // broken heart
91   SLEEP, // sleeping face
92   SMIL2, // smiling face with open mouth & sweat
93   HUNRD, // 100
94   CONFU, // confused
95   TONGU, // face with tongue & winking eye
96   DISAP, // disappointed
97   YUMMY, // face savoring delicious food
98   CLAP, // hand clapping
99   FEAR, // face screaming in fear
100   HORNS, // smiling face with horns
101   HALO, // smiling face with halo
102   BYE, // waving hand
103   SUN, // sun
104   MOON, // moon
105   SKULL, // skull
106
107   // greek letters
108   UALPH,
109   UBETA,
110   UGAMM,
111   UDELT,
112   UEPSI,
113   UZETA,
114   UETA,
115   UTHET,
116   UIOTA,
117   UKAPP,
118   ULAMB,
119   UMU,
120   UNU,
121   UXI,
122   UOMIC,
123   UPI,
124   URHO,
125   USIGM,
126   UTAU,
127   UUPSI,
128   UPHI,
129   UCHI,
130   UPSI,
131   UOMEG,
132
133   LALPH,
134   LBETA,
135   LGAMM,
136   LDELT,
137   LEPSI,
138   LZETA,
139   LETA,
140   LTHET,
141   LIOTA,
142   LKAPP,
143   LLAMB,
144   LMU,
145   LNU,
146   LXI,
147   LOMIC,
148   LPI,
149   LRHO,
150   LSIGM,
151   LTAU,
152   LUPSI,
153   LPHI,
154   LCHI,
155   LPSI,
156   LOMEG,
157
158   FSIGM,
159 };
160
161 const uint32_t PROGMEM unicode_map[] = {
162   [GRIN] = 0x1F600,
163   [TJOY] = 0x1F602,
164   [SMILE] = 0x1F601,
165   [HEART] = 0x2764,
166   [EYERT] = 0x1f60d,
167   [CRY] = 0x1f62d,
168   [SMEYE] = 0x1F60A,
169   [UNAMU] = 0x1F612,
170   [KISS] = 0x1F618,
171   [HART2] = 0x1F495,
172   [WEARY] = 0x1F629,
173   [OKHND] = 0x1F44C,
174   [PENSV] = 0x1F614,
175   [SMIRK] = 0x1F60F,
176   [RECYC] = 0x267B,
177   [WINK] = 0x1F609,
178   [THMUP] = 0x1F44D,
179   [THMDN] = 0x1F44E,
180   [PRAY] = 0x1F64F,
181   [PHEW] = 0x1F60C,
182   [MUSIC] = 0x1F3B6,
183   [FLUSH] = 0x1F633,
184   [CELEB] = 0x1F64C,
185   [CRY2] = 0x1F622,
186   [COOL] = 0x1F60E,
187   [NOEVS] = 0x1F648,
188   [NOEVH] = 0x1F649,
189   [NOEVK] = 0x1F64A,
190   [POO] = 0x1F4A9,
191   [EYES] = 0x1F440,
192   [VIC] = 0x270C,
193   [BHART] = 0x1F494,
194   [SLEEP] = 0x1F634,
195   [SMIL2] = 0x1F605,
196   [HUNRD] = 0x1F4AF,
197   [CONFU] = 0x1F615,
198   [TONGU] = 0x1F61C,
199   [DISAP] = 0x1F61E,
200   [YUMMY] = 0x1F60B,
201   [CLAP] = 0x1F44F,
202   [FEAR] = 0x1F631,
203   [HORNS] = 0x1F608,
204   [HALO] = 0x1F607,
205   [BYE] = 0x1F44B,
206   [SUN] = 0x2600,
207   [MOON] = 0x1F314,
208   [SKULL] = 0x1F480,
209
210   // greek letters
211   [UALPH] = 0x0391,
212   [UBETA] = 0x0392,
213   [UGAMM] = 0x0393,
214   [UDELT] = 0x0394,
215   [UEPSI] = 0x0395,
216   [UZETA] = 0x0396,
217   [UETA] = 0x0397,
218   [UTHET] = 0x0398,
219   [UIOTA] = 0x0399,
220   [UKAPP] = 0x039A,
221   [ULAMB] = 0x039B,
222   [UMU] = 0x039C,
223   [UNU] = 0x039D,
224   [UXI] = 0x039E,
225   [UOMIC] = 0x039F,
226   [UPI] = 0x03A0,
227   [URHO] = 0x03A1,
228   [USIGM] = 0x03A3,
229   [UTAU] = 0x03A4,
230   [UUPSI] = 0x03A5,
231   [UPHI] = 0x03A6,
232   [UCHI] = 0x03A7,
233   [UPSI] = 0x03A8,
234   [UOMEG] = 0x03A9,
235   [LALPH] = 0x03B1,
236   [LBETA] = 0x03B2,
237   [LGAMM] = 0x03B3,
238   [LDELT] = 0x03B4,
239   [LEPSI] = 0x03B5,
240   [LZETA] = 0x03B6,
241   [LETA] = 0x03B7,
242   [LTHET] = 0x03B8,
243   [LIOTA] = 0x03B9,
244   [LKAPP] = 0x03BA,
245   [LLAMB] = 0x03BB,
246   [LMU] = 0x03BC,
247   [LNU] = 0x03BD,
248   [LXI] = 0x03BE,
249   [LOMIC] = 0x03BF,
250   [LPI] = 0x03C0,
251   [LRHO] = 0x03C1,
252   [LSIGM] = 0x03C3,
253   [LTAU] = 0x03C4,
254   [LUPSI] = 0x03C5,
255   [LPHI] = 0x03C6,
256   [LCHI] = 0x03C7,
257   [LPSI] = 0x03C8,
258   [LOMEG] = 0x03C9,
259   [FSIGM] = 0x03C2,
260 };
261
262
263 // hybrid shift - =
264 // #undef KC_LSFT
265 // #define KC_LSFT MT(MOD_LSFT, KC_MINS)
266 // #undef KC_RSFT
267 // #define KC_RSFT MT(MOD_LSFT, KC_EQL)
268
269
270 // hybrid right-gui & scroll lock (mapped to Compose in OS)
271 #undef KC_RALT
272 #define KC_RALT MT(MOD_RALT, KC_SLCK)
273
274 // keymaps
275
276 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
277
278 /* Qwerty
279  * ,-----------------------------------------------------------------------------------.
280  * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
281  * |------+------+------+------+------+-------------+------+------+------+------+------|
282  * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |Enter |
283  * |------+------+------+------+------+------|------+------+------+------+------+------|
284  * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Shift |
285  * |------+------+------+------+------+------+------+------+------+------+------+------|
286  * | Ctrl | GUI  | Alt  | Punc | Num  |    Space    | Func |Emoji |Greek |AltGr | Ctrl |
287  * `-----------------------------------------------------------------------------------'
288  */
289 [_QWERTY] = {
290   {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
291   {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_QUOT, KC_ENT },
292   {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT},
293   {KC_LCTL, KC_LALT, KC_LGUI, PUNC,    NUM,     KC_SPC,  KC_SPC,  FUNC,    EMOJI,   GREEK,   KC_RALT, KC_RCTL}
294 },
295
296 /* Colemak
297  * ,-----------------------------------------------------------------------------------.
298  * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
299  * |------+------+------+------+------+-------------+------+------+------+------+------|
300  * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |Enter |
301  * |------+------+------+------+------+------|------+------+------+------+------+------|
302  * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Shift |
303  * |------+------+------+------+------+------+------+------+------+------+------+------|
304  * | Ctrl | GUI  | Alt  | Punc | Num  |    Space    | Func |Emoji |AltGr | GUI  | Ctrl |
305  * `-----------------------------------------------------------------------------------'
306  */
307 [_COLEMAK] = {
308   {_______, KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_QUOT, _______},
309   {_______, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    _______},
310   {_______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______},
311   {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
312 },
313
314 /* Workman
315  * ,-----------------------------------------------------------------------------------.
316  * | Tab  |   Q  |   D  |   R  |   W  |   B  |   J  |   F  |   U  |   P  |   ;  | Bksp |
317  * |------+------+------+------+------+-------------+------+------+------+------+------|
318  * | Esc  |   A  |   S  |   H  |   T  |   G  |   Y  |   N  |   E  |   O  |   I  |Enter |
319  * |------+------+------+------+------+------|------+------+------+------+------+------|
320  * | Shift|   Z  |   X  |   M  |   C  |   V  |   K  |   K  |   ,  |   .  |   /  |Shift |
321  * |------+------+------+------+------+------+------+------+------+------+------+------|
322  * | Ctrl | GUI  | Alt  | Punc | Num  |    Space    | Func |Emoji |AltGr | GUI  | Ctrl |
323  * `-----------------------------------------------------------------------------------'
324  */
325 [_WORKMAN] = {
326   {_______, KC_Q,    KC_D,    KC_R,    KC_W,    KC_B,    KC_J,    KC_F,    KC_U,    KC_P,    KC_QUOT, _______},
327   {_______, KC_A,    KC_S,    KC_H,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_E,    KC_O,    KC_I,    _______},
328   {_______, KC_Z,    KC_X,    KC_M,    KC_C,    KC_V,    KC_K,    KC_L,    KC_COMM, KC_DOT,  KC_SLSH, _______},
329   {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
330 },
331
332 /* Uppercase Greek
333  * ,-----------------------------------------------------------------------------------.
334  * |      |      |      |      |      |      |      |      |      |      |      |      |
335  * |------+------+------+------+------+-------------+------+------+------+------+------|
336  * |      |      |      |      |      |      |      |      |      |      |      |      |
337  * |------+------+------+------+------+------+------+------+------+------+------+------|
338  * |      |      |      |      |      |      |      |      |      |      |      |      |
339  * |------+------+------+------+------+------+------+------+------+------+------+------|
340  * |      |      |      |      |      |      |      |      |      |      |      |      |
341  * `-----------------------------------------------------------------------------------'
342  */
343 [_GREEKU] = {
344   {_______, _______, _______,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC),  X(UPI), _______},
345   {_______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA),  X(UXI),X(UKAPP),X(ULAMB), _______, _______},
346   {_______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA),  X(UNU),  X(UMU), _______, _______, _______, _______},
347   {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
348 },
349
350 /* Lowercase Greek
351  * ,-----------------------------------------------------------------------------------.
352  * |      |      |      |      |      |      |      |      |      |      |      |      |
353  * |------+------+------+------+------+-------------+------+------+------+------+------|
354  * |      |      |      |      |      |      |      |      |      |      |      |      |
355  * |------+------+------+------+------+------+------+------+------+------+------+------|
356  * |      |      |      |      |      |      |      |      |      |      |      |      |
357  * |------+------+------+------+------+------+------+------+------+------+------+------|
358  * |      |      |      |      |      |      |      |      |      |      |      |      |
359  * `-----------------------------------------------------------------------------------'
360  */
361 [_GREEKL] = {
362   {_______, _______,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC),  X(LPI), _______},
363   {_______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA),  X(LXI),X(LKAPP),X(LLAMB), _______, _______},
364   {_______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA),  X(LNU),  X(LMU), _______, _______, _______, _______},
365   {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
366 },
367
368 /* Punc
369  * ,-----------------------------------------------------------------------------------.
370  * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  |   `  |
371  * |------+------+------+------+------+-------------+------+------+------+------+------|
372  * |      |      |   \  |   -  |   =  |   <  |   >  |   (  |   )  |   '  |      |      |
373  * |------+------+------+------+------+------|------+------+------+------+------+------|
374  * |      |      |   |  |   _  |   +  |   {  |   }  |   [  |   ]  |   "  |      |      |
375  * |------+------+------+------+------+------+------+------+------+------+------+------|
376  * |      |      |      |      |      |             |      |      |      |      |      |
377  * `-----------------------------------------------------------------------------------'
378  */
379 [_PUNC] = {
380   {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_GRV },
381   {XXXXXXX, XXXXXXX, KC_BSLS, KC_MINS,  KC_EQL, KC_LABK, KC_RABK, KC_LPRN, KC_RPRN, KC_QUOT, XXXXXXX, XXXXXXX},
382   {XXXXXXX, XXXXXXX, KC_PIPE, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_DQUO, XXXXXXX, XXXXXXX},
383   {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
384 },
385
386 /* Num
387  * ,-----------------------------------------------------------------------------------.
388  * |  ^   |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
389  * |------+------+------+------+------+-------------+------+------+------+------+------|
390  * | Esc  |  @   |  A   |  B   |  C   |  (   |  )   |   4  |   5  |   6  |   :  |Enter |
391  * |------+------+------+------+------+------|------+------+------+------+------+------|
392  * |  &   |  #   |  D   |  E   |  F   |  [   |  ]   |   1  |   2  |   3  |   /  |  *   |
393  * |------+------+------+------+------+------+------+------+------+------+------+------|
394  * |      |      |      |  x   |      |             |   0  |   ,  |   .  |   +  |  -   |
395  * `-----------------------------------------------------------------------------------'
396  */
397 [_NUM] = {
398   {KC_CIRC,    KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0, KC_BSPC},
399   { KC_ESC,   KC_AT, S(KC_A), S(KC_B), S(KC_C), KC_LPRN, KC_RPRN,    KC_4,    KC_5,    KC_6, KC_COLN,  KC_ENT},
400   {KC_AMPR, KC_HASH, S(KC_D), S(KC_E), S(KC_F), KC_LBRC, KC_RBRC,    KC_1,    KC_2,    KC_3, KC_SLSH, KC_ASTR},
401   {_______, _______, _______,    KC_X, _______,  KC_SPC,  KC_SPC,    KC_0, KC_COMM,  KC_DOT, KC_PLUS, KC_MINS}
402 },
403
404 /* Func
405  * ,-----------------------------------------------------------------------------------.
406  * |      |  F1  |  F2  |  F3  |  F4  |      |      | PgUp |  Up  | PgDn | PgUp | Del  |
407  * |------+------+------+------+------+-------------+------+------+------+------+------|
408  * |      |  F5  |  F6  |  F7  |  F8  |PrtSc |      | Left | Down | Right| PgDn | Ins  |
409  * |------+------+------+------+------+------|------+------+------+------+------+------|
410  * |      |  F9  |  F10 |  F11 |  F12 |      |      |      | Home |  End |      |      |
411  * |------+------+------+------+------+------+------+------+------+------+------+------|
412  * |      |      |      |      |      |             |      |      |      |      |      |
413  * `-----------------------------------------------------------------------------------'
414  */
415 [_FUNC] = {
416   {XXXXXXX,   KC_F1,   KC_F2,   KC_F3,   KC_F4, XXXXXXX, XXXXXXX, KC_PGUP,   KC_UP, KC_PGDN, KC_PGUP,  KC_DEL},
417   {XXXXXXX,   KC_F5,   KC_F6,   KC_F7,  KC_F8,KC_PSCREEN,XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN,  KC_INS},
418   {_______,   KC_F9,  KC_F10,  KC_F11,  KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME,  KC_END, XXXXXXX, _______},
419   {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
420 },
421
422 /* Emoji
423  * ,-----------------------------------------------------------------------------------.
424  * |      |      |      |      |      |      |      |      |      |      |      |      |
425  * |------+------+------+------+------+-------------+------+------+------+------+------|
426  * |      |      |      |      |      |      |      |      |      |      |      |      |
427  * |------+------+------+------+------+------+------+------+------+------+------+------|
428  * |      |      |      |      |      |      |      |      |      |      |      |      |
429  * |------+------+------+------+------+------+------+------+------+------+------+------|
430  * |      |      |      |      |      |      |      |      |      |      |      |      |
431  * `-----------------------------------------------------------------------------------'
432  */
433 [_EMOJI] = {
434   {X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW)},
435   {X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART),  X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS)},
436   {X(THMDN),X(SLEEP), X(CLAP),  X(CRY),  X(VIC),X(BHART),  X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH)},
437   {  X(POO), X(EYES),X(HUNRD), _______,X(SKULL),X(HORNS), X(HALO), X(FEAR), _______,X(YUMMY),X(DISAP),X(NOEVK)}
438 },
439
440 /* GUI
441  * ,-----------------------------------------------------------------------------------.
442  * |      |  D1  |  D2  |  D3  |  D4  |  D5  |  D6  |  D7  |  D8  |  D9  |  D10 |      |
443  * |------+------+------+------+------+-------------+------+------+------+------+------|
444  * |Linux |      | Vol- | Mute | Vol+ |      |      |  D-  |      |  D+  |      |Qwerty|
445  * |------+------+------+------+------+------+------+------+------+------+------+------|
446  * | Win  |      | Prev | Play | Next |      |      |      |      |      |      |Colmak|
447  * |------+------+------+------+------+------+------+------+------+------+------+------|
448  * | OSX  |      |      |      |      |  BL- |  BL+ |      |      |      |      |Workmn|
449  * `-----------------------------------------------------------------------------------'
450  */
451 [_GUI] = {
452   {_______, LGUI(KC_1),LGUI(KC_2),LGUI(KC_3),LGUI(KC_4),LGUI(KC_5),LGUI(KC_6),LGUI(KC_7),LGUI(KC_8),LGUI(KC_9),LGUI(KC_0), _______},
453   {  LINUX, _______, KC_VOLD, KC_MUTE, KC_VOLU,_______,_______,KC_WWW_BACK,_______,KC_WWW_FORWARD,_______, QWERTY},
454   {    WIN, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, _______, _______, _______, _______, COLEMAK},
455   {    OSX, _______, _______, _______, _______,  BL_DEC,  BL_INC, _______, _______, _______, _______, WORKMAN}
456 },
457
458 };
459
460 #ifdef AUDIO_ENABLE
461 float tone_startup[][2]    = SONG(STARTUP_SOUND);
462 float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
463 float tone_colemak[][2]    = SONG(COLEMAK_SOUND);
464 float tone_workman[][2]    = SONG(DVORAK_SOUND);
465 float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
466 float tone_linux[][2] = SONG(CAPS_LOCK_ON_SOUND);
467 float tone_windows[][2] = SONG(SCROLL_LOCK_ON_SOUND);
468 float tone_osx[][2] = SONG(NUM_LOCK_ON_SOUND);
469 float tone_click[][2] = SONG(MUSICAL_NOTE(_F3, 2));
470 float tone_release[][2] = SONG(MUSICAL_NOTE(_A3, 2));
471 float tone_tolelot[][2] = SONG(Q__NOTE(_E5), Q__NOTE(_C5), Q__NOTE(_D5));
472 #endif
473
474 void persistant_default_layer_set(uint16_t default_layer) {
475   eeconfig_update_default_layer(default_layer);
476   default_layer_set(default_layer);
477 }
478
479 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
480   // faux clicky
481   // if (record->event.pressed) PLAY_NOTE_ARRAY(tone_click, false, 0);
482   #ifdef AUDIO_ENABLE
483   #ifdef TOLELOT_ENABLE
484   if (record->event.pressed) {
485     PLAY_NOTE_ARRAY(tone_tolelot, false, 0);
486   }
487   #else
488   if (record->event.pressed) {
489     PLAY_NOTE_ARRAY(tone_click, false, 0);
490   } else {
491     PLAY_NOTE_ARRAY(tone_release, false, 0);
492   }
493   #endif
494   #endif
495
496   bool lshifted = keyboard_report->mods & MOD_BIT(KC_LSFT);
497   bool rshifted = keyboard_report->mods & MOD_BIT(KC_RSFT);
498
499   switch (keycode) {
500     // Greek layer handling
501     case GREEK:
502       if (record->event.pressed) {
503         if (lshifted || rshifted) {
504           layer_on(_GREEKU);
505           layer_off(_GREEKL);
506         } else {
507           layer_on(_GREEKL);
508           layer_off(_GREEKU);
509         }
510       } else {
511         layer_off(_GREEKU);
512         layer_off(_GREEKL);
513       }
514       return false;
515       break;
516
517     case KC_LSFT:
518     case KC_RSFT:
519       ;
520       uint8_t layer = biton32(layer_state);
521       if (layer == _GREEKU || layer == _GREEKL) {
522         if (record->event.pressed) {
523           layer_on(_GREEKU);
524           layer_off(_GREEKL);
525         } else {
526           if (lshifted ^ rshifted) { // if only one shift is pressed
527             layer_on(_GREEKL);
528             layer_off(_GREEKU);
529           }
530         }
531       }
532       return true;
533       break;
534
535     // QWERTZ style comma and dot: semicolon and colon when shifted
536     case KC_COMM:
537       if (record->event.pressed) {
538         if (lshifted || rshifted) {
539           if (lshifted) unregister_code(KC_LSFT);
540           if (rshifted) unregister_code(KC_RSFT);
541           register_code(KC_SCLN);
542           unregister_code(KC_SCLN);
543           if (lshifted) register_code(KC_LSFT);
544           if (rshifted) register_code(KC_RSFT);
545         } else {
546           register_code(KC_COMM);
547           unregister_code(KC_COMM);
548         }
549       }
550       return false;
551       break;
552     case KC_DOT:
553       if (record->event.pressed) {
554         if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
555           register_code(KC_SCLN);
556           unregister_code(KC_SCLN);
557         } else {
558           register_code(KC_DOT);
559           unregister_code(KC_DOT);
560         }
561       }
562       return false;
563       break;
564
565     // layout switcher
566     case QWERTY:
567       if (record->event.pressed) {
568         #ifdef AUDIO_ENABLE
569           PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
570         #endif
571         persistant_default_layer_set(1UL<<_QWERTY);
572       }
573       return false;
574       break;
575     case COLEMAK:
576       if (record->event.pressed) {
577         #ifdef AUDIO_ENABLE
578           PLAY_NOTE_ARRAY(tone_colemak, false, 0);
579         #endif
580         persistant_default_layer_set(1UL<<_COLEMAK);
581       }
582       return false;
583       break;
584     case WORKMAN:
585       if (record->event.pressed) {
586         #ifdef AUDIO_ENABLE
587           PLAY_NOTE_ARRAY(tone_workman, false, 0);
588         #endif
589         persistant_default_layer_set(1UL<<_WORKMAN);
590       }
591       return false;
592       break;
593
594     // layer switchers
595     case PUNC:
596       if (record->event.pressed) {
597         layer_on(_PUNC);
598         update_tri_layer(_PUNC, _EMOJI, _GUI);
599       } else {
600         layer_off(_PUNC);
601         update_tri_layer(_PUNC, _EMOJI, _GUI);
602       }
603       return false;
604       break;
605     case EMOJI:
606       if (record->event.pressed) {
607         layer_on(_EMOJI);
608         update_tri_layer(_PUNC, _EMOJI, _GUI);
609       } else {
610         layer_off(_EMOJI);
611         update_tri_layer(_PUNC, _EMOJI, _GUI);
612       }
613       return false;
614       break;
615     case NUM:
616       if (record->event.pressed) {
617         layer_on(_NUM);
618       } else {
619         layer_off(_NUM);
620       }
621       return false;
622       break;
623     case FUNC:
624       if (record->event.pressed) {
625         layer_on(_FUNC);
626       } else {
627         layer_off(_FUNC);
628       }
629       return false;
630       break;
631
632     // OS switchers
633     case LINUX:
634       set_unicode_input_mode(UC_LNX);
635       #ifdef AUDIO_ENABLE
636         PLAY_NOTE_ARRAY(tone_linux, false, 0);
637       #endif
638       return false;
639       break;
640     case WIN:
641       set_unicode_input_mode(UC_WINC);
642       #ifdef AUDIO_ENABLE
643         PLAY_NOTE_ARRAY(tone_windows, false, 0);
644       #endif
645       return false;
646       break;
647     case OSX:
648       set_unicode_input_mode(UC_OSX);
649       #ifdef AUDIO_ENABLE
650         PLAY_NOTE_ARRAY(tone_osx, false, 0);
651       #endif
652       return false;
653       break;
654   }
655   return true;
656 }
657
658 void matrix_init_user(void) {
659   #ifdef AUDIO_ENABLE
660       startup_user();
661   #endif
662   set_unicode_input_mode(UC_LNX);
663 }
664
665 #ifdef AUDIO_ENABLE
666
667 void startup_user()
668 {
669     _delay_ms(20); // gets rid of tick
670     PLAY_NOTE_ARRAY(tone_startup, false, 0);
671 }
672
673 void shutdown_user()
674 {
675     PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
676     _delay_ms(150);
677     stop_all_notes();
678 }
679
680 #endif