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
581 * ,-----------------------------------------------------------------------------------.
582 * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp |
583 * |------+------+------+------+------+-------------+------+------+------+------+------|
584 * | Esc | A | O | E | U | I | D | H | T | N | S |Enter |
585 * |------+------+------+------+------+------|------+------+------+------+------+------|
586 * | Shift| / | Q | J | K | X | B | M | W | V | Z |Shift |
587 * |------+------+------+------+------+------+------+------+------+------+------+------|
588 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
589 * `-----------------------------------------------------------------------------------'
593 _______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, _______,
594 _______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, _______,
595 _______, KC_SLSH, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______,
596 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
601 * ,-----------------------------------------------------------------------------------.
602 * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
603 * |------+------+------+------+------+-------------+------+------+------+------+------|
604 * | Esc | A | R | S | T | D | H | N | E | I | O |Enter |
605 * |------+------+------+------+------+------|------+------+------+------+------+------|
606 * | Shift| Z | X | C | V | B | K | M | , | . | / |Shift |
607 * |------+------+------+------+------+------+------+------+------+------+------+------|
608 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
609 * `-----------------------------------------------------------------------------------'
612 #ifdef LAYOUT_COLEMAK
614 _______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, _______,
615 _______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, _______,
616 _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
617 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
622 * ,-----------------------------------------------------------------------------------.
623 * | Tab | Q | W | D | F | K | J | U | R | L | ; | Bksp |
624 * |------+------+------+------+------+-------------+------+------+------+------+------|
625 * | Esc | A | S | E | T | G | Y | N | I | O | H |Enter |
626 * |------+------+------+------+------+------|------+------+------+------+------+------|
627 * | Shift| Z | X | C | V | B | P | M | , | . | / |Shift |
628 * |------+------+------+------+------+------+------+------+------+------+------+------|
629 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
630 * `-----------------------------------------------------------------------------------'
635 _______, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_J, KC_U, KC_R, KC_L, KC_QUOT, _______,
636 _______, KC_A, KC_S, KC_E, KC_T, KC_G, KC_Y, KC_N, KC_I, KC_O, KC_H, _______,
637 _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
638 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
643 * ,-----------------------------------------------------------------------------------.
644 * | Tab | Q | D | R | W | B | J | F | U | P | ; | Bksp |
645 * |------+------+------+------+------+-------------+------+------+------+------+------|
646 * | Esc | A | S | H | T | G | Y | N | E | O | I |Enter |
647 * |------+------+------+------+------+------|------+------+------+------+------+------|
648 * | Shift| Z | X | M | C | V | K | K | , | . | / |Shift |
649 * |------+------+------+------+------+------+------+------+------+------+------+------|
650 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
651 * `-----------------------------------------------------------------------------------'
654 #ifdef LAYOUT_WORKMAN
656 _______, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_QUOT, _______,
657 _______, KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, _______,
658 _______, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, _______,
659 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
664 * ,-----------------------------------------------------------------------------------.
665 * | ~ | ! | @ | # | $ | % | ^ | & | * | ≤ | ≥ | ` |
666 * |------+------+------+------+------+-------------+------+------+------+------+------|
667 * | | * | \ | - | = | / | ≠ | ( | ) | < | > | |
668 * |------+------+------+------+------+------|------+------+------+------+------+------|
669 * | & | ^ | | | _ | + | ? | ± | [ | ] | { | } | |
670 * |------+------+------+------+------+------+------+------+------+------+------+------|
671 * | | | | | | | | | | : | |
672 * `-----------------------------------------------------------------------------------'
675 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, X(LTEQ), X(GTEQ), _______,
676 KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, X(NOTEQ),KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
677 KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, X(PLMIN),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______,
678 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______
682 * ,-----------------------------------------------------------------------------------.
683 * | ~ | ! | @ | # | $ | % | A | 7 | 8 | 9 | D | |
684 * |------+------+------+------+------+-------------+------+------+------+------+------|
685 * | ` | * | \ | - | = | / | B | 4 | 5 | 6 | E | |
686 * |------+------+------+------+------+------|------+------+------+------+------+------|
687 * | & | ^ | | | _ | + | ? | C | 1 | 2 | 3 | F | |
688 * |------+------+------+------+------+------+------+------+------+------+------+------|
689 * | | | x | | | | | 0 | , | . | : | |
690 * `-----------------------------------------------------------------------------------'
693 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, S(KC_A), KC_7, KC_8, KC_9, S(KC_D), _______,
694 KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, S(KC_B), KC_4, KC_5, KC_6, S(KC_E), _______,
695 KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C), KC_1, KC_2, KC_3, S(KC_F), _______,
696 _______, _______, KC_X, _______, _______, _______, _______, FUN0 , KC_COMM, KC_DOT, KC_COLN, _______
700 * ,-----------------------------------------------------------------------------------.
701 * | | F1 | F2 | F3 | F4 | Ins | | PgUp | Up | PgDn | PgUp | |
702 * |------+------+------+------+------+-------------+------+------+------+------+------|
703 * | Caps | F5 | F6 | F7 | F8 |PrtSc | | Left | Down | Right| PgDn | |
704 * |------+------+------+------+------+------|------+------+------+------+------+------|
705 * | | F9 | F10 | F11 | F12 |Pause | | | Home | End | | |
706 * |------+------+------+------+------+------+------+------+------+------+------+------|
707 * | | | | | | | | | | | |
708 * `-----------------------------------------------------------------------------------'
711 XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_INS, XXXXXXX, KC_PGUP, KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
712 KC_CAPS, KC_F5, KC_F6, KC_F7, KC_F8, KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
713 _______, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUS, XXXXXXX, XXXXXXX, KC_HOME, KC_END, XXXXXXX, _______,
714 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
718 * ,-----------------------------------------------------------------------------------.
719 * | | | | | | | | | | | | |
720 * |------+------+------+------+------+-------------+------+------+------+------+------|
721 * | | | | | | | | | | | | |
722 * |------+------+------+------+------+------+------+------+------+------+------+------|
723 * | | | | | | | | | | | | |
724 * |------+------+------+------+------+------+------+------+------+------+------+------|
725 * | | | | | | | | | | | | |
726 * `-----------------------------------------------------------------------------------'
729 _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC), X(UPI), _______,
730 _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA), X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
731 _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA), X(UNU), X(UMU), KC_COMM, KC_DOT, KC_SLSH, _______,
732 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
736 * ,-----------------------------------------------------------------------------------.
737 * | | | | | | | | | | | | |
738 * |------+------+------+------+------+-------------+------+------+------+------+------|
739 * | | | | | | | | | | | | |
740 * |------+------+------+------+------+------+------+------+------+------+------+------|
741 * | | | | | | | | | | | | |
742 * |------+------+------+------+------+------+------+------+------+------+------+------|
743 * | | | | | | | | | | | | |
744 * `-----------------------------------------------------------------------------------'
747 _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC), X(LPI), _______,
748 _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA), X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
749 _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA), X(LNU), X(LMU), KC_COMM, KC_DOT, KC_SLSH, _______,
750 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
754 * ,-----------------------------------------------------------------------------------.
755 * | | | | | | | | | | | | |
756 * |------+------+------+------+------+-------------+------+------+------+------+------|
757 * | | | | | | | | | | | | |
758 * |------+------+------+------+------+------+------+------+------+------+------+------|
759 * | | | | | | | | | | | | |
760 * |------+------+------+------+------+------+------+------+------+------+------+------|
761 * | | | | | | | | | | | | |
762 * `-----------------------------------------------------------------------------------'
765 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
766 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
767 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
768 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
772 * ,-----------------------------------------------------------------------------------.
773 * | | | | | | | | | | | | |
774 * |------+------+------+------+------+-------------+------+------+------+------+------|
775 * | | | | | | | | | | | | |
776 * |------+------+------+------+------+------+------+------+------+------+------+------|
777 * | | | | | | | | | | | | |
778 * |------+------+------+------+------+------+------+------+------+------+------+------|
779 * | | | | | | | | | | | | |
780 * `-----------------------------------------------------------------------------------'
783 X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
784 X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART), X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
785 X(THMDN),X(SLEEP), X(CLAP), X(CRY), X(VIC),X(BHART), X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
786 X(POO), X(EYES), X(HUNRD),_______, X(SKULL),X(HORNS), X(HALO), X(FEAR),_______,X(YUMMY),X(DISAP),X(NOEVK)
790 * ,-----------------------------------------------------------------------------------.
791 * | | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | |
792 * |------+------+------+------+------+-------------+------+------+------+------+------|
793 * | Esc | | Btab | Esc | Tab | | | Prev | | Next | | |
794 * |------+------+------+------+------+------+------+------+------+------+------+------|
795 * | | | Prev | Play | Next | | | | | | | |
796 * |------+------+------+------+------+------+------+------+------+------+------+------|
797 * | | | | | | | | | | | | |
798 * `-----------------------------------------------------------------------------------'
801 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,
802 KC_ESC, XXXXXXX, S(KC_TAB),KC_ESC, KC_TAB, XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
803 XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, KC_SPC, KC_SPC, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
804 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
808 * ,-----------------------------------------------------------------------------------.
809 * | |Qwerty| Win | |Reset | | | USB | | | | |
810 * |------+------+------+------+------+-------------+------+------+------+------+------|
811 * | |Audio | |Dvorak| | Glow | | |WorkMn|Linux | | |
812 * |------+------+------+------+------+------+------+------+------+------+------+------|
813 * | | | |Colmak| | BLE |Norman|MacOS | | | | |
814 * |------+------+------+------+------+------+------+------+------+------+------+------|
815 * | | | | | | | | | | | | |
816 * `-----------------------------------------------------------------------------------'
819 XXXXXXX, QWERTY, WIN, XXXXXXX, RESET, XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
820 XXXXXXX, FC_TOG, XXXXXXX, DVORAK, XXXXXXX, GLOW, XXXXXXX, XXXXXXX, WORKMAN, LINUX, XXXXXXX, XXXXXXX,
821 XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BLE, NORMAN, OSX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
822 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______
828 void persistant_default_layer_set(uint16_t default_layer) {
829 eeconfig_update_default_layer(default_layer);
830 default_layer_set(default_layer);
833 #ifdef DOUBLESPACE_LAYER_ENABLE
834 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
839 register_code(KC_LALT); // sends alt and enter layer
840 space_layer_entered = true;
844 if (space_layer_entered) {
845 unregister_code(KC_LALT); // release alt and exit layer
848 space_layer_entered = false;
852 register_code(KC_SPC);
853 unregister_code(KC_SPC);
861 uint32_t layer_state_set_kb(uint32_t state)
863 // turn on punc layer if both fun & num are on
864 if ((state & ((1UL<<_NUM) | (1UL<<_FUN))) == ((1UL<<_NUM) | (1UL<<_FUN))) {
865 state |= (1UL<<_PUNC);
867 state &= ~(1UL<<_PUNC);
870 // turn on emoji layer if empty and greek layer are on
872 (state & ((1UL<<_EMPTY) | (1UL<<_GREEKU))) == ((1UL<<_EMPTY) | (1UL<<_GREEKU))
873 || (state & ((1UL<<_EMPTY) | (1UL<<_GREEKL))) == ((1UL<<_EMPTY) | (1UL<<_GREEKL))
875 state |= (1UL<<_EMOJI);
877 state &= ~(1UL<<_EMOJI);
882 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
883 static bool lshift = false;
884 static bool rshift = false;
885 static uint8_t layer = 0;
887 lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
888 rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
889 layer = biton32(layer_state);
891 #ifdef DOUBLESPACE_LAYER_ENABLE
892 // double-space: send space immediately if any other key depressed before space is released
893 if ((lspace_active ^ rspace_active)
896 && record->event.pressed)
899 if (!lspace_emitted) {
900 register_code(KC_SPC);
901 unregister_code(KC_SPC);
903 lspace_emitted = true;
906 if (!rspace_emitted) {
907 register_code(KC_SPC);
908 unregister_code(KC_SPC);
910 rspace_emitted = true;
914 if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
915 if (record->event.pressed) {
916 unregister_code(KC_LALT);
918 register_code(KC_LALT);
925 #ifdef DOUBLESPACE_LAYER_ENABLE
926 // double-space enter space layer
928 process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
932 process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
937 // handle greek layer shift
941 if (layer == _GREEKU || layer == _GREEKL) {
942 if (record->event.pressed) {
946 if (lshift ^ rshift) { // if only one shift was pressed
955 // press both ctrls to activate SYS layer
959 bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
960 bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
961 if (record->event.pressed) {
962 if (lctrl ^ rctrl) { // if only one ctrl was pressed
971 // QWERTZ style comma and dot: semicolon and colon when shifted
973 if (record->event.pressed) {
974 if (lshift || rshift) {
975 if (lshift) unregister_code(KC_LSFT);
976 if (rshift) unregister_code(KC_RSFT);
977 register_code(KC_SCLN);
978 unregister_code(KC_SCLN);
979 if (lshift) register_code(KC_LSFT);
980 if (rshift) register_code(KC_RSFT);
982 register_code(KC_COMM);
983 unregister_code(KC_COMM);
989 if (record->event.pressed) {
990 if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
991 register_code(KC_SCLN);
992 unregister_code(KC_SCLN);
994 register_code(KC_DOT);
995 unregister_code(KC_DOT);
1003 if (record->event.pressed) {
1004 persistant_default_layer_set(1UL<<_QWERTY);
1008 #ifdef LAYOUT_DVORAK
1010 if (record->event.pressed) {
1011 persistant_default_layer_set(1UL<<_DVORAK);
1016 #ifdef LAYOUT_COLEMAK
1018 if (record->event.pressed) {
1019 persistant_default_layer_set(1UL<<_COLEMAK);
1024 #ifdef LAYOUT_WORKMAN
1026 if (record->event.pressed) {
1027 persistant_default_layer_set(1UL<<_WORKMAN);
1032 #ifdef LAYOUT_NORMAN
1034 if (record->event.pressed) {
1035 persistant_default_layer_set(1UL<<_NORMAN);
1041 // only process Fnumber on key release, and only when layer switcher is still pressed.
1042 // this is to avoid accidental presses on potentially destructive keys
1043 case KC_F1 ... KC_F12:
1047 if (!record->event.pressed && layer == _FUN) { // key released and still in FUN layer
1048 register_code(keycode);
1049 unregister_code(keycode);
1057 if (record->event.pressed) {
1058 if (lshift || rshift) {
1074 set_unicode_input_mode(UC_LNX);
1078 set_unicode_input_mode(UC_WINC);
1082 set_unicode_input_mode(UC_OSX);
1086 // glow mode changer
1087 #ifdef RGBSPS_ENABLE
1089 if (record->event.pressed) {
1091 if (glow_mode > GLOW_FULL) {
1092 glow_mode = GLOW_NONE;
1101 // faux clicky indicator
1102 #ifdef FAUXCLICKY_ENABLE
1111 void set_output_user(uint8_t output) {
1112 #ifdef ADAFRUIT_BLE_ENABLE
1115 led_set_output_usb();
1117 case OUTPUT_ADAFRUIT_BLE:
1118 led_set_output_ble();
1121 led_set_output_none();
1126 void matrix_init_user() {
1127 _delay_ms(500); // give time for usb to initialize
1129 set_unicode_input_mode(UC_LNX);
1131 #ifdef RGBSPS_ENABLE
1135 // auto detect output on init
1136 #ifdef ADAFRUIT_BLE_ENABLE
1137 uint8_t output = auto_detect_output();
1138 if (output == OUTPUT_USB) {
1139 set_output(OUTPUT_USB);
1141 set_output(OUTPUT_ADAFRUIT_BLE);
1146 void turn_off_capslock() {
1148 register_code(KC_CAPS);
1149 unregister_code(KC_CAPS);
1153 #ifdef RGBSPS_ENABLE
1154 void matrix_scan_user(void) {
1155 led_set_layer_indicator();
1158 void battery_poll(uint8_t level) {
1159 rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15);
1163 void led_set_user(uint8_t usb_led) {
1164 bool new_capslock = usb_led & (1<<USB_LED_CAPS_LOCK);
1165 if (new_capslock ^ capslock) { // capslock state is different
1166 if ((capslock = new_capslock)) {
1167 rgbsps_set(LED_IND_NUM, 15, 0, 0);
1169 rgbsps_set(LED_IND_NUM, 0, 0, 0);
1176 #ifdef PS2_MOUSE_ENABLE
1177 void ps2_mouse_init_user() {
1180 // set TrackPoint sensitivity
1181 PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
1182 PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
1183 PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
1184 PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
1186 // set TrackPoint Negative Inertia factor
1187 PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
1188 PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
1189 PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
1190 PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
1192 // set TrackPoint speed
1193 // (transfer function upper plateau speed)
1194 PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
1195 PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
1196 PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
1197 PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
1199 // inquire pts status
1200 rcv = ps2_host_send(0xE2);
1201 rcv = ps2_host_send(0x2C);
1202 rcv = ps2_host_recv_response();
1203 if ((rcv & 1) == 1) {
1204 // if on, disable pts
1205 rcv = ps2_host_send(0xE2);
1206 rcv = ps2_host_send(0x47);
1207 rcv = ps2_host_send(0x2C);
1208 rcv = ps2_host_send(0x01);