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"
36 #ifdef PS2_MOUSE_ENABLE
37 #include "ps2_mouse.h"
40 #ifdef FAUXCLICKY_ENABLE
41 #include "fauxclicky.h"
44 #define FAUXCLICKY_OFF do { \
45 fauxclicky_enabled = false; \
46 rgbsps_set(LED_AUDIO, COLOR_BLANK); \
50 #define FAUXCLICKY_ON do { \
51 fauxclicky_enabled = true; \
52 rgbsps_set(LED_AUDIO, THEME_COLOR_AUDIO); \
56 #include "outputselect.h"
58 #define COUNT(x) (sizeof (x) / sizeof (*(x)))
60 // Fillers to make layering clearer
61 #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
151 #define EMPTY MO(_EMPTY)
154 #define FUN0 LT(_FUN, KC_0)
159 GRIN, // grinning face 😊
160 TJOY, // tears of joy 😂
161 SMILE, // grining face with smiling eyes 😁
163 EYERT, // smiling face with heart shaped eyes 😍
164 CRY, // crying face 😭
165 SMEYE, // smiling face with smiling eyes 😊
168 HART2, // two hearts 💕
170 OKHND, // ok hand sign 👌
176 THMDN, // thumb down 👎
179 MUSIC, // musical notes
181 CELEB, // celebration 🙌
182 CRY2, // crying face 😢
183 COOL, // smile with sunglasses 😎
184 NOEVS, // see no evil
185 NOEVH, // hear no evil
186 NOEVK, // speak no evil
190 BHART, // broken heart
191 SLEEP, // sleeping face
192 SMIL2, // smiling face with open mouth & sweat
195 TONGU, // face with tongue & winking eye
196 DISAP, // disappointed
197 YUMMY, // face savoring delicious food
198 CLAP, // hand clapping
199 FEAR, // face screaming in fear
200 HORNS, // smiling face with horns
201 HALO, // smiling face with halo
266 const uint32_t PROGMEM unicode_map[] = {
367 [LTEQ] = 0x2264, // less than or equal
368 [GTEQ] = 0x2265, // greater than or equal
369 [NOTEQ] = 0x2260, // not equal
370 [PLMIN] = 0xB1, // plus minus
376 const uint8_t PROGMEM LED_ALNUM[] = {
411 const uint8_t PROGMEM LED_HOMING[] = {
422 const uint8_t PROGMEM LED_MODS[] = {
437 const uint8_t PROGMEM LED_FN[] = {
444 const uint8_t PROGMEM LED_INDICATORS[] = {
464 const uint8_t PROGMEM LED_TRACKPOINT[] = {
470 void led_turnoff_keys(void) {
471 for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
472 rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), COLOR_BLACK);
474 for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
475 rgbsps_set(pgm_read_byte(&LED_MODS[i]), COLOR_BLACK);
477 for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
478 rgbsps_set(pgm_read_byte(&LED_FN[i]), COLOR_BLACK);
482 #ifdef RGBSPS_DEMO_ENABLE
483 void led_demo(void) {
484 rgbsps_set(LED_IND_LINUX, THEME_COLOR_LINUX);
485 rgbsps_set(LED_IND_APPLE, THEME_COLOR_APPLE);
486 rgbsps_set(LED_IND_WINDOWS, THEME_COLOR_WINDOWS);
487 rgbsps_set(LED_IND_QWERTY, THEME_COLOR_QWERTY);
488 rgbsps_set(LED_IND_ALT, THEME_COLOR_ALT);
489 rgbsps_set(LED_IND_AUDIO, THEME_COLOR_AUDIO);
490 rgbsps_set(LED_IND_BLUETOOTH, THEME_COLOR_BLUETOOTH);
491 rgbsps_set(LED_IND_USB, THEME_COLOR_USB);
492 rgbsps_set(LED_IND_CAPSLOCK, THEME_COLOR_CAPSLOCK);
493 rgbsps_set(LED_IND_GUI, THEME_COLOR_GUI);
494 rgbsps_set(LED_IND_FUN, THEME_COLOR_FUN);
495 rgbsps_set(LED_IND_NUM, THEME_COLOR_NUM);
496 rgbsps_set(LED_IND_PUNC, THEME_COLOR_PUNC);
497 rgbsps_set(LED_IND_GREEK, THEME_COLOR_GREEK);
498 rgbsps_set(LED_IND_EMOJI, THEME_COLOR_EMOJI);
503 void led_reset(void) {
510 for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
511 rgbsps_set(pgm_read_byte(&LED_HOMING[i]), THEME_COLOR_GLOW1_HOME);
513 rgbsps_set(LED_F, THEME_COLOR_GLOW1_HOMING);
514 rgbsps_set(LED_J, THEME_COLOR_GLOW1_HOMING);
517 for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
518 rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), THEME_COLOR_GLOW2_ALPHA);
520 for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
521 rgbsps_set(pgm_read_byte(&LED_MODS[i]), THEME_COLOR_GLOW2_MODS);
523 for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
524 rgbsps_set(pgm_read_byte(&LED_FN[i]), THEME_COLOR_GLOW2_FN);
526 for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
527 rgbsps_set(pgm_read_byte(&LED_HOMING[i]), THEME_COLOR_GLOW2_HOME);
529 rgbsps_set(LED_F, THEME_COLOR_GLOW2_HOMING);
530 rgbsps_set(LED_J, THEME_COLOR_GLOW2_HOMING);
535 void led_set_default_layer_indicator(void) {
536 uint8_t default_layer = biton32(default_layer_state);
537 if (default_layer == _QWERTY) {
538 rgbsps_set(LED_IND_QWERTY, THEME_COLOR_QWERTY);
539 rgbsps_set(LED_IND_ALT, COLOR_BLANK);
541 rgbsps_set(LED_IND_QWERTY, COLOR_BLANK);
542 rgbsps_set(LED_IND_ALT, THEME_COLOR_ALT);
548 void led_set_layer_indicator(void) {
549 static uint8_t oldlayer = 255;
553 rgbsps_set(LED_IND_GUI, COLOR_BLANK);
554 rgbsps_set(LED_IND_FUN, COLOR_BLANK);
555 rgbsps_set(LED_IND_NUM, COLOR_BLANK);
556 rgbsps_set(LED_IND_PUNC, COLOR_BLANK);
557 rgbsps_set(LED_IND_GREEK, COLOR_BLANK);
558 rgbsps_set(LED_IND_EMOJI, COLOR_BLANK);
560 uint8_t layer = biton32(layer_state);
561 if (oldlayer == layer) {
567 if (layer <= _DEFAULT_LAYER_MAX) {
574 rgbsps_set(LED_IND_GUI, THEME_COLOR_GUI);
577 rgbsps_set(LED_IND_FUN, THEME_COLOR_FUN);
580 rgbsps_set(LED_IND_NUM, THEME_COLOR_NUM);
583 rgbsps_set(LED_IND_PUNC, THEME_COLOR_PUNC);
587 rgbsps_set(LED_IND_GREEK, THEME_COLOR_GREEK);
590 rgbsps_set(LED_IND_EMOJI, THEME_COLOR_EMOJI);
593 rgbsps_set(LED_IND_GUI, THEME_COLOR_OTHERLAYER);
594 rgbsps_set(LED_IND_FUN, THEME_COLOR_OTHERLAYER);
595 rgbsps_set(LED_IND_NUM, THEME_COLOR_OTHERLAYER);
596 rgbsps_set(LED_IND_PUNC, THEME_COLOR_OTHERLAYER);
597 rgbsps_set(LED_IND_GREEK, THEME_COLOR_OTHERLAYER);
598 rgbsps_set(LED_IND_EMOJI, THEME_COLOR_OTHERLAYER);
604 void led_set_unicode_input_mode(void) {
605 rgbsps_set(LED_IND_LINUX, COLOR_BLANK);
606 rgbsps_set(LED_IND_APPLE, COLOR_BLANK);
607 rgbsps_set(LED_IND_WINDOWS, COLOR_BLANK);
609 switch (get_unicode_input_mode()) {
611 rgbsps_set(LED_IND_LINUX, THEME_COLOR_LINUX);
614 rgbsps_set(LED_IND_APPLE, THEME_COLOR_APPLE);
618 rgbsps_set(LED_IND_WINDOWS, THEME_COLOR_WINDOWS);
624 void led_set_output_ble(void) {
625 rgbsps_set(LED_IND_BLUETOOTH, THEME_COLOR_BLUETOOTH);
626 rgbsps_set(LED_IND_USB, COLOR_BLANK);
630 void led_set_output_usb(void) {
631 rgbsps_set(LED_IND_BLUETOOTH, COLOR_BLANK);
632 rgbsps_set(LED_IND_USB, THEME_COLOR_USB);
636 void led_set_output_none(void) {
637 rgbsps_set(LED_IND_BLUETOOTH, COLOR_BLANK);
638 rgbsps_set(LED_IND_USB, COLOR_BLANK);
642 void led_init(void) {
646 // set trackpoint color
647 rgbsps_set(LED_TRACKPOINT1, THEME_COLOR_TP1);
648 rgbsps_set(LED_TRACKPOINT2, THEME_COLOR_TP2);
649 rgbsps_set(LED_TRACKPOINT3, THEME_COLOR_TP3);
651 // unicode input mode
652 led_set_unicode_input_mode();
655 led_set_layer_indicator();
656 led_set_default_layer_indicator();
659 #ifdef FAUXCLICKY_ENABLE
660 if (fauxclicky_enabled) {
661 rgbsps_set(LED_IND_AUDIO, THEME_COLOR_AUDIO);
663 rgbsps_set(LED_IND_AUDIO, COLOR_BLANK);
671 #endif // RGBSPS_ENABLE
675 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
678 * ,-----------------------------------------------------------------------------------.
679 * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
680 * |------+------+------+------+------+-------------+------+------+------+------+------|
681 * | Esc | A | S | D | F | G | H | J | K | L | ' |Enter |
682 * |------+------+------+------+------+------|------+------+------+------+------+------|
683 * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift |
684 * |------+------+------+------+------+------+------+------+------+------+------+------|
685 * | Ctrl | Alt | GUI | Punc | Num | Space | Fun |Greek | GUI |AltGr | Ctrl |
686 * `-----------------------------------------------------------------------------------'
689 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
690 KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT ,
691 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
692 KC_LCTL, KC_LALT, KC_LGUI, EMPTY, NUM, LSPACE, RSPACE, FUN, GREEK, KC_RGUI, C_RALT, KC_RCTL,
693 _______, _______, _______
697 * ,-----------------------------------------------------------------------------------.
698 * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp |
699 * |------+------+------+------+------+-------------+------+------+------+------+------|
700 * | Esc | A | O | E | U | I | D | H | T | N | S |Enter |
701 * |------+------+------+------+------+------|------+------+------+------+------+------|
702 * | Shift| / | Q | J | K | X | B | M | W | V | Z |Shift |
703 * |------+------+------+------+------+------+------+------+------+------+------+------|
704 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
705 * `-----------------------------------------------------------------------------------'
709 _______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, _______,
710 _______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, _______,
711 _______, KC_SLSH, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______,
712 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
713 _______, _______, _______
718 * ,-----------------------------------------------------------------------------------.
719 * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
720 * |------+------+------+------+------+-------------+------+------+------+------+------|
721 * | Esc | A | R | S | T | D | H | N | E | I | O |Enter |
722 * |------+------+------+------+------+------|------+------+------+------+------+------|
723 * | Shift| Z | X | C | V | B | K | M | , | . | / |Shift |
724 * |------+------+------+------+------+------+------+------+------+------+------+------|
725 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
726 * `-----------------------------------------------------------------------------------'
729 #ifdef LAYOUT_COLEMAK
731 _______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, _______,
732 _______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, _______,
733 _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
734 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
735 _______, _______, _______
740 * ,-----------------------------------------------------------------------------------.
741 * | Tab | Q | W | D | F | K | J | U | R | L | ; | Bksp |
742 * |------+------+------+------+------+-------------+------+------+------+------+------|
743 * | Esc | A | S | E | T | G | Y | N | I | O | H |Enter |
744 * |------+------+------+------+------+------|------+------+------+------+------+------|
745 * | Shift| Z | X | C | V | B | P | M | , | . | / |Shift |
746 * |------+------+------+------+------+------+------+------+------+------+------+------|
747 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
748 * `-----------------------------------------------------------------------------------'
753 _______, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_J, KC_U, KC_R, KC_L, KC_QUOT, _______,
754 _______, KC_A, KC_S, KC_E, KC_T, KC_G, KC_Y, KC_N, KC_I, KC_O, KC_H, _______,
755 _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
756 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
757 _______, _______, _______
762 * ,-----------------------------------------------------------------------------------.
763 * | Tab | Q | D | R | W | B | J | F | U | P | ; | Bksp |
764 * |------+------+------+------+------+-------------+------+------+------+------+------|
765 * | Esc | A | S | H | T | G | Y | N | E | O | I |Enter |
766 * |------+------+------+------+------+------|------+------+------+------+------+------|
767 * | Shift| Z | X | M | C | V | K | K | , | . | / |Shift |
768 * |------+------+------+------+------+------+------+------+------+------+------+------|
769 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
770 * `-----------------------------------------------------------------------------------'
773 #ifdef LAYOUT_WORKMAN
775 _______, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_QUOT, _______,
776 _______, KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, _______,
777 _______, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, _______,
778 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
779 _______, _______, _______
784 * ,-----------------------------------------------------------------------------------.
785 * | ~ | ! | @ | # | $ | % | ^ | & | * | ≤ | ≥ | ` |
786 * |------+------+------+------+------+-------------+------+------+------+------+------|
787 * | | * | \ | - | = | / | ≠ | ( | ) | < | > | |
788 * |------+------+------+------+------+------|------+------+------+------+------+------|
789 * | & | ^ | | | _ | + | ? | ± | [ | ] | { | } | |
790 * |------+------+------+------+------+------+------+------+------+------+------+------|
791 * | | | | | | | | | | : | |
792 * `-----------------------------------------------------------------------------------'
795 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, X(LTEQ), X(GTEQ), _______,
796 KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, X(NOTEQ),KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
797 KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, X(PLMIN),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______,
798 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______,
799 _______, _______, _______
803 * ,-----------------------------------------------------------------------------------.
804 * | ~ | ! | @ | # | $ | % | A | 7 | 8 | 9 | D | |
805 * |------+------+------+------+------+-------------+------+------+------+------+------|
806 * | ` | * | \ | - | = | / | B | 4 | 5 | 6 | E | |
807 * |------+------+------+------+------+------|------+------+------+------+------+------|
808 * | & | ^ | | | _ | + | ? | C | 1 | 2 | 3 | F | |
809 * |------+------+------+------+------+------+------+------+------+------+------+------|
810 * | | | x | | | | | 0 | , | . | : | |
811 * `-----------------------------------------------------------------------------------'
814 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, S(KC_A), KC_1, KC_2, KC_3, S(KC_D), _______,
815 KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, S(KC_B), KC_4, KC_5, KC_6, S(KC_E), _______,
816 KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C), KC_7, KC_8, KC_9, S(KC_F), _______,
817 _______, _______, KC_X, _______, _______, _______, _______, FUN0 , KC_COMM, KC_DOT, KC_COLN, _______,
818 _______, _______, _______
822 * ,-----------------------------------------------------------------------------------.
823 * | | F1 | F2 | F3 | F4 | Ins | | PgUp | Up | PgDn | PgUp | |
824 * |------+------+------+------+------+-------------+------+------+------+------+------|
825 * | Caps | F5 | F6 | F7 | F8 |PrtSc | | Left | Down | Right| PgDn | |
826 * |------+------+------+------+------+------|------+------+------+------+------+------|
827 * | | F9 | F10 | F11 | F12 |Pause | | | Home | End | | |
828 * |------+------+------+------+------+------+------+------+------+------+------+------|
829 * | | | | | | | | | | | |
830 * `-----------------------------------------------------------------------------------'
833 XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_INS, XXXXXXX, KC_PGUP, KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
834 KC_CAPS, KC_F5, KC_F6, KC_F7, KC_F8, KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
835 _______, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUS, XXXXXXX, XXXXXXX, KC_HOME, KC_END, XXXXXXX, _______,
836 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
837 _______, _______, _______
841 * ,-----------------------------------------------------------------------------------.
842 * | | | | | | | | | | | | |
843 * |------+------+------+------+------+-------------+------+------+------+------+------|
844 * | | | | | | | | | | | | |
845 * |------+------+------+------+------+------+------+------+------+------+------+------|
846 * | | | | | | | | | | | | |
847 * |------+------+------+------+------+------+------+------+------+------+------+------|
848 * | | | | | | | | | | | | |
849 * `-----------------------------------------------------------------------------------'
852 _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC), X(UPI), _______,
853 _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA), X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
854 _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA), X(UNU), X(UMU), KC_COMM, KC_DOT, KC_SLSH, _______,
855 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
856 _______, _______, _______
860 * ,-----------------------------------------------------------------------------------.
861 * | | | | | | | | | | | | |
862 * |------+------+------+------+------+-------------+------+------+------+------+------|
863 * | | | | | | | | | | | | |
864 * |------+------+------+------+------+------+------+------+------+------+------+------|
865 * | | | | | | | | | | | | |
866 * |------+------+------+------+------+------+------+------+------+------+------+------|
867 * | | | | | | | | | | | | |
868 * `-----------------------------------------------------------------------------------'
871 _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC), X(LPI), _______,
872 _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA), X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
873 _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA), X(LNU), X(LMU), KC_COMM, KC_DOT, KC_SLSH, _______,
874 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
875 _______, _______, _______
879 * ,-----------------------------------------------------------------------------------.
880 * | | | | | | | | | | | | |
881 * |------+------+------+------+------+-------------+------+------+------+------+------|
882 * | | | | | | | | | | | | |
883 * |------+------+------+------+------+------+------+------+------+------+------+------|
884 * | | | | | | | | | | | | |
885 * |------+------+------+------+------+------+------+------+------+------+------+------|
886 * | | | | | | | | | | | | |
887 * `-----------------------------------------------------------------------------------'
890 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
891 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
892 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
893 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
894 _______, _______, _______
898 * ,-----------------------------------------------------------------------------------.
899 * | | | | | | | | | | | | |
900 * |------+------+------+------+------+-------------+------+------+------+------+------|
901 * | | | | | | | | | | | | |
902 * |------+------+------+------+------+------+------+------+------+------+------+------|
903 * | | | | | | | | | | | | |
904 * |------+------+------+------+------+------+------+------+------+------+------+------|
905 * | | | | | | | | | | | | |
906 * `-----------------------------------------------------------------------------------'
909 X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
910 X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART), X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
911 X(THMDN),X(SLEEP), X(CLAP), X(CRY), X(VIC),X(BHART), X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
912 X(POO), X(EYES), X(HUNRD),_______, X(SKULL),X(HORNS), X(HALO), X(FEAR),_______,X(YUMMY),X(DISAP),X(NOEVK),
913 _______, _______, _______
917 * ,-----------------------------------------------------------------------------------.
918 * | | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | |
919 * |------+------+------+------+------+-------------+------+------+------+------+------|
920 * | Esc | | Btab | Esc | Tab | | | Prev | | Next | | |
921 * |------+------+------+------+------+------+------+------+------+------+------+------|
922 * | | | Prev | Play | Next | | | | | | | |
923 * |------+------+------+------+------+------+------+------+------+------+------+------|
924 * | | | | | | | | | | | | |
925 * `-----------------------------------------------------------------------------------'
928 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,
929 KC_ESC, XXXXXXX, S(KC_TAB),KC_ESC, KC_TAB, XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
930 XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, KC_SPC, KC_SPC, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
931 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
932 _______, _______, _______
936 * ,-----------------------------------------------------------------------------------.
937 * | |Qwerty| Win | |Reset | | | USB | | | | |
938 * |------+------+------+------+------+-------------+------+------+------+------+------|
939 * | |Audio | |Dvorak| | Glow | | |WorkMn|Linux | | |
940 * |------+------+------+------+------+------+------+------+------+------+------+------|
941 * | | | |Colmak| | BLE |Norman|MacOS | | | | |
942 * |------+------+------+------+------+------+------+------+------+------+------+------|
943 * | | | | | | | | | | | | |
944 * `-----------------------------------------------------------------------------------'
947 DEBUG, QWERTY, WIN, XXXXXXX, RESET, XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, RGBDEMO,
948 XXXXXXX, FC_TOG, XXXXXXX, DVORAK, XXXXXXX, GLOW, XXXXXXX, XXXXXXX, WORKMAN, LINUX, XXXXXXX, XXXXXXX,
949 XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BT, NORMAN, OSX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
950 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
951 _______, _______, _______
957 void persistent_default_layer_set(uint16_t default_layer) {
958 eeconfig_update_default_layer(default_layer);
959 default_layer_set(default_layer);
961 led_set_default_layer_indicator();
965 #ifdef DOUBLESPACE_LAYER_ENABLE
966 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
971 register_code(KC_LALT); // sends alt and enter layer
972 space_layer_entered = true;
976 if (space_layer_entered) {
977 unregister_code(KC_LALT); // release alt and exit layer
980 space_layer_entered = false;
984 register_code(KC_SPC);
985 unregister_code(KC_SPC);
993 uint32_t layer_state_set_kb(uint32_t state)
995 // turn on punc layer if both fun & num are on
996 if ((state & ((1UL<<_NUM) | (1UL<<_FUN))) == ((1UL<<_NUM) | (1UL<<_FUN))) {
997 state |= (1UL<<_PUNC);
999 state &= ~(1UL<<_PUNC);
1002 // turn on emoji layer if empty and greek layer are on
1004 (state & ((1UL<<_EMPTY) | (1UL<<_GREEKU))) == ((1UL<<_EMPTY) | (1UL<<_GREEKU))
1005 || (state & ((1UL<<_EMPTY) | (1UL<<_GREEKL))) == ((1UL<<_EMPTY) | (1UL<<_GREEKL))
1007 state |= (1UL<<_EMOJI);
1009 state &= ~(1UL<<_EMOJI);
1014 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
1015 static bool lshift = false;
1016 static bool rshift = false;
1017 static uint8_t layer = 0;
1019 lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
1020 rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
1021 layer = biton32(layer_state);
1023 #ifdef DOUBLESPACE_LAYER_ENABLE
1024 // double-space: send space immediately if any other key depressed before space is released
1025 if ((lspace_active ^ rspace_active)
1026 && keycode != LSPACE
1027 && keycode != RSPACE
1028 && record->event.pressed)
1030 if (lspace_active) {
1031 if (!lspace_emitted) {
1032 register_code(KC_SPC);
1033 unregister_code(KC_SPC);
1035 lspace_emitted = true;
1037 if (rspace_active) {
1038 if (!rspace_emitted) {
1039 register_code(KC_SPC);
1040 unregister_code(KC_SPC);
1042 rspace_emitted = true;
1046 if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
1047 if (record->event.pressed) {
1048 unregister_code(KC_LALT);
1050 register_code(KC_LALT);
1057 #ifdef DOUBLESPACE_LAYER_ENABLE
1058 // double-space enter space layer
1060 process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
1064 process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
1069 // handle greek layer shift
1073 if (layer == _GREEKU || layer == _GREEKL) {
1074 if (record->event.pressed) {
1078 if (lshift ^ rshift) { // if only one shift was pressed
1087 // press both ctrls to activate SYS layer
1091 bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
1092 bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
1093 if (record->event.pressed) {
1094 if (lctrl ^ rctrl) { // if only one ctrl was pressed
1103 // QWERTZ style comma and dot: semicolon and colon when shifted
1105 if (record->event.pressed) {
1106 if (lshift || rshift) {
1107 if (lshift) unregister_code(KC_LSFT);
1108 if (rshift) unregister_code(KC_RSFT);
1109 register_code(KC_SCLN);
1110 unregister_code(KC_SCLN);
1111 if (lshift) register_code(KC_LSFT);
1112 if (rshift) register_code(KC_RSFT);
1114 register_code(KC_COMM);
1115 unregister_code(KC_COMM);
1121 if (record->event.pressed) {
1122 if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
1123 register_code(KC_SCLN);
1124 unregister_code(KC_SCLN);
1126 register_code(KC_DOT);
1127 unregister_code(KC_DOT);
1135 if (record->event.pressed) {
1136 persistent_default_layer_set(1UL<<_QWERTY);
1140 #ifdef LAYOUT_DVORAK
1142 if (record->event.pressed) {
1143 persistent_default_layer_set(1UL<<_DVORAK);
1148 #ifdef LAYOUT_COLEMAK
1150 if (record->event.pressed) {
1151 persistent_default_layer_set(1UL<<_COLEMAK);
1156 #ifdef LAYOUT_WORKMAN
1158 if (record->event.pressed) {
1159 persistent_default_layer_set(1UL<<_WORKMAN);
1164 #ifdef LAYOUT_NORMAN
1166 if (record->event.pressed) {
1167 persistent_default_layer_set(1UL<<_NORMAN);
1173 // only process Fnumber on key release, and only when layer switcher is still pressed.
1174 // this is to avoid accidental presses on potentially destructive keys
1175 case KC_F1 ... KC_F12:
1179 if (!record->event.pressed && layer == _FUN) { // key released and still in FUN layer
1180 register_code(keycode);
1181 unregister_code(keycode);
1189 if (record->event.pressed) {
1190 if (lshift || rshift) {
1206 set_unicode_input_mode(UC_LNX);
1207 #ifdef RGBSPS_ENABLE
1208 led_set_unicode_input_mode();
1213 set_unicode_input_mode(UC_WINC);
1214 #ifdef RGBSPS_ENABLE
1215 led_set_unicode_input_mode();
1220 set_unicode_input_mode(UC_OSX);
1221 #ifdef RGBSPS_ENABLE
1222 led_set_unicode_input_mode();
1227 // glow mode changer
1228 #ifdef RGBSPS_ENABLE
1230 if (record->event.pressed) {
1232 if (glow_mode > GLOW_FULL) {
1233 glow_mode = GLOW_NONE;
1242 // faux clicky indicator
1243 #ifdef FAUXCLICKY_ENABLE
1245 #ifdef RGBSPS_ENABLE
1246 if (fauxclicky_enabled) {
1247 rgbsps_set(LED_IND_AUDIO, THEME_COLOR_AUDIO);
1249 rgbsps_set(LED_IND_AUDIO, COLOR_BLANK);
1257 #ifdef RGBSPS_DEMO_ENABLE
1267 void set_output_user(uint8_t output) {
1268 #ifdef MODULE_ADAFRUIT_BLE
1271 led_set_output_usb();
1273 case OUTPUT_BLUETOOTH:
1274 led_set_output_ble();
1277 led_set_output_none();
1282 void matrix_init_user() {
1283 _delay_ms(500); // give time for usb to initialize
1285 set_unicode_input_mode(UC_LNX);
1287 #ifdef RGBSPS_ENABLE
1291 // auto detect output on init
1292 #ifdef MODULE_ADAFRUIT_BLE
1293 uint8_t output = auto_detect_output();
1294 if (output == OUTPUT_USB) {
1295 set_output(OUTPUT_USB);
1297 set_output(OUTPUT_BLUETOOTH);
1302 void turn_off_capslock() {
1304 register_code(KC_CAPS);
1305 unregister_code(KC_CAPS);
1309 #ifdef RGBSPS_ENABLE
1310 void matrix_scan_user(void) {
1311 led_set_layer_indicator();
1314 void battery_poll(uint8_t level) {
1315 rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15);
1319 void led_set_user(uint8_t usb_led) {
1320 bool new_capslock = usb_led & (1<<USB_LED_CAPS_LOCK);
1321 if (new_capslock ^ capslock) { // capslock state is different
1322 if ((capslock = new_capslock)) {
1323 rgbsps_set(LED_IND_CAPSLOCK, THEME_COLOR_CAPSLOCK);
1325 rgbsps_set(LED_IND_CAPSLOCK, COLOR_BLANK);
1332 #ifdef PS2_MOUSE_ENABLE
1333 void ps2_mouse_init_user() {
1336 // set TrackPoint sensitivity
1337 PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
1338 PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
1339 PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
1340 PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
1342 // set TrackPoint Negative Inertia factor
1343 PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
1344 PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
1345 PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
1346 PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
1348 // set TrackPoint speed
1349 // (transfer function upper plateau speed)
1350 PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
1351 PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
1352 PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
1353 PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
1355 // inquire pts status
1356 rcv = ps2_host_send(0xE2);
1357 rcv = ps2_host_send(0x2C);
1358 rcv = ps2_host_recv_response();
1359 if ((rcv & 1) == 1) {
1360 // if on, disable pts
1361 rcv = ps2_host_send(0xE2);
1362 rcv = ps2_host_send(0x47);
1363 rcv = ps2_host_send(0x2C);
1364 rcv = ps2_host_send(0x01);