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