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"
43 #define FAUXCLICKY_OFF do { \
44 fauxclicky_enabled = false; \
45 rgbsps_set(LED_AUDIO, 0, 0, 0); \
49 #define FAUXCLICKY_ON do { \
50 fauxclicky_enabled = true; \
51 rgbsps_set(LED_AUDIO, 8, 0, 8); \
55 #include "outputselect.h"
57 #define COUNT(x) (sizeof (x) / sizeof (*(x)))
59 // Fillers to make layering clearer
60 #define _______ KC_TRNS
63 #define KC_WWWB KC_WWW_BACK
64 #define KC_WWWF KC_WWW_FORWARD
66 // hybrid right-alt & scroll lock (mapped to Compose in OS)
67 #define C_RALT MT(MOD_RALT, KC_SLCK)
69 // dual use right-shift & del key
70 // #define C_RSFT MT(MOD_RSFT, KC_DEL)
72 bool capslock = false;
73 #ifdef DOUBLESPACE_LAYER_ENABLE
74 bool lspace_active = false;
75 bool rspace_active = false;
76 bool lspace_emitted = false;
77 bool rspace_emitted = false;
78 bool space_layer_entered = false;
87 uint8_t glow_mode = GLOW_MIN;
89 void turn_off_capslock(void);
90 extern keymap_config_t keymap_config;
92 // layers, ordering is important!
99 _DEFAULT_LAYER_MAX = _NORMAN,
114 // double-space layer
117 enum planck_keycodes {
141 #ifndef FAUXCLICKY_ENABLE
144 #ifndef MODULE_ADAFRUIT_BLE
150 #define EMPTY MO(_EMPTY)
153 #define FUN0 LT(_FUN, KC_0)
158 GRIN, // grinning face 😊
159 TJOY, // tears of joy 😂
160 SMILE, // grining face with smiling eyes 😁
162 EYERT, // smiling face with heart shaped eyes 😍
163 CRY, // crying face 😭
164 SMEYE, // smiling face with smiling eyes 😊
167 HART2, // two hearts 💕
169 OKHND, // ok hand sign 👌
175 THMDN, // thumb down 👎
178 MUSIC, // musical notes
180 CELEB, // celebration 🙌
181 CRY2, // crying face 😢
182 COOL, // smile with sunglasses 😎
183 NOEVS, // see no evil
184 NOEVH, // hear no evil
185 NOEVK, // speak no evil
189 BHART, // broken heart
190 SLEEP, // sleeping face
191 SMIL2, // smiling face with open mouth & sweat
194 TONGU, // face with tongue & winking eye
195 DISAP, // disappointed
196 YUMMY, // face savoring delicious food
197 CLAP, // hand clapping
198 FEAR, // face screaming in fear
199 HORNS, // smiling face with horns
200 HALO, // smiling face with halo
265 const uint32_t PROGMEM unicode_map[] = {
366 [LTEQ] = 0x2264, // less than or equal
367 [GTEQ] = 0x2265, // greater than or equal
368 [NOTEQ] = 0x2260, // not equal
369 [PLMIN] = 0xB1, // plus minus
375 const uint8_t PROGMEM LED_ALNUM[] = {
410 const uint8_t PROGMEM LED_HOMING[] = {
421 const uint8_t PROGMEM LED_MODS[] = {
436 const uint8_t PROGMEM LED_FN[] = {
443 const uint8_t PROGMEM LED_INDICATORS[] = {
463 const uint8_t PROGMEM LED_TRACKPOINT[] = {
469 void led_turnoff_keys(void) {
470 for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
471 rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 0, 0, 0);
473 for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
474 rgbsps_set(pgm_read_byte(&LED_MODS[i]), 0, 0, 0);
476 for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
477 rgbsps_set(pgm_read_byte(&LED_FN[i]), 0, 0, 0);
481 void led_reset(void) {
488 for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
489 rgbsps_set(pgm_read_byte(&LED_HOMING[i]), 8, 8, 8);
491 rgbsps_set(LED_F, 15, 0, 0);
492 rgbsps_set(LED_J, 15, 0, 0);
495 for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
496 rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 8, 8, 8);
498 for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
499 rgbsps_set(pgm_read_byte(&LED_MODS[i]), 0, 15, 0);
501 for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
502 rgbsps_set(pgm_read_byte(&LED_FN[i]), 0, 0, 15);
504 for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
505 rgbsps_set(pgm_read_byte(&LED_HOMING[i]), 15, 0, 0);
507 rgbsps_set(LED_F, 15, 15, 0);
508 rgbsps_set(LED_J, 15, 15, 0);
513 void led_set_default_layer_indicator(void) {
514 uint8_t default_layer = biton32(default_layer_state);
515 if (default_layer == _QWERTY) {
516 rgbsps_set(LED_IND_QWERTY, 15, 10, 0);
517 rgbsps_set(LED_IND_ALT, 0, 0, 0);
519 rgbsps_set(LED_IND_QWERTY, 0, 0, 0);
520 rgbsps_set(LED_IND_ALT, 15, 10, 0);
526 void led_set_layer_indicator(void) {
527 static uint8_t oldlayer = 255;
531 rgbsps_set(LED_IND_GUI, 0, 0, 0);
532 rgbsps_set(LED_IND_FUN, 0, 0, 0);
533 rgbsps_set(LED_IND_NUM, 0, 0, 0);
534 rgbsps_set(LED_IND_PUNC, 0, 0, 0);
535 rgbsps_set(LED_IND_GREEK, 0, 0, 0);
536 rgbsps_set(LED_IND_EMOJI, 0, 0, 0);
538 uint8_t layer = biton32(layer_state);
539 if (oldlayer == layer) {
545 if (layer <= _DEFAULT_LAYER_MAX) {
552 rgbsps_set(LED_IND_GUI, 15, 0, 15);
555 rgbsps_set(LED_IND_FUN, 15, 0, 0);
558 rgbsps_set(LED_IND_NUM, 0, 0, 15);
561 rgbsps_set(LED_IND_PUNC, 0, 15, 0);
565 rgbsps_set(LED_IND_GREEK, 0, 15, 15);
568 rgbsps_set(LED_IND_EMOJI, 15, 15, 0);
571 rgbsps_set(LED_IND_GUI, 3, 3, 3);
572 rgbsps_set(LED_IND_FUN, 3, 3, 3);
573 rgbsps_set(LED_IND_NUM, 3, 3, 3);
574 rgbsps_set(LED_IND_PUNC, 3, 3, 3);
575 rgbsps_set(LED_IND_GREEK, 3, 3, 3);
576 rgbsps_set(LED_IND_EMOJI, 3, 3, 3);
582 void led_set_unicode_input_mode(void) {
583 rgbsps_set(LED_IND_LINUX, 0, 0, 0);
584 rgbsps_set(LED_IND_APPLE, 0, 0, 0);
585 rgbsps_set(LED_IND_WINDOWS, 0, 0, 0);
587 switch (get_unicode_input_mode()) {
589 rgbsps_set(LED_IND_LINUX, 15, 15, 15);
592 rgbsps_set(LED_IND_APPLE, 15, 15, 15);
596 rgbsps_set(LED_IND_WINDOWS, 15, 15, 15);
602 void led_set_output_ble(void) {
603 rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 15);
604 rgbsps_set(LED_IND_USB, 0, 0, 0);
608 void led_set_output_usb(void) {
609 rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0);
610 rgbsps_set(LED_IND_USB, 15, 15, 15);
614 void led_set_output_none(void) {
615 rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0);
616 rgbsps_set(LED_IND_USB, 0, 0, 0);
620 void led_init(void) {
624 // set trackpoint color
625 rgbsps_set(LED_TRACKPOINT1, 15, 0, 0);
626 rgbsps_set(LED_TRACKPOINT2, 0, 0, 15);
627 rgbsps_set(LED_TRACKPOINT3, 15, 0, 0);
629 // unicode input mode
630 led_set_unicode_input_mode();
633 led_set_layer_indicator();
634 led_set_default_layer_indicator();
638 #endif // RGBSPS_ENABLE
642 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
645 * ,-----------------------------------------------------------------------------------.
646 * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
647 * |------+------+------+------+------+-------------+------+------+------+------+------|
648 * | Esc | A | S | D | F | G | H | J | K | L | ' |Enter |
649 * |------+------+------+------+------+------|------+------+------+------+------+------|
650 * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift |
651 * |------+------+------+------+------+------+------+------+------+------+------+------|
652 * | Ctrl | Alt | GUI | Punc | Num | Space | Fun |Greek | GUI |AltGr | Ctrl |
653 * `-----------------------------------------------------------------------------------'
656 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
657 KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT ,
658 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
659 KC_LCTL, KC_LALT, KC_LGUI, EMPTY, NUM, LSPACE, RSPACE, FUN, GREEK, KC_RGUI, C_RALT, KC_RCTL,
660 _______, _______, _______
664 * ,-----------------------------------------------------------------------------------.
665 * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp |
666 * |------+------+------+------+------+-------------+------+------+------+------+------|
667 * | Esc | A | O | E | U | I | D | H | T | N | S |Enter |
668 * |------+------+------+------+------+------|------+------+------+------+------+------|
669 * | Shift| / | Q | J | K | X | B | M | W | V | Z |Shift |
670 * |------+------+------+------+------+------+------+------+------+------+------+------|
671 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
672 * `-----------------------------------------------------------------------------------'
676 _______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, _______,
677 _______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, _______,
678 _______, KC_SLSH, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______,
679 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
680 _______, _______, _______
685 * ,-----------------------------------------------------------------------------------.
686 * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
687 * |------+------+------+------+------+-------------+------+------+------+------+------|
688 * | Esc | A | R | S | T | D | H | N | E | I | O |Enter |
689 * |------+------+------+------+------+------|------+------+------+------+------+------|
690 * | Shift| Z | X | C | V | B | K | M | , | . | / |Shift |
691 * |------+------+------+------+------+------+------+------+------+------+------+------|
692 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
693 * `-----------------------------------------------------------------------------------'
696 #ifdef LAYOUT_COLEMAK
698 _______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, _______,
699 _______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, _______,
700 _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
701 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
702 _______, _______, _______
707 * ,-----------------------------------------------------------------------------------.
708 * | Tab | Q | W | D | F | K | J | U | R | L | ; | Bksp |
709 * |------+------+------+------+------+-------------+------+------+------+------+------|
710 * | Esc | A | S | E | T | G | Y | N | I | O | H |Enter |
711 * |------+------+------+------+------+------|------+------+------+------+------+------|
712 * | Shift| Z | X | C | V | B | P | M | , | . | / |Shift |
713 * |------+------+------+------+------+------+------+------+------+------+------+------|
714 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
715 * `-----------------------------------------------------------------------------------'
720 _______, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_J, KC_U, KC_R, KC_L, KC_QUOT, _______,
721 _______, KC_A, KC_S, KC_E, KC_T, KC_G, KC_Y, KC_N, KC_I, KC_O, KC_H, _______,
722 _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
723 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
724 _______, _______, _______
729 * ,-----------------------------------------------------------------------------------.
730 * | Tab | Q | D | R | W | B | J | F | U | P | ; | Bksp |
731 * |------+------+------+------+------+-------------+------+------+------+------+------|
732 * | Esc | A | S | H | T | G | Y | N | E | O | I |Enter |
733 * |------+------+------+------+------+------|------+------+------+------+------+------|
734 * | Shift| Z | X | M | C | V | K | K | , | . | / |Shift |
735 * |------+------+------+------+------+------+------+------+------+------+------+------|
736 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
737 * `-----------------------------------------------------------------------------------'
740 #ifdef LAYOUT_WORKMAN
742 _______, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_QUOT, _______,
743 _______, KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, _______,
744 _______, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, _______,
745 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
746 _______, _______, _______
751 * ,-----------------------------------------------------------------------------------.
752 * | ~ | ! | @ | # | $ | % | ^ | & | * | ≤ | ≥ | ` |
753 * |------+------+------+------+------+-------------+------+------+------+------+------|
754 * | | * | \ | - | = | / | ≠ | ( | ) | < | > | |
755 * |------+------+------+------+------+------|------+------+------+------+------+------|
756 * | & | ^ | | | _ | + | ? | ± | [ | ] | { | } | |
757 * |------+------+------+------+------+------+------+------+------+------+------+------|
758 * | | | | | | | | | | : | |
759 * `-----------------------------------------------------------------------------------'
762 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, X(LTEQ), X(GTEQ), _______,
763 KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, X(NOTEQ),KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
764 KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, X(PLMIN),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______,
765 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______,
766 _______, _______, _______
770 * ,-----------------------------------------------------------------------------------.
771 * | ~ | ! | @ | # | $ | % | A | 7 | 8 | 9 | D | |
772 * |------+------+------+------+------+-------------+------+------+------+------+------|
773 * | ` | * | \ | - | = | / | B | 4 | 5 | 6 | E | |
774 * |------+------+------+------+------+------|------+------+------+------+------+------|
775 * | & | ^ | | | _ | + | ? | C | 1 | 2 | 3 | F | |
776 * |------+------+------+------+------+------+------+------+------+------+------+------|
777 * | | | x | | | | | 0 | , | . | : | |
778 * `-----------------------------------------------------------------------------------'
781 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, S(KC_A), KC_1, KC_2, KC_3, S(KC_D), _______,
782 KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, S(KC_B), KC_4, KC_5, KC_6, S(KC_E), _______,
783 KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C), KC_7, KC_8, KC_9, S(KC_F), _______,
784 _______, _______, KC_X, _______, _______, _______, _______, FUN0 , KC_COMM, KC_DOT, KC_COLN, _______,
785 _______, _______, _______
789 * ,-----------------------------------------------------------------------------------.
790 * | | F1 | F2 | F3 | F4 | Ins | | PgUp | Up | PgDn | PgUp | |
791 * |------+------+------+------+------+-------------+------+------+------+------+------|
792 * | Caps | F5 | F6 | F7 | F8 |PrtSc | | Left | Down | Right| PgDn | |
793 * |------+------+------+------+------+------|------+------+------+------+------+------|
794 * | | F9 | F10 | F11 | F12 |Pause | | | Home | End | | |
795 * |------+------+------+------+------+------+------+------+------+------+------+------|
796 * | | | | | | | | | | | |
797 * `-----------------------------------------------------------------------------------'
800 XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_INS, XXXXXXX, KC_PGUP, KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
801 KC_CAPS, KC_F5, KC_F6, KC_F7, KC_F8, KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
802 _______, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUS, XXXXXXX, XXXXXXX, KC_HOME, KC_END, XXXXXXX, _______,
803 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
804 _______, _______, _______
808 * ,-----------------------------------------------------------------------------------.
809 * | | | | | | | | | | | | |
810 * |------+------+------+------+------+-------------+------+------+------+------+------|
811 * | | | | | | | | | | | | |
812 * |------+------+------+------+------+------+------+------+------+------+------+------|
813 * | | | | | | | | | | | | |
814 * |------+------+------+------+------+------+------+------+------+------+------+------|
815 * | | | | | | | | | | | | |
816 * `-----------------------------------------------------------------------------------'
819 _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC), X(UPI), _______,
820 _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA), X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
821 _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA), X(UNU), X(UMU), KC_COMM, KC_DOT, KC_SLSH, _______,
822 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
823 _______, _______, _______
827 * ,-----------------------------------------------------------------------------------.
828 * | | | | | | | | | | | | |
829 * |------+------+------+------+------+-------------+------+------+------+------+------|
830 * | | | | | | | | | | | | |
831 * |------+------+------+------+------+------+------+------+------+------+------+------|
832 * | | | | | | | | | | | | |
833 * |------+------+------+------+------+------+------+------+------+------+------+------|
834 * | | | | | | | | | | | | |
835 * `-----------------------------------------------------------------------------------'
838 _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC), X(LPI), _______,
839 _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA), X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
840 _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA), X(LNU), X(LMU), KC_COMM, KC_DOT, KC_SLSH, _______,
841 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
842 _______, _______, _______
846 * ,-----------------------------------------------------------------------------------.
847 * | | | | | | | | | | | | |
848 * |------+------+------+------+------+-------------+------+------+------+------+------|
849 * | | | | | | | | | | | | |
850 * |------+------+------+------+------+------+------+------+------+------+------+------|
851 * | | | | | | | | | | | | |
852 * |------+------+------+------+------+------+------+------+------+------+------+------|
853 * | | | | | | | | | | | | |
854 * `-----------------------------------------------------------------------------------'
857 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
858 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
859 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
860 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
861 _______, _______, _______
865 * ,-----------------------------------------------------------------------------------.
866 * | | | | | | | | | | | | |
867 * |------+------+------+------+------+-------------+------+------+------+------+------|
868 * | | | | | | | | | | | | |
869 * |------+------+------+------+------+------+------+------+------+------+------+------|
870 * | | | | | | | | | | | | |
871 * |------+------+------+------+------+------+------+------+------+------+------+------|
872 * | | | | | | | | | | | | |
873 * `-----------------------------------------------------------------------------------'
876 X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
877 X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART), X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
878 X(THMDN),X(SLEEP), X(CLAP), X(CRY), X(VIC),X(BHART), X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
879 X(POO), X(EYES), X(HUNRD),_______, X(SKULL),X(HORNS), X(HALO), X(FEAR),_______,X(YUMMY),X(DISAP),X(NOEVK),
880 _______, _______, _______
884 * ,-----------------------------------------------------------------------------------.
885 * | | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | |
886 * |------+------+------+------+------+-------------+------+------+------+------+------|
887 * | Esc | | Btab | Esc | Tab | | | Prev | | Next | | |
888 * |------+------+------+------+------+------+------+------+------+------+------+------|
889 * | | | Prev | Play | Next | | | | | | | |
890 * |------+------+------+------+------+------+------+------+------+------+------+------|
891 * | | | | | | | | | | | | |
892 * `-----------------------------------------------------------------------------------'
895 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,
896 KC_ESC, XXXXXXX, S(KC_TAB),KC_ESC, KC_TAB, XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
897 XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, KC_SPC, KC_SPC, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
898 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
899 _______, _______, _______
903 * ,-----------------------------------------------------------------------------------.
904 * | |Qwerty| Win | |Reset | | | USB | | | | |
905 * |------+------+------+------+------+-------------+------+------+------+------+------|
906 * | |Audio | |Dvorak| | Glow | | |WorkMn|Linux | | |
907 * |------+------+------+------+------+------+------+------+------+------+------+------|
908 * | | | |Colmak| | BLE |Norman|MacOS | | | | |
909 * |------+------+------+------+------+------+------+------+------+------+------+------|
910 * | | | | | | | | | | | | |
911 * `-----------------------------------------------------------------------------------'
914 DEBUG, QWERTY, WIN, XXXXXXX, RESET, XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
915 XXXXXXX, FC_TOG, XXXXXXX, DVORAK, XXXXXXX, GLOW, XXXXXXX, XXXXXXX, WORKMAN, LINUX, XXXXXXX, XXXXXXX,
916 XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BT, NORMAN, OSX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
917 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
918 _______, _______, _______
924 void persistant_default_layer_set(uint16_t default_layer) {
925 eeconfig_update_default_layer(default_layer);
926 default_layer_set(default_layer);
927 led_set_default_layer_indicator();
930 #ifdef DOUBLESPACE_LAYER_ENABLE
931 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
936 register_code(KC_LALT); // sends alt and enter layer
937 space_layer_entered = true;
941 if (space_layer_entered) {
942 unregister_code(KC_LALT); // release alt and exit layer
945 space_layer_entered = false;
949 register_code(KC_SPC);
950 unregister_code(KC_SPC);
958 uint32_t layer_state_set_kb(uint32_t state)
960 // turn on punc layer if both fun & num are on
961 if ((state & ((1UL<<_NUM) | (1UL<<_FUN))) == ((1UL<<_NUM) | (1UL<<_FUN))) {
962 state |= (1UL<<_PUNC);
964 state &= ~(1UL<<_PUNC);
967 // turn on emoji layer if empty and greek layer are on
969 (state & ((1UL<<_EMPTY) | (1UL<<_GREEKU))) == ((1UL<<_EMPTY) | (1UL<<_GREEKU))
970 || (state & ((1UL<<_EMPTY) | (1UL<<_GREEKL))) == ((1UL<<_EMPTY) | (1UL<<_GREEKL))
972 state |= (1UL<<_EMOJI);
974 state &= ~(1UL<<_EMOJI);
979 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
980 static bool lshift = false;
981 static bool rshift = false;
982 static uint8_t layer = 0;
984 lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
985 rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
986 layer = biton32(layer_state);
988 #ifdef DOUBLESPACE_LAYER_ENABLE
989 // double-space: send space immediately if any other key depressed before space is released
990 if ((lspace_active ^ rspace_active)
993 && record->event.pressed)
996 if (!lspace_emitted) {
997 register_code(KC_SPC);
998 unregister_code(KC_SPC);
1000 lspace_emitted = true;
1002 if (rspace_active) {
1003 if (!rspace_emitted) {
1004 register_code(KC_SPC);
1005 unregister_code(KC_SPC);
1007 rspace_emitted = true;
1011 if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
1012 if (record->event.pressed) {
1013 unregister_code(KC_LALT);
1015 register_code(KC_LALT);
1022 #ifdef DOUBLESPACE_LAYER_ENABLE
1023 // double-space enter space layer
1025 process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
1029 process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
1034 // handle greek layer shift
1038 if (layer == _GREEKU || layer == _GREEKL) {
1039 if (record->event.pressed) {
1043 if (lshift ^ rshift) { // if only one shift was pressed
1052 // press both ctrls to activate SYS layer
1056 bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
1057 bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
1058 if (record->event.pressed) {
1059 if (lctrl ^ rctrl) { // if only one ctrl was pressed
1068 // QWERTZ style comma and dot: semicolon and colon when shifted
1070 if (record->event.pressed) {
1071 if (lshift || rshift) {
1072 if (lshift) unregister_code(KC_LSFT);
1073 if (rshift) unregister_code(KC_RSFT);
1074 register_code(KC_SCLN);
1075 unregister_code(KC_SCLN);
1076 if (lshift) register_code(KC_LSFT);
1077 if (rshift) register_code(KC_RSFT);
1079 register_code(KC_COMM);
1080 unregister_code(KC_COMM);
1086 if (record->event.pressed) {
1087 if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
1088 register_code(KC_SCLN);
1089 unregister_code(KC_SCLN);
1091 register_code(KC_DOT);
1092 unregister_code(KC_DOT);
1100 if (record->event.pressed) {
1101 persistant_default_layer_set(1UL<<_QWERTY);
1105 #ifdef LAYOUT_DVORAK
1107 if (record->event.pressed) {
1108 persistant_default_layer_set(1UL<<_DVORAK);
1113 #ifdef LAYOUT_COLEMAK
1115 if (record->event.pressed) {
1116 persistant_default_layer_set(1UL<<_COLEMAK);
1121 #ifdef LAYOUT_WORKMAN
1123 if (record->event.pressed) {
1124 persistant_default_layer_set(1UL<<_WORKMAN);
1129 #ifdef LAYOUT_NORMAN
1131 if (record->event.pressed) {
1132 persistant_default_layer_set(1UL<<_NORMAN);
1138 // only process Fnumber on key release, and only when layer switcher is still pressed.
1139 // this is to avoid accidental presses on potentially destructive keys
1140 case KC_F1 ... KC_F12:
1144 if (!record->event.pressed && layer == _FUN) { // key released and still in FUN layer
1145 register_code(keycode);
1146 unregister_code(keycode);
1154 if (record->event.pressed) {
1155 if (lshift || rshift) {
1171 set_unicode_input_mode(UC_LNX);
1172 #ifdef RGBSPS_ENABLE
1173 led_set_unicode_input_mode();
1178 set_unicode_input_mode(UC_WINC);
1179 #ifdef RGBSPS_ENABLE
1180 led_set_unicode_input_mode();
1185 set_unicode_input_mode(UC_OSX);
1186 #ifdef RGBSPS_ENABLE
1187 led_set_unicode_input_mode();
1192 // glow mode changer
1193 #ifdef RGBSPS_ENABLE
1195 if (record->event.pressed) {
1197 if (glow_mode > GLOW_FULL) {
1198 glow_mode = GLOW_NONE;
1207 // faux clicky indicator
1208 #ifdef FAUXCLICKY_ENABLE
1210 #ifdef RGBSPS_ENABLE
1211 if (fauxclicky_enabled) {
1212 rgbsps_set(LED_IND_AUDIO, 0, 0, 0);
1214 rgbsps_set(LED_IND_AUDIO, 5, 11, 13);
1225 void set_output_user(uint8_t output) {
1226 #ifdef MODULE_ADAFRUIT_BLE
1229 led_set_output_usb();
1231 case OUTPUT_BLUETOOTH:
1232 led_set_output_ble();
1235 led_set_output_none();
1240 void matrix_init_user() {
1241 _delay_ms(500); // give time for usb to initialize
1243 set_unicode_input_mode(UC_LNX);
1245 #ifdef RGBSPS_ENABLE
1249 // auto detect output on init
1250 #ifdef MODULE_ADAFRUIT_BLE
1251 uint8_t output = auto_detect_output();
1252 if (output == OUTPUT_USB) {
1253 set_output(OUTPUT_USB);
1255 set_output(OUTPUT_BLUETOOTH);
1260 void turn_off_capslock() {
1262 register_code(KC_CAPS);
1263 unregister_code(KC_CAPS);
1267 #ifdef RGBSPS_ENABLE
1268 void matrix_scan_user(void) {
1269 led_set_layer_indicator();
1272 void battery_poll(uint8_t level) {
1273 rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15);
1277 void led_set_user(uint8_t usb_led) {
1278 bool new_capslock = usb_led & (1<<USB_LED_CAPS_LOCK);
1279 if (new_capslock ^ capslock) { // capslock state is different
1280 if ((capslock = new_capslock)) {
1281 rgbsps_set(LED_IND_CAPSLOCK, 15, 0, 0);
1283 rgbsps_set(LED_IND_CAPSLOCK, 0, 0, 0);
1290 #ifdef PS2_MOUSE_ENABLE
1291 void ps2_mouse_init_user() {
1294 // set TrackPoint sensitivity
1295 PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
1296 PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
1297 PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
1298 PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
1300 // set TrackPoint Negative Inertia factor
1301 PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
1302 PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
1303 PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
1304 PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
1306 // set TrackPoint speed
1307 // (transfer function upper plateau speed)
1308 PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
1309 PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
1310 PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
1311 PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
1313 // inquire pts status
1314 rcv = ps2_host_send(0xE2);
1315 rcv = ps2_host_send(0x2C);
1316 rcv = ps2_host_recv_response();
1317 if ((rcv & 1) == 1) {
1318 // if on, disable pts
1319 rcv = ps2_host_send(0xE2);
1320 rcv = ps2_host_send(0x47);
1321 rcv = ps2_host_send(0x2C);
1322 rcv = ps2_host_send(0x01);