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
64 #define KC_WWWB KC_WWW_BACK
65 #define KC_WWWF KC_WWW_FORWARD
67 // hybrid right-alt & scroll lock (mapped to Compose in OS)
68 #define C_RALT MT(MOD_RALT, KC_SLCK)
70 // dual use right-shift & del key
71 // #define C_RSFT MT(MOD_RSFT, KC_DEL)
73 bool capslock = false;
74 #ifdef DOUBLESPACE_LAYER_ENABLE
75 bool lspace_active = false;
76 bool rspace_active = false;
77 bool lspace_emitted = false;
78 bool rspace_emitted = false;
79 bool space_layer_entered = false;
88 uint8_t glow_mode = GLOW_MIN;
90 void turn_off_capslock(void);
91 extern keymap_config_t keymap_config;
93 // layers, ordering is important!
100 _DEFAULT_LAYER_MAX = _NORMAN,
115 // double-space layer
118 enum planck_keycodes {
142 #ifndef FAUXCLICKY_ENABLE
145 #ifndef MODULE_ADAFRUIT_BLE
152 #define EMPTY MO(_EMPTY)
155 #define FUN0 LT(_FUN, KC_0)
160 GRIN, // grinning face 😊
161 TJOY, // tears of joy 😂
162 SMILE, // grining face with smiling eyes 😁
164 EYERT, // smiling face with heart shaped eyes 😍
165 CRY, // crying face 😭
166 SMEYE, // smiling face with smiling eyes 😊
169 HART2, // two hearts 💕
171 OKHND, // ok hand sign 👌
177 THMDN, // thumb down 👎
180 MUSIC, // musical notes
182 CELEB, // celebration 🙌
183 CRY2, // crying face 😢
184 COOL, // smile with sunglasses 😎
185 NOEVS, // see no evil
186 NOEVH, // hear no evil
187 NOEVK, // speak no evil
191 BHART, // broken heart
192 SLEEP, // sleeping face
193 SMIL2, // smiling face with open mouth & sweat
196 TONGU, // face with tongue & winking eye
197 DISAP, // disappointed
198 YUMMY, // face savoring delicious food
199 CLAP, // hand clapping
200 FEAR, // face screaming in fear
201 HORNS, // smiling face with horns
202 HALO, // smiling face with halo
267 const uint32_t PROGMEM unicode_map[] = {
368 [LTEQ] = 0x2264, // less than or equal
369 [GTEQ] = 0x2265, // greater than or equal
370 [NOTEQ] = 0x2260, // not equal
371 [PLMIN] = 0xB1, // plus minus
377 const uint8_t PROGMEM LED_ALNUM[] = {
412 const uint8_t PROGMEM LED_HOMING[] = {
423 const uint8_t PROGMEM LED_MODS[] = {
438 const uint8_t PROGMEM LED_FN[] = {
445 const uint8_t PROGMEM LED_INDICATORS[] = {
465 const uint8_t PROGMEM LED_TRACKPOINT[] = {
471 void led_turnoff_keys(void) {
472 for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
473 rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), COLOR_BLACK);
475 for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
476 rgbsps_set(pgm_read_byte(&LED_MODS[i]), COLOR_BLACK);
478 for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
479 rgbsps_set(pgm_read_byte(&LED_FN[i]), COLOR_BLACK);
483 #ifdef RGBSPS_DEMO_ENABLE
484 void led_demo(void) {
485 rgbsps_set(LED_IND_LINUX, THEME_COLOR_LINUX);
486 rgbsps_set(LED_IND_APPLE, THEME_COLOR_APPLE);
487 rgbsps_set(LED_IND_WINDOWS, THEME_COLOR_WINDOWS);
488 rgbsps_set(LED_IND_QWERTY, THEME_COLOR_QWERTY);
489 rgbsps_set(LED_IND_ALT, THEME_COLOR_ALT);
490 rgbsps_set(LED_IND_AUDIO, THEME_COLOR_AUDIO);
491 rgbsps_set(LED_IND_BLUETOOTH, THEME_COLOR_BLUETOOTH);
492 rgbsps_set(LED_IND_USB, THEME_COLOR_USB);
493 rgbsps_set(LED_IND_CAPSLOCK, THEME_COLOR_CAPSLOCK);
494 rgbsps_set(LED_IND_GUI, THEME_COLOR_GUI);
495 rgbsps_set(LED_IND_FUN, THEME_COLOR_FUN);
496 rgbsps_set(LED_IND_NUM, THEME_COLOR_NUM);
497 rgbsps_set(LED_IND_PUNC, THEME_COLOR_PUNC);
498 rgbsps_set(LED_IND_GREEK, THEME_COLOR_GREEK);
499 rgbsps_set(LED_IND_EMOJI, THEME_COLOR_EMOJI);
504 void led_reset(void) {
511 for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
512 rgbsps_set(pgm_read_byte(&LED_HOMING[i]), THEME_COLOR_GLOW1_HOME);
514 rgbsps_set(LED_F, THEME_COLOR_GLOW1_HOMING);
515 rgbsps_set(LED_J, THEME_COLOR_GLOW1_HOMING);
518 for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
519 rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), THEME_COLOR_GLOW2_ALPHA);
521 for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
522 rgbsps_set(pgm_read_byte(&LED_MODS[i]), THEME_COLOR_GLOW2_MODS);
524 for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
525 rgbsps_set(pgm_read_byte(&LED_FN[i]), THEME_COLOR_GLOW2_FN);
527 for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
528 rgbsps_set(pgm_read_byte(&LED_HOMING[i]), THEME_COLOR_GLOW2_HOME);
530 rgbsps_set(LED_F, THEME_COLOR_GLOW2_HOMING);
531 rgbsps_set(LED_J, THEME_COLOR_GLOW2_HOMING);
536 void led_set_default_layer_indicator(void) {
537 uint8_t default_layer = biton32(default_layer_state);
538 if (default_layer == _QWERTY) {
539 rgbsps_set(LED_IND_QWERTY, THEME_COLOR_QWERTY);
540 rgbsps_set(LED_IND_ALT, COLOR_BLANK);
542 rgbsps_set(LED_IND_QWERTY, COLOR_BLANK);
543 rgbsps_set(LED_IND_ALT, THEME_COLOR_ALT);
549 void led_set_layer_indicator(void) {
550 static uint8_t oldlayer = 255;
554 rgbsps_set(LED_IND_GUI, COLOR_BLANK);
555 rgbsps_set(LED_IND_FUN, COLOR_BLANK);
556 rgbsps_set(LED_IND_NUM, COLOR_BLANK);
557 rgbsps_set(LED_IND_PUNC, COLOR_BLANK);
558 rgbsps_set(LED_IND_GREEK, COLOR_BLANK);
559 rgbsps_set(LED_IND_EMOJI, COLOR_BLANK);
561 uint8_t layer = biton32(layer_state);
562 if (oldlayer == layer) {
568 if (layer <= _DEFAULT_LAYER_MAX) {
575 rgbsps_set(LED_IND_GUI, THEME_COLOR_GUI);
578 rgbsps_set(LED_IND_FUN, THEME_COLOR_FUN);
581 rgbsps_set(LED_IND_NUM, THEME_COLOR_NUM);
584 rgbsps_set(LED_IND_PUNC, THEME_COLOR_PUNC);
588 rgbsps_set(LED_IND_GREEK, THEME_COLOR_GREEK);
591 rgbsps_set(LED_IND_EMOJI, THEME_COLOR_EMOJI);
594 rgbsps_set(LED_IND_GUI, THEME_COLOR_OTHERLAYER);
595 rgbsps_set(LED_IND_FUN, THEME_COLOR_OTHERLAYER);
596 rgbsps_set(LED_IND_NUM, THEME_COLOR_OTHERLAYER);
597 rgbsps_set(LED_IND_PUNC, THEME_COLOR_OTHERLAYER);
598 rgbsps_set(LED_IND_GREEK, THEME_COLOR_OTHERLAYER);
599 rgbsps_set(LED_IND_EMOJI, THEME_COLOR_OTHERLAYER);
605 void led_set_unicode_input_mode(void) {
606 rgbsps_set(LED_IND_LINUX, COLOR_BLANK);
607 rgbsps_set(LED_IND_APPLE, COLOR_BLANK);
608 rgbsps_set(LED_IND_WINDOWS, COLOR_BLANK);
610 switch (get_unicode_input_mode()) {
612 rgbsps_set(LED_IND_LINUX, THEME_COLOR_LINUX);
615 rgbsps_set(LED_IND_APPLE, THEME_COLOR_APPLE);
619 rgbsps_set(LED_IND_WINDOWS, THEME_COLOR_WINDOWS);
625 void led_set_output_ble(void) {
626 rgbsps_set(LED_IND_BLUETOOTH, THEME_COLOR_BLUETOOTH);
627 rgbsps_set(LED_IND_USB, COLOR_BLANK);
631 void led_set_output_usb(void) {
632 rgbsps_set(LED_IND_BLUETOOTH, COLOR_BLANK);
633 rgbsps_set(LED_IND_USB, THEME_COLOR_USB);
637 void led_set_output_none(void) {
638 rgbsps_set(LED_IND_BLUETOOTH, COLOR_BLANK);
639 rgbsps_set(LED_IND_USB, COLOR_BLANK);
643 void led_init(void) {
647 // set trackpoint color
648 rgbsps_set(LED_TRACKPOINT1, THEME_COLOR_TP1);
649 rgbsps_set(LED_TRACKPOINT2, THEME_COLOR_TP2);
650 rgbsps_set(LED_TRACKPOINT3, THEME_COLOR_TP3);
652 // unicode input mode
653 led_set_unicode_input_mode();
656 led_set_layer_indicator();
657 led_set_default_layer_indicator();
660 #ifdef FAUXCLICKY_ENABLE
661 if (fauxclicky_enabled) {
662 rgbsps_set(LED_IND_AUDIO, THEME_COLOR_AUDIO);
664 rgbsps_set(LED_IND_AUDIO, COLOR_BLANK);
672 #endif // RGBSPS_ENABLE
676 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
679 * ,-----------------------------------------------------------------------------------.
680 * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
681 * |------+------+------+------+------+-------------+------+------+------+------+------|
682 * | Esc | A | S | D | F | G | H | J | K | L | ' |Enter |
683 * |------+------+------+------+------+------|------+------+------+------+------+------|
684 * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift |
685 * |------+------+------+------+------+------+------+------+------+------+------+------|
686 * | Ctrl | Alt | GUI | Punc | Num | Space | Fun |Greek | GUI |AltGr | Ctrl |
687 * `-----------------------------------------------------------------------------------'
689 [_QWERTY] = KEYMAP_CUSTOM(
690 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
691 KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT ,
692 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
693 KC_LCTL, KC_LALT, KC_LGUI, EMPTY, NUM, LSPACE, RSPACE, FUN, GREEK, KC_RGUI, C_RALT, KC_RCTL,
694 _______, _______, _______
698 * ,-----------------------------------------------------------------------------------.
699 * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp |
700 * |------+------+------+------+------+-------------+------+------+------+------+------|
701 * | Esc | A | O | E | U | I | D | H | T | N | S |Enter |
702 * |------+------+------+------+------+------|------+------+------+------+------+------|
703 * | Shift| / | Q | J | K | X | B | M | W | V | Z |Shift |
704 * |------+------+------+------+------+------+------+------+------+------+------+------|
705 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
706 * `-----------------------------------------------------------------------------------'
709 [_DVORAK] = KEYMAP_CUSTOM(
710 _______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, _______,
711 _______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, _______,
712 _______, KC_SLSH, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______,
713 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
714 _______, _______, _______
719 * ,-----------------------------------------------------------------------------------.
720 * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
721 * |------+------+------+------+------+-------------+------+------+------+------+------|
722 * | Esc | A | R | S | T | D | H | N | E | I | O |Enter |
723 * |------+------+------+------+------+------|------+------+------+------+------+------|
724 * | Shift| Z | X | C | V | B | K | M | , | . | / |Shift |
725 * |------+------+------+------+------+------+------+------+------+------+------+------|
726 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
727 * `-----------------------------------------------------------------------------------'
730 #ifdef LAYOUT_COLEMAK
731 [_COLEMAK] = KEYMAP_CUSTOM(
732 _______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, _______,
733 _______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, _______,
734 _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
735 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
736 _______, _______, _______
741 * ,-----------------------------------------------------------------------------------.
742 * | Tab | Q | W | D | F | K | J | U | R | L | ; | Bksp |
743 * |------+------+------+------+------+-------------+------+------+------+------+------|
744 * | Esc | A | S | E | T | G | Y | N | I | O | H |Enter |
745 * |------+------+------+------+------+------|------+------+------+------+------+------|
746 * | Shift| Z | X | C | V | B | P | M | , | . | / |Shift |
747 * |------+------+------+------+------+------+------+------+------+------+------+------|
748 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
749 * `-----------------------------------------------------------------------------------'
753 [_NORMAN] = KEYMAP_CUSTOM(
754 _______, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_J, KC_U, KC_R, KC_L, KC_QUOT, _______,
755 _______, KC_A, KC_S, KC_E, KC_T, KC_G, KC_Y, KC_N, KC_I, KC_O, KC_H, _______,
756 _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
757 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
758 _______, _______, _______
763 * ,-----------------------------------------------------------------------------------.
764 * | Tab | Q | D | R | W | B | J | F | U | P | ; | Bksp |
765 * |------+------+------+------+------+-------------+------+------+------+------+------|
766 * | Esc | A | S | H | T | G | Y | N | E | O | I |Enter |
767 * |------+------+------+------+------+------|------+------+------+------+------+------|
768 * | Shift| Z | X | M | C | V | K | K | , | . | / |Shift |
769 * |------+------+------+------+------+------+------+------+------+------+------+------|
770 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
771 * `-----------------------------------------------------------------------------------'
774 #ifdef LAYOUT_WORKMAN
775 [_WORKMAN] = KEYMAP_CUSTOM(
776 _______, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_QUOT, _______,
777 _______, KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, _______,
778 _______, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, _______,
779 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
780 _______, _______, _______
785 * ,-----------------------------------------------------------------------------------.
786 * | ~ | ! | @ | # | $ | % | ^ | & | * | ≤ | ≥ | ` |
787 * |------+------+------+------+------+-------------+------+------+------+------+------|
788 * | | * | \ | - | = | / | ≠ | ( | ) | < | > | |
789 * |------+------+------+------+------+------|------+------+------+------+------+------|
790 * | & | ^ | | | _ | + | ? | ± | [ | ] | { | } | |
791 * |------+------+------+------+------+------+------+------+------+------+------+------|
792 * | | | | | | | | | | : | |
793 * `-----------------------------------------------------------------------------------'
795 [_PUNC] = KEYMAP_CUSTOM(
796 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, X(LTEQ), X(GTEQ), _______,
797 KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, X(NOTEQ),KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
798 KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, X(PLMIN),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______,
799 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______,
800 _______, _______, _______
804 * ,-----------------------------------------------------------------------------------.
805 * | ~ | ! | @ | # | $ | % | A | 7 | 8 | 9 | D | |
806 * |------+------+------+------+------+-------------+------+------+------+------+------|
807 * | ` | * | \ | - | = | / | B | 4 | 5 | 6 | E | |
808 * |------+------+------+------+------+------|------+------+------+------+------+------|
809 * | & | ^ | | | _ | + | ? | C | 1 | 2 | 3 | F | |
810 * |------+------+------+------+------+------+------+------+------+------+------+------|
811 * | | | x | | | | | 0 | , | . | : | |
812 * `-----------------------------------------------------------------------------------'
814 [_NUM] = KEYMAP_CUSTOM(
815 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, S(KC_A), KC_1, KC_2, KC_3, S(KC_D), _______,
816 KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, S(KC_B), KC_4, KC_5, KC_6, S(KC_E), _______,
817 KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C), KC_7, KC_8, KC_9, S(KC_F), _______,
818 _______, _______, KC_X, _______, _______, _______, _______, FUN0 , KC_COMM, KC_DOT, KC_COLN, _______,
819 _______, _______, _______
823 * ,-----------------------------------------------------------------------------------.
824 * | | F1 | F2 | F3 | F4 | Ins | | PgUp | Up | PgDn | PgUp | |
825 * |------+------+------+------+------+-------------+------+------+------+------+------|
826 * | Caps | F5 | F6 | F7 | F8 |PrtSc | | Left | Down | Right| PgDn | |
827 * |------+------+------+------+------+------|------+------+------+------+------+------|
828 * | | F9 | F10 | F11 | F12 |Pause | | | Home | End | | |
829 * |------+------+------+------+------+------+------+------+------+------+------+------|
830 * | | | | | | | | | | | |
831 * `-----------------------------------------------------------------------------------'
833 [_FUN] = KEYMAP_CUSTOM(
834 XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_INS, XXXXXXX, KC_PGUP, KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
835 KC_CAPS, KC_F5, KC_F6, KC_F7, KC_F8, KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
836 _______, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUS, XXXXXXX, XXXXXXX, KC_HOME, KC_END, XXXXXXX, _______,
837 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
838 _______, _______, _______
842 * ,-----------------------------------------------------------------------------------.
843 * | | | | | | | | | | | | |
844 * |------+------+------+------+------+-------------+------+------+------+------+------|
845 * | | | | | | | | | | | | |
846 * |------+------+------+------+------+------+------+------+------+------+------+------|
847 * | | | | | | | | | | | | |
848 * |------+------+------+------+------+------+------+------+------+------+------+------|
849 * | | | | | | | | | | | | |
850 * `-----------------------------------------------------------------------------------'
852 [_GREEKU] = KEYMAP_CUSTOM(
853 _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC), X(UPI), _______,
854 _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA), X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
855 _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA), X(UNU), X(UMU), KC_COMM, KC_DOT, KC_SLSH, _______,
856 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
857 _______, _______, _______
861 * ,-----------------------------------------------------------------------------------.
862 * | | | | | | | | | | | | |
863 * |------+------+------+------+------+-------------+------+------+------+------+------|
864 * | | | | | | | | | | | | |
865 * |------+------+------+------+------+------+------+------+------+------+------+------|
866 * | | | | | | | | | | | | |
867 * |------+------+------+------+------+------+------+------+------+------+------+------|
868 * | | | | | | | | | | | | |
869 * `-----------------------------------------------------------------------------------'
871 [_GREEKL] = KEYMAP_CUSTOM(
872 _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC), X(LPI), _______,
873 _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA), X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
874 _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA), X(LNU), X(LMU), KC_COMM, KC_DOT, KC_SLSH, _______,
875 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
876 _______, _______, _______
880 * ,-----------------------------------------------------------------------------------.
881 * | | | | | | | | | | | | |
882 * |------+------+------+------+------+-------------+------+------+------+------+------|
883 * | | | | | | | | | | | | |
884 * |------+------+------+------+------+------+------+------+------+------+------+------|
885 * | | | | | | | | | | | | |
886 * |------+------+------+------+------+------+------+------+------+------+------+------|
887 * | | | | | | | | | | | | |
888 * `-----------------------------------------------------------------------------------'
890 [_EMPTY] = KEYMAP_CUSTOM(
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 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
894 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
895 _______, _______, _______
899 * ,-----------------------------------------------------------------------------------.
900 * | | | | | | | | | | | | |
901 * |------+------+------+------+------+-------------+------+------+------+------+------|
902 * | | | | | | | | | | | | |
903 * |------+------+------+------+------+------+------+------+------+------+------+------|
904 * | | | | | | | | | | | | |
905 * |------+------+------+------+------+------+------+------+------+------+------+------|
906 * | | | | | | | | | | | | |
907 * `-----------------------------------------------------------------------------------'
909 [_EMOJI] = KEYMAP_CUSTOM(
910 X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
911 X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART), X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
912 X(THMDN),X(SLEEP), X(CLAP), X(CRY), X(VIC),X(BHART), X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
913 X(POO), X(EYES), X(HUNRD),_______, X(SKULL),X(HORNS), X(HALO), X(FEAR),_______,X(YUMMY),X(DISAP),X(NOEVK),
914 _______, _______, _______
918 * ,-----------------------------------------------------------------------------------.
919 * | | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | |
920 * |------+------+------+------+------+-------------+------+------+------+------+------|
921 * | Esc | | Btab | Esc | Tab | | | Prev | | Next | | |
922 * |------+------+------+------+------+------+------+------+------+------+------+------|
923 * | | | Prev | Play | Next | | | | | | | |
924 * |------+------+------+------+------+------+------+------+------+------+------+------|
925 * | | | | | | | | | | | | |
926 * `-----------------------------------------------------------------------------------'
928 [_GUI] = KEYMAP_CUSTOM(
929 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,
930 KC_ESC, XXXXXXX, S(KC_TAB),KC_ESC, KC_TAB, XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
931 XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, KC_SPC, KC_SPC, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
932 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
933 _______, _______, _______
937 * ,-----------------------------------------------------------------------------------.
938 * | |Qwerty| Win | |Reset | | | USB | | | | |
939 * |------+------+------+------+------+-------------+------+------+------+------+------|
940 * | |Audio | |Dvorak| | Glow | | |WorkMn|Linux | | |
941 * |------+------+------+------+------+------+------+------+------+------+------+------|
942 * | | | |Colmak| | BLE |Norman|MacOS | | | | |
943 * |------+------+------+------+------+------+------+------+------+------+------+------|
944 * | | | | | | | | | | | | |
945 * `-----------------------------------------------------------------------------------'
947 [_SYS] = KEYMAP_CUSTOM(
948 DEBUG, QWERTY, WIN, XXXXXXX, RESET, XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, RGBDEMO,
949 XXXXXXX, FC_TOG, XXXXXXX, DVORAK, XXXXXXX, GLOW, XXXXXXX, XXXXXXX, WORKMAN, LINUX, XXXXXXX, XXXXXXX,
950 XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BT, NORMAN, OSX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
951 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
952 _______, _______, _______
958 void persistent_default_layer_set(uint16_t default_layer) {
959 eeconfig_update_default_layer(default_layer);
960 default_layer_set(default_layer);
962 led_set_default_layer_indicator();
966 #ifdef DOUBLESPACE_LAYER_ENABLE
967 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
972 register_code(KC_LALT); // sends alt and enter layer
973 space_layer_entered = true;
977 if (space_layer_entered) {
978 unregister_code(KC_LALT); // release alt and exit layer
981 space_layer_entered = false;
985 register_code(KC_SPC);
986 unregister_code(KC_SPC);
994 uint32_t layer_state_set_kb(uint32_t state)
996 // turn on punc layer if both fun & num are on
997 if ((state & ((1UL<<_NUM) | (1UL<<_FUN))) == ((1UL<<_NUM) | (1UL<<_FUN))) {
998 state |= (1UL<<_PUNC);
1000 state &= ~(1UL<<_PUNC);
1003 // turn on emoji layer if empty and greek layer are on
1005 (state & ((1UL<<_EMPTY) | (1UL<<_GREEKU))) == ((1UL<<_EMPTY) | (1UL<<_GREEKU))
1006 || (state & ((1UL<<_EMPTY) | (1UL<<_GREEKL))) == ((1UL<<_EMPTY) | (1UL<<_GREEKL))
1008 state |= (1UL<<_EMOJI);
1010 state &= ~(1UL<<_EMOJI);
1015 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
1016 static bool lshift = false;
1017 static bool rshift = false;
1018 static uint8_t layer = 0;
1020 lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
1021 rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
1022 layer = biton32(layer_state);
1024 #ifdef DOUBLESPACE_LAYER_ENABLE
1025 // double-space: send space immediately if any other key depressed before space is released
1026 if ((lspace_active ^ rspace_active)
1027 && keycode != LSPACE
1028 && keycode != RSPACE
1029 && record->event.pressed)
1031 if (lspace_active) {
1032 if (!lspace_emitted) {
1033 register_code(KC_SPC);
1034 unregister_code(KC_SPC);
1036 lspace_emitted = true;
1038 if (rspace_active) {
1039 if (!rspace_emitted) {
1040 register_code(KC_SPC);
1041 unregister_code(KC_SPC);
1043 rspace_emitted = true;
1047 if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
1048 if (record->event.pressed) {
1049 unregister_code(KC_LALT);
1051 register_code(KC_LALT);
1058 #ifdef DOUBLESPACE_LAYER_ENABLE
1059 // double-space enter space layer
1061 process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
1065 process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
1070 // handle greek layer shift
1074 if (layer == _GREEKU || layer == _GREEKL) {
1075 if (record->event.pressed) {
1079 if (lshift ^ rshift) { // if only one shift was pressed
1088 // press both ctrls to activate SYS layer
1092 bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
1093 bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
1094 if (record->event.pressed) {
1095 if (lctrl ^ rctrl) { // if only one ctrl was pressed
1104 // QWERTZ style comma and dot: semicolon and colon when shifted
1106 if (record->event.pressed) {
1107 if (lshift || rshift) {
1108 if (lshift) unregister_code(KC_LSFT);
1109 if (rshift) unregister_code(KC_RSFT);
1110 register_code(KC_SCLN);
1111 unregister_code(KC_SCLN);
1112 if (lshift) register_code(KC_LSFT);
1113 if (rshift) register_code(KC_RSFT);
1115 register_code(KC_COMM);
1116 unregister_code(KC_COMM);
1122 if (record->event.pressed) {
1123 if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
1124 register_code(KC_SCLN);
1125 unregister_code(KC_SCLN);
1127 register_code(KC_DOT);
1128 unregister_code(KC_DOT);
1136 if (record->event.pressed) {
1137 persistent_default_layer_set(1UL<<_QWERTY);
1141 #ifdef LAYOUT_DVORAK
1143 if (record->event.pressed) {
1144 persistent_default_layer_set(1UL<<_DVORAK);
1149 #ifdef LAYOUT_COLEMAK
1151 if (record->event.pressed) {
1152 persistent_default_layer_set(1UL<<_COLEMAK);
1157 #ifdef LAYOUT_WORKMAN
1159 if (record->event.pressed) {
1160 persistent_default_layer_set(1UL<<_WORKMAN);
1165 #ifdef LAYOUT_NORMAN
1167 if (record->event.pressed) {
1168 persistent_default_layer_set(1UL<<_NORMAN);
1174 // only process Fnumber on key release, and only when layer switcher is still pressed.
1175 // this is to avoid accidental presses on potentially destructive keys
1176 case KC_F1 ... KC_F12:
1180 if (!record->event.pressed && layer == _FUN) { // key released and still in FUN layer
1181 register_code(keycode);
1182 unregister_code(keycode);
1190 if (record->event.pressed) {
1191 if (lshift || rshift) {
1207 set_unicode_input_mode(UC_LNX);
1208 #ifdef RGBSPS_ENABLE
1209 led_set_unicode_input_mode();
1214 set_unicode_input_mode(UC_WINC);
1215 #ifdef RGBSPS_ENABLE
1216 led_set_unicode_input_mode();
1221 set_unicode_input_mode(UC_OSX);
1222 #ifdef RGBSPS_ENABLE
1223 led_set_unicode_input_mode();
1228 // glow mode changer
1229 #ifdef RGBSPS_ENABLE
1231 if (record->event.pressed) {
1233 if (glow_mode > GLOW_FULL) {
1234 glow_mode = GLOW_NONE;
1243 // faux clicky indicator
1244 #ifdef FAUXCLICKY_ENABLE
1246 #ifdef RGBSPS_ENABLE
1247 if (fauxclicky_enabled) {
1248 rgbsps_set(LED_IND_AUDIO, THEME_COLOR_AUDIO);
1250 rgbsps_set(LED_IND_AUDIO, COLOR_BLANK);
1258 #ifdef RGBSPS_DEMO_ENABLE
1268 void set_output_user(uint8_t output) {
1269 #ifdef MODULE_ADAFRUIT_BLE
1272 led_set_output_usb();
1274 case OUTPUT_BLUETOOTH:
1275 led_set_output_ble();
1278 led_set_output_none();
1283 void matrix_init_user() {
1284 _delay_ms(500); // give time for usb to initialize
1286 set_unicode_input_mode(UC_LNX);
1288 #ifdef RGBSPS_ENABLE
1292 // auto detect output on init
1293 #ifdef MODULE_ADAFRUIT_BLE
1294 uint8_t output = auto_detect_output();
1295 if (output == OUTPUT_USB) {
1296 set_output(OUTPUT_USB);
1298 set_output(OUTPUT_BLUETOOTH);
1303 void turn_off_capslock() {
1305 register_code(KC_CAPS);
1306 unregister_code(KC_CAPS);
1310 #ifdef RGBSPS_ENABLE
1311 void matrix_scan_user(void) {
1312 led_set_layer_indicator();
1315 void battery_poll(uint8_t level) {
1316 rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15);
1320 void led_set_user(uint8_t usb_led) {
1321 bool new_capslock = usb_led & (1<<USB_LED_CAPS_LOCK);
1322 if (new_capslock ^ capslock) { // capslock state is different
1323 if ((capslock = new_capslock)) {
1324 rgbsps_set(LED_IND_CAPSLOCK, THEME_COLOR_CAPSLOCK);
1326 rgbsps_set(LED_IND_CAPSLOCK, COLOR_BLANK);
1333 #ifdef PS2_MOUSE_ENABLE
1334 void ps2_mouse_init_user() {
1337 // set TrackPoint sensitivity
1338 PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
1339 PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
1340 PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
1341 PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
1343 // set TrackPoint Negative Inertia factor
1344 PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
1345 PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
1346 PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
1347 PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
1349 // set TrackPoint speed
1350 // (transfer function upper plateau speed)
1351 PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
1352 PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
1353 PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
1354 PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
1356 // inquire pts status
1357 rcv = ps2_host_send(0xE2);
1358 rcv = ps2_host_send(0x2C);
1359 rcv = ps2_host_recv_response();
1360 if ((rcv & 1) == 1) {
1361 // if on, disable pts
1362 rcv = ps2_host_send(0xE2);
1363 rcv = ps2_host_send(0x47);
1364 rcv = ps2_host_send(0x2C);
1365 rcv = ps2_host_send(0x01);