]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/handwired/promethium/keymaps/priyadi/keymap.c
Keymap updates and some adjustment for latest version of QMK
[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   led_set_default_layer_indicator();
928 }
929
930 #ifdef DOUBLESPACE_LAYER_ENABLE
931 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
932   if (pressed) {
933     *isactive = true;
934     if (*otheractive) {
935       layer_on(_SPACE);
936       register_code(KC_LALT);  // sends alt and enter layer
937       space_layer_entered = true;
938     }
939   } else {
940     *isactive = false;
941     if (space_layer_entered) {
942       unregister_code(KC_LALT);  // release alt and exit layer
943       layer_off(_SPACE);
944       if (!*otheractive) {
945         space_layer_entered = false;
946       }
947     } else {
948       if (!*isemitted) {
949         register_code(KC_SPC);
950         unregister_code(KC_SPC);
951       }
952       *isemitted = false;
953     }
954   }
955 }
956 #endif
957
958 uint32_t layer_state_set_kb(uint32_t state)
959 {
960   // turn on punc layer if both fun & num are on
961   if ((state & ((1UL<<_NUM) | (1UL<<_FUN))) == ((1UL<<_NUM) | (1UL<<_FUN))) {
962     state |= (1UL<<_PUNC);
963   } else {
964     state &= ~(1UL<<_PUNC);
965   }
966
967   // turn on emoji layer if empty and greek layer are on
968   if (
969     (state & ((1UL<<_EMPTY) | (1UL<<_GREEKU))) == ((1UL<<_EMPTY) | (1UL<<_GREEKU))
970     || (state & ((1UL<<_EMPTY) | (1UL<<_GREEKL))) == ((1UL<<_EMPTY) | (1UL<<_GREEKL))
971   ) {
972     state |= (1UL<<_EMOJI);
973   } else {
974     state &= ~(1UL<<_EMOJI);
975   }
976   return state;
977 }
978
979 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
980   static bool lshift = false;
981   static bool rshift = false;
982   static uint8_t layer = 0;
983
984   lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
985   rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
986   layer = biton32(layer_state);
987
988 #ifdef DOUBLESPACE_LAYER_ENABLE
989   // double-space: send space immediately if any other key depressed before space is released
990   if ((lspace_active ^ rspace_active)
991       && keycode != LSPACE
992       && keycode != RSPACE
993       && record->event.pressed)
994   {
995     if (lspace_active) {
996       if (!lspace_emitted) {
997         register_code(KC_SPC);
998         unregister_code(KC_SPC);
999       }
1000       lspace_emitted = true;
1001     }
1002     if (rspace_active) {
1003       if (!rspace_emitted) {
1004         register_code(KC_SPC);
1005         unregister_code(KC_SPC);
1006       }
1007       rspace_emitted = true;
1008     }
1009   }
1010
1011   if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
1012     if (record->event.pressed) {
1013       unregister_code(KC_LALT);
1014     } else {
1015       register_code(KC_LALT);
1016     }
1017   }
1018 #endif
1019
1020   switch (keycode) {
1021
1022 #ifdef DOUBLESPACE_LAYER_ENABLE
1023     // double-space enter space layer
1024     case LSPACE:
1025       process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
1026       return false;
1027       break;
1028     case RSPACE:
1029       process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
1030       return false;
1031       break;
1032 #endif
1033
1034     // handle greek layer shift
1035     case KC_LSFT:
1036     case KC_RSFT:
1037       ;
1038       if (layer == _GREEKU || layer == _GREEKL) {
1039         if (record->event.pressed) {
1040           layer_on(_GREEKU);
1041           layer_off(_GREEKL);
1042         } else {
1043           if (lshift ^ rshift) { // if only one shift was pressed
1044             layer_on(_GREEKL);
1045             layer_off(_GREEKU);
1046           }
1047         }
1048       }
1049       return true;
1050       break;
1051
1052     // press both ctrls to activate SYS layer
1053     case KC_LCTL:
1054     case KC_RCTL:
1055       ;
1056       bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
1057       bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
1058       if (record->event.pressed) {
1059         if (lctrl ^ rctrl) { // if only one ctrl was pressed
1060           layer_on(_SYS);
1061         }
1062       } else {
1063         layer_off(_SYS);
1064       }
1065       return true;
1066       break;
1067
1068     // QWERTZ style comma and dot: semicolon and colon when shifted
1069     case KC_COMM:
1070       if (record->event.pressed) {
1071         if (lshift || rshift) {
1072           if (lshift) unregister_code(KC_LSFT);
1073           if (rshift) unregister_code(KC_RSFT);
1074           register_code(KC_SCLN);
1075           unregister_code(KC_SCLN);
1076           if (lshift) register_code(KC_LSFT);
1077           if (rshift) register_code(KC_RSFT);
1078         } else {
1079           register_code(KC_COMM);
1080           unregister_code(KC_COMM);
1081         }
1082       }
1083       return false;
1084       break;
1085     case KC_DOT:
1086       if (record->event.pressed) {
1087         if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
1088           register_code(KC_SCLN);
1089           unregister_code(KC_SCLN);
1090         } else {
1091           register_code(KC_DOT);
1092           unregister_code(KC_DOT);
1093         }
1094       }
1095       return false;
1096       break;
1097
1098     // layout switchers
1099     case QWERTY:
1100       if (record->event.pressed) {
1101         persistant_default_layer_set(1UL<<_QWERTY);
1102       }
1103       return false;
1104       break;
1105 #ifdef LAYOUT_DVORAK
1106     case DVORAK:
1107       if (record->event.pressed) {
1108         persistant_default_layer_set(1UL<<_DVORAK);
1109       }
1110       return false;
1111       break;
1112 #endif
1113 #ifdef LAYOUT_COLEMAK
1114     case COLEMAK:
1115       if (record->event.pressed) {
1116         persistant_default_layer_set(1UL<<_COLEMAK);
1117       }
1118       return false;
1119       break;
1120 #endif
1121 #ifdef LAYOUT_WORKMAN
1122     case WORKMAN:
1123       if (record->event.pressed) {
1124         persistant_default_layer_set(1UL<<_WORKMAN);
1125       }
1126       return false;
1127       break;
1128 #endif
1129 #ifdef LAYOUT_NORMAN
1130     case NORMAN:
1131       if (record->event.pressed) {
1132         persistant_default_layer_set(1UL<<_NORMAN);
1133       }
1134       return false;
1135       break;
1136 #endif
1137
1138     // only process Fnumber on key release, and only when layer switcher is still pressed.
1139     // this is to avoid accidental presses on potentially destructive keys
1140     case KC_F1 ... KC_F12:
1141     case KC_PAUS:
1142     case KC_PSCR:
1143     case KC_INS:
1144       if (!record->event.pressed && layer == _FUN) { // key released and still in FUN layer
1145           register_code(keycode);
1146           unregister_code(keycode);
1147       }
1148       return false;
1149       break;
1150
1151     // layer switcher
1152     //
1153     case GREEK:
1154       if (record->event.pressed) {
1155         if (lshift || rshift) {
1156           layer_on(_GREEKU);
1157           layer_off(_GREEKL);
1158         } else {
1159           layer_on(_GREEKL);
1160           layer_off(_GREEKU);
1161         }
1162       } else {
1163         layer_off(_GREEKU);
1164         layer_off(_GREEKL);
1165       }
1166       return false;
1167       break;
1168
1169     // OS switchers
1170     case LINUX:
1171       set_unicode_input_mode(UC_LNX);
1172 #ifdef RGBSPS_ENABLE
1173       led_set_unicode_input_mode();
1174 #endif
1175       return false;
1176       break;
1177     case WIN:
1178       set_unicode_input_mode(UC_WINC);
1179 #ifdef RGBSPS_ENABLE
1180       led_set_unicode_input_mode();
1181 #endif
1182       return false;
1183       break;
1184     case OSX:
1185       set_unicode_input_mode(UC_OSX);
1186 #ifdef RGBSPS_ENABLE
1187       led_set_unicode_input_mode();
1188 #endif
1189       return false;
1190       break;
1191
1192     // glow mode changer
1193 #ifdef RGBSPS_ENABLE
1194     case GLOW:
1195       if (record->event.pressed) {
1196         glow_mode++;
1197         if (glow_mode > GLOW_FULL) {
1198           glow_mode = GLOW_NONE;
1199         }
1200         led_reset();
1201         rgbsps_send();
1202       }
1203       return false;
1204       break;
1205 #endif
1206
1207     // faux clicky indicator
1208 #ifdef FAUXCLICKY_ENABLE
1209     case FC_TOG:
1210 #ifdef RGBSPS_ENABLE
1211       if (fauxclicky_enabled) {
1212         rgbsps_set(LED_IND_AUDIO, 0, 0, 0);
1213       } else {
1214         rgbsps_set(LED_IND_AUDIO, 5, 11, 13);
1215       }
1216       rgbsps_send();
1217 #endif
1218       return true;
1219       break;
1220 #endif
1221   }
1222   return true;
1223 }
1224
1225 void set_output_user(uint8_t output) {
1226 #ifdef MODULE_ADAFRUIT_BLE
1227   switch(output) {
1228     case OUTPUT_USB:
1229       led_set_output_usb();
1230       break;
1231     case OUTPUT_BLUETOOTH:
1232       led_set_output_ble();
1233       break;
1234     default:
1235       led_set_output_none();
1236   }
1237 #endif
1238 }
1239
1240 void matrix_init_user() {
1241   _delay_ms(500); // give time for usb to initialize
1242
1243   set_unicode_input_mode(UC_LNX);
1244
1245 #ifdef RGBSPS_ENABLE
1246   led_init();
1247 #endif
1248
1249   // auto detect output on init
1250 #ifdef MODULE_ADAFRUIT_BLE
1251   uint8_t output = auto_detect_output();
1252   if (output == OUTPUT_USB) {
1253     set_output(OUTPUT_USB);
1254   } else {
1255     set_output(OUTPUT_BLUETOOTH);
1256   }
1257 #endif
1258 }
1259
1260 void turn_off_capslock() {
1261   if (capslock) {
1262     register_code(KC_CAPS);
1263     unregister_code(KC_CAPS);
1264   }
1265 }
1266
1267 #ifdef RGBSPS_ENABLE
1268   void matrix_scan_user(void) {
1269     led_set_layer_indicator();
1270   }
1271
1272   void battery_poll(uint8_t level) {
1273     rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15);
1274     rgbsps_send();
1275   }
1276
1277   void led_set_user(uint8_t usb_led) {
1278     bool new_capslock = usb_led & (1<<USB_LED_CAPS_LOCK);
1279     if (new_capslock ^ capslock) { // capslock state is different
1280       if ((capslock = new_capslock)) {
1281         rgbsps_set(LED_IND_CAPSLOCK, 15, 0, 0);
1282       } else {
1283         rgbsps_set(LED_IND_CAPSLOCK, 0, 0, 0);
1284       }
1285       rgbsps_send();
1286     }
1287   }
1288 #endif
1289
1290 #ifdef PS2_MOUSE_ENABLE
1291   void ps2_mouse_init_user() {
1292       uint8_t rcv;
1293
1294       // set TrackPoint sensitivity
1295       PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
1296       PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
1297       PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
1298       PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
1299
1300       // set TrackPoint Negative Inertia factor
1301       PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
1302       PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
1303       PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
1304       PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
1305
1306       // set TrackPoint speed
1307       // (transfer function upper plateau speed)
1308       PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
1309       PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
1310       PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
1311       PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
1312
1313       // inquire pts status
1314       rcv = ps2_host_send(0xE2);
1315       rcv = ps2_host_send(0x2C);
1316       rcv = ps2_host_recv_response();
1317       if ((rcv & 1) == 1) {
1318         // if on, disable pts
1319         rcv = ps2_host_send(0xE2);
1320         rcv = ps2_host_send(0x47);
1321         rcv = ps2_host_send(0x2C);
1322         rcv = ps2_host_send(0x01);
1323       }
1324   }
1325 #endif