]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/handwired/promethium/keymaps/priyadi/keymap.c
Merge branch 'master' of https://github.com/Dbroqua/qmk_firmware
[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_PUNC,
438   LED_NUM,
439   LED_FUN,
440   LED_EMOJI
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
637
638 #endif // RGBSPS_ENABLE
639
640 // keymaps
641
642 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
643
644 /* Qwerty
645  * ,-----------------------------------------------------------------------------------.
646  * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
647  * |------+------+------+------+------+-------------+------+------+------+------+------|
648  * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   '  |Enter |
649  * |------+------+------+------+------+------|------+------+------+------+------+------|
650  * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Shift |
651  * |------+------+------+------+------+------+------+------+------+------+------+------|
652  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Fun  |Greek | GUI  |AltGr | Ctrl |
653  * `-----------------------------------------------------------------------------------'
654  */
655 [_QWERTY] = KEYMAP(
656   KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC,
657   KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_QUOT, KC_ENT ,
658   KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,
659   KC_LCTL, KC_LALT, KC_LGUI, EMPTY,   NUM,     LSPACE,  RSPACE,  FUN,     GREEK,   KC_RGUI, C_RALT,  KC_RCTL,
660                                            _______, _______, _______
661 ),
662
663 /* Dvorak
664  * ,-----------------------------------------------------------------------------------.
665  * | Tab  |   '  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp |
666  * |------+------+------+------+------+-------------+------+------+------+------+------|
667  * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |Enter |
668  * |------+------+------+------+------+------|------+------+------+------+------+------|
669  * | Shift|   /  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Shift |
670  * |------+------+------+------+------+------+------+------+------+------+------+------|
671  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
672  * `-----------------------------------------------------------------------------------'
673  */
674 #ifdef LAYOUT_DVORAK
675 [_DVORAK] = KEYMAP(
676   _______, KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    _______,
677   _______, KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    _______,
678   _______, KC_SLSH, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    _______,
679   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
680                                            _______, _______, _______
681 ),
682 #endif
683
684 /* Colemak
685  * ,-----------------------------------------------------------------------------------.
686  * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
687  * |------+------+------+------+------+-------------+------+------+------+------+------|
688  * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |Enter |
689  * |------+------+------+------+------+------|------+------+------+------+------+------|
690  * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Shift |
691  * |------+------+------+------+------+------+------+------+------+------+------+------|
692  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
693  * `-----------------------------------------------------------------------------------'
694  */
695
696 #ifdef LAYOUT_COLEMAK
697 [_COLEMAK] = KEYMAP(
698   _______, KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_QUOT, _______,
699   _______, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    _______,
700   _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
701   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
702                                            _______, _______, _______
703 ),
704 #endif
705
706 /* Norman
707  * ,-----------------------------------------------------------------------------------.
708  * | Tab  |   Q  |   W  |   D  |   F  |   K  |   J  |   U  |   R  |   L  |   ;  | Bksp |
709  * |------+------+------+------+------+-------------+------+------+------+------+------|
710  * | Esc  |   A  |   S  |   E  |   T  |   G  |   Y  |   N  |   I  |   O  |   H  |Enter |
711  * |------+------+------+------+------+------|------+------+------+------+------+------|
712  * | Shift|   Z  |   X  |   C  |   V  |   B  |   P  |   M  |   ,  |   .  |   /  |Shift |
713  * |------+------+------+------+------+------+------+------+------+------+------+------|
714  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
715  * `-----------------------------------------------------------------------------------'
716  */
717
718 #ifdef LAYOUT_NORMAN
719 [_NORMAN] = KEYMAP(
720   _______, KC_Q,    KC_W,    KC_D,    KC_F,    KC_K,    KC_J,    KC_U,    KC_R,    KC_L,    KC_QUOT, _______,
721   _______, KC_A,    KC_S,    KC_E,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_I,    KC_O,    KC_H,    _______,
722   _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_P,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
723   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
724                                            _______, _______, _______
725 ),
726 #endif
727
728 /* Workman
729  * ,-----------------------------------------------------------------------------------.
730  * | Tab  |   Q  |   D  |   R  |   W  |   B  |   J  |   F  |   U  |   P  |   ;  | Bksp |
731  * |------+------+------+------+------+-------------+------+------+------+------+------|
732  * | Esc  |   A  |   S  |   H  |   T  |   G  |   Y  |   N  |   E  |   O  |   I  |Enter |
733  * |------+------+------+------+------+------|------+------+------+------+------+------|
734  * | Shift|   Z  |   X  |   M  |   C  |   V  |   K  |   K  |   ,  |   .  |   /  |Shift |
735  * |------+------+------+------+------+------+------+------+------+------+------+------|
736  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
737  * `-----------------------------------------------------------------------------------'
738  */
739
740 #ifdef LAYOUT_WORKMAN
741 [_WORKMAN] = KEYMAP(
742   _______, KC_Q,    KC_D,    KC_R,    KC_W,    KC_B,    KC_J,    KC_F,    KC_U,    KC_P,    KC_QUOT, _______,
743   _______, KC_A,    KC_S,    KC_H,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_E,    KC_O,    KC_I,    _______,
744   _______, KC_Z,    KC_X,    KC_M,    KC_C,    KC_V,    KC_K,    KC_L,    KC_COMM, KC_DOT,  KC_SLSH, _______,
745   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
746                                            _______, _______, _______
747 ),
748 #endif
749
750 /* Punc
751  * ,-----------------------------------------------------------------------------------.
752  * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   ≤  |   ≥  |   `  |
753  * |------+------+------+------+------+-------------+------+------+------+------+------|
754  * |      |   *  |   \  |   -  |   =  |   /  |   ≠  |   (  |   )  |   <  |   >  |      |
755  * |------+------+------+------+------+------|------+------+------+------+------+------|
756  * |   &  |   ^  |   |  |   _  |   +  |   ?  |   ±  |   [  |   ]  |   {  |   }  |      |
757  * |------+------+------+------+------+------+------+------+------+------+------+------|
758  * |      |      |      |      |      |             |      |      |      |   :  |      |
759  * `-----------------------------------------------------------------------------------'
760  */
761 [_PUNC] = KEYMAP(
762   KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, X(LTEQ), X(GTEQ), _______,
763   KC_GRV,  KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, X(NOTEQ),KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
764   KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, X(PLMIN),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______,
765   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______,
766                                            _______, _______, _______
767 ),
768
769 /* Num
770  * ,-----------------------------------------------------------------------------------.
771  * |   ~  |   !  |   @  |   #  |   $  |   %  |   A  |   7  |   8  |   9  |   D  |      |
772  * |------+------+------+------+------+-------------+------+------+------+------+------|
773  * |   `  |   *  |   \  |   -  |   =  |   /  |   B  |   4  |   5  |   6  |   E  |      |
774  * |------+------+------+------+------+------|------+------+------+------+------+------|
775  * |   &  |   ^  |   |  |   _  |   +  |   ?  |   C  |   1  |   2  |   3  |   F  |      |
776  * |------+------+------+------+------+------+------+------+------+------+------+------|
777  * |      |      |   x  |      |      |      |      |   0  |   ,  |   .  |   :  |      |
778  * `-----------------------------------------------------------------------------------'
779  */
780 [_NUM] = KEYMAP(
781   KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, S(KC_A),  KC_1,    KC_2,    KC_3,   S(KC_D), _______,
782   KC_GRV,  KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, S(KC_B),  KC_4,    KC_5,    KC_6,   S(KC_E), _______,
783   KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C),  KC_7,    KC_8,    KC_9,   S(KC_F), _______,
784   _______, _______, KC_X,    _______, _______, _______, _______,  FUN0 ,   KC_COMM, KC_DOT, KC_COLN, _______,
785                                            _______, _______, _______
786 ),
787
788 /* Func
789  * ,-----------------------------------------------------------------------------------.
790  * |      |  F1  |  F2  |  F3  |  F4  | Ins  |      | PgUp |  Up  | PgDn | PgUp |      |
791  * |------+------+------+------+------+-------------+------+------+------+------+------|
792  * | Caps |  F5  |  F6  |  F7  |  F8  |PrtSc |      | Left | Down | Right| PgDn |      |
793  * |------+------+------+------+------+------|------+------+------+------+------+------|
794  * |      |  F9  |  F10 |  F11 |  F12 |Pause |      |      | Home |  End |      |      |
795  * |------+------+------+------+------+------+------+------+------+------+------+------|
796  * |      |      |      |      |      |             |      |      |      |      |      |
797  * `-----------------------------------------------------------------------------------'
798  */
799 [_FUN] = KEYMAP(
800   XXXXXXX,   KC_F1,   KC_F2,   KC_F3,  KC_F4,   KC_INS,  XXXXXXX, KC_PGUP,   KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
801   KC_CAPS,   KC_F5,   KC_F6,   KC_F7,  KC_F8,   KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
802   _______,   KC_F9,  KC_F10,  KC_F11,  KC_F12,  KC_PAUS, XXXXXXX, XXXXXXX, KC_HOME,  KC_END, XXXXXXX, _______,
803   _______, _______, _______, _______,  _______, _______, _______, _______, _______, _______, _______, _______,
804                                            _______, _______, _______
805 ),
806
807 /* Uppercase Greek
808  * ,-----------------------------------------------------------------------------------.
809  * |      |      |      |      |      |      |      |      |      |      |      |      |
810  * |------+------+------+------+------+-------------+------+------+------+------+------|
811  * |      |      |      |      |      |      |      |      |      |      |      |      |
812  * |------+------+------+------+------+------+------+------+------+------+------+------|
813  * |      |      |      |      |      |      |      |      |      |      |      |      |
814  * |------+------+------+------+------+------+------+------+------+------+------+------|
815  * |      |      |      |      |      |      |      |      |      |      |      |      |
816  * `-----------------------------------------------------------------------------------'
817  */
818 [_GREEKU] = KEYMAP(
819   _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC),  X(UPI), _______,
820   _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA),  X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
821   _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA),  X(UNU),  X(UMU), KC_COMM, KC_DOT,  KC_SLSH, _______,
822   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
823                                            _______, _______, _______
824 ),
825
826 /* Lowercase Greek
827  * ,-----------------------------------------------------------------------------------.
828  * |      |      |      |      |      |      |      |      |      |      |      |      |
829  * |------+------+------+------+------+-------------+------+------+------+------+------|
830  * |      |      |      |      |      |      |      |      |      |      |      |      |
831  * |------+------+------+------+------+------+------+------+------+------+------+------|
832  * |      |      |      |      |      |      |      |      |      |      |      |      |
833  * |------+------+------+------+------+------+------+------+------+------+------+------|
834  * |      |      |      |      |      |      |      |      |      |      |      |      |
835  * `-----------------------------------------------------------------------------------'
836  */
837 [_GREEKL] = KEYMAP(
838   _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC),  X(LPI), _______,
839   _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA),  X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
840   _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA),  X(LNU),  X(LMU), KC_COMM, KC_DOT,  KC_SLSH, _______,
841   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
842                                            _______, _______, _______
843 ),
844
845 /* Empty
846  * ,-----------------------------------------------------------------------------------.
847  * |      |      |      |      |      |      |      |      |      |      |      |      |
848  * |------+------+------+------+------+-------------+------+------+------+------+------|
849  * |      |      |      |      |      |      |      |      |      |      |      |      |
850  * |------+------+------+------+------+------+------+------+------+------+------+------|
851  * |      |      |      |      |      |      |      |      |      |      |      |      |
852  * |------+------+------+------+------+------+------+------+------+------+------+------|
853  * |      |      |      |      |      |      |      |      |      |      |      |      |
854  * `-----------------------------------------------------------------------------------'
855  */
856 [_EMPTY] = KEYMAP(
857   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
858   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
859   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
860   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
861                                            _______, _______, _______
862 ),
863
864 /* Emoji
865  * ,-----------------------------------------------------------------------------------.
866  * |      |      |      |      |      |      |      |      |      |      |      |      |
867  * |------+------+------+------+------+-------------+------+------+------+------+------|
868  * |      |      |      |      |      |      |      |      |      |      |      |      |
869  * |------+------+------+------+------+------+------+------+------+------+------+------|
870  * |      |      |      |      |      |      |      |      |      |      |      |      |
871  * |------+------+------+------+------+------+------+------+------+------+------+------|
872  * |      |      |      |      |      |      |      |      |      |      |      |      |
873  * `-----------------------------------------------------------------------------------'
874  */
875 [_EMOJI] = KEYMAP(
876   X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
877   X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART),  X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
878   X(THMDN),X(SLEEP), X(CLAP),  X(CRY),  X(VIC),X(BHART),  X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
879     X(POO), X(EYES), X(HUNRD),_______, X(SKULL),X(HORNS), X(HALO), X(FEAR),_______,X(YUMMY),X(DISAP),X(NOEVK),
880                                            _______, _______, _______
881 ),
882
883 /* GUI
884  * ,-----------------------------------------------------------------------------------.
885  * |      |  D1  |  D2  |  D3  |  D4  |  D5  |  D6  |  D7  |  D8  |  D9  |  D10 |      |
886  * |------+------+------+------+------+-------------+------+------+------+------+------|
887  * | Esc  |      | Btab | Esc  | Tab  |      |      | Prev |      | Next |      |      |
888  * |------+------+------+------+------+------+------+------+------+------+------+------|
889  * |      |      | Prev | Play | Next |      |      |      |      |      |      |      |
890  * |------+------+------+------+------+------+------+------+------+------+------+------|
891  * |      |      |      |      |      |      |      |      |      |      |      |      |
892  * `-----------------------------------------------------------------------------------'
893  */
894 [_GUI] = KEYMAP(
895   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,
896   KC_ESC,  XXXXXXX, S(KC_TAB),KC_ESC, KC_TAB,  XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
897   XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, KC_SPC,  KC_SPC,  KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
898   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
899                                            _______, _______, _______
900 ),
901
902 /* Sys
903  * ,-----------------------------------------------------------------------------------.
904  * |      |Qwerty| Win  |      |Reset |      |      | USB  |      |      |      |      |
905  * |------+------+------+------+------+-------------+------+------+------+------+------|
906  * |      |Audio |      |Dvorak|      | Glow |      |      |WorkMn|Linux |      |      |
907  * |------+------+------+------+------+------+------+------+------+------+------+------|
908  * |      |      |      |Colmak|      | BLE  |Norman|MacOS |      |      |      |      |
909  * |------+------+------+------+------+------+------+------+------+------+------+------|
910  * |      |      |      |      |      |      |      |      |      |      |      |      |
911  * `-----------------------------------------------------------------------------------'
912  */
913 [_SYS] = KEYMAP(
914   DEBUG,   QWERTY,  WIN,     XXXXXXX, RESET,   XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
915   XXXXXXX, FC_TOG,  XXXXXXX, DVORAK,  XXXXXXX, GLOW,    XXXXXXX, XXXXXXX, WORKMAN, LINUX,   XXXXXXX, XXXXXXX,
916   XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BT,  NORMAN,  OSX,     XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
917   _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
918                                            _______, _______, _______
919 ),
920
921
922 };
923
924 void persistant_default_layer_set(uint16_t default_layer) {
925   eeconfig_update_default_layer(default_layer);
926   default_layer_set(default_layer);
927 #ifdef RGBSPS_ENABLE
928   led_set_default_layer_indicator();
929 #endif
930 }
931
932 #ifdef DOUBLESPACE_LAYER_ENABLE
933 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
934   if (pressed) {
935     *isactive = true;
936     if (*otheractive) {
937       layer_on(_SPACE);
938       register_code(KC_LALT);  // sends alt and enter layer
939       space_layer_entered = true;
940     }
941   } else {
942     *isactive = false;
943     if (space_layer_entered) {
944       unregister_code(KC_LALT);  // release alt and exit layer
945       layer_off(_SPACE);
946       if (!*otheractive) {
947         space_layer_entered = false;
948       }
949     } else {
950       if (!*isemitted) {
951         register_code(KC_SPC);
952         unregister_code(KC_SPC);
953       }
954       *isemitted = false;
955     }
956   }
957 }
958 #endif
959
960 uint32_t layer_state_set_kb(uint32_t state)
961 {
962   // turn on punc layer if both fun & num are on
963   if ((state & ((1UL<<_NUM) | (1UL<<_FUN))) == ((1UL<<_NUM) | (1UL<<_FUN))) {
964     state |= (1UL<<_PUNC);
965   } else {
966     state &= ~(1UL<<_PUNC);
967   }
968
969   // turn on emoji layer if empty and greek layer are on
970   if (
971     (state & ((1UL<<_EMPTY) | (1UL<<_GREEKU))) == ((1UL<<_EMPTY) | (1UL<<_GREEKU))
972     || (state & ((1UL<<_EMPTY) | (1UL<<_GREEKL))) == ((1UL<<_EMPTY) | (1UL<<_GREEKL))
973   ) {
974     state |= (1UL<<_EMOJI);
975   } else {
976     state &= ~(1UL<<_EMOJI);
977   }
978   return state;
979 }
980
981 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
982   static bool lshift = false;
983   static bool rshift = false;
984   static uint8_t layer = 0;
985
986   lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
987   rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
988   layer = biton32(layer_state);
989
990 #ifdef DOUBLESPACE_LAYER_ENABLE
991   // double-space: send space immediately if any other key depressed before space is released
992   if ((lspace_active ^ rspace_active)
993       && keycode != LSPACE
994       && keycode != RSPACE
995       && record->event.pressed)
996   {
997     if (lspace_active) {
998       if (!lspace_emitted) {
999         register_code(KC_SPC);
1000         unregister_code(KC_SPC);
1001       }
1002       lspace_emitted = true;
1003     }
1004     if (rspace_active) {
1005       if (!rspace_emitted) {
1006         register_code(KC_SPC);
1007         unregister_code(KC_SPC);
1008       }
1009       rspace_emitted = true;
1010     }
1011   }
1012
1013   if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
1014     if (record->event.pressed) {
1015       unregister_code(KC_LALT);
1016     } else {
1017       register_code(KC_LALT);
1018     }
1019   }
1020 #endif
1021
1022   switch (keycode) {
1023
1024 #ifdef DOUBLESPACE_LAYER_ENABLE
1025     // double-space enter space layer
1026     case LSPACE:
1027       process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
1028       return false;
1029       break;
1030     case RSPACE:
1031       process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
1032       return false;
1033       break;
1034 #endif
1035
1036     // handle greek layer shift
1037     case KC_LSFT:
1038     case KC_RSFT:
1039       ;
1040       if (layer == _GREEKU || layer == _GREEKL) {
1041         if (record->event.pressed) {
1042           layer_on(_GREEKU);
1043           layer_off(_GREEKL);
1044         } else {
1045           if (lshift ^ rshift) { // if only one shift was pressed
1046             layer_on(_GREEKL);
1047             layer_off(_GREEKU);
1048           }
1049         }
1050       }
1051       return true;
1052       break;
1053
1054     // press both ctrls to activate SYS layer
1055     case KC_LCTL:
1056     case KC_RCTL:
1057       ;
1058       bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
1059       bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
1060       if (record->event.pressed) {
1061         if (lctrl ^ rctrl) { // if only one ctrl was pressed
1062           layer_on(_SYS);
1063         }
1064       } else {
1065         layer_off(_SYS);
1066       }
1067       return true;
1068       break;
1069
1070     // QWERTZ style comma and dot: semicolon and colon when shifted
1071     case KC_COMM:
1072       if (record->event.pressed) {
1073         if (lshift || rshift) {
1074           if (lshift) unregister_code(KC_LSFT);
1075           if (rshift) unregister_code(KC_RSFT);
1076           register_code(KC_SCLN);
1077           unregister_code(KC_SCLN);
1078           if (lshift) register_code(KC_LSFT);
1079           if (rshift) register_code(KC_RSFT);
1080         } else {
1081           register_code(KC_COMM);
1082           unregister_code(KC_COMM);
1083         }
1084       }
1085       return false;
1086       break;
1087     case KC_DOT:
1088       if (record->event.pressed) {
1089         if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
1090           register_code(KC_SCLN);
1091           unregister_code(KC_SCLN);
1092         } else {
1093           register_code(KC_DOT);
1094           unregister_code(KC_DOT);
1095         }
1096       }
1097       return false;
1098       break;
1099
1100     // layout switchers
1101     case QWERTY:
1102       if (record->event.pressed) {
1103         persistant_default_layer_set(1UL<<_QWERTY);
1104       }
1105       return false;
1106       break;
1107 #ifdef LAYOUT_DVORAK
1108     case DVORAK:
1109       if (record->event.pressed) {
1110         persistant_default_layer_set(1UL<<_DVORAK);
1111       }
1112       return false;
1113       break;
1114 #endif
1115 #ifdef LAYOUT_COLEMAK
1116     case COLEMAK:
1117       if (record->event.pressed) {
1118         persistant_default_layer_set(1UL<<_COLEMAK);
1119       }
1120       return false;
1121       break;
1122 #endif
1123 #ifdef LAYOUT_WORKMAN
1124     case WORKMAN:
1125       if (record->event.pressed) {
1126         persistant_default_layer_set(1UL<<_WORKMAN);
1127       }
1128       return false;
1129       break;
1130 #endif
1131 #ifdef LAYOUT_NORMAN
1132     case NORMAN:
1133       if (record->event.pressed) {
1134         persistant_default_layer_set(1UL<<_NORMAN);
1135       }
1136       return false;
1137       break;
1138 #endif
1139
1140     // only process Fnumber on key release, and only when layer switcher is still pressed.
1141     // this is to avoid accidental presses on potentially destructive keys
1142     case KC_F1 ... KC_F12:
1143     case KC_PAUS:
1144     case KC_PSCR:
1145     case KC_INS:
1146       if (!record->event.pressed && layer == _FUN) { // key released and still in FUN layer
1147           register_code(keycode);
1148           unregister_code(keycode);
1149       }
1150       return false;
1151       break;
1152
1153     // layer switcher
1154     //
1155     case GREEK:
1156       if (record->event.pressed) {
1157         if (lshift || rshift) {
1158           layer_on(_GREEKU);
1159           layer_off(_GREEKL);
1160         } else {
1161           layer_on(_GREEKL);
1162           layer_off(_GREEKU);
1163         }
1164       } else {
1165         layer_off(_GREEKU);
1166         layer_off(_GREEKL);
1167       }
1168       return false;
1169       break;
1170
1171     // OS switchers
1172     case LINUX:
1173       set_unicode_input_mode(UC_LNX);
1174 #ifdef RGBSPS_ENABLE
1175       led_set_unicode_input_mode();
1176 #endif
1177       return false;
1178       break;
1179     case WIN:
1180       set_unicode_input_mode(UC_WINC);
1181 #ifdef RGBSPS_ENABLE
1182       led_set_unicode_input_mode();
1183 #endif
1184       return false;
1185       break;
1186     case OSX:
1187       set_unicode_input_mode(UC_OSX);
1188 #ifdef RGBSPS_ENABLE
1189       led_set_unicode_input_mode();
1190 #endif
1191       return false;
1192       break;
1193
1194     // glow mode changer
1195 #ifdef RGBSPS_ENABLE
1196     case GLOW:
1197       if (record->event.pressed) {
1198         glow_mode++;
1199         if (glow_mode > GLOW_FULL) {
1200           glow_mode = GLOW_NONE;
1201         }
1202         led_reset();
1203         rgbsps_send();
1204       }
1205       return false;
1206       break;
1207 #endif
1208
1209     // faux clicky indicator
1210 #ifdef FAUXCLICKY_ENABLE
1211     case FC_TOG:
1212 #ifdef RGBSPS_ENABLE
1213       if (fauxclicky_enabled) {
1214         rgbsps_set(LED_IND_AUDIO, 0, 0, 0);
1215       } else {
1216         rgbsps_set(LED_IND_AUDIO, 5, 11, 13);
1217       }
1218       rgbsps_send();
1219 #endif
1220       return true;
1221       break;
1222 #endif
1223   }
1224   return true;
1225 }
1226
1227 void set_output_user(uint8_t output) {
1228 #ifdef MODULE_ADAFRUIT_BLE
1229   switch(output) {
1230     case OUTPUT_USB:
1231       led_set_output_usb();
1232       break;
1233     case OUTPUT_BLUETOOTH:
1234       led_set_output_ble();
1235       break;
1236     default:
1237       led_set_output_none();
1238   }
1239 #endif
1240 }
1241
1242 void matrix_init_user() {
1243   _delay_ms(500); // give time for usb to initialize
1244
1245   set_unicode_input_mode(UC_LNX);
1246
1247 #ifdef RGBSPS_ENABLE
1248   led_init();
1249 #endif
1250
1251   // auto detect output on init
1252 #ifdef MODULE_ADAFRUIT_BLE
1253   uint8_t output = auto_detect_output();
1254   if (output == OUTPUT_USB) {
1255     set_output(OUTPUT_USB);
1256   } else {
1257     set_output(OUTPUT_BLUETOOTH);
1258   }
1259 #endif
1260 }
1261
1262 void turn_off_capslock() {
1263   if (capslock) {
1264     register_code(KC_CAPS);
1265     unregister_code(KC_CAPS);
1266   }
1267 }
1268
1269 #ifdef RGBSPS_ENABLE
1270   void matrix_scan_user(void) {
1271     led_set_layer_indicator();
1272   }
1273
1274   void battery_poll(uint8_t level) {
1275     rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15);
1276     rgbsps_send();
1277   }
1278
1279   void led_set_user(uint8_t usb_led) {
1280     bool new_capslock = usb_led & (1<<USB_LED_CAPS_LOCK);
1281     if (new_capslock ^ capslock) { // capslock state is different
1282       if ((capslock = new_capslock)) {
1283         rgbsps_set(LED_IND_CAPSLOCK, 15, 0, 0);
1284       } else {
1285         rgbsps_set(LED_IND_CAPSLOCK, 0, 0, 0);
1286       }
1287       rgbsps_send();
1288     }
1289   }
1290 #endif
1291
1292 #ifdef PS2_MOUSE_ENABLE
1293   void ps2_mouse_init_user() {
1294       uint8_t rcv;
1295
1296       // set TrackPoint sensitivity
1297       PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
1298       PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
1299       PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
1300       PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
1301
1302       // set TrackPoint Negative Inertia factor
1303       PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
1304       PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
1305       PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
1306       PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
1307
1308       // set TrackPoint speed
1309       // (transfer function upper plateau speed)
1310       PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
1311       PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
1312       PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
1313       PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
1314
1315       // inquire pts status
1316       rcv = ps2_host_send(0xE2);
1317       rcv = ps2_host_send(0x2C);
1318       rcv = ps2_host_recv_response();
1319       if ((rcv & 1) == 1) {
1320         // if on, disable pts
1321         rcv = ps2_host_send(0xE2);
1322         rcv = ps2_host_send(0x47);
1323         rcv = ps2_host_send(0x2C);
1324         rcv = ps2_host_send(0x01);
1325       }
1326   }
1327 #endif