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);
928 led_set_default_layer_indicator();
932 #ifdef DOUBLESPACE_LAYER_ENABLE
933 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
938 register_code(KC_LALT); // sends alt and enter layer
939 space_layer_entered = true;
943 if (space_layer_entered) {
944 unregister_code(KC_LALT); // release alt and exit layer
947 space_layer_entered = false;
951 register_code(KC_SPC);
952 unregister_code(KC_SPC);
960 uint32_t layer_state_set_kb(uint32_t state)
962 // turn on punc layer if both fun & num are on
963 if ((state & ((1UL<<_NUM) | (1UL<<_FUN))) == ((1UL<<_NUM) | (1UL<<_FUN))) {
964 state |= (1UL<<_PUNC);
966 state &= ~(1UL<<_PUNC);
969 // turn on emoji layer if empty and greek layer are on
971 (state & ((1UL<<_EMPTY) | (1UL<<_GREEKU))) == ((1UL<<_EMPTY) | (1UL<<_GREEKU))
972 || (state & ((1UL<<_EMPTY) | (1UL<<_GREEKL))) == ((1UL<<_EMPTY) | (1UL<<_GREEKL))
974 state |= (1UL<<_EMOJI);
976 state &= ~(1UL<<_EMOJI);
981 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
982 static bool lshift = false;
983 static bool rshift = false;
984 static uint8_t layer = 0;
986 lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
987 rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
988 layer = biton32(layer_state);
990 #ifdef DOUBLESPACE_LAYER_ENABLE
991 // double-space: send space immediately if any other key depressed before space is released
992 if ((lspace_active ^ rspace_active)
995 && record->event.pressed)
998 if (!lspace_emitted) {
999 register_code(KC_SPC);
1000 unregister_code(KC_SPC);
1002 lspace_emitted = true;
1004 if (rspace_active) {
1005 if (!rspace_emitted) {
1006 register_code(KC_SPC);
1007 unregister_code(KC_SPC);
1009 rspace_emitted = true;
1013 if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
1014 if (record->event.pressed) {
1015 unregister_code(KC_LALT);
1017 register_code(KC_LALT);
1024 #ifdef DOUBLESPACE_LAYER_ENABLE
1025 // double-space enter space layer
1027 process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
1031 process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
1036 // handle greek layer shift
1040 if (layer == _GREEKU || layer == _GREEKL) {
1041 if (record->event.pressed) {
1045 if (lshift ^ rshift) { // if only one shift was pressed
1054 // press both ctrls to activate SYS layer
1058 bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
1059 bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
1060 if (record->event.pressed) {
1061 if (lctrl ^ rctrl) { // if only one ctrl was pressed
1070 // QWERTZ style comma and dot: semicolon and colon when shifted
1072 if (record->event.pressed) {
1073 if (lshift || rshift) {
1074 if (lshift) unregister_code(KC_LSFT);
1075 if (rshift) unregister_code(KC_RSFT);
1076 register_code(KC_SCLN);
1077 unregister_code(KC_SCLN);
1078 if (lshift) register_code(KC_LSFT);
1079 if (rshift) register_code(KC_RSFT);
1081 register_code(KC_COMM);
1082 unregister_code(KC_COMM);
1088 if (record->event.pressed) {
1089 if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
1090 register_code(KC_SCLN);
1091 unregister_code(KC_SCLN);
1093 register_code(KC_DOT);
1094 unregister_code(KC_DOT);
1102 if (record->event.pressed) {
1103 persistant_default_layer_set(1UL<<_QWERTY);
1107 #ifdef LAYOUT_DVORAK
1109 if (record->event.pressed) {
1110 persistant_default_layer_set(1UL<<_DVORAK);
1115 #ifdef LAYOUT_COLEMAK
1117 if (record->event.pressed) {
1118 persistant_default_layer_set(1UL<<_COLEMAK);
1123 #ifdef LAYOUT_WORKMAN
1125 if (record->event.pressed) {
1126 persistant_default_layer_set(1UL<<_WORKMAN);
1131 #ifdef LAYOUT_NORMAN
1133 if (record->event.pressed) {
1134 persistant_default_layer_set(1UL<<_NORMAN);
1140 // only process Fnumber on key release, and only when layer switcher is still pressed.
1141 // this is to avoid accidental presses on potentially destructive keys
1142 case KC_F1 ... KC_F12:
1146 if (!record->event.pressed && layer == _FUN) { // key released and still in FUN layer
1147 register_code(keycode);
1148 unregister_code(keycode);
1156 if (record->event.pressed) {
1157 if (lshift || rshift) {
1173 set_unicode_input_mode(UC_LNX);
1174 #ifdef RGBSPS_ENABLE
1175 led_set_unicode_input_mode();
1180 set_unicode_input_mode(UC_WINC);
1181 #ifdef RGBSPS_ENABLE
1182 led_set_unicode_input_mode();
1187 set_unicode_input_mode(UC_OSX);
1188 #ifdef RGBSPS_ENABLE
1189 led_set_unicode_input_mode();
1194 // glow mode changer
1195 #ifdef RGBSPS_ENABLE
1197 if (record->event.pressed) {
1199 if (glow_mode > GLOW_FULL) {
1200 glow_mode = GLOW_NONE;
1209 // faux clicky indicator
1210 #ifdef FAUXCLICKY_ENABLE
1212 #ifdef RGBSPS_ENABLE
1213 if (fauxclicky_enabled) {
1214 rgbsps_set(LED_IND_AUDIO, 0, 0, 0);
1216 rgbsps_set(LED_IND_AUDIO, 5, 11, 13);
1227 void set_output_user(uint8_t output) {
1228 #ifdef MODULE_ADAFRUIT_BLE
1231 led_set_output_usb();
1233 case OUTPUT_BLUETOOTH:
1234 led_set_output_ble();
1237 led_set_output_none();
1242 void matrix_init_user() {
1243 _delay_ms(500); // give time for usb to initialize
1245 set_unicode_input_mode(UC_LNX);
1247 #ifdef RGBSPS_ENABLE
1251 // auto detect output on init
1252 #ifdef MODULE_ADAFRUIT_BLE
1253 uint8_t output = auto_detect_output();
1254 if (output == OUTPUT_USB) {
1255 set_output(OUTPUT_USB);
1257 set_output(OUTPUT_BLUETOOTH);
1262 void turn_off_capslock() {
1264 register_code(KC_CAPS);
1265 unregister_code(KC_CAPS);
1269 #ifdef RGBSPS_ENABLE
1270 void matrix_scan_user(void) {
1271 led_set_layer_indicator();
1274 void battery_poll(uint8_t level) {
1275 rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15);
1279 void led_set_user(uint8_t usb_led) {
1280 bool new_capslock = usb_led & (1<<USB_LED_CAPS_LOCK);
1281 if (new_capslock ^ capslock) { // capslock state is different
1282 if ((capslock = new_capslock)) {
1283 rgbsps_set(LED_IND_CAPSLOCK, 15, 0, 0);
1285 rgbsps_set(LED_IND_CAPSLOCK, 0, 0, 0);
1292 #ifdef PS2_MOUSE_ENABLE
1293 void ps2_mouse_init_user() {
1296 // set TrackPoint sensitivity
1297 PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
1298 PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
1299 PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
1300 PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
1302 // set TrackPoint Negative Inertia factor
1303 PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
1304 PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
1305 PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
1306 PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
1308 // set TrackPoint speed
1309 // (transfer function upper plateau speed)
1310 PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
1311 PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
1312 PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
1313 PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
1315 // inquire pts status
1316 rcv = ps2_host_send(0xE2);
1317 rcv = ps2_host_send(0x2C);
1318 rcv = ps2_host_recv_response();
1319 if ((rcv & 1) == 1) {
1320 // if on, disable pts
1321 rcv = ps2_host_send(0xE2);
1322 rcv = ps2_host_send(0x47);
1323 rcv = ps2_host_send(0x2C);
1324 rcv = ps2_host_send(0x01);