From ae4593e2defa5242159c6559380cff04d566b03d Mon Sep 17 00:00:00 2001 From: Rutherther Date: Mon, 8 Jul 2024 14:30:19 +0200 Subject: [PATCH] Init tracking rutherther keymap --- .../moonlander/keymaps/rutherther/config.h | 69 +++++ .../keymaps/rutherther/features/layer_lock.c | 146 ++++++++++ .../keymaps/rutherther/features/layer_lock.h | 136 +++++++++ .../moonlander/keymaps/rutherther/keymap.c | 269 ++++++++++++++++++ .../moonlander/keymaps/rutherther/rules.mk | 14 + 5 files changed, 634 insertions(+) create mode 100644 keyboards/zsa/moonlander/keymaps/rutherther/config.h create mode 100644 keyboards/zsa/moonlander/keymaps/rutherther/features/layer_lock.c create mode 100644 keyboards/zsa/moonlander/keymaps/rutherther/features/layer_lock.h create mode 100644 keyboards/zsa/moonlander/keymaps/rutherther/keymap.c create mode 100644 keyboards/zsa/moonlander/keymaps/rutherther/rules.mk diff --git a/keyboards/zsa/moonlander/keymaps/rutherther/config.h b/keyboards/zsa/moonlander/keymaps/rutherther/config.h new file mode 100644 index 0000000000..a713e01d00 --- /dev/null +++ b/keyboards/zsa/moonlander/keymaps/rutherther/config.h @@ -0,0 +1,69 @@ +/* + Set any config.h overrides for your specific keymap here. + See config.h options at https://docs.qmk.fm/#/config_options?id=the-configh-file +*/ +#pragma once + +#undef IGNORE_MOD_TAP_INTERRUPT +#undef TAPPING_TERM +#define TAPPING_TERM 180 +#define PERMISSIVE_HOLD +#define QUICK_TAP_TERM 0 + +#undef RGB_MATRIX_TIMEOUT +#define RGB_MATRIX_TIMEOUT 60000 + +#define USB_SUSPEND_WAKEUP_DELAY 0 +#define FIRMWARE_VERSION u8"dYmjX/qo4Nz" +#define RAW_USAGE_PAGE 0xFF60 +#define RAW_USAGE_ID 0x61 +#define LAYER_STATE_16BIT + +#define TAPPING_TERM_PER_KEY +#define RGB_MATRIX_STARTUP_SPD 60 + +#define BOTH_SHIFTS_TURNS_ON_CAPS_WORD + +#undef ENABLE_RGB_MATRIX_ALPHAS_MODS +#undef ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN +#undef ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT +#undef ENABLE_RGB_MATRIX_BREATHING +#undef ENABLE_RGB_MATRIX_BAND_SAT +#undef ENABLE_RGB_MATRIX_BAND_VAL +#undef ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT +#undef ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL +#undef ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT +#undef ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL +#undef ENABLE_RGB_MATRIX_CYCLE_ALL +#undef ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT +#undef ENABLE_RGB_MATRIX_CYCLE_UP_DOWN +#undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN +#undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL +#undef ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON +#undef ENABLE_RGB_MATRIX_CYCLE_PINWHEEL +#undef ENABLE_RGB_MATRIX_CYCLE_SPIRAL +#undef ENABLE_RGB_MATRIX_DUAL_BEACON +#undef ENABLE_RGB_MATRIX_RAINBOW_BEACON +#undef ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS +#undef ENABLE_RGB_MATRIX_RAINDROPS +#undef ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS +#undef ENABLE_RGB_MATRIX_HUE_BREATHING +#undef ENABLE_RGB_MATRIX_HUE_PENDULUM +#undef ENABLE_RGB_MATRIX_HUE_WAVE +#undef ENABLE_RGB_MATRIX_PIXEL_FRACTAL +#undef ENABLE_RGB_MATRIX_PIXEL_FLOW +#undef ENABLE_RGB_MATRIX_PIXEL_RAIN +#undef ENABLE_RGB_MATRIX_TYPING_HEATMAP +#undef ENABLE_RGB_MATRIX_DIGITAL_RAIN +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS +#undef ENABLE_RGB_MATRIX_SPLASH +#undef ENABLE_RGB_MATRIX_MULTISPLASH +#undef ENABLE_RGB_MATRIX_SOLID_SPLASH +#undef ENABLE_RGB_MATRIX_SOLID_MULTISPLASH diff --git a/keyboards/zsa/moonlander/keymaps/rutherther/features/layer_lock.c b/keyboards/zsa/moonlander/keymaps/rutherther/features/layer_lock.c new file mode 100644 index 0000000000..1a58378e75 --- /dev/null +++ b/keyboards/zsa/moonlander/keymaps/rutherther/features/layer_lock.c @@ -0,0 +1,146 @@ +// Copyright 2022-2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file layer_lock.c + * @brief Layer Lock implementation + * + * For full documentation, see + * + */ + +#include "layer_lock.h" + +// The current lock state. The kth bit is on if layer k is locked. +static layer_state_t locked_layers = 0; + +// Layer Lock timer to disable layer lock after X seconds inactivity +#if LAYER_LOCK_IDLE_TIMEOUT > 0 +static uint32_t layer_lock_timer = 0; + +void layer_lock_task(void) { + if (locked_layers && + timer_elapsed32(layer_lock_timer) > LAYER_LOCK_IDLE_TIMEOUT) { + layer_lock_all_off(); + layer_lock_timer = timer_read32(); + } +} +#endif // LAYER_LOCK_IDLE_TIMEOUT > 0 + +// Handles an event on an `MO` or `TT` layer switch key. +static bool handle_mo_or_tt(uint8_t layer, keyrecord_t* record) { + if (is_layer_locked(layer)) { + if (record->event.pressed) { // On press, unlock the layer. + layer_lock_invert(layer); + } + return false; // Skip default handling. + } + return true; +} + +bool process_layer_lock(uint16_t keycode, keyrecord_t* record, + uint16_t lock_keycode) { +#if LAYER_LOCK_IDLE_TIMEOUT > 0 + layer_lock_timer = timer_read32(); +#endif // LAYER_LOCK_IDLE_TIMEOUT > 0 + + // The intention is that locked layers remain on. If something outside of + // this feature turned any locked layers off, unlock them. + if ((locked_layers & ~layer_state) != 0) { + layer_lock_set_user(locked_layers &= layer_state); + } + + if (keycode == lock_keycode) { + if (record->event.pressed) { // The layer lock key was pressed. + layer_lock_invert(get_highest_layer(layer_state)); + } + return false; + } + + switch (keycode) { + case QK_MOMENTARY ... QK_MOMENTARY_MAX: // `MO(layer)` keys. + return handle_mo_or_tt(QK_MOMENTARY_GET_LAYER(keycode), record); + + case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX: // `TT(layer)`. + return handle_mo_or_tt(QK_LAYER_TAP_TOGGLE_GET_LAYER(keycode), record); + + case QK_LAYER_MOD ... QK_LAYER_MOD_MAX: { // `LM(layer, mod)`. + uint8_t layer = QK_LAYER_MOD_GET_LAYER(keycode); + if (is_layer_locked(layer)) { + if (record->event.pressed) { // On press, unlock the layer. + layer_lock_invert(layer); + } else { // On release, clear the mods. + clear_mods(); + send_keyboard_report(); + } + return false; // Skip default handling. + } + } break; + +#ifndef NO_ACTION_TAPPING + case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: // `LT(layer, key)` keys. + if (record->tap.count == 0 && !record->event.pressed && + is_layer_locked(QK_LAYER_TAP_GET_LAYER(keycode))) { + // Release event on a held layer-tap key where the layer is locked. + return false; // Skip default handling so that layer stays on. + } + break; +#endif // NO_ACTION_TAPPING + } + + return true; +} + +bool is_layer_locked(uint8_t layer) { + return locked_layers & ((layer_state_t)1 << layer); +} + +void layer_lock_invert(uint8_t layer) { + const layer_state_t mask = (layer_state_t)1 << layer; + if ((locked_layers & mask) == 0) { // Layer is being locked. +#ifndef NO_ACTION_ONESHOT + if (layer == get_oneshot_layer()) { + reset_oneshot_layer(); // Reset so that OSL doesn't turn layer off. + } +#endif // NO_ACTION_ONESHOT + layer_on(layer); +#if LAYER_LOCK_IDLE_TIMEOUT > 0 + layer_lock_timer = timer_read32(); +#endif // LAYER_LOCK_IDLE_TIMEOUT > 0 + } else { // Layer is being unlocked. + layer_off(layer); + } + layer_lock_set_user(locked_layers ^= mask); +} + +// Implement layer_lock_on/off by deferring to layer_lock_invert. +void layer_lock_on(uint8_t layer) { + if (!is_layer_locked(layer)) { + layer_lock_invert(layer); + } +} + +void layer_lock_off(uint8_t layer) { + if (is_layer_locked(layer)) { + layer_lock_invert(layer); + } +} + +void layer_lock_all_off(void) { + layer_and(~locked_layers); + locked_layers = 0; + layer_lock_set_user(locked_layers); +} + +__attribute__((weak)) void layer_lock_set_user(layer_state_t locked_layers) {} diff --git a/keyboards/zsa/moonlander/keymaps/rutherther/features/layer_lock.h b/keyboards/zsa/moonlander/keymaps/rutherther/features/layer_lock.h new file mode 100644 index 0000000000..a0f1455ac8 --- /dev/null +++ b/keyboards/zsa/moonlander/keymaps/rutherther/features/layer_lock.h @@ -0,0 +1,136 @@ +// Copyright 2022-2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file layer_lock.h + * @brief Layer Lock, a key to stay in the current layer. + * + * Overview + * -------- + * + * Layers are often accessed by holding a button, e.g. with a momentary layer + * switch `MO(layer)` or layer tap `LT(layer, key)` key. But you may sometimes + * want to "lock" or "toggle" the layer so that it stays on without having to + * hold down a button. One way to do that is with a tap-toggle `TT` layer key, + * but here is an alternative. + * + * This library implements a "Layer Lock key". When tapped, it "locks" the + * highest layer to stay active, assuming the layer was activated by one of the + * following keys: + * + * * `MO(layer)` momentary layer switch + * * `LT(layer, key)` layer tap + * * `OSL(layer)` one-shot layer + * * `TT(layer)` layer tap toggle + * * `LM(layer, mod)` layer-mod key (the layer is locked, but not the mods) + * + * Tapping the Layer Lock key again unlocks and turns off the layer. + * + * @note When a layer is "locked", other layer keys such as `TO(layer)` or + * manually calling `layer_off(layer)` will override and unlock the layer. + * + * Configuration + * ------------- + * + * Optionally, a timeout may be defined so that Layer Lock disables + * automatically if not keys are pressed for `LAYER_LOCK_IDLE_TIMEOUT` + * milliseconds. Define `LAYER_LOCK_IDLE_TIMEOUT` in your config.h, for instance + * + * #define LAYER_LOCK_IDLE_TIMEOUT 60000 // Turn off after 60 seconds. + * + * and call `layer_lock_task()` from your `matrix_scan_user()` in keymap.c: + * + * void matrix_scan_user(void) { + * layer_lock_task(); + * // Other tasks... + * } + * + * For full documentation, see + * + */ + +#pragma once + +#include "quantum.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Handler function for Layer Lock. + * + * In your keymap, define a custom keycode to use for Layer Lock. Then handle + * Layer Lock from your `process_record_user` function by calling + * `process_layer_lock`, passing your custom keycode for the `lock_keycode` arg: + * + * #include "features/layer_lock.h" + * + * bool process_record_user(uint16_t keycode, keyrecord_t* record) { + * if (!process_layer_lock(keycode, record, LLOCK)) { return false; } + * // Your macros ... + * + * return true; + * } + */ +bool process_layer_lock(uint16_t keycode, keyrecord_t* record, + uint16_t lock_keycode); + +/** Returns true if `layer` is currently locked. */ +bool is_layer_locked(uint8_t layer); + +/** Locks and turns on `layer`. */ +void layer_lock_on(uint8_t layer); + +/** Unlocks and turns off `layer`. */ +void layer_lock_off(uint8_t layer); + +/** Unlocks and turns off all locked layers. */ +void layer_lock_all_off(void); + +/** Toggles whether `layer` is locked. */ +void layer_lock_invert(uint8_t layer); + +/** + * Optional callback that gets called when a layer is locked or unlocked. + * + * This is useful to represent the current lock state, e.g. by setting an LED or + * playing a sound. In your keymap, define + * + * void layer_lock_set_user(layer_state_t locked_layers) { + * // Do something like `set_led(is_layer_locked(NAV));` + * } + * + * @param locked_layers Bitfield in which the kth bit represents whether the + * kth layer is on. + */ +void layer_lock_set_user(layer_state_t locked_layers); + +/** + * @fn layer_lock_task(void) + * Matrix task function for Layer Lock. + * + * If using `LAYER_LOCK_IDLE_TIMEOUT`, call this function from your + * `matrix_scan_user()` function in keymap.c. (If no timeout is set, calling + * `layer_lock_task()` has no effect.) + */ +#if LAYER_LOCK_IDLE_TIMEOUT > 0 +void layer_lock_task(void); +#else +static inline void layer_lock_task(void) {} +#endif // LAYER_LOCK_IDLE_TIMEOUT > 0 + +#ifdef __cplusplus +} +#endif diff --git a/keyboards/zsa/moonlander/keymaps/rutherther/keymap.c b/keyboards/zsa/moonlander/keymaps/rutherther/keymap.c new file mode 100644 index 0000000000..5a2e27d689 --- /dev/null +++ b/keyboards/zsa/moonlander/keymaps/rutherther/keymap.c @@ -0,0 +1,269 @@ +#include QMK_KEYBOARD_H +#include "version.h" +#include "keymap_czech.h" +#include "features/layer_lock.h" + +#define MOON_LED_LEVEL LED_LEVEL + +enum custom_keycodes { + RGB_SLD = SAFE_RANGE, + QK_LLCK, + CZ_CARETED, // on hold send cz caret prepended to each symbol + CZ_ACUTED, // on hold send cz acute prepended to each symbol +}; + +#define PLAIN_LAYER 7 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ESCAPE, KC_1, KC_2, KC_3, KC_4, KC_5, TO(6), KC_TRANSPARENT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_ESCAPE, + MT(MOD_LGUI, KC_TAB),KC_Q, KC_W, KC_E, KC_R, KC_T, KC_PAGE_UP, KC_HOME, KC_Y, KC_U, KC_I, KC_O, LT(4,KC_P), MT(MOD_LGUI, KC_BSLS), + MT(MOD_LCTL, KC_BSPC),LT(1,KC_A), KC_S, KC_D, KC_F, LT(2,KC_G), KC_PGDN, KC_END, KC_H, KC_J, KC_K, KC_L, LT(1,KC_SCLN), MT(MOD_LCTL, KC_QUOTE), + KC_LEFT_SHIFT, KC_Z, KC_X, KC_C, LT(5,KC_V), KC_B, KC_N, LT(5,KC_M), KC_COMMA, KC_DOT, KC_SLASH, KC_RIGHT_SHIFT, + CZ_ACUTED, QK_CAPS_WORD_TOGGLE, KC_LEFT_GUI, QK_LOCK, LT(1,KC_ESCAPE),LCTL(KC_X), LCTL(KC_C), LT(1,KC_ESCAPE), KC_RIGHT_ALT, KC_TRANSPARENT, KC_TRANSPARENT, CZ_CARETED, + MT(MOD_LALT, KC_SPACE),MO(2), MO(3), KC_DELETE, QK_REP, MT(MOD_LALT, KC_ENTER) + ), + [1] = LAYOUT( + KC_ESCAPE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRANSPARENT, KC_PSCR, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRANSPARENT, OSL(3), KC_LABK, KC_RABK, KC_BSLS, KC_GRAVE, KC_TRANSPARENT, KC_INSERT, KC_AMPR, KC_UNDS, KC_LBRC, KC_RBRC, KC_TRANSPARENT, KC_F12, + KC_TRANSPARENT, KC_EXLM, KC_MINUS, KC_PLUS, KC_EQUAL, KC_HASH, KC_TRANSPARENT, KC_TRANSPARENT, KC_PIPE, KC_TILD, KC_LPRN, KC_RPRN, KC_PERC, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_SLASH, KC_ASTR, KC_CIRC, KC_TRANSPARENT, KC_TRANSPARENT, KC_DLR, KC_LCBR, KC_RCBR, KC_TRANSPARENT, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, RGB_MODE_FORWARD, RGB_TOG, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, + RGB_VAD, RGB_VAI, TOGGLE_LAYER_COLOR, RGB_SLD, RGB_HUD, RGB_HUI + ), + [2] = LAYOUT( + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TAB, KC_8, KC_9, KC_4, KC_PLUS, KC_SLASH, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_COLN, KC_1, KC_2, KC_3, KC_MINUS, KC_ASTR, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_COMMA, KC_7, KC_6, KC_5, KC_DOT, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, TO(0), KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, QK_LLCK, KC_0 + ), + [3] = LAYOUT( + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, QK_BOOT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_F8, KC_F9, KC_F4, KC_F10, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_F1, KC_F2, KC_F3, KC_F11, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_F7, KC_F6, KC_F5, KC_F12, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, TO(0), KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, QK_LLCK, KC_TRANSPARENT + ), + [4] = LAYOUT( + AU_TOGG, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, QK_DYNAMIC_TAPPING_TERM_UP,KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, QK_BOOT, + MU_TOGG, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_UP, KC_TRANSPARENT, KC_MS_WH_UP, KC_TRANSPARENT, QK_DYNAMIC_TAPPING_TERM_DOWN,MOON_LED_LEVEL, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, + MU_NEXT, KC_TRANSPARENT, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_DOWN, KC_TRANSPARENT, QK_DYNAMIC_TAPPING_TERM_PRINT,KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MEDIA_PLAY_PAUSE, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_BTN1, KC_MS_BTN2, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MEDIA_PREV_TRACK,KC_MEDIA_NEXT_TRACK,KC_TRANSPARENT, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_AUDIO_VOL_UP,KC_AUDIO_VOL_DOWN,KC_AUDIO_MUTE, KC_TRANSPARENT, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_WWW_BACK + ), + [5] = LAYOUT( + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_HOME, KC_PGDN, KC_PAGE_UP, KC_END, KC_TRANSPARENT, KC_TRANSPARENT, KC_HOME, KC_PGDN, KC_PAGE_UP, KC_END, KC_TRANSPARENT, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRANSPARENT, KC_TRANSPARENT, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRANSPARENT, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT + ), + [6] = LAYOUT( + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_F3, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, + KC_TAB, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_F4, KC_TRANSPARENT, KC_TRANSPARENT, KC_U, KC_TRANSPARENT, KC_TRANSPARENT, KC_P, KC_TRANSPARENT, + KC_LEFT_CTRL, KC_A, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_G, TO(0), KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_SCLN, KC_TRANSPARENT, + KC_LEFT_SHIFT, KC_Z, KC_TRANSPARENT, KC_TRANSPARENT, KC_V, KC_TRANSPARENT, KC_TRANSPARENT, KC_M, KC_TRANSPARENT, KC_TRANSPARENT, KC_SLASH, KC_RIGHT_SHIFT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, + KC_SPACE, KC_F5, KC_F2, KC_TRANSPARENT, KC_TRANSPARENT, KC_ENTER + ), + // Plain + [7] = LAYOUT( + KC_ESCAPE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRANSPARENT, KC_TRANSPARENT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_ESCAPE, + MOD_LGUI, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_PAGE_UP, KC_HOME, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + MOD_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_PGDN, KC_END, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOTE, + KC_LEFT_SHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RIGHT_SHIFT, + KC_TRANSPARENT, KC_LEFT_GUI, KC_TRANSPARENT, KC_TRANSPARENT, KC_ESCAPE, LCTL(KC_X), LCTL(KC_C), KC_ESCAPE, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, + // Thumb cluster left 3, right 3 + KC_SPACE, KC_TRANSPARENT, KC_TRANSPARENT, KC_DELETE, QK_REP, KC_ENTER + ), +}; +uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case MT(MOD_LALT, KC_SPACE): + return g_tapping_term + 120; + case MT(MOD_LALT, KC_ENTER): + return g_tapping_term + 120; + default: + return g_tapping_term; + } +} + +extern rgb_config_t rgb_matrix_config; + +void keyboard_post_init_user(void) { + rgb_matrix_enable(); +} + +const uint8_t PROGMEM ledmap[][RGB_MATRIX_LED_COUNT][3] = { + [0] = { {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {74,255,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {74,255,255}, {31,255,255}, {0,0,255}, {0,0,255}, {74,255,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {74,255,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {74,255,255}, {31,255,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255} }, + + [1] = { {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255}, {113,255,255} }, + + [2] = { {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {131,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {131,255,255}, {131,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {131,255,255}, {131,255,255}, {131,255,255}, {0,0,0}, {0,0,0}, {131,255,255}, {131,255,255}, {131,255,255}, {0,0,0}, {0,0,0}, {131,255,255}, {131,255,255}, {131,255,255}, {0,0,0}, {0,0,0}, {131,255,255}, {131,255,255}, {131,255,255}, {0,0,0}, {0,0,0}, {131,255,255}, {131,255,255}, {131,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {131,255,255}, {131,255,255}, {0,0,0}, {0,0,0} }, + + [3] = { {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {188,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {188,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {188,255,255}, {188,255,255}, {188,255,255}, {0,0,0}, {0,0,0}, {188,255,255}, {188,255,255}, {188,255,255}, {0,0,0}, {0,0,0}, {188,255,255}, {188,255,255}, {188,255,255}, {0,0,0}, {0,0,0}, {188,255,255}, {188,255,255}, {188,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {188,255,255}, {0,0,0}, {0,0,0} }, + + [4] = { {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255}, {202,255,255} }, + + [5] = { {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0} }, + + [6] = { {0,0,0}, {0,0,0}, {0,245,245}, {0,245,245}, {0,0,0}, {0,0,0}, {0,0,0}, {0,245,245}, {0,0,0}, {0,0,0}, {0,0,0}, {0,245,245}, {0,245,245}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,245,245}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,255}, {0,245,245}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0} }, + + [7] = { {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0} }, + + [8] = { {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {85,203,158}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0} }, + +}; + +void set_layer_color(int layer) { + for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) { + HSV hsv = { + .h = pgm_read_byte(&ledmap[layer][i][0]), + .s = pgm_read_byte(&ledmap[layer][i][1]), + .v = pgm_read_byte(&ledmap[layer][i][2]), + }; + if (!hsv.h && !hsv.s && !hsv.v) { + rgb_matrix_set_color( i, 0, 0, 0 ); + } else { + RGB rgb = hsv_to_rgb( hsv ); + float f = (float)rgb_matrix_config.hsv.v / UINT8_MAX; + rgb_matrix_set_color( i, f * rgb.r, f * rgb.g, f * rgb.b ); + } + } +} + +bool rgb_matrix_indicators_user(void) { + if (keyboard_config.disable_layer_led) { return false; } + switch (biton32(layer_state)) { + case 0: + set_layer_color(0); + break; + case 1: + set_layer_color(1); + break; + case 2: + set_layer_color(2); + break; + case 3: + set_layer_color(3); + break; + case 4: + set_layer_color(4); + break; + case 5: + set_layer_color(5); + break; + case 6: + set_layer_color(6); + break; + case 7: + set_layer_color(7); + break; + case 8: + set_layer_color(8); + break; + default: + if (rgb_matrix_get_flags() == LED_FLAG_NONE) + rgb_matrix_set_color_all(0, 0, 0); + break; + } + return true; +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + static bool cz_send_careted = false; + static bool cz_send_acuted = false; + + if (!process_layer_lock(keycode, record, QK_LLCK)) { return false; } + + switch (keycode) { + case CZ_CARETED: + cz_send_careted = record->event.pressed; + + if (record->event.pressed) { + layer_move(PLAIN_LAYER); + } else { + layer_move(0); + } + return false; + case CZ_ACUTED: + cz_send_acuted = record->event.pressed; + + if (record->event.pressed) { + layer_move(PLAIN_LAYER); + } else { + layer_move(0); + } + return false; + + case RGB_SLD: + if (record->event.pressed) { + rgblight_mode(1); + } + return false; + } + + if (cz_send_careted && keycode != CZ_CARETED && keycode != KC_LEFT_SHIFT && keycode != KC_RIGHT_SHIFT && record->event.pressed) { + if (QK_MODS_GET_BASIC_KEYCODE(keycode) == KC_U) { + tap_code16(LSFT(RALT(CZ_SCLN))); + } else { + tap_code16(LSFT(RALT(CZ_ACUT))); + } + } + + if (cz_send_acuted && keycode != CZ_ACUTED && keycode != KC_LEFT_SHIFT && keycode != KC_RIGHT_SHIFT && record->event.pressed) { + const uint8_t mods = get_mods() | get_weak_mods(); + // 1. release shift if held, save if held to shift_held + // 2. send acute accent char with ralt + // 3. if shift_held, hold shift + // 4. process original + if ((mods & MOD_MASK_SHIFT) != 0) { + del_weak_mods(MOD_MASK_SHIFT); + unregister_mods(MOD_MASK_SHIFT); + } + + tap_code16(RALT(CZ_ACUT)); + set_mods(mods); + } + + return true; +} + + +typedef struct { + bool is_press_action; + uint8_t step; +} tap; + +enum { + SINGLE_TAP = 1, + SINGLE_HOLD, + DOUBLE_TAP, + DOUBLE_HOLD, + DOUBLE_SINGLE_TAP, + MORE_TAPS +}; + +/* static tap dance_state[2]; */ + +uint8_t dance_step(tap_dance_state_t *state); + +uint8_t dance_step(tap_dance_state_t *state) { + if (state->count == 1) { + if (state->interrupted || !state->pressed) return SINGLE_TAP; + else return SINGLE_HOLD; + } else if (state->count == 2) { + if (state->interrupted) return DOUBLE_SINGLE_TAP; + else if (state->pressed) return DOUBLE_HOLD; + else return DOUBLE_TAP; + } + return MORE_TAPS; +} + +tap_dance_action_t tap_dance_actions[] = { +}; diff --git a/keyboards/zsa/moonlander/keymaps/rutherther/rules.mk b/keyboards/zsa/moonlander/keymaps/rutherther/rules.mk new file mode 100644 index 0000000000..6f4bbbf1fb --- /dev/null +++ b/keyboards/zsa/moonlander/keymaps/rutherther/rules.mk @@ -0,0 +1,14 @@ +# Set any rules.mk overrides for your specific keymap here. +# See rules at https://docs.qmk.fm/#/config_options?id=the-rulesmk-file +SRC += features/layer_lock.c +CONSOLE_ENABLE = no +COMMAND_ENABLE = no +AUDIO_ENABLE = no +RGB_MATRIX_ENABLE = yes +TAP_DANCE_ENABLE = yes +SPACE_CADET_ENABLE = no +DYNAMIC_TAPPING_TERM_ENABLE = yes +LAYER_LOCK_ENABLE = yes +REPEAT_KEY_ENABLE = yes +CAPS_WORD_ENABLE = yes +KEY_LOCK_ENABLE = yes -- 2.48.1