diff options
Diffstat (limited to 'users/issmirnov')
| -rw-r--r-- | users/issmirnov/config.h | 45 | ||||
| -rw-r--r-- | users/issmirnov/issmirnov.c | 43 | ||||
| -rw-r--r-- | users/issmirnov/issmirnov.h | 35 | ||||
| -rw-r--r-- | users/issmirnov/rows.h | 55 | ||||
| -rw-r--r-- | users/issmirnov/rules.mk | 25 | ||||
| -rw-r--r-- | users/issmirnov/tap_tog.c | 52 | ||||
| -rw-r--r-- | users/issmirnov/tap_tog.h | 10 |
7 files changed, 265 insertions, 0 deletions
diff --git a/users/issmirnov/config.h b/users/issmirnov/config.h new file mode 100644 index 000000000..664ebfe8a --- /dev/null +++ b/users/issmirnov/config.h | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | #pragma once | ||
| 2 | |||
| 3 | // Allows sending more than one key per scan. Useful for chords. | ||
| 4 | #define QMK_KEYS_PER_SCAN 4 | ||
| 5 | |||
| 6 | // how long before a tap becomes a hold | ||
| 7 | #undef TAPPING_TERM | ||
| 8 | #define TAPPING_TERM 100 | ||
| 9 | |||
| 10 | // makes tap and hold keys work better for fast typers who don't want | ||
| 11 | // tapping term set above 500 | ||
| 12 | #define PERMISSIVE_HOLD | ||
| 13 | |||
| 14 | // tap anyway, even after TAPPING_TERM, if there was no other key | ||
| 15 | // interruption between press and release | ||
| 16 | #define RETRO_TAPPING | ||
| 17 | |||
| 18 | // how many taps before triggering the toggle | ||
| 19 | #undef ONESHOT_TAP_TOGGLE | ||
| 20 | #define ONESHOT_TAP_TOGGLE 2 | ||
| 21 | |||
| 22 | // how long before oneshot modifier key times out (currently only shift) | ||
| 23 | #undef ONESHOT_TIMEOUT | ||
| 24 | #define ONESHOT_TIMEOUT 2000 | ||
| 25 | |||
| 26 | // Enable combos for vim | ||
| 27 | #define COMBO_COUNT 5 // Specify the number of combos used. BE SURE TO INCREMENT AS NEEDED | ||
| 28 | #define COMBO_TERM 50 // window in milliseconds to trigger combo | ||
| 29 | |||
| 30 | // Allow more than 4 keys to be sent to the system. Useful for gaming. | ||
| 31 | // #define FORCE_NKRO | ||
| 32 | |||
| 33 | // Save 200 bytes on unused keycodes | ||
| 34 | #undef LOCKING_SUPPORT_ENABLE | ||
| 35 | #undef LOCKING_RESYNC_ENABLE | ||
| 36 | |||
| 37 | // Enable HID_listen commands. | ||
| 38 | #define NO_DEBUG | ||
| 39 | #undef NO_PRINT | ||
| 40 | #define USER_PRINT | ||
| 41 | |||
| 42 | // Note: Defining the following does not have any impact on space: | ||
| 43 | // - NO_ACTION_MACRO | ||
| 44 | // - NO_ACTION_FUNCTION | ||
| 45 | // - DISABLE_LEADER | ||
diff --git a/users/issmirnov/issmirnov.c b/users/issmirnov/issmirnov.c new file mode 100644 index 000000000..665afbcfd --- /dev/null +++ b/users/issmirnov/issmirnov.c | |||
| @@ -0,0 +1,43 @@ | |||
| 1 | #include "issmirnov.h" | ||
| 2 | |||
| 3 | enum combo_events { | ||
| 4 | JK_ESC, | ||
| 5 | DF_CLN, | ||
| 6 | SD_SLASH, | ||
| 7 | XC_COPY, | ||
| 8 | XV_PASTE | ||
| 9 | }; | ||
| 10 | |||
| 11 | |||
| 12 | const uint16_t PROGMEM jk_combo[] = {KC_J, KC_K, COMBO_END}; | ||
| 13 | const uint16_t PROGMEM df_combo[] = {KC_D, KC_F, COMBO_END}; | ||
| 14 | const uint16_t PROGMEM sd_combo[] = {KC_S, KC_D, COMBO_END}; | ||
| 15 | const uint16_t PROGMEM copy_combo[] = {KC_X, KC_C, COMBO_END}; | ||
| 16 | const uint16_t PROGMEM paste_combo[] = {KC_X, KC_V, COMBO_END}; | ||
| 17 | |||
| 18 | |||
| 19 | // BE SURE TO UPDATE THE CONFIG.H "COMBO_COUNT" value when you add elements here! | ||
| 20 | combo_t key_combos[COMBO_COUNT] = { | ||
| 21 | COMBO(jk_combo, KC_ESC), | ||
| 22 | COMBO(df_combo, KC_COLON), | ||
| 23 | COMBO(sd_combo, KC_SLASH), | ||
| 24 | [XC_COPY] = COMBO_ACTION(copy_combo), | ||
| 25 | [XV_PASTE] = COMBO_ACTION(paste_combo), | ||
| 26 | }; | ||
| 27 | |||
| 28 | |||
| 29 | void process_combo_event(uint8_t combo_index, bool pressed) { | ||
| 30 | switch(combo_index) { | ||
| 31 | case XC_COPY: | ||
| 32 | if (pressed) { | ||
| 33 | tap_code16(LCTL(KC_C)); | ||
| 34 | } | ||
| 35 | break; | ||
| 36 | |||
| 37 | case XV_PASTE: | ||
| 38 | if (pressed) { | ||
| 39 | tap_code16(LCTL(KC_V)); | ||
| 40 | } | ||
| 41 | break; | ||
| 42 | } | ||
| 43 | } | ||
diff --git a/users/issmirnov/issmirnov.h b/users/issmirnov/issmirnov.h new file mode 100644 index 000000000..eef80dfc4 --- /dev/null +++ b/users/issmirnov/issmirnov.h | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include QMK_KEYBOARD_H | ||
| 4 | |||
| 5 | #include "rows.h" | ||
| 6 | |||
| 7 | // Each layer gets a name for readability, which is then used in the keymap matrix below. | ||
| 8 | // The underscores don't mean anything - you can have a layer called STUFF or any other name. | ||
| 9 | // Layer names don't all need to be of the same length, obviously, and you can also skip them | ||
| 10 | // entirely and just use numbers | ||
| 11 | enum { | ||
| 12 | _QWERTY = 0, | ||
| 13 | _SYMB, | ||
| 14 | _NUMP, | ||
| 15 | _OVERWATCH, | ||
| 16 | _NAVI | ||
| 17 | }; | ||
| 18 | |||
| 19 | enum custom_keycodes { | ||
| 20 | PLACEHOLDER = SAFE_RANGE, | ||
| 21 | TAP_TOG_LAYER, | ||
| 22 | CLEAR_EEPROM, | ||
| 23 | WKSP_LEFT, // Smart key that only activates when we are momentarily in a layer | ||
| 24 | WKSP_RIGHT, // Smart key that only activates when we are momentarily in a layer | ||
| 25 | }; | ||
| 26 | |||
| 27 | |||
| 28 | #define LOWER MO(_SYMB) | ||
| 29 | #define RAISE MO(_NUMP) | ||
| 30 | |||
| 31 | #define CTL_SPC MT(MOD_LCTL, KC_SPC) | ||
| 32 | #define OSMSFT OSM(MOD_LSFT) | ||
| 33 | #define LOCK LGUI(KC_L) | ||
| 34 | #define MODSFT LSFT(KC_LGUI) | ||
| 35 | #define APPS LGUI(KC_SPC) | ||
diff --git a/users/issmirnov/rows.h b/users/issmirnov/rows.h new file mode 100644 index 000000000..d35af2175 --- /dev/null +++ b/users/issmirnov/rows.h | |||
| @@ -0,0 +1,55 @@ | |||
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include QMK_KEYBOARD_H | ||
| 4 | |||
| 5 | // This wrapper is required in order to expand the row macro inside the keymap configs. | ||
| 6 | #define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__) | ||
| 7 | #define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) | ||
| 8 | |||
| 9 | // Share common config. We'll skip the mod rows and func rows. | ||
| 10 | // Note, it's also really neat the way the scoping works. Since we perform the expansion in the keymap.c file | ||
| 11 | // so we can use our enums for custom keycodes | ||
| 12 | #define _________________QWERTY_L1_________________ KC_Q , KC_W , KC_E , KC_R , KC_T | ||
| 13 | #define _________________QWERTY_L2_________________ KC_A , KC_S , KC_D , KC_F , KC_G | ||
| 14 | #define _________________QWERTY_L3_________________ KC_Z , KC_X , KC_C , KC_V , KC_B | ||
| 15 | |||
| 16 | #define _________________QWERTY_R1_________________ KC_Y , KC_U , KC_I , KC_O , KC_P | ||
| 17 | #define _________________QWERTY_R2_________________ KC_H , KC_J , KC_K , KC_L , TAP_TOG_LAYER | ||
| 18 | #define _________________QWERTY_R3_________________ KC_N , KC_M , KC_DOT , KC_COMMA , TG(_NUMP) | ||
| 19 | |||
| 20 | #define ___________________BLANK___________________ _______ , _______ , _______ , _______ , _______ | ||
| 21 | #define ___________________XXXXX___________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX | ||
| 22 | |||
| 23 | #define _________________SYMB_L1___________________ KC_MINS , KC_AT , KC_LCBR , KC_RCBR , KC_GRV | ||
| 24 | #define _________________SYMB_L2___________________ KC_CIRC , KC_UNDS , KC_LPRN , KC_RPRN , KC_DLR | ||
| 25 | #define _________________SYMB_L3___________________ KC_LABK , KC_RABK , KC_LBRACKET , KC_RBRACKET , KC_TILD | ||
| 26 | |||
| 27 | #define _________________SYMB_R1___________________ KC_ASTR , KC_EXLM , KC_PIPE , KC_PERC , KC_PLUS | ||
| 28 | #define _________________SYMB_R2___________________ KC_HASH , KC_EQL , KC_COLN , KC_SCLN , TAP_TOG_LAYER | ||
| 29 | #define _________________SYMB_R3___________________ KC_AMPR , KC_QUES , KC_SLASH , KC_BSLASH , TG(_NUMP) | ||
| 30 | |||
| 31 | |||
| 32 | #define _________________NUMP_L1___________________ KC_NO , KC_NO , LGUI(KC_UP) , XXXXXXX , XXXXXXX | ||
| 33 | #define _________________NUMP_L2___________________ XXXXXXX , LGUI(KC_LEFT) , LGUI(KC_DOWN) , LGUI(KC_RIGHT) , XXXXXXX | ||
| 34 | #define _________________NUMP_L3___________________ XXXXXXX , XXXXXXX , XXXXXXX , KC_AUDIO_VOL_DOWN , KC_AUDIO_VOL_UP | ||
| 35 | |||
| 36 | #define _________________NUMP_R1___________________ KC_COMM , KC_7 , KC_8 , KC_9 , XXXXXXX | ||
| 37 | #define _________________NUMP_R2___________________ KC_0 , KC_4 , KC_5 , KC_6 , TO(_SYMB) | ||
| 38 | #define _________________NUMP_R3___________________ KC_DOT , KC_1 , KC_2 , KC_3 , TO(_QWERTY) | ||
| 39 | |||
| 40 | // Note: These are 6x1 blocks, since modifiers are also adjusted. | ||
| 41 | #define ______________OVERWATCH_L1_________________ KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T | ||
| 42 | #define ______________OVERWATCH_L2_________________ KC_LCTL , KC_A , KC_S , KC_D , KC_F , KC_P | ||
| 43 | #define ______________OVERWATCH_L3_________________ KC_LSHIFT , KC_Z , KC_X , KC_C , KC_V , KC_GRAVE | ||
| 44 | // Ergodox only has 5 keys on bottom row: | ||
| 45 | #define ______________OVERWATCH_L4_________________ KC_LCTL , KC_F9 , KC_PSCREEN , KC_H , KC_R | ||
| 46 | |||
| 47 | |||
| 48 | |||
| 49 | #define _________________NAVI_L1___________________ XXXXXXX , XXXXXXX , KC_UP , XXXXXXX , XXXXXXX | ||
| 50 | #define _________________NAVI_L2___________________ XXXXXXX , KC_LEFT , KC_DOWN , KC_RGHT , XXXXXXX | ||
| 51 | #define _________________NAVI_L3___________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX | ||
| 52 | |||
| 53 | #define _________________NAVI_R1___________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX | ||
| 54 | #define _________________NAVI_R2___________________ XXXXXXX , KC_LCTL , XXXXXXX , XXXXXXX , XXXXXXX | ||
| 55 | #define _________________NAVI_R3___________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX | ||
diff --git a/users/issmirnov/rules.mk b/users/issmirnov/rules.mk new file mode 100644 index 000000000..096d7b4c0 --- /dev/null +++ b/users/issmirnov/rules.mk | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | |||
| 2 | SRC += tap_tog.c | ||
| 3 | SRC += issmirnov.c | ||
| 4 | |||
| 5 | # https://www.reddit.com/r/olkb/comments/bmpgjm/programming_help/ | ||
| 6 | # Should shave 2000 bytes | ||
| 7 | LINK_TIME_OPTIMIZATION_ENABLE = yes | ||
| 8 | |||
| 9 | # Enable debugging only when needed. | ||
| 10 | CONSOLE_ENABLE = yes # +400 bytes (hid_listen support) | ||
| 11 | |||
| 12 | # Enable combo keys for vim usage. | ||
| 13 | # https://github.com/qmk/qmk_firmware/blob/master/docs/feature_combo.md | ||
| 14 | COMBO_ENABLE = yes | ||
| 15 | |||
| 16 | # This allows the keyboard to tell the host OS that up to 248 keys are held down at once | ||
| 17 | NKRO_ENABLE = no # note: also needs FORCE_NKRO in config.h | ||
| 18 | |||
| 19 | # Disable unused features to save on space | ||
| 20 | # https://thomasbaart.nl/2018/12/01/reducing-firmware-size-in-qmk/ | ||
| 21 | MOUSEKEY_ENABLE = no # 2000 bytes | ||
| 22 | BOOTMAGIC_ENABLE = no | ||
| 23 | COMMAND_ENABLE = no # https://beta.docs.qmk.fm/features/feature_command | ||
| 24 | UNICODE_ENABLE = no # Unicode | ||
| 25 | SWAP_HANDS_ENABLE = no # Allow swapping hands of keyboard | ||
diff --git a/users/issmirnov/tap_tog.c b/users/issmirnov/tap_tog.c new file mode 100644 index 000000000..02cea08b1 --- /dev/null +++ b/users/issmirnov/tap_tog.c | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | #include QMK_KEYBOARD_H | ||
| 2 | |||
| 3 | #include "tap_tog.h" | ||
| 4 | |||
| 5 | bool tap_tog_layer_other_key_pressed = false; | ||
| 6 | bool tap_tog_layer_toggled_on = false; | ||
| 7 | uint8_t tap_tog_count = 0; | ||
| 8 | |||
| 9 | void process_tap_tog(uint8_t layer, keyrecord_t *record) { | ||
| 10 | tap_tog_count++; | ||
| 11 | // press | ||
| 12 | if (record->event.pressed) { | ||
| 13 | |||
| 14 | // TTL has already been pressed and we are toggled into that layer | ||
| 15 | // so now we need to leave | ||
| 16 | if(tap_tog_layer_toggled_on) { | ||
| 17 | layer_clear(); | ||
| 18 | tap_tog_layer_toggled_on = false; | ||
| 19 | } | ||
| 20 | |||
| 21 | // this means we're in our default layer | ||
| 22 | // so switch the layer immediately | ||
| 23 | // whether we'll switch back when it's released depends on if a button gets pressed while this is held down | ||
| 24 | else { | ||
| 25 | // switch layer | ||
| 26 | layer_on(layer); | ||
| 27 | tap_tog_layer_other_key_pressed = false; // if this becomes true before it gets released, it will act as a held modifier | ||
| 28 | } | ||
| 29 | } | ||
| 30 | |||
| 31 | // release | ||
| 32 | else { | ||
| 33 | // if it was used as a held modifier (like traditional shift) | ||
| 34 | if(tap_tog_layer_other_key_pressed) { | ||
| 35 | // switch layer back | ||
| 36 | layer_clear(); | ||
| 37 | } | ||
| 38 | // if it was used as a toggle button | ||
| 39 | else { | ||
| 40 | // next time, it will turn layer off | ||
| 41 | tap_tog_layer_toggled_on = true; | ||
| 42 | |||
| 43 | // If it's been tapped twice, reset the toggle flag. | ||
| 44 | // Otherwise, we get stuck oscillating between this code block and the | ||
| 45 | // pressed && TTL_toggled_on block. | ||
| 46 | if (tap_tog_count >= 4 ) { | ||
| 47 | tap_tog_count = 0; | ||
| 48 | tap_tog_layer_toggled_on = false; | ||
| 49 | } | ||
| 50 | } | ||
| 51 | } | ||
| 52 | } | ||
diff --git a/users/issmirnov/tap_tog.h b/users/issmirnov/tap_tog.h new file mode 100644 index 000000000..f59711f04 --- /dev/null +++ b/users/issmirnov/tap_tog.h | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "issmirnov.h" | ||
| 4 | |||
| 5 | extern bool tap_tog_layer_other_key_pressed; // set to true if any key pressed while TAP_TOG_LAYER held down | ||
| 6 | extern bool tap_tog_layer_toggled_on; // will become true if no keys are pressed while TTL held down | ||
| 7 | extern uint8_t tap_tog_count; // number of presses on TAP_TOG_LAYER button. | ||
| 8 | |||
| 9 | // Tap dance analog with momentary toggle when held, switch when tapped | ||
| 10 | void process_tap_tog(uint8_t layer, keyrecord_t *record); | ||
