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();
637 if (fauxclicky_enabled) {
638 rgbsps_set(LED_IND_AUDIO, 5, 11, 13);
640 rgbsps_set(LED_IND_AUDIO, 0, 0, 0);
646 #endif // RGBSPS_ENABLE
650 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
653 * ,-----------------------------------------------------------------------------------.
654 * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
655 * |------+------+------+------+------+-------------+------+------+------+------+------|
656 * | Esc | A | S | D | F | G | H | J | K | L | ' |Enter |
657 * |------+------+------+------+------+------|------+------+------+------+------+------|
658 * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift |
659 * |------+------+------+------+------+------+------+------+------+------+------+------|
660 * | Ctrl | Alt | GUI | Punc | Num | Space | Fun |Greek | GUI |AltGr | Ctrl |
661 * `-----------------------------------------------------------------------------------'
664 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
665 KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT ,
666 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
667 KC_LCTL, KC_LALT, KC_LGUI, EMPTY, NUM, LSPACE, RSPACE, FUN, GREEK, KC_RGUI, C_RALT, KC_RCTL,
668 _______, _______, _______
672 * ,-----------------------------------------------------------------------------------.
673 * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp |
674 * |------+------+------+------+------+-------------+------+------+------+------+------|
675 * | Esc | A | O | E | U | I | D | H | T | N | S |Enter |
676 * |------+------+------+------+------+------|------+------+------+------+------+------|
677 * | Shift| / | Q | J | K | X | B | M | W | V | Z |Shift |
678 * |------+------+------+------+------+------+------+------+------+------+------+------|
679 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
680 * `-----------------------------------------------------------------------------------'
684 _______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, _______,
685 _______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, _______,
686 _______, KC_SLSH, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______,
687 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
688 _______, _______, _______
693 * ,-----------------------------------------------------------------------------------.
694 * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
695 * |------+------+------+------+------+-------------+------+------+------+------+------|
696 * | Esc | A | R | S | T | D | H | N | E | I | O |Enter |
697 * |------+------+------+------+------+------|------+------+------+------+------+------|
698 * | Shift| Z | X | C | V | B | K | M | , | . | / |Shift |
699 * |------+------+------+------+------+------+------+------+------+------+------+------|
700 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
701 * `-----------------------------------------------------------------------------------'
704 #ifdef LAYOUT_COLEMAK
706 _______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, _______,
707 _______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, _______,
708 _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
709 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
710 _______, _______, _______
715 * ,-----------------------------------------------------------------------------------.
716 * | Tab | Q | W | D | F | K | J | U | R | L | ; | Bksp |
717 * |------+------+------+------+------+-------------+------+------+------+------+------|
718 * | Esc | A | S | E | T | G | Y | N | I | O | H |Enter |
719 * |------+------+------+------+------+------|------+------+------+------+------+------|
720 * | Shift| Z | X | C | V | B | P | M | , | . | / |Shift |
721 * |------+------+------+------+------+------+------+------+------+------+------+------|
722 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
723 * `-----------------------------------------------------------------------------------'
728 _______, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_J, KC_U, KC_R, KC_L, KC_QUOT, _______,
729 _______, KC_A, KC_S, KC_E, KC_T, KC_G, KC_Y, KC_N, KC_I, KC_O, KC_H, _______,
730 _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
731 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
732 _______, _______, _______
737 * ,-----------------------------------------------------------------------------------.
738 * | Tab | Q | D | R | W | B | J | F | U | P | ; | Bksp |
739 * |------+------+------+------+------+-------------+------+------+------+------+------|
740 * | Esc | A | S | H | T | G | Y | N | E | O | I |Enter |
741 * |------+------+------+------+------+------|------+------+------+------+------+------|
742 * | Shift| Z | X | M | C | V | K | K | , | . | / |Shift |
743 * |------+------+------+------+------+------+------+------+------+------+------+------|
744 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
745 * `-----------------------------------------------------------------------------------'
748 #ifdef LAYOUT_WORKMAN
750 _______, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_QUOT, _______,
751 _______, KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, _______,
752 _______, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, _______,
753 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
754 _______, _______, _______
759 * ,-----------------------------------------------------------------------------------.
760 * | ~ | ! | @ | # | $ | % | ^ | & | * | ≤ | ≥ | ` |
761 * |------+------+------+------+------+-------------+------+------+------+------+------|
762 * | | * | \ | - | = | / | ≠ | ( | ) | < | > | |
763 * |------+------+------+------+------+------|------+------+------+------+------+------|
764 * | & | ^ | | | _ | + | ? | ± | [ | ] | { | } | |
765 * |------+------+------+------+------+------+------+------+------+------+------+------|
766 * | | | | | | | | | | : | |
767 * `-----------------------------------------------------------------------------------'
770 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, X(LTEQ), X(GTEQ), _______,
771 KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, X(NOTEQ),KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
772 KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, X(PLMIN),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______,
773 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______,
774 _______, _______, _______
778 * ,-----------------------------------------------------------------------------------.
779 * | ~ | ! | @ | # | $ | % | A | 7 | 8 | 9 | D | |
780 * |------+------+------+------+------+-------------+------+------+------+------+------|
781 * | ` | * | \ | - | = | / | B | 4 | 5 | 6 | E | |
782 * |------+------+------+------+------+------|------+------+------+------+------+------|
783 * | & | ^ | | | _ | + | ? | C | 1 | 2 | 3 | F | |
784 * |------+------+------+------+------+------+------+------+------+------+------+------|
785 * | | | x | | | | | 0 | , | . | : | |
786 * `-----------------------------------------------------------------------------------'
789 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, S(KC_A), KC_1, KC_2, KC_3, S(KC_D), _______,
790 KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, S(KC_B), KC_4, KC_5, KC_6, S(KC_E), _______,
791 KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C), KC_7, KC_8, KC_9, S(KC_F), _______,
792 _______, _______, KC_X, _______, _______, _______, _______, FUN0 , KC_COMM, KC_DOT, KC_COLN, _______,
793 _______, _______, _______
797 * ,-----------------------------------------------------------------------------------.
798 * | | F1 | F2 | F3 | F4 | Ins | | PgUp | Up | PgDn | PgUp | |
799 * |------+------+------+------+------+-------------+------+------+------+------+------|
800 * | Caps | F5 | F6 | F7 | F8 |PrtSc | | Left | Down | Right| PgDn | |
801 * |------+------+------+------+------+------|------+------+------+------+------+------|
802 * | | F9 | F10 | F11 | F12 |Pause | | | Home | End | | |
803 * |------+------+------+------+------+------+------+------+------+------+------+------|
804 * | | | | | | | | | | | |
805 * `-----------------------------------------------------------------------------------'
808 XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_INS, XXXXXXX, KC_PGUP, KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
809 KC_CAPS, KC_F5, KC_F6, KC_F7, KC_F8, KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
810 _______, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUS, XXXXXXX, XXXXXXX, KC_HOME, KC_END, XXXXXXX, _______,
811 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
812 _______, _______, _______
816 * ,-----------------------------------------------------------------------------------.
817 * | | | | | | | | | | | | |
818 * |------+------+------+------+------+-------------+------+------+------+------+------|
819 * | | | | | | | | | | | | |
820 * |------+------+------+------+------+------+------+------+------+------+------+------|
821 * | | | | | | | | | | | | |
822 * |------+------+------+------+------+------+------+------+------+------+------+------|
823 * | | | | | | | | | | | | |
824 * `-----------------------------------------------------------------------------------'
827 _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC), X(UPI), _______,
828 _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA), X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
829 _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA), X(UNU), X(UMU), KC_COMM, KC_DOT, KC_SLSH, _______,
830 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
831 _______, _______, _______
835 * ,-----------------------------------------------------------------------------------.
836 * | | | | | | | | | | | | |
837 * |------+------+------+------+------+-------------+------+------+------+------+------|
838 * | | | | | | | | | | | | |
839 * |------+------+------+------+------+------+------+------+------+------+------+------|
840 * | | | | | | | | | | | | |
841 * |------+------+------+------+------+------+------+------+------+------+------+------|
842 * | | | | | | | | | | | | |
843 * `-----------------------------------------------------------------------------------'
846 _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC), X(LPI), _______,
847 _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA), X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
848 _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA), X(LNU), X(LMU), KC_COMM, KC_DOT, KC_SLSH, _______,
849 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
850 _______, _______, _______
854 * ,-----------------------------------------------------------------------------------.
855 * | | | | | | | | | | | | |
856 * |------+------+------+------+------+-------------+------+------+------+------+------|
857 * | | | | | | | | | | | | |
858 * |------+------+------+------+------+------+------+------+------+------+------+------|
859 * | | | | | | | | | | | | |
860 * |------+------+------+------+------+------+------+------+------+------+------+------|
861 * | | | | | | | | | | | | |
862 * `-----------------------------------------------------------------------------------'
865 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
866 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
867 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
868 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
869 _______, _______, _______
873 * ,-----------------------------------------------------------------------------------.
874 * | | | | | | | | | | | | |
875 * |------+------+------+------+------+-------------+------+------+------+------+------|
876 * | | | | | | | | | | | | |
877 * |------+------+------+------+------+------+------+------+------+------+------+------|
878 * | | | | | | | | | | | | |
879 * |------+------+------+------+------+------+------+------+------+------+------+------|
880 * | | | | | | | | | | | | |
881 * `-----------------------------------------------------------------------------------'
884 X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
885 X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART), X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
886 X(THMDN),X(SLEEP), X(CLAP), X(CRY), X(VIC),X(BHART), X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
887 X(POO), X(EYES), X(HUNRD),_______, X(SKULL),X(HORNS), X(HALO), X(FEAR),_______,X(YUMMY),X(DISAP),X(NOEVK),
888 _______, _______, _______
892 * ,-----------------------------------------------------------------------------------.
893 * | | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | |
894 * |------+------+------+------+------+-------------+------+------+------+------+------|
895 * | Esc | | Btab | Esc | Tab | | | Prev | | Next | | |
896 * |------+------+------+------+------+------+------+------+------+------+------+------|
897 * | | | Prev | Play | Next | | | | | | | |
898 * |------+------+------+------+------+------+------+------+------+------+------+------|
899 * | | | | | | | | | | | | |
900 * `-----------------------------------------------------------------------------------'
903 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,
904 KC_ESC, XXXXXXX, S(KC_TAB),KC_ESC, KC_TAB, XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
905 XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, KC_SPC, KC_SPC, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
906 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
907 _______, _______, _______
911 * ,-----------------------------------------------------------------------------------.
912 * | |Qwerty| Win | |Reset | | | USB | | | | |
913 * |------+------+------+------+------+-------------+------+------+------+------+------|
914 * | |Audio | |Dvorak| | Glow | | |WorkMn|Linux | | |
915 * |------+------+------+------+------+------+------+------+------+------+------+------|
916 * | | | |Colmak| | BLE |Norman|MacOS | | | | |
917 * |------+------+------+------+------+------+------+------+------+------+------+------|
918 * | | | | | | | | | | | | |
919 * `-----------------------------------------------------------------------------------'
922 DEBUG, QWERTY, WIN, XXXXXXX, RESET, XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
923 XXXXXXX, FC_TOG, XXXXXXX, DVORAK, XXXXXXX, GLOW, XXXXXXX, XXXXXXX, WORKMAN, LINUX, XXXXXXX, XXXXXXX,
924 XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BT, NORMAN, OSX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
925 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
926 _______, _______, _______
932 void persistant_default_layer_set(uint16_t default_layer) {
933 eeconfig_update_default_layer(default_layer);
934 default_layer_set(default_layer);
936 led_set_default_layer_indicator();
940 #ifdef DOUBLESPACE_LAYER_ENABLE
941 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
946 register_code(KC_LALT); // sends alt and enter layer
947 space_layer_entered = true;
951 if (space_layer_entered) {
952 unregister_code(KC_LALT); // release alt and exit layer
955 space_layer_entered = false;
959 register_code(KC_SPC);
960 unregister_code(KC_SPC);
968 uint32_t layer_state_set_kb(uint32_t state)
970 // turn on punc layer if both fun & num are on
971 if ((state & ((1UL<<_NUM) | (1UL<<_FUN))) == ((1UL<<_NUM) | (1UL<<_FUN))) {
972 state |= (1UL<<_PUNC);
974 state &= ~(1UL<<_PUNC);
977 // turn on emoji layer if empty and greek layer are on
979 (state & ((1UL<<_EMPTY) | (1UL<<_GREEKU))) == ((1UL<<_EMPTY) | (1UL<<_GREEKU))
980 || (state & ((1UL<<_EMPTY) | (1UL<<_GREEKL))) == ((1UL<<_EMPTY) | (1UL<<_GREEKL))
982 state |= (1UL<<_EMOJI);
984 state &= ~(1UL<<_EMOJI);
989 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
990 static bool lshift = false;
991 static bool rshift = false;
992 static uint8_t layer = 0;
994 lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
995 rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
996 layer = biton32(layer_state);
998 #ifdef DOUBLESPACE_LAYER_ENABLE
999 // double-space: send space immediately if any other key depressed before space is released
1000 if ((lspace_active ^ rspace_active)
1001 && keycode != LSPACE
1002 && keycode != RSPACE
1003 && record->event.pressed)
1005 if (lspace_active) {
1006 if (!lspace_emitted) {
1007 register_code(KC_SPC);
1008 unregister_code(KC_SPC);
1010 lspace_emitted = true;
1012 if (rspace_active) {
1013 if (!rspace_emitted) {
1014 register_code(KC_SPC);
1015 unregister_code(KC_SPC);
1017 rspace_emitted = true;
1021 if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
1022 if (record->event.pressed) {
1023 unregister_code(KC_LALT);
1025 register_code(KC_LALT);
1032 #ifdef DOUBLESPACE_LAYER_ENABLE
1033 // double-space enter space layer
1035 process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
1039 process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
1044 // handle greek layer shift
1048 if (layer == _GREEKU || layer == _GREEKL) {
1049 if (record->event.pressed) {
1053 if (lshift ^ rshift) { // if only one shift was pressed
1062 // press both ctrls to activate SYS layer
1066 bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
1067 bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
1068 if (record->event.pressed) {
1069 if (lctrl ^ rctrl) { // if only one ctrl was pressed
1078 // QWERTZ style comma and dot: semicolon and colon when shifted
1080 if (record->event.pressed) {
1081 if (lshift || rshift) {
1082 if (lshift) unregister_code(KC_LSFT);
1083 if (rshift) unregister_code(KC_RSFT);
1084 register_code(KC_SCLN);
1085 unregister_code(KC_SCLN);
1086 if (lshift) register_code(KC_LSFT);
1087 if (rshift) register_code(KC_RSFT);
1089 register_code(KC_COMM);
1090 unregister_code(KC_COMM);
1096 if (record->event.pressed) {
1097 if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
1098 register_code(KC_SCLN);
1099 unregister_code(KC_SCLN);
1101 register_code(KC_DOT);
1102 unregister_code(KC_DOT);
1110 if (record->event.pressed) {
1111 persistant_default_layer_set(1UL<<_QWERTY);
1115 #ifdef LAYOUT_DVORAK
1117 if (record->event.pressed) {
1118 persistant_default_layer_set(1UL<<_DVORAK);
1123 #ifdef LAYOUT_COLEMAK
1125 if (record->event.pressed) {
1126 persistant_default_layer_set(1UL<<_COLEMAK);
1131 #ifdef LAYOUT_WORKMAN
1133 if (record->event.pressed) {
1134 persistant_default_layer_set(1UL<<_WORKMAN);
1139 #ifdef LAYOUT_NORMAN
1141 if (record->event.pressed) {
1142 persistant_default_layer_set(1UL<<_NORMAN);
1148 // only process Fnumber on key release, and only when layer switcher is still pressed.
1149 // this is to avoid accidental presses on potentially destructive keys
1150 case KC_F1 ... KC_F12:
1154 if (!record->event.pressed && layer == _FUN) { // key released and still in FUN layer
1155 register_code(keycode);
1156 unregister_code(keycode);
1164 if (record->event.pressed) {
1165 if (lshift || rshift) {
1181 set_unicode_input_mode(UC_LNX);
1182 #ifdef RGBSPS_ENABLE
1183 led_set_unicode_input_mode();
1188 set_unicode_input_mode(UC_WINC);
1189 #ifdef RGBSPS_ENABLE
1190 led_set_unicode_input_mode();
1195 set_unicode_input_mode(UC_OSX);
1196 #ifdef RGBSPS_ENABLE
1197 led_set_unicode_input_mode();
1202 // glow mode changer
1203 #ifdef RGBSPS_ENABLE
1205 if (record->event.pressed) {
1207 if (glow_mode > GLOW_FULL) {
1208 glow_mode = GLOW_NONE;
1217 // faux clicky indicator
1218 #ifdef FAUXCLICKY_ENABLE
1220 #ifdef RGBSPS_ENABLE
1221 if (fauxclicky_enabled) {
1222 rgbsps_set(LED_IND_AUDIO, 5, 11, 13);
1224 rgbsps_set(LED_IND_AUDIO, 0, 0, 0);
1235 void set_output_user(uint8_t output) {
1236 #ifdef MODULE_ADAFRUIT_BLE
1239 led_set_output_usb();
1241 case OUTPUT_BLUETOOTH:
1242 led_set_output_ble();
1245 led_set_output_none();
1250 void matrix_init_user() {
1251 _delay_ms(500); // give time for usb to initialize
1253 set_unicode_input_mode(UC_LNX);
1255 #ifdef RGBSPS_ENABLE
1259 // auto detect output on init
1260 #ifdef MODULE_ADAFRUIT_BLE
1261 uint8_t output = auto_detect_output();
1262 if (output == OUTPUT_USB) {
1263 set_output(OUTPUT_USB);
1265 set_output(OUTPUT_BLUETOOTH);
1270 void turn_off_capslock() {
1272 register_code(KC_CAPS);
1273 unregister_code(KC_CAPS);
1277 #ifdef RGBSPS_ENABLE
1278 void matrix_scan_user(void) {
1279 led_set_layer_indicator();
1282 void battery_poll(uint8_t level) {
1283 rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15);
1287 void led_set_user(uint8_t usb_led) {
1288 bool new_capslock = usb_led & (1<<USB_LED_CAPS_LOCK);
1289 if (new_capslock ^ capslock) { // capslock state is different
1290 if ((capslock = new_capslock)) {
1291 rgbsps_set(LED_IND_CAPSLOCK, 15, 0, 0);
1293 rgbsps_set(LED_IND_CAPSLOCK, 0, 0, 0);
1300 #ifdef PS2_MOUSE_ENABLE
1301 void ps2_mouse_init_user() {
1304 // set TrackPoint sensitivity
1305 PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
1306 PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
1307 PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
1308 PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
1310 // set TrackPoint Negative Inertia factor
1311 PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
1312 PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
1313 PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
1314 PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
1316 // set TrackPoint speed
1317 // (transfer function upper plateau speed)
1318 PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
1319 PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
1320 PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
1321 PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
1323 // inquire pts status
1324 rcv = ps2_host_send(0xE2);
1325 rcv = ps2_host_send(0x2C);
1326 rcv = ps2_host_recv_response();
1327 if ((rcv & 1) == 1) {
1328 // if on, disable pts
1329 rcv = ps2_host_send(0xE2);
1330 rcv = ps2_host_send(0x47);
1331 rcv = ps2_host_send(0x2C);
1332 rcv = ps2_host_send(0x01);