QMK keymap with a functioning alt+tab on a layer
unknown
c_cpp
2 years ago
25 kB
36
No Index
/** * Copyright 2022 Charly Delay <[email protected]> (@0xcharly) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include QMK_KEYBOARD_H enum charybdis_keymap_layers { LAYER_BASE = 0, LAYER_LOWER, LAYER_RAISE, LAYER_POINTER, LAYER_MAJ, LAYER_GAME, }; static uint8_t current_layer = LAYER_BASE; enum custom_keycodes { PLACEHOLDER = SAFE_RANGE, // can always be here CK_STAB, CK_STABB }; /** \brief Automatically enable sniping-mode on the pointer layer. */ #define CHARYBDIS_AUTO_SNIPING_ON_LAYER LAYER_POINTER #ifdef CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE static uint16_t auto_pointer_layer_timer = 0; # ifndef CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS # define CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS 1000 # endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS # ifndef CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD # define CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD 8 # endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD #endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE #define LOWER MO(LAYER_LOWER) #define RAISE MO(LAYER_RAISE) #define PT_Z LT(LAYER_POINTER, KC_Z) #define PT_SLSH LT(LAYER_POINTER, KC_SLSH) #define HRM_A_ALTGR MT(MOD_LALT | MOD_RALT, KC_A) #define HRM_S_ALT MT(MOD_LALT, KC_S) #define HRM_D_SHIFT MT(MOD_LSFT, KC_D) #define HRM_F_CTRL MT(MOD_LCTL, KC_F) #define HRM_J_CTRL MT(MOD_LCTL, KC_J) #define HRM_K_SHIFT MT(MOD_LSFT, KC_K) #define HRM_L_ALT MT(MOD_LALT, KC_L) #define HRM_SCLN_ALT MT(MOD_LALT | MOD_RALT, KC_SCLN) // clang-format off const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LAYER_BASE] = LAYOUT( // ╭────────────────────────────────────────────────────────────────────────╮ ╭───────────────────────────────────────────────────────────────────────╮ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, //├───────────────────────────────────────────────────────────────────────┤ ├────────────────────────────────────────────────────────────────────────┤ KC_ESC, HRM_A_ALTGR, HRM_S_ALT, HRM_D_SHIFT, HRM_F_CTRL, KC_G, KC_H, HRM_J_CTRL, HRM_K_SHIFT, HRM_L_ALT, HRM_SCLN_ALT, KC_QUOT, //├───────────────────────────────────────────────────────────────────────┤ ├────────────────────────────────────────────────────────────────────────┤ KC_LSFT, KC_RBRC, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LGUI, //├───────────────────────────────────────────────────────────────────────┤ ├────────────────────────────────────────────────────────────────────────┤ KC_SPC, RAISE, MO(3), KC_ENT, LOWER // ╰──────────────────────────────────╯ ╰─────────────────────╯ // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮ // KC_LGUI, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RGUI, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ // KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_RCTL, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ // KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯ // KC_BSPC, KC_SPC, LOWER, RAISE, KC_ENT // ╰───────────────────────────╯ ╰──────────────────╯ ), [LAYER_LOWER] = LAYOUT( KC_NO, KC_MPLY, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_LBRC, RALT(KC_4), RALT(KC_5), KC_9, KC_RBRC, QK_BOOT, CK_STABB, CK_STAB, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_GRV, MT(MOD_LCTL,KC_4), MT(MOD_LSFT,KC_5), KC_BSPC, KC_PMNS, KC_NO, KC_NO, KC_TAB, KC_VOLD, C(KC_RBRC), KC_LGUI, KC_F13, KC_MINS, RALT(KC_X), RALT(KC_C), KC_DEL, KC_INS, KC_PSCR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮ // XXXXXXX, RGB_TOG, KC_MNXT, KC_MPLY, KC_MPRV, XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, XXXXXXX, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ // XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PPLS, KC_4, KC_5, KC_6, KC_PMNS, XXXXXXX, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ // XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EE_CLR, QK_BOOT, KC_PAST, KC_1, KC_2, KC_3, KC_PSLS, XXXXXXX, // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯ // XXXXXXX, XXXXXXX, _______, XXXXXXX, _______ // ╰───────────────────────────╯ ╰──────────────────╯ ), [LAYER_RAISE] = LAYOUT( QK_BOOT, KC_NO, DPI_RMOD, KC_NO, DPI_MOD, KC_NO, KC_NO, KC_P7, KC_P8, KC_P9, KC_NO, KC_COMM, KC_NO, SNIPING, DRGSCRL, KC_MS_BTN2, KC_MS_BTN1, KC_APP, KC_BSLS, KC_P4, KC_P5, KC_P6, RALT(KC_2), RALT(KC_3), KC_NO, SNP_TOG, DRG_TOG, KC_MS_BTN3, KC_WWW_BACK, KC_WWW_FORWARD, KC_P0, KC_P1, KC_P2, KC_P3, C(KC_B), KC_NO, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS // KC_NO, KC_MPLY, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_LBRC, RALT(KC_4), RALT(KC_5), KC_9, KC_RBRC, QK_BOOT, // KC_NO, KC_LGUI, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_GRV, MT(MOD_LCTL,KC_4), MT(MOD_LSFT,KC_5), KC_BSPC, KC_PMNS, KC_NO, // KC_NO, KC_TAB, KC_VOLD, C(KC_RBRC), KC_LGUI, KC_F13, KC_MINS, RALT(KC_X), RALT(KC_C), KC_DEL, KC_INS, KC_PSCR, // KC_SPC, KC_LALT, KC_RALT, KC_NO, LOWER // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮ // XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, KC_MUTE, KC_VOLD, XXXXXXX, XXXXXXX, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ // XXXXXXX, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_RGUI, XXXXXXX, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ // XXXXXXX, KC_HOME, KC_PGUP, KC_PGDN, KC_END, XXXXXXX, QK_BOOT, EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯ // _______, _______, XXXXXXX, _______, XXXXXXX // ╰───────────────────────────╯ ╰──────────────────╯ ), [LAYER_POINTER] = LAYOUT( QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_NO, KC_NO, KC_MS_BTN3, KC_MS_BTN2, KC_MS_BTN1, KC_Z, KC_NO, KC_NO, KC_NO, KC_NO, KC_EQL, KC_F12, KC_MS_BTN3, KC_MS_BTN2, KC_MS_BTN1, KC_MS_BTN2, KC_MS_BTN1 // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮ // XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DPI_MOD, S_D_MOD, S_D_MOD, DPI_MOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ // XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_RGUI, XXXXXXX, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ // XXXXXXX, _______, DRGSCRL, SNIPING, EE_CLR, QK_BOOT, QK_BOOT, EE_CLR, SNIPING, DRGSCRL, _______, XXXXXXX, // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯ // KC_BTN2, KC_BTN1, KC_BTN3, KC_BTN3, KC_BTN1 // ╰───────────────────────────╯ ╰──────────────────╯ ), [LAYER_MAJ] = LAYOUT( // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮ KC_LGUI, LSFT(KC_Q), LSFT(KC_W), LSFT(KC_E), LSFT(KC_R), LSFT(KC_T), LSFT(KC_Y), LSFT(KC_U), LSFT(KC_I), LSFT(KC_O), LSFT(KC_P), LSFT(KC_LBRC), // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ KC_LCTL, LSFT(KC_A), LSFT(KC_S), LSFT(KC_D), LSFT(KC_F), LSFT(KC_G), LSFT(KC_H), LSFT(KC_J), LSFT(KC_K), LSFT(KC_L), LSFT(KC_SCLN), LSFT(KC_QUOT), // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ KC_LSFT, LSFT(KC_RBRC), LSFT(KC_X), LSFT(KC_C), LSFT(KC_V), LSFT(KC_B), LSFT(KC_N), LSFT(KC_M), LSFT(KC_COMM), LSFT(KC_DOT), LSFT(KC_SLSH), KC_RSFT, // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯ KC_BSPC, KC_SPC, LOWER, RAISE, KC_ENT // ╰───────────────────────────╯ ╰──────────────────╯ ), [LAYER_GAME] = LAYOUT( // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮ KC_TAB, KC_T, KC_Q, KC_W, KC_E, KC_R, KC_Y, KC_U, EE_CLR, KC_O, KC_P, TO(0), // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ KC_ESC, KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_RCTL, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ KC_LSFT, KC_G, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, DRGSCRL, KC_RSFT, // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯ KC_SPC, KC_LCTL, KC_LALT, KC_MS_BTN2, KC_MS_BTN1 // ╰───────────────────────────╯ ╰──────────────────╯ ), }; static bool isAltSetBySpecialTab = false; void unregister_alt_after_special_tab_used(void) { uint8_t layer = biton32(layer_state); bool exited_layer = layer == LAYER_BASE || layer == LAYER_GAME; if (exited_layer && isAltSetBySpecialTab) { unregister_mods(MOD_LALT); isAltSetBySpecialTab = false; } }; static uint16_t lower_key_timer; static uint16_t raise_key_timer; static bool is_other_key_pressed = false; bool process_record_user(uint16_t keycode, keyrecord_t *record) { unregister_alt_after_special_tab_used(); bool lalt_on = get_mods() & MOD_BIT(KC_LALT); bool is_shift_on = get_mods() & MOD_BIT(KC_LSFT); if (record->event.pressed && keycode != LOWER ) { is_other_key_pressed = true; } switch (keycode) { case CK_STAB: if (record->event.pressed) { if (!lalt_on) { register_mods(MOD_LALT); isAltSetBySpecialTab = true; } register_code(KC_TAB); unregister_code(KC_TAB); } return false; break; case CK_STABB: if (record->event.pressed) { if (!lalt_on) { register_mods(MOD_LALT); isAltSetBySpecialTab = true; } if (!is_shift_on) { register_mods(MOD_LSFT); } register_code(KC_TAB); unregister_code(KC_TAB); if (!is_shift_on) { unregister_mods(MOD_LSFT); } } return false; break; case LOWER: if (record->event.pressed) { // Key pressed: start timer and reset other key flag lower_key_timer = timer_read(); is_other_key_pressed = false; layer_on(LAYER_LOWER); update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_MAJ); } else { if (!is_other_key_pressed && timer_elapsed(lower_key_timer) < 200) { // Send mouse click tap_code(KC_MS_BTN1); layer_off(LAYER_LOWER); } else { layer_off(LAYER_LOWER); update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_MAJ); } } return false; case RAISE: if (record->event.pressed) { raise_key_timer = timer_read(); is_other_key_pressed = false; layer_on(LAYER_RAISE); update_tri_layer(LAYER_RAISE, LAYER_LOWER, LAYER_MAJ); } else { if (!is_other_key_pressed && timer_elapsed(raise_key_timer) < 200) { tap_code(KC_MS_BTN1); layer_off(LAYER_RAISE); } else { layer_off(LAYER_RAISE); update_tri_layer(LAYER_RAISE, LAYER_LOWER, LAYER_MAJ); } } return false; } return true; } /*layer_state_t layer_state_set_user(layer_state_t state) { //static bool has_layer_changed = true; uint8_t layer = get_highest_layer(state); if ((layer == LAYER_BASE || layer == LAYER_GAME) && isAltSetBySpecialTab) { isAltSetBySpecialTab = false; unregister_mods(MOD_LALT); } if (layer != current_layer) { // has_layer_changed = true; current_layer = layer; } return state; }*/ // // clang-format on #ifdef POINTING_DEVICE_ENABLE # ifdef CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) { if (abs(mouse_report.x) > CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD || abs(mouse_report.y) > CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD) { if (auto_pointer_layer_timer == 0) { layer_on(LAYER_POINTER); # ifdef RGB_MATRIX_ENABLE rgb_matrix_mode_noeeprom(RGB_MATRIX_NONE); rgb_matrix_sethsv_noeeprom(HSV_GREEN); # endif // RGB_MATRIX_ENABLE } auto_pointer_layer_timer = timer_read(); } return mouse_report; } void matrix_scan_user(void) { if (auto_pointer_layer_timer != 0 && TIMER_DIFF_16(timer_read(), auto_pointer_layer_timer) >= CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS) { auto_pointer_layer_timer = 0; layer_off(LAYER_POINTER); # ifdef RGB_MATRIX_ENABLE rgb_matrix_mode_noeeprom(RGB_MATRIX_DEFAULT_MODE); # endif // RGB_MATRIX_ENABLE } } # endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE # ifdef CHARYBDIS_AUTO_SNIPING_ON_LAYER layer_state_t layer_state_set_user(layer_state_t state) { charybdis_set_pointer_sniping_enabled(layer_state_cmp(state, CHARYBDIS_AUTO_SNIPING_ON_LAYER)); uint8_t layer = get_highest_layer(state); if ((layer == LAYER_BASE || layer == LAYER_GAME) && isAltSetBySpecialTab) { isAltSetBySpecialTab = false; unregister_mods(MOD_LALT); } if (layer != current_layer) { // has_layer_changed = true; current_layer = layer; } return state; } # endif // CHARYBDIS_AUTO_SNIPING_ON_LAYER #endif // POINTING_DEVICE_ENABLE #ifdef RGB_MATRIX_ENABLE // Forward-declare this helper function since it is defined in rgb_matrix.c. void rgb_matrix_update_pwm_buffers(void); #endif
Editor is loading...
Leave a Comment