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