1 // This is the canonical layout file for the Quantum project. If you want to add another keyboard,
2 // this is the style you want to emulate.
4 #include "promethium.h"
5 #include "action_layer.h"
7 #include "process_unicode.h"
10 #include "ps2_mouse.h"
12 #include "outputselect.h"
14 #define COUNT(x) (sizeof (x) / sizeof (*(x)))
16 // Fillers to make layering clearer
17 #define _______ KC_TRNS
20 #define KC_WWWB KC_WWW_BACK
21 #define KC_WWWF KC_WWW_FORWARD
23 // hybrid right-alt & scroll lock (mapped to Compose in OS)
25 #define KC_RALT MT(MOD_RALT, KC_SLCK)
27 bool capslock = false;
28 #ifdef DOUBLESPACE_LAYER_ENABLE
29 bool lspace_active = false;
30 bool rspace_active = false;
31 bool lspace_emitted = false;
32 bool rspace_emitted = false;
33 bool space_layer_entered = false;
42 uint8_t glow_mode = GLOW_MIN;
44 void turn_off_capslock(void);
45 extern keymap_config_t keymap_config;
53 _DEFAULT_LAYER_MAX = _NORMAN,
70 enum planck_keycodes {
103 GRIN, // grinning face 😊
104 TJOY, // tears of joy 😂
105 SMILE, // grining face with smiling eyes 😁
107 EYERT, // smiling face with heart shaped eyes 😍
108 CRY, // crying face 😭
109 SMEYE, // smiling face with smiling eyes 😊
112 HART2, // two hearts 💕
114 OKHND, // ok hand sign 👌
120 THMDN, // thumb down 👎
123 MUSIC, // musical notes
125 CELEB, // celebration 🙌
126 CRY2, // crying face 😢
127 COOL, // smile with sunglasses 😎
128 NOEVS, // see no evil
129 NOEVH, // hear no evil
130 NOEVK, // speak no evil
134 BHART, // broken heart
135 SLEEP, // sleeping face
136 SMIL2, // smiling face with open mouth & sweat
139 TONGU, // face with tongue & winking eye
140 DISAP, // disappointed
141 YUMMY, // face savoring delicious food
142 CLAP, // hand clapping
143 FEAR, // face screaming in fear
144 HORNS, // smiling face with horns
145 HALO, // smiling face with halo
205 const uint32_t PROGMEM unicode_map[] = {
308 const uint8_t PROGMEM LED_ALNUM[] = {
343 const uint8_t PROGMEM LED_HOMING[] = {
354 const uint8_t PROGMEM LED_MODS[] = {
369 const uint8_t PROGMEM LED_FN[] = {
376 const uint8_t PROGMEM LED_INDICATORS[] = {
385 const uint8_t PROGMEM LED_TRACKPOINT[] = {
391 void led_turnoff_keys(void) {
392 for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
393 rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 0, 0, 0);
395 for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
396 rgbsps_set(pgm_read_byte(&LED_MODS[i]), 0, 0, 0);
398 for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
399 rgbsps_set(pgm_read_byte(&LED_FN[i]), 0, 0, 0);
403 void led_reset(void) {
410 for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
411 rgbsps_set(pgm_read_byte(&LED_HOMING[i]), 8, 8, 8);
413 rgbsps_set(LED_F, 15, 0, 0);
414 rgbsps_set(LED_J, 15, 0, 0);
417 for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
418 rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 8, 8, 8);
420 for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
421 rgbsps_set(pgm_read_byte(&LED_MODS[i]), 0, 15, 0);
423 for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
424 rgbsps_set(pgm_read_byte(&LED_FN[i]), 0, 0, 15);
426 for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
427 rgbsps_set(pgm_read_byte(&LED_HOMING[i]), 15, 0, 0);
429 rgbsps_set(LED_F, 15, 15, 0);
430 rgbsps_set(LED_J, 15, 15, 0);
435 void led_set_layer_indicator(void) {
436 static uint8_t oldlayer = 255;
438 rgbsps_set(LED_IND_FUNC, 0, 0, 0);
439 // rgbsps_set(LED_IND_NUM, 0, 0, 0);
440 rgbsps_set(LED_IND_EMOJI, 0, 0, 0);
444 uint8_t layer = biton32(layer_state);
445 if (oldlayer == layer) {
451 if (layer <= _DEFAULT_LAYER_MAX) {
458 rgbsps_set(LED_IND_FUNC, 15, 0, 0);
461 // rgbsps_set(LED_IND_NUM, 0, 0, 15);
464 rgbsps_set(LED_IND_EMOJI, 15, 15, 0);
467 rgbsps_set(LED_IND_FUNC, 3, 3, 3);
468 // rgbsps_set(LED_IND_NUM, 3, 3, 3);
469 rgbsps_set(LED_IND_EMOJI, 3, 3, 3);
475 void led_set_output_ble(void) {
476 rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 15);
477 rgbsps_set(LED_IND_USB, 0, 0, 0);
481 void led_set_output_usb(void) {
482 rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0);
483 rgbsps_set(LED_IND_USB, 15, 15, 15);
487 void led_set_output_none(void) {
488 rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0);
489 rgbsps_set(LED_IND_USB, 0, 0, 0);
493 void led_init(void) {
497 // set trackpoint color
498 rgbsps_set(LED_TRACKPOINT1, 15, 0, 0);
499 rgbsps_set(LED_TRACKPOINT2, 0, 0, 15);
500 rgbsps_set(LED_TRACKPOINT3, 15, 0, 0);
506 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
509 * ,-----------------------------------------------------------------------------------.
510 * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
511 * |------+------+------+------+------+-------------+------+------+------+------+------|
512 * | Esc | A | S | D | F | G | H | J | K | L | ' |Enter |
513 * |------+------+------+------+------+------|------+------+------+------+------+------|
514 * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift |
515 * |------+------+------+------+------+------+------+------+------+------+------+------|
516 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
517 * `-----------------------------------------------------------------------------------'
520 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
521 KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT ,
522 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
523 KC_LCTL, KC_LALT, KC_LGUI, XXXXXXX, NUM, LSPACE, RSPACE, FUNC, GREEK, KC_RGUI, KC_RALT, KC_RCTL
527 * ,-----------------------------------------------------------------------------------.
528 * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp |
529 * |------+------+------+------+------+-------------+------+------+------+------+------|
530 * | Esc | A | O | E | U | I | D | H | T | N | S |Enter |
531 * |------+------+------+------+------+------|------+------+------+------+------+------|
532 * | Shift| / | Q | J | K | X | B | M | W | V | Z |Shift |
533 * |------+------+------+------+------+------+------+------+------+------+------+------|
534 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
535 * `-----------------------------------------------------------------------------------'
539 _______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, _______,
540 _______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, _______,
541 _______, KC_SLSH, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______,
542 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
547 * ,-----------------------------------------------------------------------------------.
548 * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
549 * |------+------+------+------+------+-------------+------+------+------+------+------|
550 * | Esc | A | R | S | T | D | H | N | E | I | O |Enter |
551 * |------+------+------+------+------+------|------+------+------+------+------+------|
552 * | Shift| Z | X | C | V | B | K | M | , | . | / |Shift |
553 * |------+------+------+------+------+------+------+------+------+------+------+------|
554 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
555 * `-----------------------------------------------------------------------------------'
558 #ifdef LAYOUT_COLEMAK
560 _______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, _______,
561 _______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, _______,
562 _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
563 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
568 * ,-----------------------------------------------------------------------------------.
569 * | Tab | Q | W | D | F | K | J | U | R | L | ; | Bksp |
570 * |------+------+------+------+------+-------------+------+------+------+------+------|
571 * | Esc | A | S | E | T | G | Y | N | I | O | H |Enter |
572 * |------+------+------+------+------+------|------+------+------+------+------+------|
573 * | Shift| Z | X | C | V | B | P | M | , | . | / |Shift |
574 * |------+------+------+------+------+------+------+------+------+------+------+------|
575 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
576 * `-----------------------------------------------------------------------------------'
581 _______, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_J, KC_U, KC_R, KC_L, KC_QUOT, _______,
582 _______, KC_A, KC_S, KC_E, KC_T, KC_G, KC_Y, KC_N, KC_I, KC_O, KC_H, _______,
583 _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
584 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
589 * ,-----------------------------------------------------------------------------------.
590 * | Tab | Q | D | R | W | B | J | F | U | P | ; | Bksp |
591 * |------+------+------+------+------+-------------+------+------+------+------+------|
592 * | Esc | A | S | H | T | G | Y | N | E | O | I |Enter |
593 * |------+------+------+------+------+------|------+------+------+------+------+------|
594 * | Shift| Z | X | M | C | V | K | K | , | . | / |Shift |
595 * |------+------+------+------+------+------+------+------+------+------+------+------|
596 * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
597 * `-----------------------------------------------------------------------------------'
600 #ifdef LAYOUT_WORKMAN
602 _______, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_QUOT, _______,
603 _______, KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, _______,
604 _______, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, _______,
605 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
610 * ,-----------------------------------------------------------------------------------.
611 * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | ` |
612 * |------+------+------+------+------+-------------+------+------+------+------+------|
613 * | | * | \ | - | = | / | | ( | ) | < | > | |
614 * |------+------+------+------+------+------|------+------+------+------+------+------|
615 * | & | ^ | | | _ | + | ? | | [ | ] | { | } | : |
616 * |------+------+------+------+------+------+------+------+------+------+------+------|
617 * | | | | | | | | | | | |
618 * `-----------------------------------------------------------------------------------'
621 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______,
622 KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, XXXXXXX, KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
623 KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, XXXXXXX, KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, KC_COLN,
624 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
628 * ,-----------------------------------------------------------------------------------.
629 * | ~ | ! | @ | # | $ | % | A | 7 | 8 | 9 | D | ` |
630 * |------+------+------+------+------+-------------+------+------+------+------+------|
631 * | | * | \ | - | = | / | B | 4 | 5 | 6 | E | |
632 * |------+------+------+------+------+------|------+------+------+------+------+------|
633 * | & | ^ | | | _ | + | ? | C | 1 | 2 | 3 | F | : |
634 * |------+------+------+------+------+------+------+------+------+------+------+------|
635 * | | | | | | | x | 0 | , | . | | |
636 * `-----------------------------------------------------------------------------------'
639 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, S(KC_A), KC_7, KC_8, KC_9, S(KC_D), _______,
640 KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, S(KC_B), KC_4, KC_5, KC_6, S(KC_E), _______,
641 KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C), KC_1, KC_2, KC_3, S(KC_F), KC_COLN,
642 _______, _______, _______, _______, _______, _______, _______, LT(_PUNC, KC_0), KC_COMM, KC_DOT, KC_X, _______
646 * ,-----------------------------------------------------------------------------------.
647 * | | F1 | F2 | F3 | F4 | | | PgUp | Up | PgDn | PgUp | Del |
648 * |------+------+------+------+------+-------------+------+------+------+------+------|
649 * | | F5 | F6 | F7 | F8 |PrtSc | | Left | Down | Right| PgDn | Ins |
650 * |------+------+------+------+------+------|------+------+------+------+------+------|
651 * | | F9 | F10 | F11 | F12 | | | | Home | End | | |
652 * |------+------+------+------+------+------+------+------+------+------+------+------|
653 * | | | | | | | | | | | |
654 * `-----------------------------------------------------------------------------------'
657 XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX, XXXXXXX, KC_PGUP, KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
658 XXXXXXX, KC_F5, KC_F6, KC_F7, KC_F8, KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_INS,
659 _______, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_END, XXXXXXX, _______,
660 _______, _______, _______, _______, PUNC, _______, _______, _______, _______, _______, _______, _______
664 * ,-----------------------------------------------------------------------------------.
665 * | | | | | | | | | | | | |
666 * |------+------+------+------+------+-------------+------+------+------+------+------|
667 * | | | | | | | | | | | | |
668 * |------+------+------+------+------+------+------+------+------+------+------+------|
669 * | | | | | | | | | | | | |
670 * |------+------+------+------+------+------+------+------+------+------+------+------|
671 * | | | | | | | | | | | | |
672 * `-----------------------------------------------------------------------------------'
675 _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC), X(UPI), _______,
676 _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA), X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
677 _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA), X(UNU), X(UMU), KC_COMM, KC_DOT, KC_SLSH, _______,
678 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
682 * ,-----------------------------------------------------------------------------------.
683 * | | | | | | | | | | | | |
684 * |------+------+------+------+------+-------------+------+------+------+------+------|
685 * | | | | | | | | | | | | |
686 * |------+------+------+------+------+------+------+------+------+------+------+------|
687 * | | | | | | | | | | | | |
688 * |------+------+------+------+------+------+------+------+------+------+------+------|
689 * | | | | | | | | | | | | |
690 * `-----------------------------------------------------------------------------------'
693 _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC), X(LPI), _______,
694 _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA), X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
695 _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA), X(LNU), X(LMU), KC_COMM, KC_DOT, KC_SLSH, _______,
696 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
700 * ,-----------------------------------------------------------------------------------.
701 * | | | | | | | | | | | | |
702 * |------+------+------+------+------+-------------+------+------+------+------+------|
703 * | | | | | | | | | | | | |
704 * |------+------+------+------+------+------+------+------+------+------+------+------|
705 * | | | | | | | | | | | | |
706 * |------+------+------+------+------+------+------+------+------+------+------+------|
707 * | | | | | | | | | | | | |
708 * `-----------------------------------------------------------------------------------'
711 X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
712 X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART), X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
713 X(THMDN),X(SLEEP), X(CLAP), X(CRY), X(VIC),X(BHART), X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
714 X(POO), X(EYES), _______,X(HUNRD), X(SKULL),X(HORNS), X(HALO), X(FEAR),X(YUMMY),_______,X(DISAP),X(NOEVK)
718 * ,-----------------------------------------------------------------------------------.
719 * | | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | |
720 * |------+------+------+------+------+-------------+------+------+------+------+------|
721 * | | | Vol- | Mute | Vol+ | | | Prev | | Next | | |
722 * |------+------+------+------+------+------+------+------+------+------+------+------|
723 * | | | Prev | Play | Next | BTab | Tab | | | | | |
724 * |------+------+------+------+------+------+------+------+------+------+------+------|
725 * | | | | | | | | | | | | |
726 * `-----------------------------------------------------------------------------------'
729 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,
730 KC_ESC, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU,S(KC_TAB),KC_TAB, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
731 XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, KC_SPC, KC_SPC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
732 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
736 * ,-----------------------------------------------------------------------------------.
737 * | |Qwerty| Win | |Reset | | | USB | | | | |
738 * |------+------+------+------+------+-------------+------+------+------+------+------|
739 * | |Audio | |Dvorak| | Glow | | |WorkMn|Linux | | |
740 * |------+------+------+------+------+------+------+------+------+------+------+------|
741 * | | | |Colmak| | BLE |Norman|MacOS | | | | |
742 * |------+------+------+------+------+------+------+------+------+------+------+------|
743 * | | | | | | | | | | | | |
744 * `-----------------------------------------------------------------------------------'
747 XXXXXXX, QWERTY, WIN, XXXXXXX, RESET, XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
748 XXXXXXX, AUDIO, XXXXXXX, DVORAK, XXXXXXX, GLOW, XXXXXXX, XXXXXXX, WORKMAN, LINUX, XXXXXXX, XXXXXXX,
749 XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BLE, NORMAN, OSX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
750 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______
755 void persistant_default_layer_set(uint16_t default_layer) {
756 eeconfig_update_default_layer(default_layer);
757 default_layer_set(default_layer);
760 #ifdef DOUBLESPACE_LAYER_ENABLE
761 void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
766 register_code(KC_LALT); // sends alt and enter layer
767 space_layer_entered = true;
771 if (space_layer_entered) {
772 unregister_code(KC_LALT); // release alt and exit layer
775 space_layer_entered = false;
779 register_code(KC_SPC);
780 unregister_code(KC_SPC);
788 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
789 bool lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
790 bool rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
791 uint8_t layer = biton32(layer_state);
793 #ifdef DOUBLESPACE_LAYER_ENABLE
794 // double-space: send space immediately if any other key depressed before space is released
795 if ((lspace_active ^ rspace_active)
798 && record->event.pressed)
801 if (!lspace_emitted) {
802 register_code(KC_SPC);
803 unregister_code(KC_SPC);
805 lspace_emitted = true;
808 if (!rspace_emitted) {
809 register_code(KC_SPC);
810 unregister_code(KC_SPC);
812 rspace_emitted = true;
816 if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
817 if (record->event.pressed) {
818 unregister_code(KC_LALT);
820 register_code(KC_LALT);
827 #ifdef DOUBLESPACE_LAYER_ENABLE
828 // double-space enter space layer
830 process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
834 process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
839 // handle greek layer shift
840 // handle both shift = capslock
844 if (layer == _GREEKU || layer == _GREEKL) {
845 if (record->event.pressed) {
849 if (lshift ^ rshift) { // if only one shift was pressed
855 if (record->event.pressed) {
856 if (lshift ^ rshift) { // if only one shift was pressed
857 register_code(KC_CAPS);
858 unregister_code(KC_CAPS);
865 // press both ctrls to activate SYS layer
869 bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
870 bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
871 if (record->event.pressed) {
872 if (lctrl ^ rctrl) { // if only one ctrl was pressed
881 // QWERTZ style comma and dot: semicolon and colon when shifted
883 if (record->event.pressed) {
884 if (lshift || rshift) {
885 if (lshift) unregister_code(KC_LSFT);
886 if (rshift) unregister_code(KC_RSFT);
887 register_code(KC_SCLN);
888 unregister_code(KC_SCLN);
889 if (lshift) register_code(KC_LSFT);
890 if (rshift) register_code(KC_RSFT);
892 register_code(KC_COMM);
893 unregister_code(KC_COMM);
899 if (record->event.pressed) {
900 if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
901 register_code(KC_SCLN);
902 unregister_code(KC_SCLN);
904 register_code(KC_DOT);
905 unregister_code(KC_DOT);
913 if (record->event.pressed) {
914 persistant_default_layer_set(1UL<<_QWERTY);
920 if (record->event.pressed) {
921 persistant_default_layer_set(1UL<<_DVORAK);
926 #ifdef LAYOUT_COLEMAK
928 if (record->event.pressed) {
929 persistant_default_layer_set(1UL<<_COLEMAK);
934 #ifdef LAYOUT_WORKMAN
936 if (record->event.pressed) {
937 persistant_default_layer_set(1UL<<_WORKMAN);
944 if (record->event.pressed) {
945 persistant_default_layer_set(1UL<<_NORMAN);
953 if (record->event.pressed) {
955 update_tri_layer(_PUNC, _GREEKL, _EMOJI);
958 update_tri_layer(_PUNC, _GREEKL, _EMOJI);
964 if (record->event.pressed) {
965 if (lshift || rshift) {
971 update_tri_layer(_PUNC, _GREEKL, _EMOJI);
976 update_tri_layer(_PUNC, _GREEKL, _EMOJI);
982 if (record->event.pressed) {
992 if (record->event.pressed) {
1002 set_unicode_input_mode(UC_LNX);
1006 set_unicode_input_mode(UC_WINC);
1010 set_unicode_input_mode(UC_OSX);
1014 // glow mode changer
1016 if (record->event.pressed) {
1018 if (glow_mode > GLOW_FULL) {
1019 glow_mode = GLOW_NONE;
1027 // faux clicky toggle, TBD
1035 void set_output_user(uint8_t output) {
1038 led_set_output_usb();
1040 case OUTPUT_ADAFRUIT_BLE:
1041 led_set_output_ble();
1044 led_set_output_none();
1048 void matrix_init_user(void) {
1049 _delay_ms(500); // give time for usb to initialize
1051 set_unicode_input_mode(UC_LNX);
1054 // auto detect output on init
1055 uint8_t output = auto_detect_output();
1056 if (output == OUTPUT_USB) {
1057 set_output(OUTPUT_USB);
1059 set_output(OUTPUT_ADAFRUIT_BLE);
1063 void matrix_scan_user(void) {
1064 led_set_layer_indicator();
1067 void battery_poll(uint8_t level) {
1068 rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15);
1072 void led_set_user(uint8_t usb_led) {
1073 bool new_capslock = usb_led & (1<<USB_LED_CAPS_LOCK);
1074 if (new_capslock ^ capslock) { // capslock state is different
1075 if ((capslock = new_capslock)) {
1076 rgbsps_set(LED_IND_NUM, 15, 0, 0);
1078 rgbsps_set(LED_IND_NUM, 0, 0, 0);
1084 void turn_off_capslock() {
1086 register_code(KC_CAPS);
1087 unregister_code(KC_CAPS);
1091 void ps2_mouse_init_user() {
1094 // set TrackPoint sensitivity
1095 PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
1096 PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
1097 PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
1098 PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
1100 // set TrackPoint Negative Inertia factor
1101 PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
1102 PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
1103 PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
1104 PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
1106 // set TrackPoint speed
1107 // (transfer function upper plateau speed)
1108 PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
1109 PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
1110 PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
1111 PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
1113 // inquire pts status
1114 rcv = ps2_host_send(0xE2);
1115 rcv = ps2_host_send(0x2C);
1116 rcv = ps2_host_recv_response();
1117 if ((rcv & 1) == 1) {
1118 // if on, disable pts
1119 rcv = ps2_host_send(0xE2);
1120 rcv = ps2_host_send(0x47);
1121 rcv = ps2_host_send(0x2C);
1122 rcv = ps2_host_send(0x01);