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