2 Copyright 2017 Priyadi Iman Nurcahyo
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 2 of the License, or
7 (at your option) any later version.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12 You should have received a copy of the GNU General Public License
13 along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #if defined(PRIYADI_PROMETHIUM)
17 #include "promethium.h"
18 #elif defined(PRIYADI_PLANCK)
21 #error "no keyboard defined"
24 #include "action_layer.h"
27 #include "musical_notes.h"
30 #include "process_unicode.h"
35 #ifdef PS2_MOUSE_ENABLE
36 #include "ps2_mouse.h"
39 #ifdef FAUXCLICKY_ENABLE
40 #include "fauxclicky.h"
42 #include "outputselect.h"
44 #define COUNT(x) (sizeof (x) / sizeof (*(x)))
46 // Fillers to make layering clearer
47 #define _______ KC_TRNS
50 #define KC_WWWB KC_WWW_BACK
51 #define KC_WWWF KC_WWW_FORWARD
53 // hybrid right-alt & scroll lock (mapped to Compose in OS)
54 #define C_RALT MT(MOD_RALT, KC_SLCK)
56 // dual use right-shift & del key
57 // #define C_RSFT MT(MOD_RSFT, KC_DEL)
59 bool capslock = false;
60 #ifdef DOUBLESPACE_LAYER_ENABLE
61 bool lspace_active = false;
62 bool rspace_active = false;
63 bool lspace_emitted = false;
64 bool rspace_emitted = false;
65 bool space_layer_entered = false;
74 uint8_t glow_mode = GLOW_MIN;
76 void turn_off_capslock(void);
77 extern keymap_config_t keymap_config;
79 // layers, ordering is important!
86 _DEFAULT_LAYER_MAX = _NORMAN,
101 // double-space layer
104 enum planck_keycodes {
128 #ifndef FAUXCLICKY_ENABLE
131 #ifndef ADAFRUIT_BLE_ENABLE
137 #define EMPTY MO(_EMPTY)
140 #define FUN0 LT(_FUN, KC_0)
145 GRIN, // grinning face 😊
146 TJOY, // tears of joy 😂
147 SMILE, // grining face with smiling eyes 😁
149 EYERT, // smiling face with heart shaped eyes 😍
150 CRY, // crying face 😭
151 SMEYE, // smiling face with smiling eyes 😊
154 HART2, // two hearts 💕
156 OKHND, // ok hand sign 👌
162 THMDN, // thumb down 👎
165 MUSIC, // musical notes
167 CELEB, // celebration 🙌
168 CRY2, // crying face 😢
169 COOL, // smile with sunglasses 😎
170 NOEVS, // see no evil
171 NOEVH, // hear no evil
172 NOEVK, // speak no evil
176 BHART, // broken heart
177 SLEEP, // sleeping face
178 SMIL2, // smiling face with open mouth & sweat
181 TONGU, // face with tongue & winking eye
182 DISAP, // disappointed
183 YUMMY, // face savoring delicious food
184 CLAP, // hand clapping
185 FEAR, // face screaming in fear
186 HORNS, // smiling face with horns
187 HALO, // smiling face with halo
252 const uint32_t PROGMEM unicode_map[] = {
353 [LTEQ] = 0x2264, // less than or equal
354 [GTEQ] = 0x2265, // greater than or equal
355 [NOTEQ] = 0x2260, // not equal
356 [PLMIN] = 0xB1, // plus minus
362 const uint8_t PROGMEM LED_ALNUM[] = {
397 const uint8_t PROGMEM LED_HOMING[] = {
408 const uint8_t PROGMEM LED_MODS[] = {
423 const uint8_t PROGMEM LED_FN[] = {
430 const uint8_t PROGMEM LED_INDICATORS[] = {
439 const uint8_t PROGMEM LED_TRACKPOINT[] = {
445 void led_turnoff_keys(void) {
446 for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
447 rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 0, 0, 0);
449 for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
450 rgbsps_set(pgm_read_byte(&LED_MODS[i]), 0, 0, 0);
452 for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
453 rgbsps_set(pgm_read_byte(&LED_FN[i]), 0, 0, 0);
457 void led_reset(void) {
464 for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
465 rgbsps_set(pgm_read_byte(&LED_HOMING[i]), 8, 8, 8);
467 rgbsps_set(LED_F, 15, 0, 0);
468 rgbsps_set(LED_J, 15, 0, 0);
471 for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
472 rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 8, 8, 8);
474 for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
475 rgbsps_set(pgm_read_byte(&LED_MODS[i]), 0, 15, 0);
477 for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
478 rgbsps_set(pgm_read_byte(&LED_FN[i]), 0, 0, 15);
480 for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
481 rgbsps_set(pgm_read_byte(&LED_HOMING[i]), 15, 0, 0);
483 rgbsps_set(LED_F, 15, 15, 0);
484 rgbsps_set(LED_J, 15, 15, 0);
489 void led_set_layer_indicator(void) {
490 static uint8_t oldlayer = 255;
492 rgbsps_set(LED_IND_FUN, 0, 0, 0);
493 // rgbsps_set(LED_IND_NUM, 0, 0, 0);
494 rgbsps_set(LED_IND_EMOJI, 0, 0, 0);
498 uint8_t layer = biton32(layer_state);
499 if (oldlayer == layer) {
505 if (layer <= _DEFAULT_LAYER_MAX) {
512 rgbsps_set(LED_IND_FUN, 15, 0, 0);
515 // rgbsps_set(LED_IND_NUM, 0, 0, 15);
518 rgbsps_set(LED_IND_EMOJI, 15, 15, 0);
521 rgbsps_set(LED_IND_FUN, 3, 3, 3);
522 // rgbsps_set(LED_IND_NUM, 3, 3, 3);
523 rgbsps_set(LED_IND_EMOJI, 3, 3, 3);
529 void led_set_output_ble(void) {
530 rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 15);
531 rgbsps_set(LED_IND_USB, 0, 0, 0);
535 void led_set_output_usb(void) {
536 rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0);
537 rgbsps_set(LED_IND_USB, 15, 15, 15);
541 void led_set_output_none(void) {
542 rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0);
543 rgbsps_set(LED_IND_USB, 0, 0, 0);
547 void led_init(void) {
551 // set trackpoint color
552 rgbsps_set(LED_TRACKPOINT1, 15, 0, 0);
553 rgbsps_set(LED_TRACKPOINT2, 0, 0, 15);
554 rgbsps_set(LED_TRACKPOINT3, 15, 0, 0);
556 #endif // RGBSPS_ENABLE
560 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
563 * ,-----------------------------------------------------------------------------------.
564 * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
565 * |------+------+------+------+------+-------------+------+------+------+------+------|
566 * | Esc | A | S | D | F | G | H | J | K | L | ' |Enter |
567 * |------+------+------+------+------+------|------+------+------+------+------+------|
568 * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift |
569 * |------+------+------+------+------+------+------+------+------+------+------+------|
570 * | Ctrl | Alt | GUI | Punc | Num | Space | Fun |Greek | GUI |AltGr | Ctrl |
571 * `-----------------------------------------------------------------------------------'
574 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
575 KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT ,
576 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
577 KC_LCTL, KC_LALT, KC_LGUI, EMPTY, NUM, LSPACE, RSPACE, FUN, GREEK, KC_RGUI, C_RALT, KC_RCTL,
578 _______, _______, _______
582 * ,-----------------------------------------------------------------------------------.
583 * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp |
584 * |------+------+------+------+------+-------------+------+------+------+------+------|
585 * | Esc | A | O | E | U | I | D | H | T | N | S |Enter |
586 * |------+------+------+------+------+------|------+------+------+------+------+------|
587 * | Shift| / | Q | J | K | X | B | M | W | V | Z |Shift |
588 * |------+------+------+------+------+------+------+------+------+------+------+------|
589 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
590 * `-----------------------------------------------------------------------------------'
594 _______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, _______,
595 _______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, _______,
596 _______, KC_SLSH, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______,
597 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
598 _______, _______, _______
603 * ,-----------------------------------------------------------------------------------.
604 * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
605 * |------+------+------+------+------+-------------+------+------+------+------+------|
606 * | Esc | A | R | S | T | D | H | N | E | I | O |Enter |
607 * |------+------+------+------+------+------|------+------+------+------+------+------|
608 * | Shift| Z | X | C | V | B | K | M | , | . | / |Shift |
609 * |------+------+------+------+------+------+------+------+------+------+------+------|
610 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
611 * `-----------------------------------------------------------------------------------'
614 #ifdef LAYOUT_COLEMAK
616 _______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, _______,
617 _______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, _______,
618 _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
619 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
620 _______, _______, _______
625 * ,-----------------------------------------------------------------------------------.
626 * | Tab | Q | W | D | F | K | J | U | R | L | ; | Bksp |
627 * |------+------+------+------+------+-------------+------+------+------+------+------|
628 * | Esc | A | S | E | T | G | Y | N | I | O | H |Enter |
629 * |------+------+------+------+------+------|------+------+------+------+------+------|
630 * | Shift| Z | X | C | V | B | P | M | , | . | / |Shift |
631 * |------+------+------+------+------+------+------+------+------+------+------+------|
632 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
633 * `-----------------------------------------------------------------------------------'
638 _______, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_J, KC_U, KC_R, KC_L, KC_QUOT, _______,
639 _______, KC_A, KC_S, KC_E, KC_T, KC_G, KC_Y, KC_N, KC_I, KC_O, KC_H, _______,
640 _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
641 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
642 _______, _______, _______
647 * ,-----------------------------------------------------------------------------------.
648 * | Tab | Q | D | R | W | B | J | F | U | P | ; | Bksp |
649 * |------+------+------+------+------+-------------+------+------+------+------+------|
650 * | Esc | A | S | H | T | G | Y | N | E | O | I |Enter |
651 * |------+------+------+------+------+------|------+------+------+------+------+------|
652 * | Shift| Z | X | M | C | V | K | K | , | . | / |Shift |
653 * |------+------+------+------+------+------+------+------+------+------+------+------|
654 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
655 * `-----------------------------------------------------------------------------------'
658 #ifdef LAYOUT_WORKMAN
660 _______, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_QUOT, _______,
661 _______, KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, _______,
662 _______, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, _______,
663 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
664 _______, _______, _______
669 * ,-----------------------------------------------------------------------------------.
670 * | ~ | ! | @ | # | $ | % | ^ | & | * | ≤ | ≥ | ` |
671 * |------+------+------+------+------+-------------+------+------+------+------+------|
672 * | | * | \ | - | = | / | ≠ | ( | ) | < | > | |
673 * |------+------+------+------+------+------|------+------+------+------+------+------|
674 * | & | ^ | | | _ | + | ? | ± | [ | ] | { | } | |
675 * |------+------+------+------+------+------+------+------+------+------+------+------|
676 * | | | | | | | | | | : | |
677 * `-----------------------------------------------------------------------------------'
680 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, X(LTEQ), X(GTEQ), _______,
681 KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, X(NOTEQ),KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
682 KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, X(PLMIN),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______,
683 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______,
684 _______, _______, _______
688 * ,-----------------------------------------------------------------------------------.
689 * | ~ | ! | @ | # | $ | % | A | 7 | 8 | 9 | D | |
690 * |------+------+------+------+------+-------------+------+------+------+------+------|
691 * | ` | * | \ | - | = | / | B | 4 | 5 | 6 | E | |
692 * |------+------+------+------+------+------|------+------+------+------+------+------|
693 * | & | ^ | | | _ | + | ? | C | 1 | 2 | 3 | F | |
694 * |------+------+------+------+------+------+------+------+------+------+------+------|
695 * | | | x | | | | | 0 | , | . | : | |
696 * `-----------------------------------------------------------------------------------'
699 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, S(KC_A), KC_1, KC_2, KC_3, S(KC_D), _______,
700 KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, S(KC_B), KC_4, KC_5, KC_6, S(KC_E), _______,
701 KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C), KC_7, KC_8, KC_9, S(KC_F), _______,
702 _______, _______, KC_X, _______, _______, _______, _______, FUN0 , KC_COMM, KC_DOT, KC_COLN, _______,
703 _______, _______, _______
707 * ,-----------------------------------------------------------------------------------.
708 * | | F1 | F2 | F3 | F4 | Ins | | PgUp | Up | PgDn | PgUp | |
709 * |------+------+------+------+------+-------------+------+------+------+------+------|
710 * | Caps | F5 | F6 | F7 | F8 |PrtSc | | Left | Down | Right| PgDn | |
711 * |------+------+------+------+------+------|------+------+------+------+------+------|
712 * | | F9 | F10 | F11 | F12 |Pause | | | Home | End | | |
713 * |------+------+------+------+------+------+------+------+------+------+------+------|
714 * | | | | | | | | | | | |
715 * `-----------------------------------------------------------------------------------'
718 XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_INS, XXXXXXX, KC_PGUP, KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
719 KC_CAPS, KC_F5, KC_F6, KC_F7, KC_F8, KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
720 _______, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUS, XXXXXXX, XXXXXXX, KC_HOME, KC_END, XXXXXXX, _______,
721 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
722 _______, _______, _______
726 * ,-----------------------------------------------------------------------------------.
727 * | | | | | | | | | | | | |
728 * |------+------+------+------+------+-------------+------+------+------+------+------|
729 * | | | | | | | | | | | | |
730 * |------+------+------+------+------+------+------+------+------+------+------+------|
731 * | | | | | | | | | | | | |
732 * |------+------+------+------+------+------+------+------+------+------+------+------|
733 * | | | | | | | | | | | | |
734 * `-----------------------------------------------------------------------------------'
737 _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC), X(UPI), _______,
738 _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA), X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
739 _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA), X(UNU), X(UMU), KC_COMM, KC_DOT, KC_SLSH, _______,
740 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
741 _______, _______, _______
745 * ,-----------------------------------------------------------------------------------.
746 * | | | | | | | | | | | | |
747 * |------+------+------+------+------+-------------+------+------+------+------+------|
748 * | | | | | | | | | | | | |
749 * |------+------+------+------+------+------+------+------+------+------+------+------|
750 * | | | | | | | | | | | | |
751 * |------+------+------+------+------+------+------+------+------+------+------+------|
752 * | | | | | | | | | | | | |
753 * `-----------------------------------------------------------------------------------'
756 _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC), X(LPI), _______,
757 _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA), X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
758 _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA), X(LNU), X(LMU), KC_COMM, KC_DOT, KC_SLSH, _______,
759 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
760 _______, _______, _______
764 * ,-----------------------------------------------------------------------------------.
765 * | | | | | | | | | | | | |
766 * |------+------+------+------+------+-------------+------+------+------+------+------|
767 * | | | | | | | | | | | | |
768 * |------+------+------+------+------+------+------+------+------+------+------+------|
769 * | | | | | | | | | | | | |
770 * |------+------+------+------+------+------+------+------+------+------+------+------|
771 * | | | | | | | | | | | | |
772 * `-----------------------------------------------------------------------------------'
775 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
776 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
777 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
778 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
779 _______, _______, _______
783 * ,-----------------------------------------------------------------------------------.
784 * | | | | | | | | | | | | |
785 * |------+------+------+------+------+-------------+------+------+------+------+------|
786 * | | | | | | | | | | | | |
787 * |------+------+------+------+------+------+------+------+------+------+------+------|
788 * | | | | | | | | | | | | |
789 * |------+------+------+------+------+------+------+------+------+------+------+------|
790 * | | | | | | | | | | | | |
791 * `-----------------------------------------------------------------------------------'
794 X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
795 X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART), X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
796 X(THMDN),X(SLEEP), X(CLAP), X(CRY), X(VIC),X(BHART), X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
797 X(POO), X(EYES), X(HUNRD),_______, X(SKULL),X(HORNS), X(HALO), X(FEAR),_______,X(YUMMY),X(DISAP),X(NOEVK),
798 _______, _______, _______
802 * ,-----------------------------------------------------------------------------------.
803 * | | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | |
804 * |------+------+------+------+------+-------------+------+------+------+------+------|
805 * | Esc | | Btab | Esc | Tab | | | Prev | | Next | | |
806 * |------+------+------+------+------+------+------+------+------+------+------+------|
807 * | | | Prev | Play | Next | | | | | | | |
808 * |------+------+------+------+------+------+------+------+------+------+------+------|
809 * | | | | | | | | | | | | |
810 * `-----------------------------------------------------------------------------------'
813 XXXXXXX, G(KC_1), G(KC_2), G(KC_3), G(KC_4), G(KC_5), G(KC_6), G(KC_7), G(KC_8), G(KC_9), G(KC_0), XXXXXXX,
814 KC_ESC, XXXXXXX, S(KC_TAB),KC_ESC, KC_TAB, XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
815 XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, KC_SPC, KC_SPC, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
816 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
817 _______, _______, _______
821 * ,-----------------------------------------------------------------------------------.
822 * | |Qwerty| Win | |Reset | | | USB | | | | |
823 * |------+------+------+------+------+-------------+------+------+------+------+------|
824 * | |Audio | |Dvorak| | Glow | | |WorkMn|Linux | | |
825 * |------+------+------+------+------+------+------+------+------+------+------+------|
826 * | | | |Colmak| | BLE |Norman|MacOS | | | | |
827 * |------+------+------+------+------+------+------+------+------+------+------+------|
828 * | | | | | | | | | | | | |
829 * `-----------------------------------------------------------------------------------'
832 DEBUG, QWERTY, WIN, XXXXXXX, RESET, XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
833 XXXXXXX, FC_TOG, XXXXXXX, DVORAK, XXXXXXX, GLOW, XXXXXXX, XXXXXXX, WORKMAN, LINUX, XXXXXXX, XXXXXXX,
834 XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BLE, NORMAN, OSX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
835 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
836 _______, _______, _______
842 void persistant_default_layer_set(uint16_t default_layer) {
843 eeconfig_update_default_layer(default_layer);
844 default_layer_set(default_layer);
847 #ifdef DOUBLESPACE_LAYER_ENABLE
848 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
853 register_code(KC_LALT); // sends alt and enter layer
854 space_layer_entered = true;
858 if (space_layer_entered) {
859 unregister_code(KC_LALT); // release alt and exit layer
862 space_layer_entered = false;
866 register_code(KC_SPC);
867 unregister_code(KC_SPC);
875 uint32_t layer_state_set_kb(uint32_t state)
877 // turn on punc layer if both fun & num are on
878 if ((state & ((1UL<<_NUM) | (1UL<<_FUN))) == ((1UL<<_NUM) | (1UL<<_FUN))) {
879 state |= (1UL<<_PUNC);
881 state &= ~(1UL<<_PUNC);
884 // turn on emoji layer if empty and greek layer are on
886 (state & ((1UL<<_EMPTY) | (1UL<<_GREEKU))) == ((1UL<<_EMPTY) | (1UL<<_GREEKU))
887 || (state & ((1UL<<_EMPTY) | (1UL<<_GREEKL))) == ((1UL<<_EMPTY) | (1UL<<_GREEKL))
889 state |= (1UL<<_EMOJI);
891 state &= ~(1UL<<_EMOJI);
896 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
897 static bool lshift = false;
898 static bool rshift = false;
899 static uint8_t layer = 0;
901 lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
902 rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
903 layer = biton32(layer_state);
905 #ifdef DOUBLESPACE_LAYER_ENABLE
906 // double-space: send space immediately if any other key depressed before space is released
907 if ((lspace_active ^ rspace_active)
910 && record->event.pressed)
913 if (!lspace_emitted) {
914 register_code(KC_SPC);
915 unregister_code(KC_SPC);
917 lspace_emitted = true;
920 if (!rspace_emitted) {
921 register_code(KC_SPC);
922 unregister_code(KC_SPC);
924 rspace_emitted = true;
928 if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
929 if (record->event.pressed) {
930 unregister_code(KC_LALT);
932 register_code(KC_LALT);
939 #ifdef DOUBLESPACE_LAYER_ENABLE
940 // double-space enter space layer
942 process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
946 process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
951 // handle greek layer shift
955 if (layer == _GREEKU || layer == _GREEKL) {
956 if (record->event.pressed) {
960 if (lshift ^ rshift) { // if only one shift was pressed
969 // press both ctrls to activate SYS layer
973 bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
974 bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
975 if (record->event.pressed) {
976 if (lctrl ^ rctrl) { // if only one ctrl was pressed
985 // QWERTZ style comma and dot: semicolon and colon when shifted
987 if (record->event.pressed) {
988 if (lshift || rshift) {
989 if (lshift) unregister_code(KC_LSFT);
990 if (rshift) unregister_code(KC_RSFT);
991 register_code(KC_SCLN);
992 unregister_code(KC_SCLN);
993 if (lshift) register_code(KC_LSFT);
994 if (rshift) register_code(KC_RSFT);
996 register_code(KC_COMM);
997 unregister_code(KC_COMM);
1003 if (record->event.pressed) {
1004 if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
1005 register_code(KC_SCLN);
1006 unregister_code(KC_SCLN);
1008 register_code(KC_DOT);
1009 unregister_code(KC_DOT);
1017 if (record->event.pressed) {
1018 persistant_default_layer_set(1UL<<_QWERTY);
1022 #ifdef LAYOUT_DVORAK
1024 if (record->event.pressed) {
1025 persistant_default_layer_set(1UL<<_DVORAK);
1030 #ifdef LAYOUT_COLEMAK
1032 if (record->event.pressed) {
1033 persistant_default_layer_set(1UL<<_COLEMAK);
1038 #ifdef LAYOUT_WORKMAN
1040 if (record->event.pressed) {
1041 persistant_default_layer_set(1UL<<_WORKMAN);
1046 #ifdef LAYOUT_NORMAN
1048 if (record->event.pressed) {
1049 persistant_default_layer_set(1UL<<_NORMAN);
1055 // only process Fnumber on key release, and only when layer switcher is still pressed.
1056 // this is to avoid accidental presses on potentially destructive keys
1057 case KC_F1 ... KC_F12:
1061 if (!record->event.pressed && layer == _FUN) { // key released and still in FUN layer
1062 register_code(keycode);
1063 unregister_code(keycode);
1071 if (record->event.pressed) {
1072 if (lshift || rshift) {
1088 set_unicode_input_mode(UC_LNX);
1092 set_unicode_input_mode(UC_WINC);
1096 set_unicode_input_mode(UC_OSX);
1100 // glow mode changer
1101 #ifdef RGBSPS_ENABLE
1103 if (record->event.pressed) {
1105 if (glow_mode > GLOW_FULL) {
1106 glow_mode = GLOW_NONE;
1115 // faux clicky indicator
1116 #ifdef FAUXCLICKY_ENABLE
1125 void set_output_user(uint8_t output) {
1126 #ifdef ADAFRUIT_BLE_ENABLE
1129 led_set_output_usb();
1131 case OUTPUT_ADAFRUIT_BLE:
1132 led_set_output_ble();
1135 led_set_output_none();
1140 void matrix_init_user() {
1141 _delay_ms(500); // give time for usb to initialize
1143 set_unicode_input_mode(UC_LNX);
1145 #ifdef RGBSPS_ENABLE
1149 // auto detect output on init
1150 #ifdef ADAFRUIT_BLE_ENABLE
1151 uint8_t output = auto_detect_output();
1152 if (output == OUTPUT_USB) {
1153 set_output(OUTPUT_USB);
1155 set_output(OUTPUT_ADAFRUIT_BLE);
1160 void turn_off_capslock() {
1162 register_code(KC_CAPS);
1163 unregister_code(KC_CAPS);
1167 #ifdef RGBSPS_ENABLE
1168 void matrix_scan_user(void) {
1169 led_set_layer_indicator();
1172 void battery_poll(uint8_t level) {
1173 rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15);
1177 void led_set_user(uint8_t usb_led) {
1178 bool new_capslock = usb_led & (1<<USB_LED_CAPS_LOCK);
1179 if (new_capslock ^ capslock) { // capslock state is different
1180 if ((capslock = new_capslock)) {
1181 rgbsps_set(LED_IND_NUM, 15, 0, 0);
1183 rgbsps_set(LED_IND_NUM, 0, 0, 0);
1190 #ifdef PS2_MOUSE_ENABLE
1191 void ps2_mouse_init_user() {
1194 // set TrackPoint sensitivity
1195 PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
1196 PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
1197 PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
1198 PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
1200 // set TrackPoint Negative Inertia factor
1201 PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
1202 PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
1203 PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
1204 PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
1206 // set TrackPoint speed
1207 // (transfer function upper plateau speed)
1208 PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
1209 PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
1210 PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
1211 PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
1213 // inquire pts status
1214 rcv = ps2_host_send(0xE2);
1215 rcv = ps2_host_send(0x2C);
1216 rcv = ps2_host_recv_response();
1217 if ((rcv & 1) == 1) {
1218 // if on, disable pts
1219 rcv = ps2_host_send(0xE2);
1220 rcv = ps2_host_send(0x47);
1221 rcv = ps2_host_send(0x2C);
1222 rcv = ps2_host_send(0x01);