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