qmk-firmware/layouts/community/ergodox/issmirnov/keymap.c

251 lines
8.4 KiB
C

#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;
};