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