]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/handwired/promethium/keymaps/priyadi/keymap.c
GUI layer fixes
[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 void turn_off_capslock(void);
45 extern keymap_config_t keymap_config;
46
47 enum layers {
48   _QWERTY,
49   _DVORAK,
50   _COLEMAK,
51   _WORKMAN,
52   _NORMAN,
53   _DEFAULT_LAYER_MAX = _NORMAN,
54
55   _GREEKU,
56   _GREEKL,
57
58   _NUM,
59   _FUNC,
60   _PUNC,
61
62   _EMOJI,
63   _GUI,
64   _SYS,
65 };
66
67 // double-space layer
68 #define _SPACE _GUI
69
70 enum planck_keycodes {
71   // layouts
72   QWERTY = SAFE_RANGE,
73   DVORAK,
74   COLEMAK,
75   WORKMAN,
76   NORMAN,
77
78   // layer switchers
79   PUNC,
80   NUM,
81   FUNC,
82   EMOJI,
83   GUI,
84   GREEK,
85
86   // os switchers
87   LINUX,
88   WIN,
89   OSX,
90
91   // others
92   LSPACE,
93   RSPACE,
94   GLOW,
95
96   // stub
97   AUDIO
98 };
99
100 // unicode map
101
102 enum unicode_name {
103   GRIN, // grinning face 😊
104   TJOY, // tears of joy 😂
105   SMILE, // grining face with smiling eyes 😁
106   HEART, // heart ❤
107   EYERT, // smiling face with heart shaped eyes 😍
108   CRY, // crying face 😭
109   SMEYE, // smiling face with smiling eyes 😊
110   UNAMU, // unamused 😒
111   KISS, // kiss 😘
112   HART2, // two hearts 💕
113   WEARY, // weary 😩
114   OKHND, // ok hand sign 👌
115   PENSV, // pensive 😔
116   SMIRK, // smirk 😏
117   RECYC, // recycle ♻
118   WINK, // wink 😉
119   THMUP, // thumb up 👍
120   THMDN, // thumb down 👎
121   PRAY, // pray 🙏
122   PHEW, // relieved 😌
123   MUSIC, // musical notes
124   FLUSH, // flushed 😳
125   CELEB, // celebration 🙌
126   CRY2, // crying face 😢
127   COOL, // smile with sunglasses 😎
128   NOEVS, // see no evil
129   NOEVH, // hear no evil
130   NOEVK, // speak no evil
131   POO, // pile of poo
132   EYES, // eyes
133   VIC, // victory hand
134   BHART, // broken heart
135   SLEEP, // sleeping face
136   SMIL2, // smiling face with open mouth & sweat
137   HUNRD, // 100
138   CONFU, // confused
139   TONGU, // face with tongue & winking eye
140   DISAP, // disappointed
141   YUMMY, // face savoring delicious food
142   CLAP, // hand clapping
143   FEAR, // face screaming in fear
144   HORNS, // smiling face with horns
145   HALO, // smiling face with halo
146   BYE, // waving hand
147   SUN, // sun
148   MOON, // moon
149   SKULL, // skull
150
151   // greek letters
152   UALPH,
153   UBETA,
154   UGAMM,
155   UDELT,
156   UEPSI,
157   UZETA,
158   UETA,
159   UTHET,
160   UIOTA,
161   UKAPP,
162   ULAMB,
163   UMU,
164   UNU,
165   UXI,
166   UOMIC,
167   UPI,
168   URHO,
169   USIGM,
170   UTAU,
171   UUPSI,
172   UPHI,
173   UCHI,
174   UPSI,
175   UOMEG,
176
177   LALPH,
178   LBETA,
179   LGAMM,
180   LDELT,
181   LEPSI,
182   LZETA,
183   LETA,
184   LTHET,
185   LIOTA,
186   LKAPP,
187   LLAMB,
188   LMU,
189   LNU,
190   LXI,
191   LOMIC,
192   LPI,
193   LRHO,
194   LSIGM,
195   LTAU,
196   LUPSI,
197   LPHI,
198   LCHI,
199   LPSI,
200   LOMEG,
201
202   FSIGM,
203 };
204
205 const uint32_t PROGMEM unicode_map[] = {
206   [GRIN] = 0x1F600,
207   [TJOY] = 0x1F602,
208   [SMILE] = 0x1F601,
209   [HEART] = 0x2764,
210   [EYERT] = 0x1f60d,
211   [CRY] = 0x1f62d,
212   [SMEYE] = 0x1F60A,
213   [UNAMU] = 0x1F612,
214   [KISS] = 0x1F618,
215   [HART2] = 0x1F495,
216   [WEARY] = 0x1F629,
217   [OKHND] = 0x1F44C,
218   [PENSV] = 0x1F614,
219   [SMIRK] = 0x1F60F,
220   [RECYC] = 0x267B,
221   [WINK] = 0x1F609,
222   [THMUP] = 0x1F44D,
223   [THMDN] = 0x1F44E,
224   [PRAY] = 0x1F64F,
225   [PHEW] = 0x1F60C,
226   [MUSIC] = 0x1F3B6,
227   [FLUSH] = 0x1F633,
228   [CELEB] = 0x1F64C,
229   [CRY2] = 0x1F622,
230   [COOL] = 0x1F60E,
231   [NOEVS] = 0x1F648,
232   [NOEVH] = 0x1F649,
233   [NOEVK] = 0x1F64A,
234   [POO] = 0x1F4A9,
235   [EYES] = 0x1F440,
236   [VIC] = 0x270C,
237   [BHART] = 0x1F494,
238   [SLEEP] = 0x1F634,
239   [SMIL2] = 0x1F605,
240   [HUNRD] = 0x1F4AF,
241   [CONFU] = 0x1F615,
242   [TONGU] = 0x1F61C,
243   [DISAP] = 0x1F61E,
244   [YUMMY] = 0x1F60B,
245   [CLAP] = 0x1F44F,
246   [FEAR] = 0x1F631,
247   [HORNS] = 0x1F608,
248   [HALO] = 0x1F607,
249   [BYE] = 0x1F44B,
250   [SUN] = 0x2600,
251   [MOON] = 0x1F314,
252   [SKULL] = 0x1F480,
253
254   // greek letters
255   [UALPH] = 0x0391,
256   [UBETA] = 0x0392,
257   [UGAMM] = 0x0393,
258   [UDELT] = 0x0394,
259   [UEPSI] = 0x0395,
260   [UZETA] = 0x0396,
261   [UETA] = 0x0397,
262   [UTHET] = 0x0398,
263   [UIOTA] = 0x0399,
264   [UKAPP] = 0x039A,
265   [ULAMB] = 0x039B,
266   [UMU] = 0x039C,
267   [UNU] = 0x039D,
268   [UXI] = 0x039E,
269   [UOMIC] = 0x039F,
270   [UPI] = 0x03A0,
271   [URHO] = 0x03A1,
272   [USIGM] = 0x03A3,
273   [UTAU] = 0x03A4,
274   [UUPSI] = 0x03A5,
275   [UPHI] = 0x03A6,
276   [UCHI] = 0x03A7,
277   [UPSI] = 0x03A8,
278   [UOMEG] = 0x03A9,
279   [LALPH] = 0x03B1,
280   [LBETA] = 0x03B2,
281   [LGAMM] = 0x03B3,
282   [LDELT] = 0x03B4,
283   [LEPSI] = 0x03B5,
284   [LZETA] = 0x03B6,
285   [LETA] = 0x03B7,
286   [LTHET] = 0x03B8,
287   [LIOTA] = 0x03B9,
288   [LKAPP] = 0x03BA,
289   [LLAMB] = 0x03BB,
290   [LMU] = 0x03BC,
291   [LNU] = 0x03BD,
292   [LXI] = 0x03BE,
293   [LOMIC] = 0x03BF,
294   [LPI] = 0x03C0,
295   [LRHO] = 0x03C1,
296   [LSIGM] = 0x03C3,
297   [LTAU] = 0x03C4,
298   [LUPSI] = 0x03C5,
299   [LPHI] = 0x03C6,
300   [LCHI] = 0x03C7,
301   [LPSI] = 0x03C8,
302   [LOMEG] = 0x03C9,
303   [FSIGM] = 0x03C2,
304 };
305
306 // RGBSPS
307
308 const uint8_t PROGMEM LED_ALNUM[] = {
309   LED_Z,
310   LED_A,
311   LED_Q,
312   LED_W,
313   LED_S,
314   LED_X,
315   LED_C,
316   LED_D,
317   LED_E,
318   LED_R,
319   LED_F,
320   LED_V,
321   LED_B,
322   LED_G,
323   LED_T,
324   LED_N,
325   LED_HH,
326   LED_Y,
327   LED_U,
328   LED_J,
329   LED_M,
330   LED_COMM,
331   LED_K,
332   LED_I,
333   LED_O,
334   LED_L,
335   LED_DOT,
336   LED_SLSH,
337   LED_SCLN,
338   LED_P,
339   LED_LSPC,
340   LED_RSPC
341 };
342
343 const uint8_t PROGMEM LED_HOMING[] = {
344   LED_A,
345   LED_S,
346   LED_D,
347   LED_F,
348   LED_J,
349   LED_K,
350   LED_L,
351   LED_SCLN
352 };
353
354 const uint8_t PROGMEM LED_MODS[] = {
355   LED_TAB,
356   LED_ESC,
357   LED_LSFT,
358   LED_LCTL,
359   LED_LGUI,
360   LED_LALT,
361   LED_RALT,
362   LED_RGUI,
363   LED_BKSP,
364   LED_ENT,
365   LED_RSFT,
366   LED_RCTL
367 };
368
369 const uint8_t PROGMEM LED_FN[] = {
370   LED_PUNC,
371   LED_NUM,
372   LED_FUNC,
373   LED_EMOJI
374 };
375
376 const uint8_t PROGMEM LED_INDICATORS[] = {
377   LED_IND_EMOJI,
378   LED_IND_NUM,
379   LED_IND_FUNC,
380   LED_IND_BATTERY,
381   LED_IND_USB,
382   LED_IND_BLUETOOTH,
383 };
384
385 const uint8_t PROGMEM LED_TRACKPOINT[] = {
386   LED_TRACKPOINT1,
387   LED_TRACKPOINT2,
388   LED_TRACKPOINT3,
389 };
390
391 void led_turnoff_keys(void) {
392   for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
393     rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 0, 0, 0);
394   }
395   for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
396     rgbsps_set(pgm_read_byte(&LED_MODS[i]), 0, 0, 0);
397   }
398   for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
399     rgbsps_set(pgm_read_byte(&LED_FN[i]), 0, 0, 0);
400   }
401 }
402
403 void led_reset(void) {
404   switch (glow_mode) {
405     case GLOW_NONE:
406       led_turnoff_keys();
407       break;
408     case GLOW_MIN:
409       led_turnoff_keys();
410       for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
411         rgbsps_set(pgm_read_byte(&LED_HOMING[i]), 8, 8, 8);
412       }
413       rgbsps_set(LED_F, 15, 0, 0);
414       rgbsps_set(LED_J, 15, 0, 0);
415       break;
416     case GLOW_FULL:
417       for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
418         rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 8, 8, 8);
419       }
420       for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
421         rgbsps_set(pgm_read_byte(&LED_MODS[i]), 0, 15, 0);
422       }
423       for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
424         rgbsps_set(pgm_read_byte(&LED_FN[i]), 0, 0, 15);
425       }
426       for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
427         rgbsps_set(pgm_read_byte(&LED_HOMING[i]), 15, 0, 0);
428       }
429       rgbsps_set(LED_F, 15, 15, 0);
430       rgbsps_set(LED_J, 15, 15, 0);
431       break;
432   }
433 }
434
435 void led_set_layer_indicator(void) {
436   static uint8_t oldlayer = 255;
437
438   rgbsps_set(LED_IND_FUNC, 0, 0, 0);
439   // rgbsps_set(LED_IND_NUM, 0, 0, 0);
440   rgbsps_set(LED_IND_EMOJI, 0, 0, 0);
441
442   led_reset();
443
444   uint8_t layer = biton32(layer_state);
445   if (oldlayer == layer) {
446     return;
447   }
448
449   oldlayer = layer;
450
451   if (layer <= _DEFAULT_LAYER_MAX) {
452     rgbsps_send();
453     return;
454   }
455
456   switch(layer) {
457     case _FUNC:
458       rgbsps_set(LED_IND_FUNC, 15, 0, 0);
459       break;
460     // case _NUM:
461     //   rgbsps_set(LED_IND_NUM, 0, 0, 15);
462     //   break;
463     case _EMOJI:
464       rgbsps_set(LED_IND_EMOJI, 15, 15, 0);
465       break;
466     default:
467       rgbsps_set(LED_IND_FUNC, 3, 3, 3);
468       // rgbsps_set(LED_IND_NUM, 3, 3, 3);
469       rgbsps_set(LED_IND_EMOJI, 3, 3, 3);
470   }
471
472   rgbsps_send();
473 }
474
475 void led_set_output_ble(void) {
476   rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 15);
477   rgbsps_set(LED_IND_USB, 0, 0, 0);
478   rgbsps_send();
479 }
480
481 void led_set_output_usb(void) {
482   rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0);
483   rgbsps_set(LED_IND_USB, 15, 15, 15);
484   rgbsps_send();
485 }
486
487 void led_set_output_none(void) {
488   rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0);
489   rgbsps_set(LED_IND_USB, 0, 0, 0);
490   rgbsps_send();
491 }
492
493 void led_init(void) {
494   // turn off all
495   rgbsps_turnoff();
496
497   // set trackpoint color
498   rgbsps_set(LED_TRACKPOINT1, 15, 0, 0);
499   rgbsps_set(LED_TRACKPOINT2, 0, 0, 15);
500   rgbsps_set(LED_TRACKPOINT3, 15, 0, 0);
501 }
502
503
504 // keymaps
505
506 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
507
508 /* Qwerty
509  * ,-----------------------------------------------------------------------------------.
510  * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
511  * |------+------+------+------+------+-------------+------+------+------+------+------|
512  * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   '  |Enter |
513  * |------+------+------+------+------+------|------+------+------+------+------+------|
514  * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Shift |
515  * |------+------+------+------+------+------+------+------+------+------+------+------|
516  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
517  * `-----------------------------------------------------------------------------------'
518  */
519 [_QWERTY] = KEYMAP(
520   KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC,
521   KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_QUOT, KC_ENT ,
522   KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,
523   KC_LCTL, KC_LALT, KC_LGUI, XXXXXXX, NUM,     LSPACE,  RSPACE,  FUNC,    GREEK,   KC_RGUI, KC_RALT, KC_RCTL
524 ),
525
526 /* Dvorak
527  * ,-----------------------------------------------------------------------------------.
528  * | Tab  |   '  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp |
529  * |------+------+------+------+------+-------------+------+------+------+------+------|
530  * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |Enter |
531  * |------+------+------+------+------+------|------+------+------+------+------+------|
532  * | Shift|   /  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Shift |
533  * |------+------+------+------+------+------+------+------+------+------+------+------|
534  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
535  * `-----------------------------------------------------------------------------------'
536  */
537 #ifdef LAYOUT_DVORAK
538 [_DVORAK] = KEYMAP(
539   _______, KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    _______,
540   _______, KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    _______,
541   _______, KC_SLSH, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    _______,
542   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
543 ),
544 #endif
545
546 /* Colemak
547  * ,-----------------------------------------------------------------------------------.
548  * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
549  * |------+------+------+------+------+-------------+------+------+------+------+------|
550  * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |Enter |
551  * |------+------+------+------+------+------|------+------+------+------+------+------|
552  * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Shift |
553  * |------+------+------+------+------+------+------+------+------+------+------+------|
554  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
555  * `-----------------------------------------------------------------------------------'
556  */
557
558 #ifdef LAYOUT_COLEMAK
559 [_COLEMAK] = KEYMAP(
560   _______, KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_QUOT, _______,
561   _______, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    _______,
562   _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
563   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
564 ),
565 #endif
566
567 /* Norman
568  * ,-----------------------------------------------------------------------------------.
569  * | Tab  |   Q  |   W  |   D  |   F  |   K  |   J  |   U  |   R  |   L  |   ;  | Bksp |
570  * |------+------+------+------+------+-------------+------+------+------+------+------|
571  * | Esc  |   A  |   S  |   E  |   T  |   G  |   Y  |   N  |   I  |   O  |   H  |Enter |
572  * |------+------+------+------+------+------|------+------+------+------+------+------|
573  * | Shift|   Z  |   X  |   C  |   V  |   B  |   P  |   M  |   ,  |   .  |   /  |Shift |
574  * |------+------+------+------+------+------+------+------+------+------+------+------|
575  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
576  * `-----------------------------------------------------------------------------------'
577  */
578
579 #ifdef LAYOUT_NORMAN
580 [_NORMAN] = KEYMAP(
581   _______, KC_Q,    KC_W,    KC_D,    KC_F,    KC_K,    KC_J,    KC_U,    KC_R,    KC_L,    KC_QUOT, _______,
582   _______, KC_A,    KC_S,    KC_E,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_I,    KC_O,    KC_H,    _______,
583   _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_P,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
584   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
585 ),
586 #endif
587
588 /* Workman
589  * ,-----------------------------------------------------------------------------------.
590  * | Tab  |   Q  |   D  |   R  |   W  |   B  |   J  |   F  |   U  |   P  |   ;  | Bksp |
591  * |------+------+------+------+------+-------------+------+------+------+------+------|
592  * | Esc  |   A  |   S  |   H  |   T  |   G  |   Y  |   N  |   E  |   O  |   I  |Enter |
593  * |------+------+------+------+------+------|------+------+------+------+------+------|
594  * | Shift|   Z  |   X  |   M  |   C  |   V  |   K  |   K  |   ,  |   .  |   /  |Shift |
595  * |------+------+------+------+------+------+------+------+------+------+------+------|
596  * | Ctrl | Alt  | GUI  | Punc | Num  |    Space    | Func |Greek | GUI  |AltGr | Ctrl |
597  * `-----------------------------------------------------------------------------------'
598  */
599
600 #ifdef LAYOUT_WORKMAN
601 [_WORKMAN] = KEYMAP(
602   _______, KC_Q,    KC_D,    KC_R,    KC_W,    KC_B,    KC_J,    KC_F,    KC_U,    KC_P,    KC_QUOT, _______,
603   _______, KC_A,    KC_S,    KC_H,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_E,    KC_O,    KC_I,    _______,
604   _______, KC_Z,    KC_X,    KC_M,    KC_C,    KC_V,    KC_K,    KC_L,    KC_COMM, KC_DOT,  KC_SLSH, _______,
605   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
606 ),
607 #endif
608
609 /* Punc
610  * ,-----------------------------------------------------------------------------------.
611  * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  |   `  |
612  * |------+------+------+------+------+-------------+------+------+------+------+------|
613  * |      |   *  |   \  |   -  |   =  |   /  |      |   (  |   )  |   <  |   >  |      |
614  * |------+------+------+------+------+------|------+------+------+------+------+------|
615  * |   &  |   ^  |   |  |   _  |   +  |   ?  |      |   [  |   ]  |   {  |   }  |   :  |
616  * |------+------+------+------+------+------+------+------+------+------+------+------|
617  * |      |      |      |      |      |             |      |      |      |      |      |
618  * `-----------------------------------------------------------------------------------'
619  */
620 [_PUNC] = KEYMAP(
621   KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______,
622   KC_GRV,  KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, XXXXXXX, KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
623   KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, XXXXXXX, KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, KC_COLN,
624   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
625 ),
626
627 /* Num
628  * ,-----------------------------------------------------------------------------------.
629  * |   ~  |   !  |   @  |   #  |   $  |   %  |   A  |   7  |   8  |   9  |   D  |   `  |
630  * |------+------+------+------+------+-------------+------+------+------+------+------|
631  * |      |   *  |   \  |   -  |   =  |   /  |   B  |   4  |   5  |   6  |   E  |      |
632  * |------+------+------+------+------+------|------+------+------+------+------+------|
633  * |   &  |   ^  |   |  |   _  |   +  |   ?  |   C  |   1  |   2  |   3  |   F  |  :   |
634  * |------+------+------+------+------+------+------+------+------+------+------+------|
635  * |      |      |      |      |      |      |   x  |   0  |   ,  |   .  |      |      |
636  * `-----------------------------------------------------------------------------------'
637  */
638 [_NUM] = KEYMAP(
639   KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, S(KC_A),    KC_7,    KC_8,    KC_9, S(KC_D), _______,
640   KC_GRV,  KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, S(KC_B),    KC_4,    KC_5,    KC_6, S(KC_E), _______,
641   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,
642   _______, _______, _______, _______, _______, _______, _______,    LT(_PUNC, KC_0), KC_COMM,  KC_DOT, KC_X,    _______
643 ),
644
645 /* Func
646  * ,-----------------------------------------------------------------------------------.
647  * |      |  F1  |  F2  |  F3  |  F4  |      |      | PgUp |  Up  | PgDn | PgUp | Del  |
648  * |------+------+------+------+------+-------------+------+------+------+------+------|
649  * |      |  F5  |  F6  |  F7  |  F8  |PrtSc |      | Left | Down | Right| PgDn | Ins  |
650  * |------+------+------+------+------+------|------+------+------+------+------+------|
651  * |      |  F9  |  F10 |  F11 |  F12 |      |      |      | Home |  End |      |      |
652  * |------+------+------+------+------+------+------+------+------+------+------+------|
653  * |      |      |      |      |      |             |      |      |      |      |      |
654  * `-----------------------------------------------------------------------------------'
655  */
656 [_FUNC] = KEYMAP(
657   XXXXXXX,   KC_F1,   KC_F2,   KC_F3,   KC_F4,  XXXXXXX, XXXXXXX, KC_PGUP,   KC_UP, KC_PGDN, KC_PGUP,  KC_DEL,
658   XXXXXXX,   KC_F5,   KC_F6,   KC_F7,   KC_F8,  KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN,  KC_INS,
659   _______,   KC_F9,  KC_F10,  KC_F11,   KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME,  KC_END, XXXXXXX, _______,
660   _______, _______, _______, _______,   PUNC,   _______, _______, _______, _______, _______, _______, _______
661 ),
662
663 /* Uppercase Greek
664  * ,-----------------------------------------------------------------------------------.
665  * |      |      |      |      |      |      |      |      |      |      |      |      |
666  * |------+------+------+------+------+-------------+------+------+------+------+------|
667  * |      |      |      |      |      |      |      |      |      |      |      |      |
668  * |------+------+------+------+------+------+------+------+------+------+------+------|
669  * |      |      |      |      |      |      |      |      |      |      |      |      |
670  * |------+------+------+------+------+------+------+------+------+------+------+------|
671  * |      |      |      |      |      |      |      |      |      |      |      |      |
672  * `-----------------------------------------------------------------------------------'
673  */
674 [_GREEKU] = KEYMAP(
675   _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC),  X(UPI), _______,
676   _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA),  X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
677   _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA),  X(UNU),  X(UMU), KC_COMM, KC_DOT,  KC_SLSH, _______,
678   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
679 ),
680
681 /* Lowercase Greek
682  * ,-----------------------------------------------------------------------------------.
683  * |      |      |      |      |      |      |      |      |      |      |      |      |
684  * |------+------+------+------+------+-------------+------+------+------+------+------|
685  * |      |      |      |      |      |      |      |      |      |      |      |      |
686  * |------+------+------+------+------+------+------+------+------+------+------+------|
687  * |      |      |      |      |      |      |      |      |      |      |      |      |
688  * |------+------+------+------+------+------+------+------+------+------+------+------|
689  * |      |      |      |      |      |      |      |      |      |      |      |      |
690  * `-----------------------------------------------------------------------------------'
691  */
692 [_GREEKL] = KEYMAP(
693   _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC),  X(LPI), _______,
694   _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA),  X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
695   _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA),  X(LNU),  X(LMU), KC_COMM, KC_DOT,  KC_SLSH, _______,
696   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
697 ),
698
699 /* Emoji
700  * ,-----------------------------------------------------------------------------------.
701  * |      |      |      |      |      |      |      |      |      |      |      |      |
702  * |------+------+------+------+------+-------------+------+------+------+------+------|
703  * |      |      |      |      |      |      |      |      |      |      |      |      |
704  * |------+------+------+------+------+------+------+------+------+------+------+------|
705  * |      |      |      |      |      |      |      |      |      |      |      |      |
706  * |------+------+------+------+------+------+------+------+------+------+------+------|
707  * |      |      |      |      |      |      |      |      |      |      |      |      |
708  * `-----------------------------------------------------------------------------------'
709  */
710 [_EMOJI] = KEYMAP(
711   X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
712   X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART),  X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
713   X(THMDN),X(SLEEP), X(CLAP),  X(CRY),  X(VIC),X(BHART),  X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
714     X(POO), X(EYES), _______,X(HUNRD), X(SKULL),X(HORNS), X(HALO), X(FEAR),X(YUMMY),_______,X(DISAP),X(NOEVK)
715 ),
716
717 /* GUI
718  * ,-----------------------------------------------------------------------------------.
719  * |      |  D1  |  D2  |  D3  |  D4  |  D5  |  D6  |  D7  |  D8  |  D9  |  D10 |      |
720  * |------+------+------+------+------+-------------+------+------+------+------+------|
721  * |      |      | Vol- | Mute | Vol+ |      |      | Prev |      | Next |      |      |
722  * |------+------+------+------+------+------+------+------+------+------+------+------|
723  * |      |      | Prev | Play | Next | BTab |  Tab |      |      |      |      |      |
724  * |------+------+------+------+------+------+------+------+------+------+------+------|
725  * |      |      |      |      |      |      |      |      |      |      |      |      |
726  * `-----------------------------------------------------------------------------------'
727  */
728 [_GUI] = KEYMAP(
729   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,
730   KC_ESC,  XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU,S(KC_TAB),KC_TAB,  KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
731   XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, KC_SPC,  KC_SPC,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
732   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
733 ),
734
735 /* Sys
736  * ,-----------------------------------------------------------------------------------.
737  * |      |Qwerty| Win  |      |Reset |      |      | USB  |      |      |      |      |
738  * |------+------+------+------+------+-------------+------+------+------+------+------|
739  * |      |Audio |      |Dvorak|      | Glow |      |      |WorkMn|Linux |      |      |
740  * |------+------+------+------+------+------+------+------+------+------+------+------|
741  * |      |      |      |Colmak|      | BLE  |Norman|MacOS |      |      |      |      |
742  * |------+------+------+------+------+------+------+------+------+------+------+------|
743  * |      |      |      |      |      |      |      |      |      |      |      |      |
744  * `-----------------------------------------------------------------------------------'
745  */
746 [_SYS] = KEYMAP(
747   XXXXXXX, QWERTY,  WIN,     XXXXXXX, RESET,   XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
748   XXXXXXX, AUDIO,   XXXXXXX, DVORAK,  XXXXXXX, GLOW,    XXXXXXX, XXXXXXX, WORKMAN, LINUX,   XXXXXXX, XXXXXXX,
749   XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BLE, NORMAN,  OSX,     XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
750   _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______
751 ),
752
753 };
754
755 void persistant_default_layer_set(uint16_t default_layer) {
756   eeconfig_update_default_layer(default_layer);
757   default_layer_set(default_layer);
758 }
759
760 #ifdef DOUBLESPACE_LAYER_ENABLE
761 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
762   if (pressed) {
763     *isactive = true;
764     if (*otheractive) {
765       layer_on(_SPACE);
766       register_code(KC_LALT);  // sends alt and enter layer
767       space_layer_entered = true;
768     }
769   } else {
770     *isactive = false;
771     if (space_layer_entered) {
772       unregister_code(KC_LALT);  // release alt and exit layer
773       layer_off(_SPACE);
774       if (!*otheractive) {
775         space_layer_entered = false;
776       }
777     } else {
778       if (!*isemitted) {
779         register_code(KC_SPC);
780         unregister_code(KC_SPC);
781       }
782       *isemitted = false;
783     }
784   }
785 }
786 #endif
787
788 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
789   bool lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
790   bool rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
791   uint8_t layer = biton32(layer_state);
792
793 #ifdef DOUBLESPACE_LAYER_ENABLE
794   // double-space: send space immediately if any other key depressed before space is released
795   if ((lspace_active ^ rspace_active)
796       && keycode != LSPACE
797       && keycode != RSPACE
798       && record->event.pressed)
799   {
800     if (lspace_active) {
801       if (!lspace_emitted) {
802         register_code(KC_SPC);
803         unregister_code(KC_SPC);
804       }
805       lspace_emitted = true;
806     }
807     if (rspace_active) {
808       if (!rspace_emitted) {
809         register_code(KC_SPC);
810         unregister_code(KC_SPC);
811       }
812       rspace_emitted = true;
813     }
814   }
815
816   if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
817     if (record->event.pressed) {
818       unregister_code(KC_LALT);
819     } else {
820       register_code(KC_LALT);
821     }
822   }
823 #endif
824
825   switch (keycode) {
826
827 #ifdef DOUBLESPACE_LAYER_ENABLE
828     // double-space enter space layer
829     case LSPACE:
830       process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
831       return false;
832       break;
833     case RSPACE:
834       process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
835       return false;
836       break;
837 #endif
838
839     // handle greek layer shift
840     // handle both shift = capslock
841     case KC_LSFT:
842     case KC_RSFT:
843       ;
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 }