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