Add personal userspace, update keymaps (#4845)
* Add kbd6x:konstantin keymap * Prevent tap dance from sending LShift as a weak mod in KBD6X * Move config.h and rules.mk definitions into userspace * Add UC_WIN to UNICODE_SELECTED_MODES * Temporarily use Bootmagic until Command is fixed * Move common behavior from keyboards into userspace * Update kbd6x:konstantin keymap and userspace * Make a RCTRL layer in kbd6x:konstantin * Make KC_ESC turn off layers * KC_ESC turns L_FN off only if it was locked on * Add missing record->event.pressed checks * Move numpad toggling logic into function * Disable Bootmagic, enable KEYBOARD_SHARED_EP with Commandrgb7seg
parent
ee96b7a89d
commit
9105bf2434
@ -0,0 +1,3 @@ |
||||
#pragma once |
||||
|
||||
#define LAYER_FN |
@ -0,0 +1,92 @@ |
||||
#include QMK_KEYBOARD_H |
||||
#include "konstantin.h" |
||||
|
||||
enum keycodes_keymap { |
||||
RCTRL = RANGE_KEYMAP, |
||||
}; |
||||
|
||||
enum layers_keymap { |
||||
L_RCTRL = L_RANGE_KEYMAP, |
||||
}; |
||||
|
||||
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { |
||||
switch (keycode) { |
||||
case RCTRL: |
||||
if (record->event.pressed) { |
||||
layer_on(L_RCTRL); |
||||
register_code(KC_RCTRL); |
||||
} else { |
||||
layer_off(L_RCTRL); |
||||
unregister_code(KC_RCTRL); |
||||
} |
||||
return false; |
||||
|
||||
default: |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
/* Base layer
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ |
||||
* │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ \ │ ` │ |
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ |
||||
* │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │Bspc │ |
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ |
||||
* │LCtCps│ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ |
||||
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ |
||||
* │LShiftFn│ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │RShift│FnL│ |
||||
* └─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┘ |
||||
* │LGu│LAlt │ Space │RAlGu│RCt│ |
||||
* └───┴─────┴───────────────────────────┴─────┴───┘ |
||||
*/ |
||||
[L_BASE] = LAYOUT( |
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, |
||||
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_RBRC, KC_BSPC, |
||||
LCT_CPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, |
||||
LSFT_FN, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, FN_FNLK, |
||||
XXXXXXX, KC_LGUI, KC_LALT, KC_SPC, RAL_RGU, RCTRL, XXXXXXX |
||||
), |
||||
|
||||
/* Function layer
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ |
||||
* │ │F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11│F12│PSc│Ins│ |
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ |
||||
* │ │Hom│ ↑ │End│PgU│ │ │ │ │M1 │M↑ │M2 │M3 │ Del │ |
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ |
||||
* │ │ ← │ ↓ │ → │PgD│ │ │ │MW↑│M← │M↓ │M→ │ │ |
||||
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ |
||||
* │ │Mut│VoD│VoU│Ply│Prv│Nxt│MW←│MW→│M4 │M5 │ │ │ |
||||
* └─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┘ |
||||
* │ │ │ MW↓ │ │ │ |
||||
* └───┴─────┴───────────────────────────┴─────┴───┘ |
||||
*/ |
||||
[L_FN] = LAYOUT( |
||||
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_INS, |
||||
_______, KC_HOME, KC_UP, KC_END, KC_PGUP, _______, _______, _______, _______, KC_BTN1, KC_MS_U, KC_BTN2, KC_BTN3, KC_DEL, |
||||
_______, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, _______, _______, KC_WH_U, KC_MS_L, KC_MS_D, KC_MS_R, _______, |
||||
_______, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY, KC_MPRV, KC_MNXT, KC_WH_L, KC_WH_R, KC_BTN4, KC_BTN5, _______, _______, |
||||
XXXXXXX, _______, _______, KC_WH_D, _______, _______, XXXXXXX |
||||
), |
||||
|
||||
/* RCtrl layer
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ |
||||
* │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ |
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ |
||||
* │ │Top│Mv↑│Btm│PrT│ │ │ │ │ │ │ │ │Clear│ |
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ |
||||
* │ │Mv←│Mv↓│Mv→│NxT│ │ │ │ │ │ │ │ │ |
||||
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ |
||||
* │ │ │ │ │ │ │ │ │ │ │ │ │ │ |
||||
* └─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┘ |
||||
* │Dst│Dstp←│ │Dstp→│ │ |
||||
* └───┴─────┴───────────────────────────┴─────┴───┘ |
||||
*/ |
||||
[L_RCTRL] = LAYOUT( |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, |
||||
_______, TOP, MV_UP, BOTTOM, PRV_TAB, _______, _______, _______, _______, _______, _______, _______, _______, CLEAR, |
||||
_______, MV_LEFT, MV_DOWN, MV_RGHT, NXT_TAB, _______, _______, _______, _______, _______, _______, _______, _______, |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, |
||||
XXXXXXX, DESKTOP, DSKTP_L, _______, DSKTP_R, _______, XXXXXXX |
||||
), |
||||
}; |
@ -0,0 +1,2 @@ |
||||
BACKLIGHT_ENABLE = no
|
||||
RGBLIGHT_ENABLE = no
|
@ -0,0 +1,24 @@ |
||||
#pragma once |
||||
|
||||
#define FORCE_NKRO |
||||
|
||||
#define MAGIC_KEY_LAYER0_ALT1 BSLS |
||||
#define MAGIC_KEY_BOOTLOADER ESC |
||||
|
||||
#define MOUSEKEY_DELAY 50 |
||||
#define MOUSEKEY_INTERVAL 15 |
||||
#define MOUSEKEY_MAX_SPEED 4 |
||||
#define MOUSEKEY_TIME_TO_MAX 50 |
||||
#define MOUSEKEY_WHEEL_MAX_SPEED 1 |
||||
#define MOUSEKEY_WHEEL_TIME_TO_MAX 50 |
||||
|
||||
#define NO_ACTION_FUNCTION |
||||
#define NO_ACTION_MACRO |
||||
|
||||
#define PERMISSIVE_HOLD |
||||
#define TAPPING_TERM 200 |
||||
#define TAPPING_TOGGLE 2 |
||||
|
||||
#define UNICODE_CYCLE_PERSIST false |
||||
#define UNICODE_SELECTED_MODES UC_WINC, UC_WIN, UC_LNX |
||||
#define UNICODE_WINC_KEY KC_RGUI |
@ -0,0 +1,77 @@ |
||||
#include "konstantin.h" |
||||
|
||||
#ifdef LAYER_NUMPAD |
||||
static void toggle_numpad(void) { |
||||
layer_invert(L_NUMPAD); |
||||
bool num_lock = host_keyboard_leds() & 1<<USB_LED_NUM_LOCK; |
||||
if (num_lock != (bool)IS_LAYER_ON(L_NUMPAD)) { |
||||
tap_code(KC_NLCK); // Toggle Num Lock to match layer state
|
||||
} |
||||
} |
||||
#endif |
||||
|
||||
__attribute__((weak)) |
||||
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { |
||||
return true; |
||||
} |
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { |
||||
if (!process_record_keymap(keycode, record)) { |
||||
return false; |
||||
} |
||||
|
||||
switch (keycode) { |
||||
case CLEAR: |
||||
if (record->event.pressed) { |
||||
SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); |
||||
} |
||||
return false; |
||||
|
||||
#ifdef LAYER_FN |
||||
static bool fn_lock; |
||||
|
||||
case FN_FNLK: |
||||
if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) { |
||||
fn_lock = !IS_LAYER_ON(L_FN); // Fn layer will be toggled after this
|
||||
} |
||||
return true; |
||||
#endif |
||||
|
||||
#ifdef LAYER_NUMPAD |
||||
case NUMPAD: |
||||
if (record->event.pressed) { |
||||
toggle_numpad(); |
||||
} |
||||
return false; |
||||
#endif |
||||
|
||||
case KC_ESC: |
||||
if (record->event.pressed) { |
||||
#ifdef LAYER_NUMPAD |
||||
if (IS_LAYER_ON(L_NUMPAD)) { |
||||
toggle_numpad(); |
||||
return false; |
||||
} |
||||
#endif |
||||
#ifdef LAYER_FN |
||||
if (IS_LAYER_ON(L_FN) && fn_lock) { |
||||
layer_off(L_FN); |
||||
return fn_lock = false; |
||||
} |
||||
#endif |
||||
} |
||||
return true; |
||||
|
||||
default: |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
__attribute__((weak)) |
||||
uint32_t layer_state_set_keymap(uint32_t state) { |
||||
return state; |
||||
} |
||||
|
||||
uint32_t layer_state_set_user(uint32_t state) { |
||||
return layer_state_set_keymap(state); |
||||
} |
@ -0,0 +1,50 @@ |
||||
#pragma once |
||||
|
||||
#include "quantum.h" |
||||
#ifdef TAP_DANCE_ENABLE |
||||
#include "tap_dance.h" |
||||
#endif |
||||
#ifdef UNICODE_ENABLE |
||||
#include "unicode.h" |
||||
#endif |
||||
|
||||
#ifdef LAYER_FN |
||||
#define FN MO(L_FN) |
||||
#define FN_CAPS LT(L_FN, KC_CAPS) |
||||
#define FN_FNLK TT(L_FN) |
||||
#endif |
||||
|
||||
#define MV_UP LCTL(KC_UP) |
||||
#define MV_DOWN LCTL(KC_DOWN) |
||||
#define MV_LEFT LCTL(KC_LEFT) |
||||
#define MV_RGHT LCTL(KC_RGHT) |
||||
#define TOP LCTL(KC_HOME) |
||||
#define BOTTOM LCTL(KC_END) |
||||
#define PRV_TAB LCTL(KC_PGUP) |
||||
#define NXT_TAB LCTL(KC_PGDN) |
||||
|
||||
#define LCT_CPS LCTL_T(KC_CAPS) |
||||
|
||||
enum keycodes_user { |
||||
CLEAR = SAFE_RANGE, |
||||
#ifdef LAYER_NUMPAD |
||||
NUMPAD, |
||||
#endif |
||||
|
||||
RANGE_KEYMAP, |
||||
}; |
||||
|
||||
enum layers_user { |
||||
L_BASE, |
||||
#ifdef LAYER_FN |
||||
L_FN, |
||||
#endif |
||||
#ifdef LAYER_NUMPAD |
||||
L_NUMPAD, |
||||
#endif |
||||
|
||||
L_RANGE_KEYMAP, |
||||
}; |
||||
|
||||
bool process_record_keymap(uint16_t keycode, keyrecord_t *record); |
||||
uint32_t layer_state_set_keymap(uint32_t state); |
@ -0,0 +1,16 @@ |
||||
BOOTMAGIC_ENABLE = no
|
||||
COMMAND_ENABLE = yes
|
||||
CONSOLE_ENABLE = yes
|
||||
EXTRAKEY_ENABLE = yes
|
||||
KEYBOARD_SHARED_EP = yes # TODO: Disable once Command is fixed
|
||||
MOUSEKEY_ENABLE = yes
|
||||
NKRO_ENABLE = yes
|
||||
TAP_DANCE_ENABLE = yes
|
||||
UNICODE_ENABLE = yes
|
||||
|
||||
SRC += konstantin.c
|
||||
ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) |
||||
SRC += tap_dance.c
|
||||
endif |
||||
|
||||
EXTRAFLAGS += -flto
|
@ -0,0 +1,93 @@ |
||||
#include "tap_dance.h" |
||||
#include "konstantin.h" |
||||
|
||||
#define ACTION_TAP_DANCE_DOUBLE_MODS(mod1, mod2) { \ |
||||
.fn = { td_double_mods_each, NULL, td_double_mods_reset }, \
|
||||
.user_data = &(qk_tap_dance_pair_t){ mod1, mod2 }, \
|
||||
} |
||||
|
||||
void td_double_mods_each(qk_tap_dance_state_t *state, void *user_data) { |
||||
qk_tap_dance_pair_t *mods = (qk_tap_dance_pair_t *)user_data; |
||||
// Single tap → mod1, double tap → mod2, triple tap etc. → mod1+mod2
|
||||
if (state->count == 1 || state->count == 3) { |
||||
register_code(mods->kc1); |
||||
} else if (state->count == 2) { |
||||
unregister_code(mods->kc1); |
||||
register_code(mods->kc2); |
||||
} |
||||
// Prevent tap dance from sending kc1 and kc2 as weak mods
|
||||
state->weak_mods &= ~(MOD_BIT(mods->kc1) | MOD_BIT(mods->kc2)); |
||||
} |
||||
|
||||
void td_double_mods_reset(qk_tap_dance_state_t *state, void *user_data) { |
||||
qk_tap_dance_pair_t *mods = (qk_tap_dance_pair_t *)user_data; |
||||
if (state->count == 1 || state->count >= 3) { |
||||
unregister_code(mods->kc1); |
||||
} |
||||
if (state->count >= 2) { |
||||
unregister_code(mods->kc2); |
||||
} |
||||
} |
||||
|
||||
struct { |
||||
bool fn_on; // Layer state when tap dance started
|
||||
bool started; |
||||
} td_fn_rctrl_data; |
||||
|
||||
void td_fn_rctrl_each(qk_tap_dance_state_t *state, void *user_data) { |
||||
if (!td_fn_rctrl_data.started) { |
||||
td_fn_rctrl_data.fn_on = IS_LAYER_ON(L_FN); |
||||
td_fn_rctrl_data.started = true; |
||||
} |
||||
// Single tap → Fn, double tap → RCtrl, triple tap etc. → Fn+RCtrl
|
||||
if (state->count == 1 || state->count == 3) { |
||||
layer_on(L_FN); |
||||
} else if (state->count == 2) { |
||||
if (!td_fn_rctrl_data.fn_on) { |
||||
layer_off(L_FN); |
||||
} |
||||
register_code(KC_RCTL); |
||||
} |
||||
} |
||||
|
||||
void td_fn_rctrl_reset(qk_tap_dance_state_t *state, void *user_data) { |
||||
if ((state->count == 1 || state->count >= 3) && !td_fn_rctrl_data.fn_on) { |
||||
layer_off(L_FN); |
||||
} |
||||
if (state->count >= 2) { |
||||
unregister_code(KC_RCTL); |
||||
} |
||||
td_fn_rctrl_data.started = false; |
||||
} |
||||
|
||||
void td_lsft_fn_each(qk_tap_dance_state_t *state, void *user_data) { |
||||
// Single tap → LShift, double tap → Fn, triple tap etc. → Fn+LShift
|
||||
if (state->count == 1 || state->count == 3) { |
||||
register_code(KC_LSFT); |
||||
} else if (state->count == 2) { |
||||
unregister_code(KC_LSFT); |
||||
// Prevent tap dance from sending LShift as a weak mod
|
||||
state->weak_mods &= ~MOD_BIT(KC_LSFT); |
||||
layer_on(L_FN); |
||||
} |
||||
} |
||||
|
||||
void td_lsft_fn_reset(qk_tap_dance_state_t *state, void *user_data) { |
||||
if (state->count == 1 || state->count >= 3) { |
||||
unregister_code(KC_LSFT); |
||||
} |
||||
if (state->count >= 2) { |
||||
layer_off(L_FN); |
||||
} |
||||
} |
||||
|
||||
qk_tap_dance_action_t tap_dance_actions[] = { |
||||
[TD_DESKTOP] = ACTION_TAP_DANCE_DOUBLE(LCTL(LGUI(KC_D)), LCTL(LGUI(KC_F4))), // Add/close virtual desktop
|
||||
|
||||
[TD_RAL_LAL] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RALT, KC_LALT), |
||||
[TD_RAL_RGU] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RALT, KC_RGUI), |
||||
[TD_RCT_RSF] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RCTL, KC_RSFT), |
||||
|
||||
[TD_FN_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(td_fn_rctrl_each, NULL, td_fn_rctrl_reset), |
||||
[TD_LSFT_FN] = ACTION_TAP_DANCE_FN_ADVANCED(td_lsft_fn_each, NULL, td_lsft_fn_reset), |
||||
}; |
@ -0,0 +1,25 @@ |
||||
#pragma once |
||||
|
||||
#include "quantum.h" |
||||
|
||||
#define DESKTOP TD(TD_DESKTOP) |
||||
#define DSKTP_L LCTL(LGUI(KC_LEFT)) |
||||
#define DSKTP_R LCTL(LGUI(KC_RGHT)) |
||||
|
||||
#define RAL_LAL TD(TD_RAL_LAL) |
||||
#define RAL_RGU TD(TD_RAL_RGU) |
||||
#define RCT_RSF TD(TD_RCT_RSF) |
||||
|
||||
#define FN_RCTL TD(TD_FN_RCTL) |
||||
#define LSFT_FN TD(TD_LSFT_FN) |
||||
|
||||
enum tap_dance { |
||||
TD_DESKTOP, |
||||
|
||||
TD_RAL_LAL, |
||||
TD_RAL_RGU, |
||||
TD_RCT_RSF, |
||||
|
||||
TD_FN_RCTL, |
||||
TD_LSFT_FN, |
||||
}; |
@ -0,0 +1,11 @@ |
||||
#pragma once |
||||
|
||||
#include "quantum.h" |
||||
|
||||
#define COMMA UC(0x002C) |
||||
#define L_PAREN UC(0x0028) |
||||
#define R_PAREN UC(0x0029) |
||||
#define EQUALS UC(0x003D) |
||||
#define TIMES UC(0x00D7) |
||||
#define DIVIDE UC(0x00F7) |
||||
#define MINUS UC(0x2212) |
Loading…
Reference in new issue