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