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