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 #define KC_WWWB KC_WWW_BACK
61 #define KC_WWWF KC_WWW_FORWARD
63 // hybrid right-alt & scroll lock (mapped to Compose in OS)
64 #define C_RALT MT(MOD_RALT, KC_SLCK)
66 // dual use right-shift & del key
67 // #define C_RSFT MT(MOD_RSFT, KC_DEL)
69 bool capslock = false;
70 #ifdef DOUBLESPACE_LAYER_ENABLE
71 bool lspace_active = false;
72 bool rspace_active = false;
73 bool lspace_emitted = false;
74 bool rspace_emitted = false;
75 bool space_layer_entered = false;
84 uint8_t glow_mode = GLOW_MIN;
86 void turn_off_capslock(void);
87 extern keymap_config_t keymap_config;
89 // layers, ordering is important!
96 _DEFAULT_LAYER_MAX = _NORMAN,
111 // double-space layer
114 enum planck_keycodes {
138 #ifndef FAUXCLICKY_ENABLE
141 #ifndef MODULE_ADAFRUIT_BLE
148 #define EMPTY MO(_EMPTY)
151 #define FUN0 LT(_FUN, KC_0)
156 GRIN, // grinning face 😊
157 TJOY, // tears of joy 😂
158 SMILE, // grining face with smiling eyes 😁
160 EYERT, // smiling face with heart shaped eyes 😍
161 CRY, // crying face 😭
162 SMEYE, // smiling face with smiling eyes 😊
165 HART2, // two hearts 💕
167 OKHND, // ok hand sign 👌
173 THMDN, // thumb down 👎
176 MUSIC, // musical notes
178 CELEB, // celebration 🙌
179 CRY2, // crying face 😢
180 COOL, // smile with sunglasses 😎
181 NOEVS, // see no evil
182 NOEVH, // hear no evil
183 NOEVK, // speak no evil
187 BHART, // broken heart
188 SLEEP, // sleeping face
189 SMIL2, // smiling face with open mouth & sweat
192 TONGU, // face with tongue & winking eye
193 DISAP, // disappointed
194 YUMMY, // face savoring delicious food
195 CLAP, // hand clapping
196 FEAR, // face screaming in fear
197 HORNS, // smiling face with horns
198 HALO, // smiling face with halo
263 const uint32_t PROGMEM unicode_map[] = {
364 [LTEQ] = 0x2264, // less than or equal
365 [GTEQ] = 0x2265, // greater than or equal
366 [NOTEQ] = 0x2260, // not equal
367 [PLMIN] = 0xB1, // plus minus
373 const uint8_t PROGMEM LED_ALNUM[] = {
408 const uint8_t PROGMEM LED_HOMING[] = {
419 const uint8_t PROGMEM LED_MODS[] = {
434 const uint8_t PROGMEM LED_FN[] = {
441 const uint8_t PROGMEM LED_INDICATORS[] = {
461 const uint8_t PROGMEM LED_TRACKPOINT[] = {
467 void led_turnoff_keys(void) {
468 for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
469 rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), COLOR_BLACK);
471 for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
472 rgbsps_set(pgm_read_byte(&LED_MODS[i]), COLOR_BLACK);
474 for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
475 rgbsps_set(pgm_read_byte(&LED_FN[i]), COLOR_BLACK);
479 #ifdef RGBSPS_DEMO_ENABLE
480 void led_demo(void) {
481 rgbsps_set(LED_IND_LINUX, THEME_COLOR_LINUX);
482 rgbsps_set(LED_IND_APPLE, THEME_COLOR_APPLE);
483 rgbsps_set(LED_IND_WINDOWS, THEME_COLOR_WINDOWS);
484 rgbsps_set(LED_IND_QWERTY, THEME_COLOR_QWERTY);
485 rgbsps_set(LED_IND_ALT, THEME_COLOR_ALT);
486 rgbsps_set(LED_IND_AUDIO, THEME_COLOR_AUDIO);
487 rgbsps_set(LED_IND_BLUETOOTH, THEME_COLOR_BLUETOOTH);
488 rgbsps_set(LED_IND_USB, THEME_COLOR_USB);
489 rgbsps_set(LED_IND_CAPSLOCK, THEME_COLOR_CAPSLOCK);
490 rgbsps_set(LED_IND_GUI, THEME_COLOR_GUI);
491 rgbsps_set(LED_IND_FUN, THEME_COLOR_FUN);
492 rgbsps_set(LED_IND_NUM, THEME_COLOR_NUM);
493 rgbsps_set(LED_IND_PUNC, THEME_COLOR_PUNC);
494 rgbsps_set(LED_IND_GREEK, THEME_COLOR_GREEK);
495 rgbsps_set(LED_IND_EMOJI, THEME_COLOR_EMOJI);
500 void led_reset(void) {
507 for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
508 rgbsps_set(pgm_read_byte(&LED_HOMING[i]), THEME_COLOR_GLOW1_HOME);
510 rgbsps_set(LED_F, THEME_COLOR_GLOW1_HOMING);
511 rgbsps_set(LED_J, THEME_COLOR_GLOW1_HOMING);
514 for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
515 rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), THEME_COLOR_GLOW2_ALPHA);
517 for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
518 rgbsps_set(pgm_read_byte(&LED_MODS[i]), THEME_COLOR_GLOW2_MODS);
520 for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
521 rgbsps_set(pgm_read_byte(&LED_FN[i]), THEME_COLOR_GLOW2_FN);
523 for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
524 rgbsps_set(pgm_read_byte(&LED_HOMING[i]), THEME_COLOR_GLOW2_HOME);
526 rgbsps_set(LED_F, THEME_COLOR_GLOW2_HOMING);
527 rgbsps_set(LED_J, THEME_COLOR_GLOW2_HOMING);
532 void led_set_default_layer_indicator(void) {
533 uint8_t default_layer = biton32(default_layer_state);
534 if (default_layer == _QWERTY) {
535 rgbsps_set(LED_IND_QWERTY, THEME_COLOR_QWERTY);
536 rgbsps_set(LED_IND_ALT, COLOR_BLANK);
538 rgbsps_set(LED_IND_QWERTY, COLOR_BLANK);
539 rgbsps_set(LED_IND_ALT, THEME_COLOR_ALT);
545 void led_set_layer_indicator(void) {
546 static uint8_t oldlayer = 255;
550 rgbsps_set(LED_IND_GUI, COLOR_BLANK);
551 rgbsps_set(LED_IND_FUN, COLOR_BLANK);
552 rgbsps_set(LED_IND_NUM, COLOR_BLANK);
553 rgbsps_set(LED_IND_PUNC, COLOR_BLANK);
554 rgbsps_set(LED_IND_GREEK, COLOR_BLANK);
555 rgbsps_set(LED_IND_EMOJI, COLOR_BLANK);
557 uint8_t layer = biton32(layer_state);
558 if (oldlayer == layer) {
564 if (layer <= _DEFAULT_LAYER_MAX) {
571 rgbsps_set(LED_IND_GUI, THEME_COLOR_GUI);
574 rgbsps_set(LED_IND_FUN, THEME_COLOR_FUN);
577 rgbsps_set(LED_IND_NUM, THEME_COLOR_NUM);
580 rgbsps_set(LED_IND_PUNC, THEME_COLOR_PUNC);
584 rgbsps_set(LED_IND_GREEK, THEME_COLOR_GREEK);
587 rgbsps_set(LED_IND_EMOJI, THEME_COLOR_EMOJI);
590 rgbsps_set(LED_IND_GUI, THEME_COLOR_OTHERLAYER);
591 rgbsps_set(LED_IND_FUN, THEME_COLOR_OTHERLAYER);
592 rgbsps_set(LED_IND_NUM, THEME_COLOR_OTHERLAYER);
593 rgbsps_set(LED_IND_PUNC, THEME_COLOR_OTHERLAYER);
594 rgbsps_set(LED_IND_GREEK, THEME_COLOR_OTHERLAYER);
595 rgbsps_set(LED_IND_EMOJI, THEME_COLOR_OTHERLAYER);
601 void led_set_unicode_input_mode(void) {
602 rgbsps_set(LED_IND_LINUX, COLOR_BLANK);
603 rgbsps_set(LED_IND_APPLE, COLOR_BLANK);
604 rgbsps_set(LED_IND_WINDOWS, COLOR_BLANK);
606 switch (get_unicode_input_mode()) {
608 rgbsps_set(LED_IND_LINUX, THEME_COLOR_LINUX);
611 rgbsps_set(LED_IND_APPLE, THEME_COLOR_APPLE);
615 rgbsps_set(LED_IND_WINDOWS, THEME_COLOR_WINDOWS);
621 void led_set_output_ble(void) {
622 rgbsps_set(LED_IND_BLUETOOTH, THEME_COLOR_BLUETOOTH);
623 rgbsps_set(LED_IND_USB, COLOR_BLANK);
627 void led_set_output_usb(void) {
628 rgbsps_set(LED_IND_BLUETOOTH, COLOR_BLANK);
629 rgbsps_set(LED_IND_USB, THEME_COLOR_USB);
633 void led_set_output_none(void) {
634 rgbsps_set(LED_IND_BLUETOOTH, COLOR_BLANK);
635 rgbsps_set(LED_IND_USB, COLOR_BLANK);
639 void led_init(void) {
643 // set trackpoint color
644 rgbsps_set(LED_TRACKPOINT1, THEME_COLOR_TP1);
645 rgbsps_set(LED_TRACKPOINT2, THEME_COLOR_TP2);
646 rgbsps_set(LED_TRACKPOINT3, THEME_COLOR_TP3);
648 // unicode input mode
649 led_set_unicode_input_mode();
652 led_set_layer_indicator();
653 led_set_default_layer_indicator();
656 #ifdef FAUXCLICKY_ENABLE
657 if (fauxclicky_enabled) {
658 rgbsps_set(LED_IND_AUDIO, THEME_COLOR_AUDIO);
660 rgbsps_set(LED_IND_AUDIO, COLOR_BLANK);
668 #endif // RGBSPS_ENABLE
672 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
675 * ,-----------------------------------------------------------------------------------.
676 * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
677 * |------+------+------+------+------+-------------+------+------+------+------+------|
678 * | Esc | A | S | D | F | G | H | J | K | L | ' |Enter |
679 * |------+------+------+------+------+------|------+------+------+------+------+------|
680 * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift |
681 * |------+------+------+------+------+------+------+------+------+------+------+------|
682 * | Ctrl | Alt | GUI | Punc | Num | Space | Fun |Greek | GUI |AltGr | Ctrl |
683 * `-----------------------------------------------------------------------------------'
686 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
687 KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT ,
688 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
689 KC_LCTL, KC_LALT, KC_LGUI, EMPTY, NUM, LSPACE, RSPACE, FUN, GREEK, KC_RGUI, C_RALT, KC_RCTL,
690 _______, _______, _______
694 * ,-----------------------------------------------------------------------------------.
695 * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp |
696 * |------+------+------+------+------+-------------+------+------+------+------+------|
697 * | Esc | A | O | E | U | I | D | H | T | N | S |Enter |
698 * |------+------+------+------+------+------|------+------+------+------+------+------|
699 * | Shift| / | Q | J | K | X | B | M | W | V | Z |Shift |
700 * |------+------+------+------+------+------+------+------+------+------+------+------|
701 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
702 * `-----------------------------------------------------------------------------------'
706 _______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, _______,
707 _______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, _______,
708 _______, KC_SLSH, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______,
709 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
710 _______, _______, _______
715 * ,-----------------------------------------------------------------------------------.
716 * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
717 * |------+------+------+------+------+-------------+------+------+------+------+------|
718 * | Esc | A | R | S | T | D | H | N | E | I | O |Enter |
719 * |------+------+------+------+------+------|------+------+------+------+------+------|
720 * | Shift| Z | X | C | V | B | K | M | , | . | / |Shift |
721 * |------+------+------+------+------+------+------+------+------+------+------+------|
722 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
723 * `-----------------------------------------------------------------------------------'
726 #ifdef LAYOUT_COLEMAK
728 _______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, _______,
729 _______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, _______,
730 _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
731 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
732 _______, _______, _______
737 * ,-----------------------------------------------------------------------------------.
738 * | Tab | Q | W | D | F | K | J | U | R | L | ; | Bksp |
739 * |------+------+------+------+------+-------------+------+------+------+------+------|
740 * | Esc | A | S | E | T | G | Y | N | I | O | H |Enter |
741 * |------+------+------+------+------+------|------+------+------+------+------+------|
742 * | Shift| Z | X | C | V | B | P | M | , | . | / |Shift |
743 * |------+------+------+------+------+------+------+------+------+------+------+------|
744 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
745 * `-----------------------------------------------------------------------------------'
750 _______, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_J, KC_U, KC_R, KC_L, KC_QUOT, _______,
751 _______, KC_A, KC_S, KC_E, KC_T, KC_G, KC_Y, KC_N, KC_I, KC_O, KC_H, _______,
752 _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
753 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
754 _______, _______, _______
759 * ,-----------------------------------------------------------------------------------.
760 * | Tab | Q | D | R | W | B | J | F | U | P | ; | Bksp |
761 * |------+------+------+------+------+-------------+------+------+------+------+------|
762 * | Esc | A | S | H | T | G | Y | N | E | O | I |Enter |
763 * |------+------+------+------+------+------|------+------+------+------+------+------|
764 * | Shift| Z | X | M | C | V | K | K | , | . | / |Shift |
765 * |------+------+------+------+------+------+------+------+------+------+------+------|
766 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
767 * `-----------------------------------------------------------------------------------'
770 #ifdef LAYOUT_WORKMAN
772 _______, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_QUOT, _______,
773 _______, KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, _______,
774 _______, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, _______,
775 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
776 _______, _______, _______
781 * ,-----------------------------------------------------------------------------------.
782 * | ~ | ! | @ | # | $ | % | ^ | & | * | ≤ | ≥ | ` |
783 * |------+------+------+------+------+-------------+------+------+------+------+------|
784 * | | * | \ | - | = | / | ≠ | ( | ) | < | > | |
785 * |------+------+------+------+------+------|------+------+------+------+------+------|
786 * | & | ^ | | | _ | + | ? | ± | [ | ] | { | } | |
787 * |------+------+------+------+------+------+------+------+------+------+------+------|
788 * | | | | | | | | | | : | |
789 * `-----------------------------------------------------------------------------------'
792 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, X(LTEQ), X(GTEQ), _______,
793 KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, X(NOTEQ),KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
794 KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, X(PLMIN),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______,
795 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______,
796 _______, _______, _______
800 * ,-----------------------------------------------------------------------------------.
801 * | ~ | ! | @ | # | $ | % | A | 7 | 8 | 9 | D | |
802 * |------+------+------+------+------+-------------+------+------+------+------+------|
803 * | ` | * | \ | - | = | / | B | 4 | 5 | 6 | E | |
804 * |------+------+------+------+------+------|------+------+------+------+------+------|
805 * | & | ^ | | | _ | + | ? | C | 1 | 2 | 3 | F | |
806 * |------+------+------+------+------+------+------+------+------+------+------+------|
807 * | | | x | | | | | 0 | , | . | : | |
808 * `-----------------------------------------------------------------------------------'
811 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, S(KC_A), KC_1, KC_2, KC_3, S(KC_D), _______,
812 KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, S(KC_B), KC_4, KC_5, KC_6, S(KC_E), _______,
813 KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C), KC_7, KC_8, KC_9, S(KC_F), _______,
814 _______, _______, KC_X, _______, _______, _______, _______, FUN0 , KC_COMM, KC_DOT, KC_COLN, _______,
815 _______, _______, _______
819 * ,-----------------------------------------------------------------------------------.
820 * | | F1 | F2 | F3 | F4 | Ins | | PgUp | Up | PgDn | PgUp | |
821 * |------+------+------+------+------+-------------+------+------+------+------+------|
822 * | Caps | F5 | F6 | F7 | F8 |PrtSc | | Left | Down | Right| PgDn | |
823 * |------+------+------+------+------+------|------+------+------+------+------+------|
824 * | | F9 | F10 | F11 | F12 |Pause | | | Home | End | | |
825 * |------+------+------+------+------+------+------+------+------+------+------+------|
826 * | | | | | | | | | | | |
827 * `-----------------------------------------------------------------------------------'
830 XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_INS, XXXXXXX, KC_PGUP, KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
831 KC_CAPS, KC_F5, KC_F6, KC_F7, KC_F8, KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
832 _______, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUS, XXXXXXX, XXXXXXX, KC_HOME, KC_END, XXXXXXX, _______,
833 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
834 _______, _______, _______
838 * ,-----------------------------------------------------------------------------------.
839 * | | | | | | | | | | | | |
840 * |------+------+------+------+------+-------------+------+------+------+------+------|
841 * | | | | | | | | | | | | |
842 * |------+------+------+------+------+------+------+------+------+------+------+------|
843 * | | | | | | | | | | | | |
844 * |------+------+------+------+------+------+------+------+------+------+------+------|
845 * | | | | | | | | | | | | |
846 * `-----------------------------------------------------------------------------------'
849 _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC), X(UPI), _______,
850 _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA), X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
851 _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA), X(UNU), X(UMU), KC_COMM, KC_DOT, KC_SLSH, _______,
852 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
853 _______, _______, _______
857 * ,-----------------------------------------------------------------------------------.
858 * | | | | | | | | | | | | |
859 * |------+------+------+------+------+-------------+------+------+------+------+------|
860 * | | | | | | | | | | | | |
861 * |------+------+------+------+------+------+------+------+------+------+------+------|
862 * | | | | | | | | | | | | |
863 * |------+------+------+------+------+------+------+------+------+------+------+------|
864 * | | | | | | | | | | | | |
865 * `-----------------------------------------------------------------------------------'
868 _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC), X(LPI), _______,
869 _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA), X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
870 _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA), X(LNU), X(LMU), KC_COMM, KC_DOT, KC_SLSH, _______,
871 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
872 _______, _______, _______
876 * ,-----------------------------------------------------------------------------------.
877 * | | | | | | | | | | | | |
878 * |------+------+------+------+------+-------------+------+------+------+------+------|
879 * | | | | | | | | | | | | |
880 * |------+------+------+------+------+------+------+------+------+------+------+------|
881 * | | | | | | | | | | | | |
882 * |------+------+------+------+------+------+------+------+------+------+------+------|
883 * | | | | | | | | | | | | |
884 * `-----------------------------------------------------------------------------------'
887 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
888 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
889 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
890 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
891 _______, _______, _______
895 * ,-----------------------------------------------------------------------------------.
896 * | | | | | | | | | | | | |
897 * |------+------+------+------+------+-------------+------+------+------+------+------|
898 * | | | | | | | | | | | | |
899 * |------+------+------+------+------+------+------+------+------+------+------+------|
900 * | | | | | | | | | | | | |
901 * |------+------+------+------+------+------+------+------+------+------+------+------|
902 * | | | | | | | | | | | | |
903 * `-----------------------------------------------------------------------------------'
906 X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
907 X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART), X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
908 X(THMDN),X(SLEEP), X(CLAP), X(CRY), X(VIC),X(BHART), X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
909 X(POO), X(EYES), X(HUNRD),_______, X(SKULL),X(HORNS), X(HALO), X(FEAR),_______,X(YUMMY),X(DISAP),X(NOEVK),
910 _______, _______, _______
914 * ,-----------------------------------------------------------------------------------.
915 * | | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | |
916 * |------+------+------+------+------+-------------+------+------+------+------+------|
917 * | Esc | | Btab | Esc | Tab | | | Prev | | Next | | |
918 * |------+------+------+------+------+------+------+------+------+------+------+------|
919 * | | | Prev | Play | Next | | | | | | | |
920 * |------+------+------+------+------+------+------+------+------+------+------+------|
921 * | | | | | | | | | | | | |
922 * `-----------------------------------------------------------------------------------'
925 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,
926 KC_ESC, XXXXXXX, S(KC_TAB),KC_ESC, KC_TAB, XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
927 XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, KC_SPC, KC_SPC, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
928 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
929 _______, _______, _______
933 * ,-----------------------------------------------------------------------------------.
934 * | |Qwerty| Win | |Reset | | | USB | | | | |
935 * |------+------+------+------+------+-------------+------+------+------+------+------|
936 * | |Audio | |Dvorak| | Glow | | |WorkMn|Linux | | |
937 * |------+------+------+------+------+------+------+------+------+------+------+------|
938 * | | | |Colmak| | BLE |Norman|MacOS | | | | |
939 * |------+------+------+------+------+------+------+------+------+------+------+------|
940 * | | | | | | | | | | | | |
941 * `-----------------------------------------------------------------------------------'
944 DEBUG, QWERTY, WIN, XXXXXXX, RESET, XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, RGBDEMO,
945 XXXXXXX, FC_TOG, XXXXXXX, DVORAK, XXXXXXX, GLOW, XXXXXXX, XXXXXXX, WORKMAN, LINUX, XXXXXXX, XXXXXXX,
946 XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BT, NORMAN, OSX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
947 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
948 _______, _______, _______
954 void persistent_default_layer_set(uint16_t default_layer) {
955 eeconfig_update_default_layer(default_layer);
956 default_layer_set(default_layer);
958 led_set_default_layer_indicator();
962 #ifdef DOUBLESPACE_LAYER_ENABLE
963 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
968 register_code(KC_LALT); // sends alt and enter layer
969 space_layer_entered = true;
973 if (space_layer_entered) {
974 unregister_code(KC_LALT); // release alt and exit layer
977 space_layer_entered = false;
981 register_code(KC_SPC);
982 unregister_code(KC_SPC);
990 uint32_t layer_state_set_kb(uint32_t state)
992 // turn on punc layer if both fun & num are on
993 if ((state & ((1UL<<_NUM) | (1UL<<_FUN))) == ((1UL<<_NUM) | (1UL<<_FUN))) {
994 state |= (1UL<<_PUNC);
996 state &= ~(1UL<<_PUNC);
999 // turn on emoji layer if empty and greek layer are on
1001 (state & ((1UL<<_EMPTY) | (1UL<<_GREEKU))) == ((1UL<<_EMPTY) | (1UL<<_GREEKU))
1002 || (state & ((1UL<<_EMPTY) | (1UL<<_GREEKL))) == ((1UL<<_EMPTY) | (1UL<<_GREEKL))
1004 state |= (1UL<<_EMOJI);
1006 state &= ~(1UL<<_EMOJI);
1011 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
1012 static bool lshift = false;
1013 static bool rshift = false;
1014 static uint8_t layer = 0;
1016 lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
1017 rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
1018 layer = biton32(layer_state);
1020 #ifdef DOUBLESPACE_LAYER_ENABLE
1021 // double-space: send space immediately if any other key depressed before space is released
1022 if ((lspace_active ^ rspace_active)
1023 && keycode != LSPACE
1024 && keycode != RSPACE
1025 && record->event.pressed)
1027 if (lspace_active) {
1028 if (!lspace_emitted) {
1029 register_code(KC_SPC);
1030 unregister_code(KC_SPC);
1032 lspace_emitted = true;
1034 if (rspace_active) {
1035 if (!rspace_emitted) {
1036 register_code(KC_SPC);
1037 unregister_code(KC_SPC);
1039 rspace_emitted = true;
1043 if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
1044 if (record->event.pressed) {
1045 unregister_code(KC_LALT);
1047 register_code(KC_LALT);
1054 #ifdef DOUBLESPACE_LAYER_ENABLE
1055 // double-space enter space layer
1057 process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
1061 process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
1066 // handle greek layer shift
1070 if (layer == _GREEKU || layer == _GREEKL) {
1071 if (record->event.pressed) {
1075 if (lshift ^ rshift) { // if only one shift was pressed
1084 // press both ctrls to activate SYS layer
1088 bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
1089 bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
1090 if (record->event.pressed) {
1091 if (lctrl ^ rctrl) { // if only one ctrl was pressed
1100 // QWERTZ style comma and dot: semicolon and colon when shifted
1102 if (record->event.pressed) {
1103 if (lshift || rshift) {
1104 if (lshift) unregister_code(KC_LSFT);
1105 if (rshift) unregister_code(KC_RSFT);
1106 register_code(KC_SCLN);
1107 unregister_code(KC_SCLN);
1108 if (lshift) register_code(KC_LSFT);
1109 if (rshift) register_code(KC_RSFT);
1111 register_code(KC_COMM);
1112 unregister_code(KC_COMM);
1118 if (record->event.pressed) {
1119 if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
1120 register_code(KC_SCLN);
1121 unregister_code(KC_SCLN);
1123 register_code(KC_DOT);
1124 unregister_code(KC_DOT);
1132 if (record->event.pressed) {
1133 persistent_default_layer_set(1UL<<_QWERTY);
1137 #ifdef LAYOUT_DVORAK
1139 if (record->event.pressed) {
1140 persistent_default_layer_set(1UL<<_DVORAK);
1145 #ifdef LAYOUT_COLEMAK
1147 if (record->event.pressed) {
1148 persistent_default_layer_set(1UL<<_COLEMAK);
1153 #ifdef LAYOUT_WORKMAN
1155 if (record->event.pressed) {
1156 persistent_default_layer_set(1UL<<_WORKMAN);
1161 #ifdef LAYOUT_NORMAN
1163 if (record->event.pressed) {
1164 persistent_default_layer_set(1UL<<_NORMAN);
1170 // only process Fnumber on key release, and only when layer switcher is still pressed.
1171 // this is to avoid accidental presses on potentially destructive keys
1172 case KC_F1 ... KC_F12:
1176 if (!record->event.pressed && layer == _FUN) { // key released and still in FUN layer
1177 register_code(keycode);
1178 unregister_code(keycode);
1186 if (record->event.pressed) {
1187 if (lshift || rshift) {
1203 set_unicode_input_mode(UC_LNX);
1204 #ifdef RGBSPS_ENABLE
1205 led_set_unicode_input_mode();
1210 set_unicode_input_mode(UC_WINC);
1211 #ifdef RGBSPS_ENABLE
1212 led_set_unicode_input_mode();
1217 set_unicode_input_mode(UC_OSX);
1218 #ifdef RGBSPS_ENABLE
1219 led_set_unicode_input_mode();
1224 // glow mode changer
1225 #ifdef RGBSPS_ENABLE
1227 if (record->event.pressed) {
1229 if (glow_mode > GLOW_FULL) {
1230 glow_mode = GLOW_NONE;
1239 // faux clicky indicator
1240 #ifdef FAUXCLICKY_ENABLE
1242 #ifdef RGBSPS_ENABLE
1243 if (fauxclicky_enabled) {
1244 rgbsps_set(LED_IND_AUDIO, THEME_COLOR_AUDIO);
1246 rgbsps_set(LED_IND_AUDIO, COLOR_BLANK);
1254 #ifdef RGBSPS_DEMO_ENABLE
1264 void set_output_user(uint8_t output) {
1265 #ifdef MODULE_ADAFRUIT_BLE
1268 led_set_output_usb();
1270 case OUTPUT_BLUETOOTH:
1271 led_set_output_ble();
1274 led_set_output_none();
1279 void matrix_init_user() {
1280 wait_ms(500); // give time for usb to initialize
1282 set_unicode_input_mode(UC_LNX);
1284 #ifdef RGBSPS_ENABLE
1288 // auto detect output on init
1289 #ifdef MODULE_ADAFRUIT_BLE
1290 uint8_t output = auto_detect_output();
1291 if (output == OUTPUT_USB) {
1292 set_output(OUTPUT_USB);
1294 set_output(OUTPUT_BLUETOOTH);
1299 void turn_off_capslock() {
1301 register_code(KC_CAPS);
1302 unregister_code(KC_CAPS);
1306 #ifdef RGBSPS_ENABLE
1307 void matrix_scan_user(void) {
1308 led_set_layer_indicator();
1311 void battery_poll(uint8_t level) {
1312 rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15);
1316 void led_set_user(uint8_t usb_led) {
1317 bool new_capslock = usb_led & (1<<USB_LED_CAPS_LOCK);
1318 if (new_capslock ^ capslock) { // capslock state is different
1319 if ((capslock = new_capslock)) {
1320 rgbsps_set(LED_IND_CAPSLOCK, THEME_COLOR_CAPSLOCK);
1322 rgbsps_set(LED_IND_CAPSLOCK, COLOR_BLANK);
1329 #ifdef PS2_MOUSE_ENABLE
1330 void ps2_mouse_init_user() {
1333 // set TrackPoint sensitivity
1334 PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
1335 PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
1336 PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
1337 PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
1339 // set TrackPoint Negative Inertia factor
1340 PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
1341 PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
1342 PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
1343 PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
1345 // set TrackPoint speed
1346 // (transfer function upper plateau speed)
1347 PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
1348 PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
1349 PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
1350 PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
1352 // inquire pts status
1353 rcv = ps2_host_send(0xE2);
1354 rcv = ps2_host_send(0x2C);
1355 rcv = ps2_host_recv_response();
1356 if ((rcv & 1) == 1) {
1357 // if on, disable pts
1358 rcv = ps2_host_send(0xE2);
1359 rcv = ps2_host_send(0x47);
1360 rcv = ps2_host_send(0x2C);
1361 rcv = ps2_host_send(0x01);