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