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