From e3af9fcaa7545eb932b65e9860ef785ac263e632 Mon Sep 17 00:00:00 2001 From: Kawamashi Date: Tue, 25 Mar 2025 19:37:13 +0100 Subject: [PATCH] Gestion de la couche typo --- .../rev1/base/keymaps/Kawamashi/clever_keys.c | 24 ++- .../features/clever_keys_utilities.c | 12 ++ .../base/keymaps/Kawamashi/features/macros.c | 18 ++- .../base/keymaps/Kawamashi/features/macros.h | 2 +- .../base/keymaps/Kawamashi/features/numword.c | 4 +- .../keymaps/Kawamashi/features/typo_layer.c | 152 ++++++++---------- .../base/keymaps/Kawamashi/features_conf.c | 36 ++++- .../rev1/base/keymaps/Kawamashi/keymap.c | 43 ++--- .../rev1/base/keymaps/Kawamashi/keymap.h | 7 +- .../keymaps/Kawamashi/keymap_french_frgo.h | 6 +- 10 files changed, 166 insertions(+), 138 deletions(-) diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/clever_keys.c b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/clever_keys.c index a7e535e2..577cb30f 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/clever_keys.c +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/clever_keys.c @@ -99,11 +99,13 @@ bool clever_key_finder(uint16_t next_keycode, keyrecord_t* record) { } break; } + break; case FG_CCED: if (!isLetter(next_keycode)) { invoke_key(FG_A, record); } + break; } @@ -126,6 +128,12 @@ bool clever_key_finder(uint16_t next_keycode, keyrecord_t* record) { } break; +/* case KC_SPC: + if (get_last_keycode() == FG_TYPO) { + invoke_key(FG_A, record); + } + break; */ + case MAGIC: switch (prev_keycode) { @@ -209,7 +217,7 @@ bool clever_key_finder(uint16_t next_keycode, keyrecord_t* record) { case FG_D: // "d@" -> "déjà" layer_off(_TYPO); - return finish_word((uint16_t[]) {FG_EACU, FG_J, FG_A}, 3, record); + return finish_word((uint16_t[]) {FG_EACU, FG_J, FG_TYPO, FG_A}, 4, record); } } break; @@ -252,11 +260,19 @@ bool clever_key_finder(uint16_t next_keycode, keyrecord_t* record) { case OU_GRV: layer_off(_TYPO); - return finish_word((uint16_t[]) {FG_O, FG_TYPO, FG_U}, 3, record); + return finish_word((uint16_t[]) {FG_O, FG_TYPO, FG_D}, 3, record); case AGRV_SPC: - //layer_off(_TYPO); - return finish_word((uint16_t[]) {FG_A, KC_SPC}, 2, record); +/* const bool is_shifted = (get_mods() | get_weak_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT; + if (is_shifted) { + del_weak_mods(MOD_MASK_SHIFT); + del_oneshot_mods(MOD_MASK_SHIFT); + unregister_mods(MOD_MASK_SHIFT); + } + invoke_key(FG_TYPO, record); + if (is_shifted) { set_oneshot_mods(MOD_BIT(KC_LSFT)); } */ + layer_off(_TYPO); + return finish_word((uint16_t[]) {FG_AGR, KC_SPC}, 2, record); } return false; // Process next keycode normally diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/clever_keys_utilities.c b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/clever_keys_utilities.c index 5a48f6a2..8fc0ba28 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/clever_keys_utilities.c +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/clever_keys_utilities.c @@ -73,6 +73,18 @@ uint16_t get_next_keycode(uint16_t keycode, keyrecord_t* record) { // Handles custom keycodes. if IS_QK_USER(keycode) { return keycode; } + //if (keycode == FG_CCED) { return FG_CCED; } + if (IS_LAYER_ON(_TYPO)) { + switch (keycode) { + case FG_K: + case FG_J: + case FG_AROB: + case FG_CCED: + break; + default: + return KC_NO; + } + } uint8_t basic_keycode = keycode; // Handle keys carrying a modifier, for ex on layers(! and ?). diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/macros.c b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/macros.c index 8e5750e2..075c76fc 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/macros.c +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/macros.c @@ -16,6 +16,7 @@ #include "macros.h" +bool is_typo_shifted = false; bool process_macros(uint16_t keycode, keyrecord_t *record) { //const uint8_t mods = get_mods(); @@ -27,18 +28,25 @@ bool process_macros(uint16_t keycode, keyrecord_t *record) { case REV_TAB: return process_swapper(S(KC_TAB)); */ - case OS_TYPO: +/* case OS_TYPO: if ((get_mods() | get_weak_mods() | get_oneshot_mods()) & MOD_BIT(KC_ALGR)) { tap_code16(ALGR(FG_TYPO)); return false; } - const bool is_shifted = get_mods() & MOD_MASK_SHIFT; - if (is_shifted) { + is_typo_shifted = (get_mods() | get_weak_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT; + if (is_typo_shifted) { del_weak_mods(MOD_MASK_SHIFT); unregister_mods(MOD_MASK_SHIFT); - set_oneshot_mods(MOD_BIT(KC_LSFT)); + del_oneshot_mods(MOD_BIT(KC_LSFT)); } - return true; + return true; */ +/* case FG_TYPO: + if ((get_mods() | get_weak_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT) { + del_weak_mods(MOD_MASK_SHIFT); + del_oneshot_mods(MOD_MASK_SHIFT); + unregister_mods(MOD_MASK_SHIFT); + } + return true; */ case AIDE_MEM: switch(get_highest_layer(layer_state|default_layer_state)) { diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/macros.h b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/macros.h index ee2560d0..82d21e73 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/macros.h +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/macros.h @@ -22,7 +22,7 @@ #ifdef __cplusplus extern "C" { #endif - +extern bool is_typo_shifted; bool process_macros(uint16_t keycode, keyrecord_t *record); diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/numword.c b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/numword.c index ac53613e..97534db4 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/numword.c +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/numword.c @@ -55,7 +55,8 @@ bool should_terminate_num_word(uint16_t keycode, const keyrecord_t *record) { // Numpad keycodes case KC_1 ... KC_0: case KC_PDOT: - case FG_VIRG: + case FG_POIN: + //case FG_VIRG: case FG_MOIN: case FG_ASTX: case FG_PLUS: @@ -65,6 +66,7 @@ bool should_terminate_num_word(uint16_t keycode, const keyrecord_t *record) { // Misc case KC_BSPC: + case FG_TYPO: // Not to exit Numword when chording it with Typo case NUMWORD: // For the combo NUMWORD to work /* diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/typo_layer.c b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/typo_layer.c index fc2d23b6..4ff39d80 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/typo_layer.c +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/typo_layer.c @@ -17,111 +17,91 @@ #include "typo_layer.h" -//bool is_typo = false; bool exit_typo = false; -void typo_layer_off() { - layer_off(_TYPO); - exit_typo = false; -} - bool process_typo(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { // On press - return true; -} + const uint8_t mods = get_mods() | get_weak_mods() | get_oneshot_mods(); + static bool is_shifted = false; -/* bool process_typo(uint16_t keycode, keyrecord_t *record) { - - if (record->event.pressed) { - switch (keycode) { - case OS_TYPO: - // Handle the custom OSL that go with this feature - // It's timerless, to avoid problems when rolling with an other key, when shift is on. - //is_typo = true; - if ((get_mods() | get_weak_mods() | get_oneshot_mods()) & MOD_BIT(KC_ALGR)) { - tap_code16(ALGR(FG_TYPO)); - } else { - layer_on(_TYPO); - } + if (keycode == OS_TYPO) { + // Handle the custom OSL that go with this feature + // It's timerless, to avoid problems when rolling with an other key, when shift is on. + // Custom behaviour when alt-gr + if (mods & MOD_BIT(KC_ALGR)) { + tap_code16(ALGR(FG_TYPO)); return false; + } + is_shifted = mods & MOD_MASK_SHIFT; + if (is_shifted) { + del_weak_mods(MOD_MASK_SHIFT); + del_oneshot_mods(MOD_MASK_SHIFT); + unregister_mods(MOD_MASK_SHIFT); + } + layer_on(_TYPO); + return false; - case FG_TYPO: - const bool is_shifted = (get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT; - if (is_shifted) { - del_weak_mods(MOD_MASK_SHIFT); - del_oneshot_mods(MOD_MASK_SHIFT); - unregister_mods(MOD_MASK_SHIFT); - } - tap_code(FG_TYPO); - //set_mods(mods); - if (is_shifted) { - set_oneshot_mods(MOD_BIT(KC_LSFT)); - //is_shifted = false; - } - } + } else if (keycode == FG_TYPO) { + // Special behaviour of FR_TYPO when shifted + // Shift must apply to the next keycode +/* is_shifted = mods & MOD_MASK_SHIFT; + if (is_shifted) { + del_weak_mods(MOD_MASK_SHIFT); + del_oneshot_mods(MOD_MASK_SHIFT); + unregister_mods(MOD_MASK_SHIFT); + } */ + //tap_code(FR_TYPO); + return true; - if (IS_LAYER_ON(_TYPO)) { + } else if (IS_LAYER_ON(_TYPO)) { switch (keycode) { - case TG_TYPO: case FG_AROB: case FG_K: case FG_J: case OU_GRV: - break; + case FG_CCED: + case AGRV_SPC: + case CNL_TYPO: + break; default: - //tap_code(FG_TYPO); - const bool is_shifted = (get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT; - if (is_shifted) { - del_weak_mods(MOD_MASK_SHIFT); - del_oneshot_mods(MOD_MASK_SHIFT); - unregister_mods(MOD_MASK_SHIFT); - } - tap_code(FG_TYPO); - if (is_shifted) { set_oneshot_mods(MOD_BIT(KC_LSFT)); } +/* is_shifted = mods & MOD_MASK_SHIFT; + if (is_shifted) { + del_weak_mods(MOD_MASK_SHIFT); + del_oneshot_mods(MOD_MASK_SHIFT); + unregister_mods(MOD_MASK_SHIFT); + } */ + tap_code(FG_TYPO); + } + if (!IS_LAYER_ON(_APOS_DR)) { + switch (keycode) { + case FG_M: + case FG_L: + is_shifted = true; + } + } + if (is_shifted) { + //set_mods(mods); + set_oneshot_mods(MOD_BIT(KC_LSFT)); + is_shifted = false; } exit_typo = true; } +/* } else { // On release + switch (keycode) { + case OS_TYPO: + case FG_TYPO: + break; + default: + if (exit_typo) { typo_layer_off(); } + } */ } return true; -} */ +} - - -/* bool process_typo(uint16_t keycode, const keyrecord_t *record) { - // Handle the custom keycodes that go with this feature - if (keycode == OS_TYPO) { - if (record->event.pressed) { - is_typo = true; - layer_on(_TYPO); - return false; - } - } - - // Other than the custom keycode, nothing else in this feature will activate - // if the behavior is not on, so allow QMK to handle the event as usual. - if (!is_typo) { return true; } - - switch (keycode) { - case TG_TYPO : - case FG_AROB: - case FG_K: - case FG_J: - case OU_GRV: - break; - - default: - const bool is_shifted = (get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT; - if (is_shifted) { - del_weak_mods(MOD_MASK_SHIFT); - del_oneshot_mods(MOD_MASK_SHIFT); - unregister_mods(MOD_MASK_SHIFT); - } - tap_code(FG_TYPO); - if (is_shifted) { set_oneshot_mods(MOD_BIT(KC_LSFT)); } - } - - exit_typo = true; - return true; -} */ \ No newline at end of file +void typo_layer_off(void) { + layer_off(_TYPO); + exit_typo = false; +} \ No newline at end of file diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features_conf.c b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features_conf.c index b4e6a198..c9091707 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features_conf.c +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features_conf.c @@ -47,9 +47,41 @@ uint16_t tap_hold_extractor(uint16_t keycode) { bool caps_word_press_user(uint16_t keycode) { + // Caps Word shouldn’t be applied with Alt-gr // Managing underscore on alt gr + E. // Underscore must continue Caps Word, without shifting. - if ((get_mods() & MOD_BIT(KC_ALGR)) && keycode == FG_E) { return true; } + if ((get_mods() & MOD_BIT(KC_ALGR))) { + switch (keycode) { + case FG_E: + case FG_T: + return true; + default: + return false; + } + } + + if (IS_LAYER_ON(_TYPO)) { + switch (keycode) { + case FG_VIRG: + add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to next key. + return true; + case FG_I: + case FG_H: + return true; + case FG_U: + case FG_T: + case FG_G: + case FG_B: + case FG_F: + case FG_M: + case FG_L: + case FG_S: + case FG_N: + return false; + } + } + + // // Keycodes that continue Caps Word, with shift applied. if (isLetter(keycode)) { @@ -62,8 +94,6 @@ bool caps_word_press_user(uint16_t keycode) { case FG_TYPO: //case FG_GRV: case FG_MOIN: - case FG_UNDS: - case FG_SLSH: case KC_KP_1 ... KC_KP_0: case KC_LEFT: case KC_RIGHT: diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap.c b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap.c index 386ff5d9..698d130b 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap.c +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap.c @@ -97,35 +97,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { // Custom tap-hold keys if (!process_custom_tap_hold(keycode, record)) { return false; } + // Custom behaviour of the typo dead-key if (!process_typo(keycode, record)) { return false; } - if (IS_LAYER_ON(_TYPO) && record->event.pressed) { - - switch (keycode) { - case FG_AROB: - case FG_K: - case FG_J: - case OU_GRV: - case FG_CCED: - case AGRV_SPC: - break; - - default: - const bool is_shifted = (get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT; - if (is_shifted) { - del_weak_mods(MOD_MASK_SHIFT); - del_oneshot_mods(MOD_MASK_SHIFT); - unregister_mods(MOD_MASK_SHIFT); - } - tap_code(FG_TYPO); - //set_mods(mods); - if (is_shifted) { - set_oneshot_mods(MOD_BIT(KC_LSFT)); - //is_shifted = false; - } - } - } - // Macros if (!process_macros(keycode, record)) { return false; } @@ -141,6 +115,7 @@ void post_process_record_user(uint16_t keycode, keyrecord_t* record) { if (os4a_layer != 0 && exit_os4a_layer) { os4a_layer_off(os4a_layer); } if (exit_num_word) { disable_num_word(); } //if (exit_typo && keycode != FG_TYPO) { typo_layer_off(); } + if (exit_typo) { typo_layer_off(); } } @@ -247,10 +222,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `----------------------------------' `----------------------------------' */ [_NUMBERS] = LAYOUT( - _______, _______, FG_ASTX, FG_EGAL, _______, FG_PERC, KC_6, _______, FG_PLUS, FG_MOIN, _______, _______, - _______, KC_6, KC_4, KC_2, FG_SLSH, FG_CARN, S(FG_ACIR), KC_1, KC_3, KC_5, KC_7, _______, - _______, _______, _______, _______, KC_8, _______, _______, _______, _______, _______, _______, KC_9, _______, _______, _______, _______, - _______, _______, FG_VIRG, KC_0 , NUMWORD, LT_REPT, KC_SPC, _______, _______, _______ + _______, _______, FG_ASTX, FG_EGAL, KC_7, FG_PERC, S(FG_ACIR), _______, FG_PLUS, FG_MOIN, _______, _______, + _______, KC_6, KC_4, KC_2, MT_SLSH, _______, FG_CARN, MT_1, KC_3, KC_5, KC_7, _______, + _______, _______, _______, _______, KC_8, _______, _______, _______, _______, _______, _______, KC_9, KC_6, _______, FG_TYPO, _______, + _______, _______, KC_PDOT, KC_0 , NUMWORD, LT_REPT, KC_SPC, _______, _______, _______ ), @@ -269,9 +244,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `----------------------------------' `----------------------------------' */ [_TYPO] = LAYOUT( - _______, _______, _______, _______, _______, FG_D, _______, S(FG_M), S(FG_L), _______, _______, _______, - _______, OU_GRV, _______, _______, FG_B, _______, _______, FG_J, FG_T, FG_AROB, _______, _______, - _______, _______, _______, _______, FG_DQUO, _______, _______, _______, _______, _______, _______, FG_CCED, _______, FG_K, TG_TYPO, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, OU_GRV, _______, _______, FG_U, _______, _______, FG_J, FG_T, FG_AROB, _______, _______, + _______, _______, _______, _______, FG_F, _______, _______, _______, _______, _______, _______, FG_CCED, _______, FG_K, CNL_TYPO, _______, _______, _______, _______, _______, FG_O, _______, AGRV_SPC, _______, _______, _______ ), diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap.h b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap.h index 29c390ee..53b06cdf 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap.h +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap.h @@ -68,7 +68,8 @@ enum custom_keycodes { OS_RALT, OS_LALT, OS_WIN, - //OS_TYPO + OS_TYPO, + CNL_TYPO }; // Layer taps @@ -76,11 +77,11 @@ enum custom_keycodes { #define LT_E ALGR_T(FG_E) #define LT_REPT LT(_NUMBERS, KC_0) #define LT_MGC LT(_SHORTNAV, KC_0) -#define OS_TYPO OSL(_TYPO) #define OS_FA OSL(_FUNCAPPS) #define TT_FA TT(_FUNCAPPS) -#define TG_TYPO TG(_TYPO) #define TG_APOD TG(_APOS_DR) +#define MT_SLSH SFT_T(FG_SLSH) +#define MT_1 SFT_T(KC_1) // One shot mods #define L_OS4A LSFT_T(OS4A) diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap_french_frgo.h b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap_french_frgo.h index 5e475314..94869a08 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap_french_frgo.h +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap_french_frgo.h @@ -122,7 +122,7 @@ /* AltGr symbols * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ - * │   │ ₁ │ ₂ │ ₃ │ ₄ │ ₅ │ ₆ │ ₇ │ ₈ │ ₉ │ ₀ │   │   │       │ + * │   │ ₁ │ ₂ │ ₃ │ ₄ │ ₅ │ ₆ │ ₇ │ ₈ │ ₉ │ ₀ │ à │   │       │ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ * │     │ ^ │ ! │ = │ $ │ % │ # │ ; │ ' │ ? │ : │   │   │     │ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │ @@ -134,6 +134,10 @@ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ */ + +// Row 1 +#define FG_AGR ALGR(FG_SLSH) + // Row 2 #define FG_ACIR ALGR(FG_X) // ^ //#define FG_EXLM ALGR(FG_VIRG) // !