#include QMK_KEYBOARD_H // Custom user includes #include "issmirnov.h" #include "tap_tog.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = LAYOUT_ergodox_wrapper( KC_ESCAPE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_EXLM, LCTL(KC_SPACE), _________________QWERTY_L1_________________, KC_ASTR, KC_TAB, _________________QWERTY_L2_________________, OSM(MOD_LSFT), _________________QWERTY_L3_________________, KC_SLASH, KC_LCTL, LSFT(KC_LGUI), LSFT(KC_LALT), KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPACE, KC_BSPACE, KC_DEL, KC_EQL , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_ESCAPE , KC_PLUS , _________________QWERTY_R1_________________ , LGUI(KC_SPACE) , _________________QWERTY_R2_________________ , MO(_NAVI) , KC_MINS , _________________QWERTY_R3_________________ , KC_QUOTE , KC_ESCAPE , KC_COLN , KC_PERC , XXXXXXX , LGUI(KC_L) , KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, KC_TAB, KC_ENTER ), // layer 1 [_SYMB] = LAYOUT_ergodox_wrapper( KC_ESCAPE , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , XXXXXXX , _________________SYMB_L1___________________ ,KC_ASTR , KC_TAB , _________________SYMB_L2___________________, KC_LSHIFT , _________________SYMB_L3___________________, KC_SLASH , KC_LCTL , LSFT(KC_LGUI) , LSFT(KC_LALT) , KC_LALT , WKSP_LEFT , XXXXXXX, XXXXXXX, XXXXXXX, WKSP_RIGHT, KC_BSPACE, KC_DEL, KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , XXXXXXX , KC_PLUS , _________________SYMB_R1___________________ , MO(_NAVI) , _________________SYMB_R2___________________ , KC_DQUO , KC_MINS , _________________SYMB_R3___________________ , KC_QUOTE , KC_ESCAPE , KC_COLN , KC_PERC , XXXXXXX , XXXXXXX , KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, KC_TAB, KC_ENTER ), // layer 2 [_NUMP] = LAYOUT_ergodox_wrapper( XXXXXXX , ___________________XXXXX___________________, XXXXXXX , XXXXXXX , _________________NUMP_L1___________________ , KC_ASTR , KC_TAB , _________________NUMP_L2___________________ , XXXXXXX , _________________NUMP_L3___________________ , KC_SLASH , TO(0) , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX , XXXXXXX , KC_SPACE , KC_BSPACE , KC_DEL , KC_EQL , ___________________XXXXX___________________ , RESET , KC_PLUS , _________________NUMP_R1___________________ , XXXXXXX , _________________NUMP_R2___________________ , XXXXXXX , KC_MINS , _________________NUMP_R3___________________ , XXXXXXX , KC_0 , XXXXXXX , XXXXXXX , TO(3) , XXXXXXX , KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, KC_LALT, KC_LSFT ), // layer 3 [_OVERWATCH] = LAYOUT_ergodox_wrapper( KC_ESCAPE, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , TO(0) , ______________OVERWATCH_L1_________________ , XXXXXXX , ______________OVERWATCH_L2_________________ , ______________OVERWATCH_L3_________________ , XXXXXXX , ______________OVERWATCH_L4_________________ , XXXXXXX , XXXXXXX , XXXXXXX , KC_SPACE , XXXXXXX , XXXXXXX , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), // layer 4 [_NAVI] = LAYOUT_ergodox_wrapper( KC_ESCAPE, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , XXXXXXX, _________________NAVI_L1___________________ , XXXXXXX , XXXXXXX, _________________NAVI_L2___________________ , XXXXXXX, _________________NAVI_L3___________________ , XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, WKSP_LEFT, XXXXXXX , XXXXXXX , XXXXXXX , WKSP_RIGHT , XXXXXXX , XXXXXXX , _______, _______, _______, _______, _______, _______, _______, _______, _________________NAVI_R1___________________, _______, _________________NAVI_R2___________________, _______, _______, _________________NAVI_R3___________________, _______, MODSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LGUI ), }; // called by QMK during key processing before the actual key event is handled. Useful for macros. bool process_record_user(uint16_t keycode, keyrecord_t *record) { uint8_t layer = biton32(layer_state); switch (keycode) { case TAP_TOG_LAYER: process_tap_tog(_SYMB,record); return false; break; case WKSP_LEFT: // Only if TAP_TOG_LAYER is being held right now do we want to do actions. if (record->event.pressed && (!tap_tog_layer_toggled_on || layer == _NAVI)) { tap_code16(LGUI(LSFT(KC_Z))); tap_tog_layer_other_key_pressed = true; // Add flag so layer resets } break; case WKSP_RIGHT: // Only if TAP_TOG_LAYER is being held right now do we want to do actions. if (record->event.pressed && (!tap_tog_layer_toggled_on || layer == _NAVI)) { tap_code16(LGUI(LSFT(KC_X))); tap_tog_layer_other_key_pressed = true; // Add flag so layer resets } break; default: tap_tog_count = 0; // reset counter. tap_tog_layer_other_key_pressed = true; // always set this to true, TAP_TOG_LAYER handlers will handle interpreting this break; } return true; } // Runs constantly in the background, in a loop every 100ms or so. // Best used for LED status output triggered when user isn't actively typing. void matrix_scan_user(void) { uint8_t layer = biton32(layer_state); if (layer == 0) { // Set up LED indicators for stuck modifier keys. // https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/report.h#L118 switch (keyboard_report->mods) { case MOD_BIT(KC_LSFT): // LSHIFT ergodox_right_led_1_set (LED_BRIGHTNESS_LO); ergodox_right_led_1_on (); ergodox_right_led_2_set (LED_BRIGHTNESS_LO); ergodox_right_led_2_on (); ergodox_right_led_3_set (LED_BRIGHTNESS_HI); ergodox_right_led_3_off (); break; case MOD_BIT(KC_LGUI): // LGUI ergodox_right_led_1_set (LED_BRIGHTNESS_HI); ergodox_right_led_1_off (); ergodox_right_led_2_set (LED_BRIGHTNESS_LO); ergodox_right_led_2_on (); ergodox_right_led_3_set (LED_BRIGHTNESS_LO); ergodox_right_led_3_on (); break; case MOD_BIT(KC_LSFT) ^ MOD_BIT(KC_LGUI): ergodox_right_led_1_set (70); ergodox_right_led_1_on (); ergodox_right_led_2_set (70); ergodox_right_led_2_on (); ergodox_right_led_3_set (70); ergodox_right_led_3_on (); break; default: // reset leds ergodox_right_led_1_set (LED_BRIGHTNESS_HI); ergodox_right_led_1_off (); ergodox_right_led_2_set (LED_BRIGHTNESS_HI); ergodox_right_led_2_off (); ergodox_right_led_3_set (LED_BRIGHTNESS_HI); ergodox_right_led_3_off (); } } } // only runs when when the layer is changed, good for updating LED's and clearing sticky state uint32_t layer_state_set_user(uint32_t state) { uint8_t layer = biton32(state); ergodox_board_led_off(); ergodox_right_led_1_off(); ergodox_right_led_2_off(); ergodox_right_led_3_off(); combo_enable(); // by default, enable combos. switch (layer) { case 0: break; case 1: clear_mods(); ergodox_right_led_1_on(); break; case 2: clear_mods(); ergodox_right_led_2_on(); break; case _OVERWATCH: clear_mods(); combo_disable(); // We don't want combos in overwatch ergodox_right_led_3_on(); break; case 4: ergodox_right_led_1_on(); ergodox_right_led_2_on(); break; case 5: ergodox_right_led_1_on(); ergodox_right_led_3_on(); break; case 6: ergodox_right_led_2_on(); ergodox_right_led_3_on(); break; case 7: ergodox_right_led_1_on(); ergodox_right_led_2_on(); ergodox_right_led_3_on(); break; default: break; } return state; };