]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/handwired/promethium/keymaps/priyadi/keymap.c
Fix LED sequence; bug fixes
[qmk_firmware.git] / keyboards / handwired / promethium / keymaps / priyadi / keymap.c
1 /*
2 Copyright 2017 Priyadi Iman Nurcahyo
3
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 2 of the License, or
7 (at your option) any later version.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 GNU General Public License for more details.
12 You should have received a copy of the GNU General Public License
13 along with this program.  If not, see <http://www.gnu.org/licenses/>.
14 */
15
16 #if defined(PRIYADI_PROMETHIUM)
17   #include "promethium.h"
18 #elif defined(PRIYADI_PLANCK)
19   #include "planck.h"
20 #else
21   #error "no keyboard defined"
22 #endif
23
24 #include "action_layer.h"
25 #ifdef AUDIO_ENABLE
26   #include "audio.h"
27   #include "musical_notes.h"
28 #endif
29 #include "eeconfig.h"
30 #include "process_unicode.h"
31 #include "quantum.h"
32 #ifdef RGBSPS_ENABLE
33 #include "rgbsps.h"
34 #endif
35 #ifdef PS2_MOUSE_ENABLE
36 #include "ps2_mouse.h"
37 #include "ps2.h"
38 #endif
39 #ifdef FAUXCLICKY_ENABLE
40 #include "fauxclicky.h"
41 #ifdef RGBSPS_ENABLE
42 #undef FAUXCLICKY_OFF
43 #define FAUXCLICKY_OFF do { \
44     fauxclicky_enabled = false; \
45     rgbsps_set(LED_AUDIO, 0, 0, 0); \
46     fauxclicky_stop(); \
47 } while (0)
48 #undef FAUXCLICKY_ON
49 #define FAUXCLICKY_ON do { \
50     fauxclicky_enabled = true; \
51     rgbsps_set(LED_AUDIO, 8, 0, 8); \
52 } while (0)
53 #endif
54 #endif
55 #include "outputselect.h"
56 #include "led.h"
57 #define COUNT(x) (sizeof (x) / sizeof (*(x)))
58
59 // Fillers to make layering clearer
60 #define _______ KC_TRNS
61 #define XXXXXXX KC_NO
62 #define G(x) LGUI(x)
63 #define KC_WWWB KC_WWW_BACK
64 #define KC_WWWF KC_WWW_FORWARD
65
66 // hybrid right-alt & scroll lock (mapped to Compose in OS)
67 #define C_RALT MT(MOD_RALT, KC_SLCK)
68
69 // dual use right-shift & del key
70 // #define C_RSFT MT(MOD_RSFT, KC_DEL)
71
72 bool capslock = false;
73 #ifdef DOUBLESPACE_LAYER_ENABLE
74 bool lspace_active = false;
75 bool rspace_active = false;
76 bool lspace_emitted = false;
77 bool rspace_emitted = false;
78 bool space_layer_entered = false;
79 #endif
80
81 // glow
82 enum glow_modes {
83   GLOW_NONE,
84   GLOW_MIN,
85   GLOW_FULL
86 };
87 uint8_t glow_mode = GLOW_MIN;
88
89 void turn_off_capslock(void);
90 extern keymap_config_t keymap_config;
91
92 // layers, ordering is important!
93 enum layers {
94   _QWERTY,
95   _DVORAK,
96   _COLEMAK,
97   _WORKMAN,
98   _NORMAN,
99   _DEFAULT_LAYER_MAX = _NORMAN,
100
101   _GREEKU,
102   _GREEKL,
103
104   _NUM,
105   _FUN,
106   _PUNC,
107
108   _EMPTY,
109   _EMOJI,
110   _GUI,
111   _SYS
112 };
113
114 // double-space layer
115 #define _SPACE _GUI
116
117 enum planck_keycodes {
118   // layouts
119   QWERTY = SAFE_RANGE,
120   DVORAK,
121   COLEMAK,
122   WORKMAN,
123   NORMAN,
124
125   // layer switchers
126   EMOJI,
127   GUI,
128   GREEK,
129
130   // os switchers
131   LINUX,
132   WIN,
133   OSX,
134
135   // others
136   LSPACE,
137   RSPACE,
138   GLOW,
139
140   // stub
141 #ifndef FAUXCLICKY_ENABLE
142   FC_TOG,
143 #endif
144 #ifndef MODULE_ADAFRUIT_BLE
145   OUT_BT,
146 #endif
147   KEYCODE_END
148 };
149
150 #define EMPTY MO(_EMPTY)
151 #define NUM MO(_NUM)
152 #define FUN MO(_FUN)
153 #define FUN0 LT(_FUN, KC_0)
154
155 // unicode map
156
157 enum unicode_name {
158   GRIN, // grinning face 😊
159   TJOY, // tears of joy 😂
160   SMILE, // grining face with smiling eyes 😁
161   HEART, // heart ❤
162   EYERT, // smiling face with heart shaped eyes 😍
163   CRY, // crying face 😭
164   SMEYE, // smiling face with smiling eyes 😊
165   UNAMU, // unamused 😒
166   KISS, // kiss 😘
167   HART2, // two hearts 💕
168   WEARY, // weary 😩
169   OKHND, // ok hand sign 👌
170   PENSV, // pensive 😔
171   SMIRK, // smirk 😏
172   RECYC, // recycle ♻
173   WINK, // wink 😉
174   THMUP, // thumb up 👍
175   THMDN, // thumb down 👎
176   PRAY, // pray 🙏
177   PHEW, // relieved 😌
178   MUSIC, // musical notes
179   FLUSH, // flushed 😳
180   CELEB, // celebration 🙌
181   CRY2, // crying face 😢
182   COOL, // smile with sunglasses 😎
183   NOEVS, // see no evil
184   NOEVH, // hear no evil
185   NOEVK, // speak no evil
186   POO, // pile of poo
187   EYES, // eyes
188   VIC, // victory hand
189   BHART, // broken heart
190   SLEEP, // sleeping face
191   SMIL2, // smiling face with open mouth & sweat
192   HUNRD, // 100
193   CONFU, // confused
194   TONGU, // face with tongue & winking eye
195   DISAP, // disappointed
196   YUMMY, // face savoring delicious food
197   CLAP, // hand clapping
198   FEAR, // face screaming in fear
199   HORNS, // smiling face with horns
200   HALO, // smiling face with halo
201   BYE, // waving hand
202   SUN, // sun
203   MOON, // moon
204   SKULL, // skull
205
206   // greek letters
207   UALPH,
208   UBETA,
209   UGAMM,
210   UDELT,
211   UEPSI,
212   UZETA,
213   UETA,
214   UTHET,
215   UIOTA,
216   UKAPP,
217   ULAMB,
218   UMU,
219   UNU,
220   UXI,
221   UOMIC,
222   UPI,
223   URHO,
224   USIGM,
225   UTAU,
226   UUPSI,
227   UPHI,
228   UCHI,
229   UPSI,
230   UOMEG,
231
232   LALPH,
233   LBETA,
234   LGAMM,
235   LDELT,
236   LEPSI,
237   LZETA,
238   LETA,
239   LTHET,
240   LIOTA,
241   LKAPP,
242   LLAMB,
243   LMU,
244   LNU,
245   LXI,
246   LOMIC,
247   LPI,
248   LRHO,
249   LSIGM,
250   LTAU,
251   LUPSI,
252   LPHI,
253   LCHI,
254   LPSI,
255   LOMEG,
256
257   FSIGM,
258
259   LTEQ,
260   GTEQ,
261   NOTEQ,
262   PLMIN,
263 };
264
265 const uint32_t PROGMEM unicode_map[] = {
266   [GRIN] = 0x1F600,
267   [TJOY] = 0x1F602,
268   [SMILE] = 0x1F601,
269   [HEART] = 0x2764,
270   [EYERT] = 0x1f60d,
271   [CRY] = 0x1f62d,
272   [SMEYE] = 0x1F60A,
273   [UNAMU] = 0x1F612,
274   [KISS] = 0x1F618,
275   [HART2] = 0x1F495,
276   [WEARY] = 0x1F629,
277   [OKHND] = 0x1F44C,
278   [PENSV] = 0x1F614,
279   [SMIRK] = 0x1F60F,
280   [RECYC] = 0x267B,
281   [WINK] = 0x1F609,
282   [THMUP] = 0x1F44D,
283   [THMDN] = 0x1F44E,
284   [PRAY] = 0x1F64F,
285   [PHEW] = 0x1F60C,
286   [MUSIC] = 0x1F3B6,
287   [FLUSH] = 0x1F633,
288   [CELEB] = 0x1F64C,
289   [CRY2] = 0x1F622,
290   [COOL] = 0x1F60E,
291   [NOEVS] = 0x1F648,
292   [NOEVH] = 0x1F649,
293   [NOEVK] = 0x1F64A,
294   [POO] = 0x1F4A9,
295   [EYES] = 0x1F440,
296   [VIC] = 0x270C,
297   [BHART] = 0x1F494,
298   [SLEEP] = 0x1F634,
299   [SMIL2] = 0x1F605,
300   [HUNRD] = 0x1F4AF,
301   [CONFU] = 0x1F615,
302   [TONGU] = 0x1F61C,
303   [DISAP] = 0x1F61E,
304   [YUMMY] = 0x1F60B,
305   [CLAP] = 0x1F44F,
306   [FEAR] = 0x1F631,
307   [HORNS] = 0x1F608,
308   [HALO] = 0x1F607,
309   [BYE] = 0x1F44B,
310   [SUN] = 0x2600,
311   [MOON] = 0x1F314,
312   [SKULL] = 0x1F480,
313
314   // greek letters
315   [UALPH] = 0x0391,
316   [UBETA] = 0x0392,
317   [UGAMM] = 0x0393,
318   [UDELT] = 0x0394,
319   [UEPSI] = 0x0395,
320   [UZETA] = 0x0396,
321   [UETA] = 0x0397,
322   [UTHET] = 0x0398,
323   [UIOTA] = 0x0399,
324   [UKAPP] = 0x039A,
325   [ULAMB] = 0x039B,
326   [UMU] = 0x039C,
327   [UNU] = 0x039D,
328   [UXI] = 0x039E,
329   [UOMIC] = 0x039F,
330   [UPI] = 0x03A0,
331   [URHO] = 0x03A1,
332   [USIGM] = 0x03A3,
333   [UTAU] = 0x03A4,
334   [UUPSI] = 0x03A5,
335   [UPHI] = 0x03A6,
336   [UCHI] = 0x03A7,
337   [UPSI] = 0x03A8,
338   [UOMEG] = 0x03A9,
339   [LALPH] = 0x03B1,
340   [LBETA] = 0x03B2,
341   [LGAMM] = 0x03B3,
342   [LDELT] = 0x03B4,
343   [LEPSI] = 0x03B5,
344   [LZETA] = 0x03B6,
345   [LETA] = 0x03B7,
346   [LTHET] = 0x03B8,
347   [LIOTA] = 0x03B9,
348   [LKAPP] = 0x03BA,
349   [LLAMB] = 0x03BB,
350   [LMU] = 0x03BC,
351   [LNU] = 0x03BD,
352   [LXI] = 0x03BE,
353   [LOMIC] = 0x03BF,
354   [LPI] = 0x03C0,
355   [LRHO] = 0x03C1,
356   [LSIGM] = 0x03C3,
357   [LTAU] = 0x03C4,
358   [LUPSI] = 0x03C5,
359   [LPHI] = 0x03C6,
360   [LCHI] = 0x03C7,
361   [LPSI] = 0x03C8,
362   [LOMEG] = 0x03C9,
363   [FSIGM] = 0x03C2,
364
365   // other
366   [LTEQ] = 0x2264, // less than or equal
367   [GTEQ] = 0x2265, // greater than or equal
368   [NOTEQ] = 0x2260, // not equal
369   [PLMIN] = 0xB1, // plus minus
370 };
371
372 // RGBSPS
373
374 #ifdef RGBSPS_ENABLE
375 const uint8_t PROGMEM LED_ALNUM[] = {
376   LED_Z,
377   LED_A,
378   LED_Q,
379   LED_W,
380   LED_S,
381   LED_X,
382   LED_C,
383   LED_D,
384   LED_E,
385   LED_R,
386   LED_F,
387   LED_V,
388   LED_B,
389   LED_G,
390   LED_T,
391   LED_N,
392   LED_HH,
393   LED_Y,
394   LED_U,
395   LED_J,
396   LED_M,
397   LED_COMM,
398   LED_K,
399   LED_I,
400   LED_O,
401   LED_L,
402   LED_DOT,
403   LED_SLSH,
404   LED_SCLN,
405   LED_P,
406   LED_LSPC,
407   LED_RSPC
408 };
409
410 const uint8_t PROGMEM LED_HOMING[] = {
411   LED_A,
412   LED_S,
413   LED_D,
414   LED_F,
415   LED_J,
416   LED_K,
417   LED_L,
418   LED_SCLN
419 };
420
421 const uint8_t PROGMEM LED_MODS[] = {
422   LED_TAB,
423   LED_ESC,
424   LED_LSFT,
425   LED_LCTL,
426   LED_LGUI,
427   LED_LALT,
428   LED_RALT,
429   LED_RGUI,
430   LED_BKSP,
431   LED_ENT,
432   LED_RSFT,
433   LED_RCTL
434 };
435
436 const uint8_t PROGMEM LED_FN[] = {
437   LED_EMPTY,
438   LED_NUM,
439   LED_FUN,
440   LED_GREEK
441 };
442
443 const uint8_t PROGMEM LED_INDICATORS[] = {
444   LED_IND_LINUX,
445   LED_IND_APPLE,
446   LED_IND_WINDOWS,
447   LED_IND_QWERTY,
448   LED_IND_ALT,
449   LED_IND_AUDIO,
450   LED_IND_BLUETOOTH,
451   LED_IND_USB,
452
453   LED_IND_BATTERY,
454   LED_IND_CAPSLOCK,
455   LED_IND_GUI,
456   LED_IND_FUN,
457   LED_IND_NUM,
458   LED_IND_PUNC,
459   LED_IND_EMOJI,
460   LED_IND_GREEK,
461 };
462
463 const uint8_t PROGMEM LED_TRACKPOINT[] = {
464   LED_TRACKPOINT1,
465   LED_TRACKPOINT2,
466   LED_TRACKPOINT3,
467 };
468
469 void led_turnoff_keys(void) {
470   for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
471     rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 0, 0, 0);
472   }
473   for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
474     rgbsps_set(pgm_read_byte(&LED_MODS[i]), 0, 0, 0);
475   }
476   for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
477     rgbsps_set(pgm_read_byte(&LED_FN[i]), 0, 0, 0);
478   }
479 }
480
481 void led_reset(void) {
482   switch (glow_mode) {
483     case GLOW_NONE:
484       led_turnoff_keys();
485       break;
486     case GLOW_MIN:
487       led_turnoff_keys();
488       for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
489         rgbsps_set(pgm_read_byte(&LED_HOMING[i]), 8, 8, 8);
490       }
491       rgbsps_set(LED_F, 15, 0, 0);
492       rgbsps_set(LED_J, 15, 0, 0);
493       break;
494     case GLOW_FULL:
495       for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
496         rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 8, 8, 8);
497       }
498       for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
499         rgbsps_set(pgm_read_byte(&LED_MODS[i]), 0, 15, 0);
500       }
501       for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
502         rgbsps_set(pgm_read_byte(&LED_FN[i]), 0, 0, 15);
503       }
504       for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
505         rgbsps_set(pgm_read_byte(&LED_HOMING[i]), 15, 0, 0);
506       }
507       rgbsps_set(LED_F, 15, 15, 0);
508       rgbsps_set(LED_J, 15, 15, 0);
509       break;
510   }
511 }
512
513 void led_set_default_layer_indicator(void) {
514   uint8_t default_layer = biton32(default_layer_state);
515   if (default_layer == _QWERTY) {
516     rgbsps_set(LED_IND_QWERTY, 15, 10, 0);
517     rgbsps_set(LED_IND_ALT, 0, 0, 0);
518   } else {
519     rgbsps_set(LED_IND_QWERTY, 0, 0, 0);
520     rgbsps_set(LED_IND_ALT, 15, 10, 0);
521   }
522   rgbsps_send();
523   return;
524 }
525
526 void led_set_layer_indicator(void) {
527   static uint8_t oldlayer = 255;
528
529   led_reset();
530
531   rgbsps_set(LED_IND_GUI, 0, 0, 0);
532   rgbsps_set(LED_IND_FUN, 0, 0, 0);
533   rgbsps_set(LED_IND_NUM, 0, 0, 0);
534   rgbsps_set(LED_IND_PUNC, 0, 0, 0);
535   rgbsps_set(LED_IND_GREEK, 0, 0, 0);
536   rgbsps_set(LED_IND_EMOJI, 0, 0, 0);
537
538   uint8_t layer = biton32(layer_state);
539   if (oldlayer == layer) {
540     return;
541   }
542
543   oldlayer = layer;
544
545   if (layer <= _DEFAULT_LAYER_MAX) {
546     rgbsps_send();
547     return;
548   }
549
550   switch(layer) {
551     case _GUI:
552       rgbsps_set(LED_IND_GUI, 15, 0, 15);
553       break;
554     case _FUN:
555       rgbsps_set(LED_IND_FUN, 15, 0, 0);
556       break;
557     case _NUM:
558       rgbsps_set(LED_IND_NUM, 0, 0, 15);
559       break;
560     case _PUNC:
561       rgbsps_set(LED_IND_PUNC, 0, 15, 0);
562       break;
563     case _GREEKL:
564     case _GREEKU:
565       rgbsps_set(LED_IND_GREEK, 0, 15, 15);
566       break;
567     case _EMOJI:
568       rgbsps_set(LED_IND_EMOJI, 15, 15, 0);
569       break;
570     default:
571       rgbsps_set(LED_IND_GUI, 3, 3, 3);
572       rgbsps_set(LED_IND_FUN, 3, 3, 3);
573       rgbsps_set(LED_IND_NUM, 3, 3, 3);
574       rgbsps_set(LED_IND_PUNC, 3, 3, 3);
575       rgbsps_set(LED_IND_GREEK, 3, 3, 3);
576       rgbsps_set(LED_IND_EMOJI, 3, 3, 3);
577   }
578
579   rgbsps_send();
580 }
581
582 void led_set_unicode_input_mode(void) {
583   rgbsps_set(LED_IND_LINUX, 0, 0, 0);
584   rgbsps_set(LED_IND_APPLE, 0, 0, 0);
585   rgbsps_set(LED_IND_WINDOWS, 0, 0, 0);
586
587   switch (get_unicode_input_mode()) {
588     case UC_LNX:
589       rgbsps_set(LED_IND_LINUX, 15, 15, 15);
590       break;
591     case UC_OSX:
592       rgbsps_set(LED_IND_APPLE, 15, 15, 15);
593       break;
594     case UC_WIN:
595     case UC_WINC:
596       rgbsps_set(LED_IND_WINDOWS, 15, 15, 15);
597       break;
598   }
599   rgbsps_send();
600 }
601
602 void led_set_output_ble(void) {
603   rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 15);
604   rgbsps_set(LED_IND_USB, 0, 0, 0);
605   rgbsps_send();
606 }
607
608 void led_set_output_usb(void) {
609   rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0);
610   rgbsps_set(LED_IND_USB, 15, 15, 15);
611   rgbsps_send();
612 }
613
614 void led_set_output_none(void) {
615   rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0);
616   rgbsps_set(LED_IND_USB, 0, 0, 0);
617   rgbsps_send();
618 }
619
620 void led_init(void) {
621   // turn off all
622   rgbsps_turnoff();
623
624   // set trackpoint color
625   rgbsps_set(LED_TRACKPOINT1, 15, 0, 0);
626   rgbsps_set(LED_TRACKPOINT2, 0, 0, 15);
627   rgbsps_set(LED_TRACKPOINT3, 15, 0, 0);
628
629   // unicode input mode
630   led_set_unicode_input_mode();
631
632   // layer indicator
633   led_set_layer_indicator();
634   led_set_default_layer_indicator();
635
636   // clicky
637   if (fauxclicky_enabled) {
638     rgbsps_set(LED_IND_AUDIO, 5, 11, 13);
639   } else {
640     rgbsps_set(LED_IND_AUDIO, 0, 0, 0);
641   }
642   rgbsps_send();
643 }
644
645
646 #endif // RGBSPS_ENABLE
647
648 // keymaps
649
650 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
651
652 /* Qwerty
653  * ,-----------------------------------------------------------------------------------.
654  * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
655  * |------+------+------+------+------+-------------+------+------+------+------+------|
656  * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   '  |Enter |
657  * |------+------+------+------+------+------|------+------+------+------+------+------|
658  * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Shift |
659  * |------+------+------+------+------+------+------+------+------+------+------+------|
660  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Fun  |Greek | GUI  |AltGr | Ctrl |
661  * `-----------------------------------------------------------------------------------'
662  */
663 [_QWERTY] = KEYMAP(
664   KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC,
665   KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_QUOT, KC_ENT ,
666   KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,
667   KC_LCTL, KC_LALT, KC_LGUI, EMPTY,   NUM,     LSPACE,  RSPACE,  FUN,     GREEK,   KC_RGUI, C_RALT,  KC_RCTL,
668                                            _______, _______, _______
669 ),
670
671 /* Dvorak
672  * ,-----------------------------------------------------------------------------------.
673  * | Tab  |   '  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp |
674  * |------+------+------+------+------+-------------+------+------+------+------+------|
675  * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |Enter |
676  * |------+------+------+------+------+------|------+------+------+------+------+------|
677  * | Shift|   /  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Shift |
678  * |------+------+------+------+------+------+------+------+------+------+------+------|
679  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
680  * `-----------------------------------------------------------------------------------'
681  */
682 #ifdef LAYOUT_DVORAK
683 [_DVORAK] = KEYMAP(
684   _______, KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    _______,
685   _______, KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    _______,
686   _______, KC_SLSH, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    _______,
687   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
688                                            _______, _______, _______
689 ),
690 #endif
691
692 /* Colemak
693  * ,-----------------------------------------------------------------------------------.
694  * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
695  * |------+------+------+------+------+-------------+------+------+------+------+------|
696  * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |Enter |
697  * |------+------+------+------+------+------|------+------+------+------+------+------|
698  * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Shift |
699  * |------+------+------+------+------+------+------+------+------+------+------+------|
700  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
701  * `-----------------------------------------------------------------------------------'
702  */
703
704 #ifdef LAYOUT_COLEMAK
705 [_COLEMAK] = KEYMAP(
706   _______, KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_QUOT, _______,
707   _______, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    _______,
708   _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
709   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
710                                            _______, _______, _______
711 ),
712 #endif
713
714 /* Norman
715  * ,-----------------------------------------------------------------------------------.
716  * | Tab  |   Q  |   W  |   D  |   F  |   K  |   J  |   U  |   R  |   L  |   ;  | Bksp |
717  * |------+------+------+------+------+-------------+------+------+------+------+------|
718  * | Esc  |   A  |   S  |   E  |   T  |   G  |   Y  |   N  |   I  |   O  |   H  |Enter |
719  * |------+------+------+------+------+------|------+------+------+------+------+------|
720  * | Shift|   Z  |   X  |   C  |   V  |   B  |   P  |   M  |   ,  |   .  |   /  |Shift |
721  * |------+------+------+------+------+------+------+------+------+------+------+------|
722  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
723  * `-----------------------------------------------------------------------------------'
724  */
725
726 #ifdef LAYOUT_NORMAN
727 [_NORMAN] = KEYMAP(
728   _______, KC_Q,    KC_W,    KC_D,    KC_F,    KC_K,    KC_J,    KC_U,    KC_R,    KC_L,    KC_QUOT, _______,
729   _______, KC_A,    KC_S,    KC_E,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_I,    KC_O,    KC_H,    _______,
730   _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_P,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
731   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
732                                            _______, _______, _______
733 ),
734 #endif
735
736 /* Workman
737  * ,-----------------------------------------------------------------------------------.
738  * | Tab  |   Q  |   D  |   R  |   W  |   B  |   J  |   F  |   U  |   P  |   ;  | Bksp |
739  * |------+------+------+------+------+-------------+------+------+------+------+------|
740  * | Esc  |   A  |   S  |   H  |   T  |   G  |   Y  |   N  |   E  |   O  |   I  |Enter |
741  * |------+------+------+------+------+------|------+------+------+------+------+------|
742  * | Shift|   Z  |   X  |   M  |   C  |   V  |   K  |   K  |   ,  |   .  |   /  |Shift |
743  * |------+------+------+------+------+------+------+------+------+------+------+------|
744  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
745  * `-----------------------------------------------------------------------------------'
746  */
747
748 #ifdef LAYOUT_WORKMAN
749 [_WORKMAN] = KEYMAP(
750   _______, KC_Q,    KC_D,    KC_R,    KC_W,    KC_B,    KC_J,    KC_F,    KC_U,    KC_P,    KC_QUOT, _______,
751   _______, KC_A,    KC_S,    KC_H,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_E,    KC_O,    KC_I,    _______,
752   _______, KC_Z,    KC_X,    KC_M,    KC_C,    KC_V,    KC_K,    KC_L,    KC_COMM, KC_DOT,  KC_SLSH, _______,
753   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
754                                            _______, _______, _______
755 ),
756 #endif
757
758 /* Punc
759  * ,-----------------------------------------------------------------------------------.
760  * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   ≤  |   ≥  |   `  |
761  * |------+------+------+------+------+-------------+------+------+------+------+------|
762  * |      |   *  |   \  |   -  |   =  |   /  |   ≠  |   (  |   )  |   <  |   >  |      |
763  * |------+------+------+------+------+------|------+------+------+------+------+------|
764  * |   &  |   ^  |   |  |   _  |   +  |   ?  |   ±  |   [  |   ]  |   {  |   }  |      |
765  * |------+------+------+------+------+------+------+------+------+------+------+------|
766  * |      |      |      |      |      |             |      |      |      |   :  |      |
767  * `-----------------------------------------------------------------------------------'
768  */
769 [_PUNC] = KEYMAP(
770   KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, X(LTEQ), X(GTEQ), _______,
771   KC_GRV,  KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, X(NOTEQ),KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
772   KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, X(PLMIN),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______,
773   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______,
774                                            _______, _______, _______
775 ),
776
777 /* Num
778  * ,-----------------------------------------------------------------------------------.
779  * |   ~  |   !  |   @  |   #  |   $  |   %  |   A  |   7  |   8  |   9  |   D  |      |
780  * |------+------+------+------+------+-------------+------+------+------+------+------|
781  * |   `  |   *  |   \  |   -  |   =  |   /  |   B  |   4  |   5  |   6  |   E  |      |
782  * |------+------+------+------+------+------|------+------+------+------+------+------|
783  * |   &  |   ^  |   |  |   _  |   +  |   ?  |   C  |   1  |   2  |   3  |   F  |      |
784  * |------+------+------+------+------+------+------+------+------+------+------+------|
785  * |      |      |   x  |      |      |      |      |   0  |   ,  |   .  |   :  |      |
786  * `-----------------------------------------------------------------------------------'
787  */
788 [_NUM] = KEYMAP(
789   KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, S(KC_A),  KC_1,    KC_2,    KC_3,   S(KC_D), _______,
790   KC_GRV,  KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, S(KC_B),  KC_4,    KC_5,    KC_6,   S(KC_E), _______,
791   KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C),  KC_7,    KC_8,    KC_9,   S(KC_F), _______,
792   _______, _______, KC_X,    _______, _______, _______, _______,  FUN0 ,   KC_COMM, KC_DOT, KC_COLN, _______,
793                                            _______, _______, _______
794 ),
795
796 /* Func
797  * ,-----------------------------------------------------------------------------------.
798  * |      |  F1  |  F2  |  F3  |  F4  | Ins  |      | PgUp |  Up  | PgDn | PgUp |      |
799  * |------+------+------+------+------+-------------+------+------+------+------+------|
800  * | Caps |  F5  |  F6  |  F7  |  F8  |PrtSc |      | Left | Down | Right| PgDn |      |
801  * |------+------+------+------+------+------|------+------+------+------+------+------|
802  * |      |  F9  |  F10 |  F11 |  F12 |Pause |      |      | Home |  End |      |      |
803  * |------+------+------+------+------+------+------+------+------+------+------+------|
804  * |      |      |      |      |      |             |      |      |      |      |      |
805  * `-----------------------------------------------------------------------------------'
806  */
807 [_FUN] = KEYMAP(
808   XXXXXXX,   KC_F1,   KC_F2,   KC_F3,  KC_F4,   KC_INS,  XXXXXXX, KC_PGUP,   KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
809   KC_CAPS,   KC_F5,   KC_F6,   KC_F7,  KC_F8,   KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
810   _______,   KC_F9,  KC_F10,  KC_F11,  KC_F12,  KC_PAUS, XXXXXXX, XXXXXXX, KC_HOME,  KC_END, XXXXXXX, _______,
811   _______, _______, _______, _______,  _______, _______, _______, _______, _______, _______, _______, _______,
812                                            _______, _______, _______
813 ),
814
815 /* Uppercase Greek
816  * ,-----------------------------------------------------------------------------------.
817  * |      |      |      |      |      |      |      |      |      |      |      |      |
818  * |------+------+------+------+------+-------------+------+------+------+------+------|
819  * |      |      |      |      |      |      |      |      |      |      |      |      |
820  * |------+------+------+------+------+------+------+------+------+------+------+------|
821  * |      |      |      |      |      |      |      |      |      |      |      |      |
822  * |------+------+------+------+------+------+------+------+------+------+------+------|
823  * |      |      |      |      |      |      |      |      |      |      |      |      |
824  * `-----------------------------------------------------------------------------------'
825  */
826 [_GREEKU] = KEYMAP(
827   _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC),  X(UPI), _______,
828   _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA),  X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
829   _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA),  X(UNU),  X(UMU), KC_COMM, KC_DOT,  KC_SLSH, _______,
830   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
831                                            _______, _______, _______
832 ),
833
834 /* Lowercase Greek
835  * ,-----------------------------------------------------------------------------------.
836  * |      |      |      |      |      |      |      |      |      |      |      |      |
837  * |------+------+------+------+------+-------------+------+------+------+------+------|
838  * |      |      |      |      |      |      |      |      |      |      |      |      |
839  * |------+------+------+------+------+------+------+------+------+------+------+------|
840  * |      |      |      |      |      |      |      |      |      |      |      |      |
841  * |------+------+------+------+------+------+------+------+------+------+------+------|
842  * |      |      |      |      |      |      |      |      |      |      |      |      |
843  * `-----------------------------------------------------------------------------------'
844  */
845 [_GREEKL] = KEYMAP(
846   _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC),  X(LPI), _______,
847   _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA),  X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
848   _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA),  X(LNU),  X(LMU), KC_COMM, KC_DOT,  KC_SLSH, _______,
849   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
850                                            _______, _______, _______
851 ),
852
853 /* Empty
854  * ,-----------------------------------------------------------------------------------.
855  * |      |      |      |      |      |      |      |      |      |      |      |      |
856  * |------+------+------+------+------+-------------+------+------+------+------+------|
857  * |      |      |      |      |      |      |      |      |      |      |      |      |
858  * |------+------+------+------+------+------+------+------+------+------+------+------|
859  * |      |      |      |      |      |      |      |      |      |      |      |      |
860  * |------+------+------+------+------+------+------+------+------+------+------+------|
861  * |      |      |      |      |      |      |      |      |      |      |      |      |
862  * `-----------------------------------------------------------------------------------'
863  */
864 [_EMPTY] = KEYMAP(
865   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
866   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
867   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
868   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
869                                            _______, _______, _______
870 ),
871
872 /* Emoji
873  * ,-----------------------------------------------------------------------------------.
874  * |      |      |      |      |      |      |      |      |      |      |      |      |
875  * |------+------+------+------+------+-------------+------+------+------+------+------|
876  * |      |      |      |      |      |      |      |      |      |      |      |      |
877  * |------+------+------+------+------+------+------+------+------+------+------+------|
878  * |      |      |      |      |      |      |      |      |      |      |      |      |
879  * |------+------+------+------+------+------+------+------+------+------+------+------|
880  * |      |      |      |      |      |      |      |      |      |      |      |      |
881  * `-----------------------------------------------------------------------------------'
882  */
883 [_EMOJI] = KEYMAP(
884   X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
885   X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART),  X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
886   X(THMDN),X(SLEEP), X(CLAP),  X(CRY),  X(VIC),X(BHART),  X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
887     X(POO), X(EYES), X(HUNRD),_______, X(SKULL),X(HORNS), X(HALO), X(FEAR),_______,X(YUMMY),X(DISAP),X(NOEVK),
888                                            _______, _______, _______
889 ),
890
891 /* GUI
892  * ,-----------------------------------------------------------------------------------.
893  * |      |  D1  |  D2  |  D3  |  D4  |  D5  |  D6  |  D7  |  D8  |  D9  |  D10 |      |
894  * |------+------+------+------+------+-------------+------+------+------+------+------|
895  * | Esc  |      | Btab | Esc  | Tab  |      |      | Prev |      | Next |      |      |
896  * |------+------+------+------+------+------+------+------+------+------+------+------|
897  * |      |      | Prev | Play | Next |      |      |      |      |      |      |      |
898  * |------+------+------+------+------+------+------+------+------+------+------+------|
899  * |      |      |      |      |      |      |      |      |      |      |      |      |
900  * `-----------------------------------------------------------------------------------'
901  */
902 [_GUI] = KEYMAP(
903   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,
904   KC_ESC,  XXXXXXX, S(KC_TAB),KC_ESC, KC_TAB,  XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
905   XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, KC_SPC,  KC_SPC,  KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
906   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
907                                            _______, _______, _______
908 ),
909
910 /* Sys
911  * ,-----------------------------------------------------------------------------------.
912  * |      |Qwerty| Win  |      |Reset |      |      | USB  |      |      |      |      |
913  * |------+------+------+------+------+-------------+------+------+------+------+------|
914  * |      |Audio |      |Dvorak|      | Glow |      |      |WorkMn|Linux |      |      |
915  * |------+------+------+------+------+------+------+------+------+------+------+------|
916  * |      |      |      |Colmak|      | BLE  |Norman|MacOS |      |      |      |      |
917  * |------+------+------+------+------+------+------+------+------+------+------+------|
918  * |      |      |      |      |      |      |      |      |      |      |      |      |
919  * `-----------------------------------------------------------------------------------'
920  */
921 [_SYS] = KEYMAP(
922   DEBUG,   QWERTY,  WIN,     XXXXXXX, RESET,   XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
923   XXXXXXX, FC_TOG,  XXXXXXX, DVORAK,  XXXXXXX, GLOW,    XXXXXXX, XXXXXXX, WORKMAN, LINUX,   XXXXXXX, XXXXXXX,
924   XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BT,  NORMAN,  OSX,     XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
925   _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
926                                            _______, _______, _______
927 ),
928
929
930 };
931
932 void persistant_default_layer_set(uint16_t default_layer) {
933   eeconfig_update_default_layer(default_layer);
934   default_layer_set(default_layer);
935 #ifdef RGBSPS_ENABLE
936   led_set_default_layer_indicator();
937 #endif
938 }
939
940 #ifdef DOUBLESPACE_LAYER_ENABLE
941 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
942   if (pressed) {
943     *isactive = true;
944     if (*otheractive) {
945       layer_on(_SPACE);
946       register_code(KC_LALT);  // sends alt and enter layer
947       space_layer_entered = true;
948     }
949   } else {
950     *isactive = false;
951     if (space_layer_entered) {
952       unregister_code(KC_LALT);  // release alt and exit layer
953       layer_off(_SPACE);
954       if (!*otheractive) {
955         space_layer_entered = false;
956       }
957     } else {
958       if (!*isemitted) {
959         register_code(KC_SPC);
960         unregister_code(KC_SPC);
961       }
962       *isemitted = false;
963     }
964   }
965 }
966 #endif
967
968 uint32_t layer_state_set_kb(uint32_t state)
969 {
970   // turn on punc layer if both fun & num are on
971   if ((state & ((1UL<<_NUM) | (1UL<<_FUN))) == ((1UL<<_NUM) | (1UL<<_FUN))) {
972     state |= (1UL<<_PUNC);
973   } else {
974     state &= ~(1UL<<_PUNC);
975   }
976
977   // turn on emoji layer if empty and greek layer are on
978   if (
979     (state & ((1UL<<_EMPTY) | (1UL<<_GREEKU))) == ((1UL<<_EMPTY) | (1UL<<_GREEKU))
980     || (state & ((1UL<<_EMPTY) | (1UL<<_GREEKL))) == ((1UL<<_EMPTY) | (1UL<<_GREEKL))
981   ) {
982     state |= (1UL<<_EMOJI);
983   } else {
984     state &= ~(1UL<<_EMOJI);
985   }
986   return state;
987 }
988
989 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
990   static bool lshift = false;
991   static bool rshift = false;
992   static uint8_t layer = 0;
993
994   lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
995   rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
996   layer = biton32(layer_state);
997
998 #ifdef DOUBLESPACE_LAYER_ENABLE
999   // double-space: send space immediately if any other key depressed before space is released
1000   if ((lspace_active ^ rspace_active)
1001       && keycode != LSPACE
1002       && keycode != RSPACE
1003       && record->event.pressed)
1004   {
1005     if (lspace_active) {
1006       if (!lspace_emitted) {
1007         register_code(KC_SPC);
1008         unregister_code(KC_SPC);
1009       }
1010       lspace_emitted = true;
1011     }
1012     if (rspace_active) {
1013       if (!rspace_emitted) {
1014         register_code(KC_SPC);
1015         unregister_code(KC_SPC);
1016       }
1017       rspace_emitted = true;
1018     }
1019   }
1020
1021   if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
1022     if (record->event.pressed) {
1023       unregister_code(KC_LALT);
1024     } else {
1025       register_code(KC_LALT);
1026     }
1027   }
1028 #endif
1029
1030   switch (keycode) {
1031
1032 #ifdef DOUBLESPACE_LAYER_ENABLE
1033     // double-space enter space layer
1034     case LSPACE:
1035       process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
1036       return false;
1037       break;
1038     case RSPACE:
1039       process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
1040       return false;
1041       break;
1042 #endif
1043
1044     // handle greek layer shift
1045     case KC_LSFT:
1046     case KC_RSFT:
1047       ;
1048       if (layer == _GREEKU || layer == _GREEKL) {
1049         if (record->event.pressed) {
1050           layer_on(_GREEKU);
1051           layer_off(_GREEKL);
1052         } else {
1053           if (lshift ^ rshift) { // if only one shift was pressed
1054             layer_on(_GREEKL);
1055             layer_off(_GREEKU);
1056           }
1057         }
1058       }
1059       return true;
1060       break;
1061
1062     // press both ctrls to activate SYS layer
1063     case KC_LCTL:
1064     case KC_RCTL:
1065       ;
1066       bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
1067       bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
1068       if (record->event.pressed) {
1069         if (lctrl ^ rctrl) { // if only one ctrl was pressed
1070           layer_on(_SYS);
1071         }
1072       } else {
1073         layer_off(_SYS);
1074       }
1075       return true;
1076       break;
1077
1078     // QWERTZ style comma and dot: semicolon and colon when shifted
1079     case KC_COMM:
1080       if (record->event.pressed) {
1081         if (lshift || rshift) {
1082           if (lshift) unregister_code(KC_LSFT);
1083           if (rshift) unregister_code(KC_RSFT);
1084           register_code(KC_SCLN);
1085           unregister_code(KC_SCLN);
1086           if (lshift) register_code(KC_LSFT);
1087           if (rshift) register_code(KC_RSFT);
1088         } else {
1089           register_code(KC_COMM);
1090           unregister_code(KC_COMM);
1091         }
1092       }
1093       return false;
1094       break;
1095     case KC_DOT:
1096       if (record->event.pressed) {
1097         if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
1098           register_code(KC_SCLN);
1099           unregister_code(KC_SCLN);
1100         } else {
1101           register_code(KC_DOT);
1102           unregister_code(KC_DOT);
1103         }
1104       }
1105       return false;
1106       break;
1107
1108     // layout switchers
1109     case QWERTY:
1110       if (record->event.pressed) {
1111         persistant_default_layer_set(1UL<<_QWERTY);
1112       }
1113       return false;
1114       break;
1115 #ifdef LAYOUT_DVORAK
1116     case DVORAK:
1117       if (record->event.pressed) {
1118         persistant_default_layer_set(1UL<<_DVORAK);
1119       }
1120       return false;
1121       break;
1122 #endif
1123 #ifdef LAYOUT_COLEMAK
1124     case COLEMAK:
1125       if (record->event.pressed) {
1126         persistant_default_layer_set(1UL<<_COLEMAK);
1127       }
1128       return false;
1129       break;
1130 #endif
1131 #ifdef LAYOUT_WORKMAN
1132     case WORKMAN:
1133       if (record->event.pressed) {
1134         persistant_default_layer_set(1UL<<_WORKMAN);
1135       }
1136       return false;
1137       break;
1138 #endif
1139 #ifdef LAYOUT_NORMAN
1140     case NORMAN:
1141       if (record->event.pressed) {
1142         persistant_default_layer_set(1UL<<_NORMAN);
1143       }
1144       return false;
1145       break;
1146 #endif
1147
1148     // only process Fnumber on key release, and only when layer switcher is still pressed.
1149     // this is to avoid accidental presses on potentially destructive keys
1150     case KC_F1 ... KC_F12:
1151     case KC_PAUS:
1152     case KC_PSCR:
1153     case KC_INS:
1154       if (!record->event.pressed && layer == _FUN) { // key released and still in FUN layer
1155           register_code(keycode);
1156           unregister_code(keycode);
1157       }
1158       return false;
1159       break;
1160
1161     // layer switcher
1162     //
1163     case GREEK:
1164       if (record->event.pressed) {
1165         if (lshift || rshift) {
1166           layer_on(_GREEKU);
1167           layer_off(_GREEKL);
1168         } else {
1169           layer_on(_GREEKL);
1170           layer_off(_GREEKU);
1171         }
1172       } else {
1173         layer_off(_GREEKU);
1174         layer_off(_GREEKL);
1175       }
1176       return false;
1177       break;
1178
1179     // OS switchers
1180     case LINUX:
1181       set_unicode_input_mode(UC_LNX);
1182 #ifdef RGBSPS_ENABLE
1183       led_set_unicode_input_mode();
1184 #endif
1185       return false;
1186       break;
1187     case WIN:
1188       set_unicode_input_mode(UC_WINC);
1189 #ifdef RGBSPS_ENABLE
1190       led_set_unicode_input_mode();
1191 #endif
1192       return false;
1193       break;
1194     case OSX:
1195       set_unicode_input_mode(UC_OSX);
1196 #ifdef RGBSPS_ENABLE
1197       led_set_unicode_input_mode();
1198 #endif
1199       return false;
1200       break;
1201
1202     // glow mode changer
1203 #ifdef RGBSPS_ENABLE
1204     case GLOW:
1205       if (record->event.pressed) {
1206         glow_mode++;
1207         if (glow_mode > GLOW_FULL) {
1208           glow_mode = GLOW_NONE;
1209         }
1210         led_reset();
1211         rgbsps_send();
1212       }
1213       return false;
1214       break;
1215 #endif
1216
1217     // faux clicky indicator
1218 #ifdef FAUXCLICKY_ENABLE
1219     case FC_TOG:
1220 #ifdef RGBSPS_ENABLE
1221       if (fauxclicky_enabled) {
1222         rgbsps_set(LED_IND_AUDIO, 5, 11, 13);
1223       } else {
1224         rgbsps_set(LED_IND_AUDIO, 0, 0, 0);
1225       }
1226       rgbsps_send();
1227 #endif
1228       return true;
1229       break;
1230 #endif
1231   }
1232   return true;
1233 }
1234
1235 void set_output_user(uint8_t output) {
1236 #ifdef MODULE_ADAFRUIT_BLE
1237   switch(output) {
1238     case OUTPUT_USB:
1239       led_set_output_usb();
1240       break;
1241     case OUTPUT_BLUETOOTH:
1242       led_set_output_ble();
1243       break;
1244     default:
1245       led_set_output_none();
1246   }
1247 #endif
1248 }
1249
1250 void matrix_init_user() {
1251   _delay_ms(500); // give time for usb to initialize
1252
1253   set_unicode_input_mode(UC_LNX);
1254
1255 #ifdef RGBSPS_ENABLE
1256   led_init();
1257 #endif
1258
1259   // auto detect output on init
1260 #ifdef MODULE_ADAFRUIT_BLE
1261   uint8_t output = auto_detect_output();
1262   if (output == OUTPUT_USB) {
1263     set_output(OUTPUT_USB);
1264   } else {
1265     set_output(OUTPUT_BLUETOOTH);
1266   }
1267 #endif
1268 }
1269
1270 void turn_off_capslock() {
1271   if (capslock) {
1272     register_code(KC_CAPS);
1273     unregister_code(KC_CAPS);
1274   }
1275 }
1276
1277 #ifdef RGBSPS_ENABLE
1278   void matrix_scan_user(void) {
1279     led_set_layer_indicator();
1280   }
1281
1282   void battery_poll(uint8_t level) {
1283     rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15);
1284     rgbsps_send();
1285   }
1286
1287   void led_set_user(uint8_t usb_led) {
1288     bool new_capslock = usb_led & (1<<USB_LED_CAPS_LOCK);
1289     if (new_capslock ^ capslock) { // capslock state is different
1290       if ((capslock = new_capslock)) {
1291         rgbsps_set(LED_IND_CAPSLOCK, 15, 0, 0);
1292       } else {
1293         rgbsps_set(LED_IND_CAPSLOCK, 0, 0, 0);
1294       }
1295       rgbsps_send();
1296     }
1297   }
1298 #endif
1299
1300 #ifdef PS2_MOUSE_ENABLE
1301   void ps2_mouse_init_user() {
1302       uint8_t rcv;
1303
1304       // set TrackPoint sensitivity
1305       PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
1306       PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
1307       PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
1308       PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
1309
1310       // set TrackPoint Negative Inertia factor
1311       PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
1312       PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
1313       PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
1314       PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
1315
1316       // set TrackPoint speed
1317       // (transfer function upper plateau speed)
1318       PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
1319       PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
1320       PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
1321       PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
1322
1323       // inquire pts status
1324       rcv = ps2_host_send(0xE2);
1325       rcv = ps2_host_send(0x2C);
1326       rcv = ps2_host_recv_response();
1327       if ((rcv & 1) == 1) {
1328         // if on, disable pts
1329         rcv = ps2_host_send(0xE2);
1330         rcv = ps2_host_send(0x47);
1331         rcv = ps2_host_send(0x2C);
1332         rcv = ps2_host_send(0x01);
1333       }
1334   }
1335 #endif