]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/handwired/promethium/keymaps/priyadi/keymap.c
Promethium rev2
[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
581 /* Dvorak
582  * ,-----------------------------------------------------------------------------------.
583  * | Tab  |   '  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp |
584  * |------+------+------+------+------+-------------+------+------+------+------+------|
585  * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |Enter |
586  * |------+------+------+------+------+------|------+------+------+------+------+------|
587  * | Shift|   /  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Shift |
588  * |------+------+------+------+------+------+------+------+------+------+------+------|
589  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
590  * `-----------------------------------------------------------------------------------'
591  */
592 #ifdef LAYOUT_DVORAK
593 [_DVORAK] = KEYMAP(
594   _______, KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    _______,
595   _______, KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    _______,
596   _______, KC_SLSH, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    _______,
597   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
598                                            _______, _______, _______
599 ),
600 #endif
601
602 /* Colemak
603  * ,-----------------------------------------------------------------------------------.
604  * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
605  * |------+------+------+------+------+-------------+------+------+------+------+------|
606  * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |Enter |
607  * |------+------+------+------+------+------|------+------+------+------+------+------|
608  * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Shift |
609  * |------+------+------+------+------+------+------+------+------+------+------+------|
610  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
611  * `-----------------------------------------------------------------------------------'
612  */
613
614 #ifdef LAYOUT_COLEMAK
615 [_COLEMAK] = KEYMAP(
616   _______, KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_QUOT, _______,
617   _______, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    _______,
618   _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
619   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
620                                            _______, _______, _______
621 ),
622 #endif
623
624 /* Norman
625  * ,-----------------------------------------------------------------------------------.
626  * | Tab  |   Q  |   W  |   D  |   F  |   K  |   J  |   U  |   R  |   L  |   ;  | Bksp |
627  * |------+------+------+------+------+-------------+------+------+------+------+------|
628  * | Esc  |   A  |   S  |   E  |   T  |   G  |   Y  |   N  |   I  |   O  |   H  |Enter |
629  * |------+------+------+------+------+------|------+------+------+------+------+------|
630  * | Shift|   Z  |   X  |   C  |   V  |   B  |   P  |   M  |   ,  |   .  |   /  |Shift |
631  * |------+------+------+------+------+------+------+------+------+------+------+------|
632  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
633  * `-----------------------------------------------------------------------------------'
634  */
635
636 #ifdef LAYOUT_NORMAN
637 [_NORMAN] = KEYMAP(
638   _______, KC_Q,    KC_W,    KC_D,    KC_F,    KC_K,    KC_J,    KC_U,    KC_R,    KC_L,    KC_QUOT, _______,
639   _______, KC_A,    KC_S,    KC_E,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_I,    KC_O,    KC_H,    _______,
640   _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_P,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
641   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
642                                            _______, _______, _______
643 ),
644 #endif
645
646 /* Workman
647  * ,-----------------------------------------------------------------------------------.
648  * | Tab  |   Q  |   D  |   R  |   W  |   B  |   J  |   F  |   U  |   P  |   ;  | Bksp |
649  * |------+------+------+------+------+-------------+------+------+------+------+------|
650  * | Esc  |   A  |   S  |   H  |   T  |   G  |   Y  |   N  |   E  |   O  |   I  |Enter |
651  * |------+------+------+------+------+------|------+------+------+------+------+------|
652  * | Shift|   Z  |   X  |   M  |   C  |   V  |   K  |   K  |   ,  |   .  |   /  |Shift |
653  * |------+------+------+------+------+------+------+------+------+------+------+------|
654  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
655  * `-----------------------------------------------------------------------------------'
656  */
657
658 #ifdef LAYOUT_WORKMAN
659 [_WORKMAN] = KEYMAP(
660   _______, KC_Q,    KC_D,    KC_R,    KC_W,    KC_B,    KC_J,    KC_F,    KC_U,    KC_P,    KC_QUOT, _______,
661   _______, KC_A,    KC_S,    KC_H,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_E,    KC_O,    KC_I,    _______,
662   _______, KC_Z,    KC_X,    KC_M,    KC_C,    KC_V,    KC_K,    KC_L,    KC_COMM, KC_DOT,  KC_SLSH, _______,
663   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
664                                            _______, _______, _______
665 ),
666 #endif
667
668 /* Punc
669  * ,-----------------------------------------------------------------------------------.
670  * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   ≤  |   ≥  |   `  |
671  * |------+------+------+------+------+-------------+------+------+------+------+------|
672  * |      |   *  |   \  |   -  |   =  |   /  |   ≠  |   (  |   )  |   <  |   >  |      |
673  * |------+------+------+------+------+------|------+------+------+------+------+------|
674  * |   &  |   ^  |   |  |   _  |   +  |   ?  |   ±  |   [  |   ]  |   {  |   }  |      |
675  * |------+------+------+------+------+------+------+------+------+------+------+------|
676  * |      |      |      |      |      |             |      |      |      |   :  |      |
677  * `-----------------------------------------------------------------------------------'
678  */
679 [_PUNC] = KEYMAP(
680   KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, X(LTEQ), X(GTEQ), _______,
681   KC_GRV,  KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, X(NOTEQ),KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
682   KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, X(PLMIN),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______,
683   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______,
684                                            _______, _______, _______
685 ),
686
687 /* Num
688  * ,-----------------------------------------------------------------------------------.
689  * |   ~  |   !  |   @  |   #  |   $  |   %  |   A  |   7  |   8  |   9  |   D  |      |
690  * |------+------+------+------+------+-------------+------+------+------+------+------|
691  * |   `  |   *  |   \  |   -  |   =  |   /  |   B  |   4  |   5  |   6  |   E  |      |
692  * |------+------+------+------+------+------|------+------+------+------+------+------|
693  * |   &  |   ^  |   |  |   _  |   +  |   ?  |   C  |   1  |   2  |   3  |   F  |      |
694  * |------+------+------+------+------+------+------+------+------+------+------+------|
695  * |      |      |   x  |      |      |      |      |   0  |   ,  |   .  |   :  |      |
696  * `-----------------------------------------------------------------------------------'
697  */
698 [_NUM] = KEYMAP(
699   KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, S(KC_A),  KC_1,    KC_2,    KC_3,   S(KC_D), _______,
700   KC_GRV,  KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, S(KC_B),  KC_4,    KC_5,    KC_6,   S(KC_E), _______,
701   KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C),  KC_7,    KC_8,    KC_9,   S(KC_F), _______,
702   _______, _______, KC_X,    _______, _______, _______, _______,  FUN0 ,   KC_COMM, KC_DOT, KC_COLN, _______,
703                                            _______, _______, _______
704 ),
705
706 /* Func
707  * ,-----------------------------------------------------------------------------------.
708  * |      |  F1  |  F2  |  F3  |  F4  | Ins  |      | PgUp |  Up  | PgDn | PgUp |      |
709  * |------+------+------+------+------+-------------+------+------+------+------+------|
710  * | Caps |  F5  |  F6  |  F7  |  F8  |PrtSc |      | Left | Down | Right| PgDn |      |
711  * |------+------+------+------+------+------|------+------+------+------+------+------|
712  * |      |  F9  |  F10 |  F11 |  F12 |Pause |      |      | Home |  End |      |      |
713  * |------+------+------+------+------+------+------+------+------+------+------+------|
714  * |      |      |      |      |      |             |      |      |      |      |      |
715  * `-----------------------------------------------------------------------------------'
716  */
717 [_FUN] = KEYMAP(
718   XXXXXXX,   KC_F1,   KC_F2,   KC_F3,  KC_F4,   KC_INS,  XXXXXXX, KC_PGUP,   KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
719   KC_CAPS,   KC_F5,   KC_F6,   KC_F7,  KC_F8,   KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
720   _______,   KC_F9,  KC_F10,  KC_F11,  KC_F12,  KC_PAUS, XXXXXXX, XXXXXXX, KC_HOME,  KC_END, XXXXXXX, _______,
721   _______, _______, _______, _______,  _______, _______, _______, _______, _______, _______, _______, _______,
722                                            _______, _______, _______
723 ),
724
725 /* Uppercase Greek
726  * ,-----------------------------------------------------------------------------------.
727  * |      |      |      |      |      |      |      |      |      |      |      |      |
728  * |------+------+------+------+------+-------------+------+------+------+------+------|
729  * |      |      |      |      |      |      |      |      |      |      |      |      |
730  * |------+------+------+------+------+------+------+------+------+------+------+------|
731  * |      |      |      |      |      |      |      |      |      |      |      |      |
732  * |------+------+------+------+------+------+------+------+------+------+------+------|
733  * |      |      |      |      |      |      |      |      |      |      |      |      |
734  * `-----------------------------------------------------------------------------------'
735  */
736 [_GREEKU] = KEYMAP(
737   _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC),  X(UPI), _______,
738   _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA),  X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
739   _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA),  X(UNU),  X(UMU), KC_COMM, KC_DOT,  KC_SLSH, _______,
740   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
741                                            _______, _______, _______
742 ),
743
744 /* Lowercase Greek
745  * ,-----------------------------------------------------------------------------------.
746  * |      |      |      |      |      |      |      |      |      |      |      |      |
747  * |------+------+------+------+------+-------------+------+------+------+------+------|
748  * |      |      |      |      |      |      |      |      |      |      |      |      |
749  * |------+------+------+------+------+------+------+------+------+------+------+------|
750  * |      |      |      |      |      |      |      |      |      |      |      |      |
751  * |------+------+------+------+------+------+------+------+------+------+------+------|
752  * |      |      |      |      |      |      |      |      |      |      |      |      |
753  * `-----------------------------------------------------------------------------------'
754  */
755 [_GREEKL] = KEYMAP(
756   _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC),  X(LPI), _______,
757   _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA),  X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
758   _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA),  X(LNU),  X(LMU), KC_COMM, KC_DOT,  KC_SLSH, _______,
759   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
760                                            _______, _______, _______
761 ),
762
763 /* Empty
764  * ,-----------------------------------------------------------------------------------.
765  * |      |      |      |      |      |      |      |      |      |      |      |      |
766  * |------+------+------+------+------+-------------+------+------+------+------+------|
767  * |      |      |      |      |      |      |      |      |      |      |      |      |
768  * |------+------+------+------+------+------+------+------+------+------+------+------|
769  * |      |      |      |      |      |      |      |      |      |      |      |      |
770  * |------+------+------+------+------+------+------+------+------+------+------+------|
771  * |      |      |      |      |      |      |      |      |      |      |      |      |
772  * `-----------------------------------------------------------------------------------'
773  */
774 [_EMPTY] = KEYMAP(
775   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
776   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
777   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
778   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
779                                            _______, _______, _______
780 ),
781
782 /* Emoji
783  * ,-----------------------------------------------------------------------------------.
784  * |      |      |      |      |      |      |      |      |      |      |      |      |
785  * |------+------+------+------+------+-------------+------+------+------+------+------|
786  * |      |      |      |      |      |      |      |      |      |      |      |      |
787  * |------+------+------+------+------+------+------+------+------+------+------+------|
788  * |      |      |      |      |      |      |      |      |      |      |      |      |
789  * |------+------+------+------+------+------+------+------+------+------+------+------|
790  * |      |      |      |      |      |      |      |      |      |      |      |      |
791  * `-----------------------------------------------------------------------------------'
792  */
793 [_EMOJI] = KEYMAP(
794   X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
795   X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART),  X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
796   X(THMDN),X(SLEEP), X(CLAP),  X(CRY),  X(VIC),X(BHART),  X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
797     X(POO), X(EYES), X(HUNRD),_______, X(SKULL),X(HORNS), X(HALO), X(FEAR),_______,X(YUMMY),X(DISAP),X(NOEVK),
798                                            _______, _______, _______
799 ),
800
801 /* GUI
802  * ,-----------------------------------------------------------------------------------.
803  * |      |  D1  |  D2  |  D3  |  D4  |  D5  |  D6  |  D7  |  D8  |  D9  |  D10 |      |
804  * |------+------+------+------+------+-------------+------+------+------+------+------|
805  * | Esc  |      | Btab | Esc  | Tab  |      |      | Prev |      | Next |      |      |
806  * |------+------+------+------+------+------+------+------+------+------+------+------|
807  * |      |      | Prev | Play | Next |      |      |      |      |      |      |      |
808  * |------+------+------+------+------+------+------+------+------+------+------+------|
809  * |      |      |      |      |      |      |      |      |      |      |      |      |
810  * `-----------------------------------------------------------------------------------'
811  */
812 [_GUI] = KEYMAP(
813   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,
814   KC_ESC,  XXXXXXX, S(KC_TAB),KC_ESC, KC_TAB,  XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
815   XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, KC_SPC,  KC_SPC,  KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
816   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
817                                            _______, _______, _______
818 ),
819
820 /* Sys
821  * ,-----------------------------------------------------------------------------------.
822  * |      |Qwerty| Win  |      |Reset |      |      | USB  |      |      |      |      |
823  * |------+------+------+------+------+-------------+------+------+------+------+------|
824  * |      |Audio |      |Dvorak|      | Glow |      |      |WorkMn|Linux |      |      |
825  * |------+------+------+------+------+------+------+------+------+------+------+------|
826  * |      |      |      |Colmak|      | BLE  |Norman|MacOS |      |      |      |      |
827  * |------+------+------+------+------+------+------+------+------+------+------+------|
828  * |      |      |      |      |      |      |      |      |      |      |      |      |
829  * `-----------------------------------------------------------------------------------'
830  */
831 [_SYS] = KEYMAP(
832   DEBUG,   QWERTY,  WIN,     XXXXXXX, RESET,   XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
833   XXXXXXX, FC_TOG,  XXXXXXX, DVORAK,  XXXXXXX, GLOW,    XXXXXXX, XXXXXXX, WORKMAN, LINUX,   XXXXXXX, XXXXXXX,
834   XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BLE, NORMAN,  OSX,     XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
835   _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
836                                            _______, _______, _______
837 ),
838
839
840 };
841
842 void persistant_default_layer_set(uint16_t default_layer) {
843   eeconfig_update_default_layer(default_layer);
844   default_layer_set(default_layer);
845 }
846
847 #ifdef DOUBLESPACE_LAYER_ENABLE
848 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
849   if (pressed) {
850     *isactive = true;
851     if (*otheractive) {
852       layer_on(_SPACE);
853       register_code(KC_LALT);  // sends alt and enter layer
854       space_layer_entered = true;
855     }
856   } else {
857     *isactive = false;
858     if (space_layer_entered) {
859       unregister_code(KC_LALT);  // release alt and exit layer
860       layer_off(_SPACE);
861       if (!*otheractive) {
862         space_layer_entered = false;
863       }
864     } else {
865       if (!*isemitted) {
866         register_code(KC_SPC);
867         unregister_code(KC_SPC);
868       }
869       *isemitted = false;
870     }
871   }
872 }
873 #endif
874
875 uint32_t layer_state_set_kb(uint32_t state)
876 {
877   // turn on punc layer if both fun & num are on
878   if ((state & ((1UL<<_NUM) | (1UL<<_FUN))) == ((1UL<<_NUM) | (1UL<<_FUN))) {
879     state |= (1UL<<_PUNC);
880   } else {
881     state &= ~(1UL<<_PUNC);
882   }
883
884   // turn on emoji layer if empty and greek layer are on
885   if (
886     (state & ((1UL<<_EMPTY) | (1UL<<_GREEKU))) == ((1UL<<_EMPTY) | (1UL<<_GREEKU))
887     || (state & ((1UL<<_EMPTY) | (1UL<<_GREEKL))) == ((1UL<<_EMPTY) | (1UL<<_GREEKL))
888   ) {
889     state |= (1UL<<_EMOJI);
890   } else {
891     state &= ~(1UL<<_EMOJI);
892   }
893   return state;
894 }
895
896 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
897   static bool lshift = false;
898   static bool rshift = false;
899   static uint8_t layer = 0;
900
901   lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
902   rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
903   layer = biton32(layer_state);
904
905 #ifdef DOUBLESPACE_LAYER_ENABLE
906   // double-space: send space immediately if any other key depressed before space is released
907   if ((lspace_active ^ rspace_active)
908       && keycode != LSPACE
909       && keycode != RSPACE
910       && record->event.pressed)
911   {
912     if (lspace_active) {
913       if (!lspace_emitted) {
914         register_code(KC_SPC);
915         unregister_code(KC_SPC);
916       }
917       lspace_emitted = true;
918     }
919     if (rspace_active) {
920       if (!rspace_emitted) {
921         register_code(KC_SPC);
922         unregister_code(KC_SPC);
923       }
924       rspace_emitted = true;
925     }
926   }
927
928   if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
929     if (record->event.pressed) {
930       unregister_code(KC_LALT);
931     } else {
932       register_code(KC_LALT);
933     }
934   }
935 #endif
936
937   switch (keycode) {
938
939 #ifdef DOUBLESPACE_LAYER_ENABLE
940     // double-space enter space layer
941     case LSPACE:
942       process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
943       return false;
944       break;
945     case RSPACE:
946       process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
947       return false;
948       break;
949 #endif
950
951     // handle greek layer shift
952     case KC_LSFT:
953     case KC_RSFT:
954       ;
955       if (layer == _GREEKU || layer == _GREEKL) {
956         if (record->event.pressed) {
957           layer_on(_GREEKU);
958           layer_off(_GREEKL);
959         } else {
960           if (lshift ^ rshift) { // if only one shift was pressed
961             layer_on(_GREEKL);
962             layer_off(_GREEKU);
963           }
964         }
965       }
966       return true;
967       break;
968
969     // press both ctrls to activate SYS layer
970     case KC_LCTL:
971     case KC_RCTL:
972       ;
973       bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
974       bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
975       if (record->event.pressed) {
976         if (lctrl ^ rctrl) { // if only one ctrl was pressed
977           layer_on(_SYS);
978         }
979       } else {
980         layer_off(_SYS);
981       }
982       return true;
983       break;
984
985     // QWERTZ style comma and dot: semicolon and colon when shifted
986     case KC_COMM:
987       if (record->event.pressed) {
988         if (lshift || rshift) {
989           if (lshift) unregister_code(KC_LSFT);
990           if (rshift) unregister_code(KC_RSFT);
991           register_code(KC_SCLN);
992           unregister_code(KC_SCLN);
993           if (lshift) register_code(KC_LSFT);
994           if (rshift) register_code(KC_RSFT);
995         } else {
996           register_code(KC_COMM);
997           unregister_code(KC_COMM);
998         }
999       }
1000       return false;
1001       break;
1002     case KC_DOT:
1003       if (record->event.pressed) {
1004         if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
1005           register_code(KC_SCLN);
1006           unregister_code(KC_SCLN);
1007         } else {
1008           register_code(KC_DOT);
1009           unregister_code(KC_DOT);
1010         }
1011       }
1012       return false;
1013       break;
1014
1015     // layout switchers
1016     case QWERTY:
1017       if (record->event.pressed) {
1018         persistant_default_layer_set(1UL<<_QWERTY);
1019       }
1020       return false;
1021       break;
1022 #ifdef LAYOUT_DVORAK
1023     case DVORAK:
1024       if (record->event.pressed) {
1025         persistant_default_layer_set(1UL<<_DVORAK);
1026       }
1027       return false;
1028       break;
1029 #endif
1030 #ifdef LAYOUT_COLEMAK
1031     case COLEMAK:
1032       if (record->event.pressed) {
1033         persistant_default_layer_set(1UL<<_COLEMAK);
1034       }
1035       return false;
1036       break;
1037 #endif
1038 #ifdef LAYOUT_WORKMAN
1039     case WORKMAN:
1040       if (record->event.pressed) {
1041         persistant_default_layer_set(1UL<<_WORKMAN);
1042       }
1043       return false;
1044       break;
1045 #endif
1046 #ifdef LAYOUT_NORMAN
1047     case NORMAN:
1048       if (record->event.pressed) {
1049         persistant_default_layer_set(1UL<<_NORMAN);
1050       }
1051       return false;
1052       break;
1053 #endif
1054
1055     // only process Fnumber on key release, and only when layer switcher is still pressed.
1056     // this is to avoid accidental presses on potentially destructive keys
1057     case KC_F1 ... KC_F12:
1058     case KC_PAUS:
1059     case KC_PSCR:
1060     case KC_INS:
1061       if (!record->event.pressed && layer == _FUN) { // key released and still in FUN layer
1062           register_code(keycode);
1063           unregister_code(keycode);
1064       }
1065       return false;
1066       break;
1067
1068     // layer switcher
1069     //
1070     case GREEK:
1071       if (record->event.pressed) {
1072         if (lshift || rshift) {
1073           layer_on(_GREEKU);
1074           layer_off(_GREEKL);
1075         } else {
1076           layer_on(_GREEKL);
1077           layer_off(_GREEKU);
1078         }
1079       } else {
1080         layer_off(_GREEKU);
1081         layer_off(_GREEKL);
1082       }
1083       return false;
1084       break;
1085
1086     // OS switchers
1087     case LINUX:
1088       set_unicode_input_mode(UC_LNX);
1089       return false;
1090       break;
1091     case WIN:
1092       set_unicode_input_mode(UC_WINC);
1093       return false;
1094       break;
1095     case OSX:
1096       set_unicode_input_mode(UC_OSX);
1097       return false;
1098       break;
1099
1100     // glow mode changer
1101 #ifdef RGBSPS_ENABLE
1102     case GLOW:
1103       if (record->event.pressed) {
1104         glow_mode++;
1105         if (glow_mode > GLOW_FULL) {
1106           glow_mode = GLOW_NONE;
1107         }
1108         led_reset();
1109         rgbsps_send();
1110       }
1111       return false;
1112       break;
1113 #endif
1114
1115     // faux clicky indicator
1116 #ifdef FAUXCLICKY_ENABLE
1117     case FC_TOG:
1118       return true;
1119       break;
1120 #endif
1121   }
1122   return true;
1123 }
1124
1125 void set_output_user(uint8_t output) {
1126 #ifdef ADAFRUIT_BLE_ENABLE
1127   switch(output) {
1128     case OUTPUT_USB:
1129       led_set_output_usb();
1130       break;
1131     case OUTPUT_ADAFRUIT_BLE:
1132       led_set_output_ble();
1133       break;
1134     default:
1135       led_set_output_none();
1136   }
1137 #endif
1138 }
1139
1140 void matrix_init_user() {
1141   _delay_ms(500); // give time for usb to initialize
1142
1143   set_unicode_input_mode(UC_LNX);
1144
1145 #ifdef RGBSPS_ENABLE
1146   led_init();
1147 #endif
1148
1149   // auto detect output on init
1150 #ifdef ADAFRUIT_BLE_ENABLE
1151   uint8_t output = auto_detect_output();
1152   if (output == OUTPUT_USB) {
1153     set_output(OUTPUT_USB);
1154   } else {
1155     set_output(OUTPUT_ADAFRUIT_BLE);
1156   }
1157 #endif
1158 }
1159
1160 void turn_off_capslock() {
1161   if (capslock) {
1162     register_code(KC_CAPS);
1163     unregister_code(KC_CAPS);
1164   }
1165 }
1166
1167 #ifdef RGBSPS_ENABLE
1168   void matrix_scan_user(void) {
1169     led_set_layer_indicator();
1170   }
1171
1172   void battery_poll(uint8_t level) {
1173     rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15);
1174     rgbsps_send();
1175   }
1176
1177   void led_set_user(uint8_t usb_led) {
1178     bool new_capslock = usb_led & (1<<USB_LED_CAPS_LOCK);
1179     if (new_capslock ^ capslock) { // capslock state is different
1180       if ((capslock = new_capslock)) {
1181         rgbsps_set(LED_IND_NUM, 15, 0, 0);
1182       } else {
1183         rgbsps_set(LED_IND_NUM, 0, 0, 0);
1184       }
1185       rgbsps_send();
1186     }
1187   }
1188 #endif
1189
1190 #ifdef PS2_MOUSE_ENABLE
1191   void ps2_mouse_init_user() {
1192       uint8_t rcv;
1193
1194       // set TrackPoint sensitivity
1195       PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
1196       PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
1197       PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
1198       PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
1199
1200       // set TrackPoint Negative Inertia factor
1201       PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
1202       PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
1203       PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
1204       PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
1205
1206       // set TrackPoint speed
1207       // (transfer function upper plateau speed)
1208       PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
1209       PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
1210       PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
1211       PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
1212
1213       // inquire pts status
1214       rcv = ps2_host_send(0xE2);
1215       rcv = ps2_host_send(0x2C);
1216       rcv = ps2_host_recv_response();
1217       if ((rcv & 1) == 1) {
1218         // if on, disable pts
1219         rcv = ps2_host_send(0xE2);
1220         rcv = ps2_host_send(0x47);
1221         rcv = ps2_host_send(0x2C);
1222         rcv = ps2_host_send(0x01);
1223       }
1224   }
1225 #endif