diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/capslist.c b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/capslist.c index f956fb31..912e8031 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/capslist.c +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/capslist.c @@ -1,8 +1,10 @@ #include "capslist.h" static bool caps_list_active = false; -static unsigned short int capslist_countdown = 0; -static unsigned short int countdown_end = 5; +//static unsigned short int capslist_countdown = 0; +unsigned short int capslist_countdown = 0; +//static unsigned short int countdown_end = 5; +unsigned short int countdown_end = 5; bool is_caps_list_on(void) { return caps_list_active; } @@ -65,50 +67,4 @@ bool process_caps_list(uint16_t keycode, keyrecord_t *record) { } disable_caps_list(); return true; -} - - -bool should_continue_caps_list(uint16_t keycode) { - if (keycode == KC_BSPC) { - capslist_countdown--; - return true; - } - if (is_letter(keycode) || is_send_string_macro(keycode) || keycode == PG_AROB) { - capslist_countdown++; - return true; - } - if (caps_word_press_user(keycode)) { - capslist_countdown++; - return true; - } - - // Keycodes that continue Caps List, but not Caps Word. - // These keycodes trigger the countdown to end Caps List. - switch (keycode) { - case PG_VIRG: - case KC_SPC: - capslist_countdown++; - return true; - } - return false; // Deactivate Caps List. -} - - -bool caps_word_reactivation(void) { - - // Words that continue Caps List. - if (recent[RECENT_SIZE - 1] == KC_SPC) { - if (recent[RECENT_SIZE - 4] == KC_SPC && recent[RECENT_SIZE - 3] == PG_E && recent[RECENT_SIZE - 2] == PG_T) { - countdown_end = 1; - return true; - } - if (recent[RECENT_SIZE - 4] == KC_SPC && recent[RECENT_SIZE - 3] == PG_O && recent[RECENT_SIZE - 2] == PG_U) { - countdown_end = 1; - return true; - } - if (recent[RECENT_SIZE - 2] == PG_VIRG) { - return true; - } - } - return false; -} +} \ No newline at end of file diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/capslist.h b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/capslist.h index 5fbc25b8..3cc69a02 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/capslist.h +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/capslist.h @@ -3,6 +3,9 @@ #include "quantum.h" #include "keymap.h" +extern unsigned short int capslist_countdown; +extern unsigned short int countdown_end; + bool is_caps_list_on(void); void enable_caps_list(void); diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/clever_keys_old.c b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/clever_keys_old.c deleted file mode 100644 index 3fdd98ec..00000000 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/clever_keys_old.c +++ /dev/null @@ -1,221 +0,0 @@ -// Correction automatique - -#include "clever_keys.h" - - -bool process_clever_keys(uint16_t keycode, keyrecord_t* record) { - - uint16_t next_keycode = get_next_keycode(keycode, record); - const uint8_t mods = get_mods(); - - if (next_keycode != KC_NO) { - - uint16_t prev_keycode = recent[RECENT_SIZE - 1]; - //const uint8_t mods = get_mods(); - - if (is_letter(next_keycode) || next_keycode == E_CIRC) { - switch (prev_keycode) { - case PG_EXCL: - case PG_QUES: - case PG_3PTS: - case PG_2PTS: - // Add space between punctuation and letters. - process_next_key(KC_SPC, record); - - case KC_SPC: - switch (recent[RECENT_SIZE - 2]) { - case PG_EXCL: - case PG_QUES: - case PG_3PTS: - case PG_X: - // Add OS shift at the beginning of a sentence. - if (!is_caps_lock_on()) { set_oneshot_mods(MOD_BIT(KC_LSFT)); } - break; - } - } - } - - // Ajout automatique du "u" après le "q" - if (prev_keycode == PG_Q) { - switch (next_keycode) { - - case PG_E: - case PG_I: - case PG_A: - case PG_O: - case PG_U: - case E_CIRC: - case PG_APOS: - process_next_key(PG_L, record); - break; - - // Raccourci pour "quelq" - case PG_Q: - clear_recent_keys(); // To prevent infinite loop - process_word((uint16_t[]) {PG_L, PG_E, PG_C}, 3, record); - break; - - // Raccourci pour "quoi", ça évite un aller-retour sur la main gauche. - case PG_Z: - return finish_word((uint16_t[]) {PG_L, PG_O, PG_I}, 3, record); - - // Raccourci pour "quand" - case PG_H: - process_word((uint16_t[]) {PG_L, PG_A, PG_S}, 3, record); - break; - } - - - } else if (next_keycode == PG_AROB && !is_letter(recent[RECENT_SIZE - 2])) { - switch (prev_keycode) { - - case PG_N: - // "t@" -> "toujours" - return finish_word((uint16_t[]) {PG_O, PG_L, PG_J, PG_O, PG_L, PG_R, PG_T}, 7, record); - - case PG_P: - // "p@" -> "peut-être" - return finish_word((uint16_t[]) {PG_E, PG_L, PG_N, PG_MOIN, PG_ACIR, PG_E, PG_N, PG_R, PG_E}, 9, record); - - case PG_A: - // "a@" -> "aujourd'hui" - return finish_word((uint16_t[]) {PG_L, PG_J, PG_O, PG_L, PG_R, PG_H, PG_APOS, PG_F, PG_L, PG_I}, 10, record); - - case PG_B: - // "b@" -> "beaucoup" - return finish_word((uint16_t[]) {PG_E, PG_A, PG_L, PG_D, PG_O, PG_L, PG_P}, 7, record); - - case PG_E: - // "e@" -> "est-ce qu" - return finish_word((uint16_t[]) {PG_T, PG_N, PG_MOIN, PG_D, PG_E, KC_SPC, PG_Q}, 7, record); - - case PG_H: - // "d@" -> "déjà" - return finish_word((uint16_t[]) {PG_U, PG_J, PG_AGRV}, 3, record); - } - - } else if (prev_keycode == PG_P) { - switch (next_keycode) { - - case PG_M: - // "pas" - return finish_word((uint16_t[]) {PG_A, PG_T}, 2, record); - - case PG_APOS: - // "par" - return finish_word((uint16_t[]) {PG_A, PG_R}, 2, record); - - case PG_X: - if (!is_letter(recent[RECENT_SIZE - 2])) { - // "pour" - return finish_word((uint16_t[]) {PG_O, PG_L, PG_R}, 3, record); - } - - } - - } else if (next_keycode == PG_A && prev_keycode == PG_O) { - // "oa" -> "oi" - process_next_key(PG_I, record); - return false; - - } else if (next_keycode == PG_O && prev_keycode == PG_L && recent[RECENT_SIZE - 2] != PG_Q) { - // "uo" -> "un" - process_next_key(PG_S, record); - return false; - } - - switch (next_keycode) { - case PG_QUES: - case PG_EXCL: - // On ajoute un espace insécable s'il n'a pas été entré avant le point d'exclamation. - // Il ne faut pas tester cette fonctionnalité avec Word, qui ajoute cet espace automatiquement. - if (is_letter(recent[RECENT_SIZE - 1])) { - - if ((mods | get_oneshot_mods() | get_weak_mods()) & MOD_MASK_SHIFT) { - del_weak_mods(MOD_MASK_SHIFT); - del_oneshot_mods(MOD_MASK_SHIFT); - unregister_mods(MOD_MASK_SHIFT); - } - process_next_key(ALGR(KC_SPC), record); - set_mods(mods); - process_next_key(next_keycode, record); - return false; - } - break; - - case MAGIC: - switch (prev_keycode) { - - case PG_N: - process_next_key(PG_I, record); - case PG_I: - return finish_word((uint16_t[]) {PG_O, PG_S}, 2, record); - - case PG_D: - return finish_word((uint16_t[]) {PG_APOS, PG_E, PG_T, PG_N}, 4, record); - - case PG_H: - return finish_word((uint16_t[]) {PG_A, PG_S, PG_T}, 3, record); - - case PG_P: - return finish_word((uint16_t[]) {PG_C, PG_L, PG_T}, 3, record); - - case PG_A: - return finish_word((uint16_t[]) {PG_G, PG_E, PG_D}, 3, record); - - case PG_T: - return finish_word((uint16_t[]) {PG_L, PG_R}, 2, record); - - case PG_B: - process_word((uint16_t[]) {PG_O, PG_S, PG_J}, 3, record); - - case PG_J: - return finish_word((uint16_t[]) {PG_O, PG_L, PG_R}, 3, record); - - case PG_M: - // "même" - return finish_word((uint16_t[]) {PG_ACIR, PG_E, PG_M, PG_E}, 4, record); - - default: - return false; - } - - case PG_Q: - if (prev_keycode == PG_J) { - // "jq" -> "jusqu" - process_word((uint16_t[]) {PG_L, PG_T}, 2, record); - } - break; - - case CA_CED: - return finish_word((uint16_t[]) {PG_CCED, PG_A}, 2, record); - - case OU_GRV: - return finish_word((uint16_t[]) {PG_O, ALGR(PG_L)}, 2, record); - - case AGRV_SPC: - return finish_word((uint16_t[]) {PG_AGRV, KC_SPC}, 2, record); - - case E_CIRC: - return process_accent(PG_ACIR, PG_E, record); - - case I_CIRC: - return process_accent(PG_ACIR, PG_I, record); - - case A_CIRC: - return process_accent(PG_ACIR, PG_A, record); - - case O_CIRC: - return process_accent(PG_ACIR, PG_O, record); - - case U_CIRC: - return process_accent(PG_ACIR, PG_L, record); - - case I_TREM: - return process_accent(PG_NREM, PG_I, record); - } - - store_keycode(next_keycode, record); - } - return true; // Process all other keycodes normally -} \ No newline at end of file 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 73f12bae..699a828b 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/macros.c +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/macros.c @@ -71,10 +71,6 @@ bool process_macros(uint16_t keycode, keyrecord_t *record) { is_apos_dr = !is_apos_dr; return false; - case NUM_ODK: - tap_code(PG_ODK); - return true; - case PG_DEG: tap_code(PG_ODK); tap_code(KC_9); diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/numword - Copie.c b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/numword - Copie.c deleted file mode 100644 index 88ec8f38..00000000 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/numword - Copie.c +++ /dev/null @@ -1,122 +0,0 @@ -/* Copyright 2025 @Kawamashi - * - * 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 . - */ - -#include "numword.h" - -//static uint16_t num_word_timer = 0; -//static bool is_num_word_on = false; -bool is_num_word_on = false; -static bool exit_num_word = false; - -bool is_num_word_enabled(void) { - return is_num_word_on; -} - -void enable_num_word(void) { - //if (is_num_word_on) return; - is_num_word_on = true; - layer_on(_NUMBERS); -} - -void disable_num_word(void) { - //if (!is_num_word_on) return; - is_num_word_on = false; - layer_off(_NUMBERS); - exit_num_word = false; -} - -void toggle_num_word(void) { - if (is_num_word_on) { - disable_num_word(); - } else { - enable_num_word(); - } -} - -bool should_exit_num_word(uint16_t keycode, const keyrecord_t *record) { - - switch (keycode) { - // Keycodes which should not disable num word mode. - - // Numpad keycodes - case KC_1 ... KC_0: - case KC_PDOT: - //case PG_X: - //case PG_EACU: - case PG_MOIN: - case PG_ASTX: - case PG_PLUS: - case PG_SLSH: - case PG_EXP: - case PG_IND: - case PG_H: - case PG_2PTS: - case LT_EURO: - case NNB_SPC: - - // Misc - case KC_BSPC: - case PG_ODK: // Not to exit Numword when chording it with ODK - case NUMWORD: // For the combo NUMWORD to work - -/* - case PG_EGAL: - case PG_BSLS:*/ - return false; - } - - return true; -} - - -bool process_numword(uint16_t keycode, const keyrecord_t *record) { - // Handle the custom keycodes that go with this feature - if (keycode == NUMWORD) { - if (record->event.pressed) { toggle_num_word(); } - return false; - } - - // Other than the custom keycodes, nothing else in this feature will activate - // if the behavior is not on, so allow QMK to handle the event as usual. - if (!is_num_word_on) { return true; } - // Nothing else acts on key release, either - if (!record->event.pressed) { return true; } - - // Get the base keycode of a mod or layer tap key - switch (keycode) { - case QK_MOD_TAP ... QK_MOD_TAP_MAX: - case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: - // Earlier return if this has not been considered tapped yet - if (record->tap.count == 0) { return true; } - keycode = keycode & 0xFF; - break; -/* case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: // `LT(layer, key)` keys. - // Release event on a held layer-tap key when numword is on. - if (record->tap.count == 0 && !record->event.pressed) { - return false; // Skip default handling so that layer stays on. - } else { - keycode = keycode & 0xFF; // Get tapping keycode. - } - break; */ - } - - exit_num_word = should_exit_num_word(keycode, record); - return true; -} - -void numword_exit_check(void) { - if (exit_num_word) { disable_num_word(); } -} 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 1235794d..abfc1f61 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/numword.c +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/numword.c @@ -46,43 +46,6 @@ void toggle_num_word(void) { } } -bool should_exit_num_word(uint16_t keycode, const keyrecord_t *record) { - - switch (keycode) { - // Keycodes which should not disable num word mode. - - // Numpad keycodes - case KC_1 ... KC_0: - case KC_PDOT: - //case PG_X: - //case PG_EACU: - case PG_MOIN: - case PG_ASTX: - case PG_PLUS: - case PG_SLSH: - case PG_EGAL: - case PG_EXP: - case PG_IND: - case PG_H: - case PG_2PTS: - //case PG_EURO: - //case LT_NBSPC: - case NNB_SPC: - - // Misc - case KC_BSPC: - case PG_ODK: // Not to exit Numword when chording it with ODK - //case NUMWORD: // For the combo NUMWORD to work - -/* - - case PG_BSLS:*/ - return false; - } - - return true; -} - bool process_numword(uint16_t keycode, const keyrecord_t *record) { // Handle the custom keycodes that go with this feature @@ -94,7 +57,7 @@ bool process_numword(uint16_t keycode, const keyrecord_t *record) { // Other than the custom keycodes, nothing else in this feature will activate // if the behavior is not on, so allow QMK to handle the event as usual. if (!is_num_word_on) { return true; } - // Nothing else acts on key release, either + if (record->event.pressed) { // Get the base keycode of a mod or layer tap key diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/numword.h b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/numword.h index 9567e4c0..978162e2 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/numword.h +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/numword.h @@ -19,7 +19,6 @@ #include "keymap.h" bool is_num_word_enabled(void); -//extern bool exit_num_word; extern bool is_num_word_on; void enable_num_word(void); diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/odk_layer.c b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/odk_layer.c index 5c430461..0aeaa981 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/odk_layer.c +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/odk_layer.c @@ -34,6 +34,11 @@ bool process_odk_layer(uint16_t keycode, keyrecord_t *record) { } else if (keycode == PG_ODK) { invoke_odk = true; + //return deferred_shift_after_dead_key(keycode, mods); + + } else if (keycode == NUM_ODK) { + invoke_odk = true; + //return deferred_shift_after_dead_key(keycode, mods); } else if (IS_LAYER_ON(_ODK)) { switch (keycode) { @@ -49,6 +54,7 @@ bool process_odk_layer(uint16_t keycode, keyrecord_t *record) { default: invoke_odk = true; + //return deferred_shift_after_dead_key(keycode, mods); } } @@ -69,10 +75,26 @@ bool process_odk_layer(uint16_t keycode, keyrecord_t *record) { if (is_shifted) { set_oneshot_mods(MOD_BIT(KC_LSFT)); // Don't use weak mods ! - //is_shifted = false; } if (keycode == PG_ODK) { return false; } } } return true; +} + +bool deferred_shift_after_dead_key(uint16_t keycode, uint8_t mods) { + bool is_shifted = false; + + if (mods & MOD_MASK_SHIFT) { + del_weak_mods(MOD_MASK_SHIFT); + del_oneshot_mods(MOD_MASK_SHIFT); + unregister_mods(MOD_MASK_SHIFT); + is_shifted = true; + } + + tap_code(PG_ODK); + + if (is_shifted) { set_oneshot_mods(MOD_BIT(KC_LSFT)); } // Don't use weak mods ! + + return !(keycode == PG_ODK); } \ No newline at end of file diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/odk_layer.h b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/odk_layer.h index dad5bf25..9123ed1c 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/odk_layer.h +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/odk_layer.h @@ -25,6 +25,7 @@ extern "C" { #endif bool process_odk_layer(uint16_t keycode, keyrecord_t *record); +bool deferred_shift_after_dead_key(uint16_t keycode, uint8_t mods); #ifdef __cplusplus } diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/os4a.c b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/os4a.c index a64e8f40..e9da4011 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/os4a.c +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/os4a.c @@ -62,7 +62,7 @@ bool os4a_layer_process_outcome(uint16_t keycode, keyrecord_t *record) { // Should keycode exit the OS4A layer without further process ? if (should_exit_os4a_layer(keycode)) { return true; } - // Should keycode stay on the OS4A layer, e.g. Callum mod ? + // Should keycode stay on the OS4A layer, to be possibly combined with another one, e.g. Callum mod ? if (is_oneshot_ignored_key(keycode)) { return false; } // Add OS Shift when no other mods are active. @@ -70,8 +70,8 @@ bool os4a_layer_process_outcome(uint16_t keycode, keyrecord_t *record) { // to be processed (ex: custom altgr, clever keys). const uint8_t mods = get_mods() | get_oneshot_mods(); if (!exit_os4a_layer && to_be_shifted(keycode, record) && mods == 0) { - // Don't use weak mods, it interferes with Capsword. set_oneshot_mods(MOD_BIT(KC_LSFT)); + // Don't use weak mods, it interferes with Capsword. } return true; } @@ -94,8 +94,8 @@ bool process_mods(uint16_t keycode, keyrecord_t *record) { update_oneshot(&os_shft_state, KC_LSFT, OS_SHFT, keycode, record); update_oneshot(&os_ctrl_state, KC_LCTL, OS_CTRL, keycode, record); update_oneshot(&os_alt_state, KC_LALT, OS_LALT, keycode, record); - update_oneshot(&os_altgr_state, KC_RALT, OS_RALT, keycode, record); update_oneshot(&os_win_state, KC_LWIN, OS_WIN, keycode, record); + //update_oneshot(&os_altgr_state, KC_RALT, OS_RALT, keycode, record); // Handling OS4A keys if (IS_OS4A_KEY(keycode)) { return process_os4a_keys(keycode, record); } diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/tap_hold_utilities.c b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/tap_hold_utilities.c index b6642413..1dd19b57 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/tap_hold_utilities.c +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features/tap_hold_utilities.c @@ -26,8 +26,7 @@ void tap_converter(uint16_t keycode, keyrecord_t *record) { } else { if (IS_QK_MOD_TAP(keycode) || IS_QK_LAYER_TAP(keycode)) { // Tranform the record to send the tap event - //record->keycode = tap_hold_extractor(keycode); - record->keycode = (keycode &= 0xff); + record->keycode = tap_hold_extractor(keycode); } process_record(record); } 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 a3f43425..50c65b41 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features_conf.c +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features_conf.c @@ -16,54 +16,9 @@ #include "features_conf.h" + bool is_caps_lock_on(void) { return host_keyboard_led_state().caps_lock; } -bool is_letter(uint16_t keycode) { - switch (keycode) { - case KC_A ... KC_F: - case KC_H ... KC_P: - case KC_R ... KC_S: - case KC_U ... KC_Z: - case PG_L: - case PG_E: - case KC_GRV ... KC_DOT: - return true; - - default: - return false; - } -} - -bool is_send_string_macro(uint16_t keycode) { - switch (keycode) { - case OU_GRV: - case MAGIC: - //case PG_DEG: - return true; - - default: - return false; - } -} - -bool is_followed_by_apos(uint16_t keycode, uint16_t prev_keycode) { - switch (keycode) { - case PG_Q: - return true; - - case PG_L: - case PG_T: - case PG_D: - case PG_C: - case PG_N: - case PG_S: - case PG_M: - case PG_Y: - case PG_J: - if (!is_letter(prev_keycode)) { return true; } - } - return false; -} // This function extracts the base keycode of MT and LT, // even if the tap/hold key is a custom one, with non-basic tap keycode. @@ -103,68 +58,6 @@ bool process_custom_tap_hold(uint16_t keycode, keyrecord_t *record) { } -// Caps Word - -bool caps_word_press_user(uint16_t keycode) { - - // Caps Word shouldn't be applied with Alt-gr - // Managing underscore and slash on alt gr + E/T. - // Underscore and slash must continue Caps Word, without shifting. -/* if ((get_mods() & MOD_BIT(KC_ALGR))) { - switch (keycode) { - case PG_E: - case PG_T: - return true; - default: - return false; - } - } */ - - if (IS_LAYER_ON(_ODK)) { - switch (keycode) { - - case PG_VIRG: - add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to next key. - return true; - - case PG_Y: - case PG_T: - return true; - - case PG_POIN: - return false; - } - } - - // Keycodes that continue Caps Word, with shift applied. - // @ must be shifted, bc of CleverKeys using it. - if (is_letter(keycode) || is_send_string_macro(keycode) || keycode == PG_AROB) { - add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to next key. - return true; - } - - switch (keycode) { - // Keycodes that continue Caps Word, without shifting. - case PG_ODK: - //case PG_GRV: - case PG_UNDS: - case PG_TIRE: - case PG_SLSH: - case KC_1 ... KC_0: - //case KC_LEFT: - //case KC_RIGHT: - case KC_BSPC: - case LCTL(KC_BSPC): - case KC_DEL: - case PG_APOS: - return true; - - default: - return false; // Deactivate Caps Word. - } -} - - // Clever keys configuration uint16_t get_ongoing_keycode_user(uint16_t keycode) { @@ -176,9 +69,7 @@ uint16_t get_ongoing_keycode_user(uint16_t keycode) { switch (keycode) { case PG_K: case PG_B: - case PG_AROB: - //case PG_3PTS: - case KC_SPC: // In order to uppercase J after '?' for ex. + case KC_SPC: // When space is added by clever keys, for ex. in order to uppercase K after '?' for ex. return keycode; case PG_POIN: @@ -192,6 +83,7 @@ uint16_t get_ongoing_keycode_user(uint16_t keycode) { return KC_TRNS; } + // One-shot 4 all configuration uint8_t get_os4a_layer(uint16_t keycode) { @@ -220,8 +112,6 @@ bool to_be_shifted(uint16_t keycode, keyrecord_t *record) { if (!IS_KEYEVENT(record->event)) { return true; } switch (keycode) { -/* case OS_ODK: - is_shifted = true; */ case KC_CAPS: case CAPSWORD: case CAPSLIST: diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features_conf.h b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features_conf.h index 62c06708..7ae5cb67 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features_conf.h +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/features_conf.h @@ -20,9 +20,6 @@ #include "keymap.h" bool is_caps_lock_on(void); -bool is_letter(uint16_t keycode); -bool is_send_string_macro(uint16_t keycode); -bool is_followed_by_apos(uint16_t keycode, uint16_t prev_keycode); uint16_t tap_hold_extractor(uint16_t keycode); bool process_custom_tap_hold(uint16_t keycode, keyrecord_t *record); diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap.c b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap.c index 1372feca..5b1f055d 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap.c +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap.c @@ -126,7 +126,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * Base Layer: ALPHAS *»\ * ,-------------------------------------------. ,-------------------------------------------. - * | | X | È | É | . | K | | V | B | L | M | X | | + * | | À | È | É | . | K | | V | B | L | M | X | | * |--------+------+------+------+------+------| |------+------+------+------+------+--------| * | Enter | O | U | A | I | J | | G | T | S | N | R | F | * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| @@ -185,28 +185,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, KC_CAPS, _______, MAGIC, TG_APOS, _______, _______, KC_NO, KC_NO ), - -/* - * Layer : Symbols - * - * ,-------------------------------------------. ,-------------------------------------------. - * | | ^ | { | } | $ | # | | % | " | = | ! | ` | | - * |--------+------+------+------+------+------| |------+------+------+------+------+--------| - * | | ? | ( | ) | ; | : | | \ | / | - | + | * | | - * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| - * | | < | [ | ] | > | | | | | | | | ' | & | | | ~ | | - * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' - * | | | | | | | | | | | | - * | | | | | | | | | | | | - * `----------------------------------' `----------------------------------' - */ - [_SYMBOLS] = LAYOUT( - _______, PG_ACIR, PG_LCBR, PG_RCBR, PG_DLR, PG_PERC, PG_HASH, PG_DQUO, PG_EGAL, ALGR(PG_J), PG_GRV, _______, - _______, ALGR(PG_O), PG_LPRN, PG_RPRN, PG_PVIR, PG_2PTS, PG_BSLS, MT_SLSH, PG_MOIN, PG_PLUS, PG_ASTX, _______, - _______, PG_INF, PG_LSBR, PG_RSBR, PG_SUP, _______, _______, _______, _______, _______, _______, PG_APOD, PG_ESPR, PG_PIPE, PG_TILD, _______, - _______, _______, _______, PG_UNDS, KC_SPC, _______, _______, _______, _______, _______ - ), - /* * Layer 1 : Numpad @@ -227,9 +205,30 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, PG_DLR, PG_MOIN, PG_PLUS, PG_EURO, PG_PERC, PG_EXP, S(PG_EGAL), PG_EGAL, PG_ASTX, _______, _______, _______, KC_4, KC_3, KC_2, MT_1, PG_2PTS, PG_IND, MT_SLSH, KC_6, KC_7, KC_8, _______, _______, S(KC_4), S(KC_3), PG_H, KC_5, _______, _______, _______, _______, _______, _______, KC_9, PG_DEG, _______, PG_ODK, _______, - _______, _______, KC_PDOT, KC_0 , LT_NBSPC, _______, KC_SPC, _______, _______, _______ + _______, _______, KC_PDOT, LT_0 , LT_NBSPC, _______, KC_SPC, _______, _______, _______ ), +/* + * Layer : Symbols + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | ^ | { | } | $ | # | | % | " | = | ! | ` | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | ? | ( | ) | ; | : | | \ | / | - | + | * | | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | < | [ | ] | > | | | | | | | | ' | & | | | ~ | | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_SYMBOLS] = LAYOUT( + _______, PG_ACIR, PG_LCBR, PG_RCBR, PG_DLR, PG_PERC, PG_HASH, PG_DQUO, PG_EGAL, ALGR(PG_J), PG_GRV, _______, + _______, ALGR(PG_O), PG_LPRN, PG_RPRN, PG_PVIR, PG_2PTS, PG_BSLS, MT_SLSH, PG_MOIN, PG_PLUS, PG_ASTX, _______, + _______, PG_INF, PG_LSBR, PG_RSBR, PG_SUP, _______, _______, _______, _______, _______, _______, PG_APOD, PG_ESPR, PG_PIPE, PG_TILD, _______, + _______, _______, _______, PG_UNDS, KC_SPC, _______, _______, _______, _______, _______ + ), + /* * Layer 2 : Symbols diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap.h b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap.h index 4ff6636c..d433e2f1 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap.h +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/keymap.h @@ -20,6 +20,7 @@ #include "keymap_french_propergol.h" #include "features_conf.h" +#include "word_conf.h" #include "clever_keys.h" #include "features/tap_hold_utilities.h" #include "features/clever_keys_utilities.h" @@ -37,8 +38,8 @@ enum layers { _L_MODS, _R_MODS, _ODK, - _SYMBOLS, _NUMBERS, + _SYMBOLS, _SHORTNAV, _FUNCAPPS, }; @@ -73,6 +74,7 @@ enum custom_keycodes { #define TG_FA TT(_FUNCAPPS) #define MT_SLSH SFT_T(PG_SLSH) #define MT_1 SFT_T(KC_1) +#define LT_0 LT(_SYMBOLS, KC_0) #define LT_NBSPC LT(_SHORTNAV, NNB_SPC) #define E_CIRC S(FG_0) #define OS_ODK OSL(_ODK) diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/rules.mk b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/rules.mk index e1888ddc..3662886d 100644 --- a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/rules.mk +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/rules.mk @@ -36,6 +36,7 @@ SRC += features/capslist.c SRC += features/macros.c SRC += features/oneshot.c SRC += features_conf.c +SRC += word_conf.c SRC += features/odk_layer.c INTROSPECTION_KEYMAP_C = features/combos.c diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/word_conf.c b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/word_conf.c new file mode 100644 index 00000000..d471722e --- /dev/null +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/word_conf.c @@ -0,0 +1,193 @@ +/* Copyright 2025 @Kawamashi + * + * 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 . + */ + +#include "word_conf.h" + + + +bool is_letter(uint16_t keycode) { + switch (keycode) { + case KC_A ... KC_F: + case KC_H ... KC_P: + case KC_R ... KC_S: + case KC_U ... KC_Z: + case PG_L: + case PG_E: + case KC_GRV ... KC_DOT: + return true; + + default: + return false; + } +} + +bool is_send_string_macro(uint16_t keycode) { + switch (keycode) { + case OU_GRV: + case MAGIC: + case PG_AROB: // because of Clever Keys + return true; + + default: + return false; + } +} + +bool is_followed_by_apos(uint16_t keycode, uint16_t prev_keycode) { + switch (keycode) { + case PG_Q: + return true; + + case PG_L: + case PG_T: + case PG_D: + case PG_C: + case PG_N: + case PG_S: + case PG_M: + case PG_Y: + case PG_J: + if (!is_letter(prev_keycode)) { return true; } + } + return false; +} + + +// Caps Word + +bool caps_word_press_user(uint16_t keycode) { + + if (IS_LAYER_ON(_ODK)) { + switch (keycode) { + + case PG_VIRG: + add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to next key. + return true; + + case PG_Y: // pour le tréma + case PG_T: // pour le trait d’union insécable + return true; + } + } + + // Keycodes that continue Caps Word, with shift applied. + // @ must be shifted, bc of CleverKeys using it. + if (is_letter(keycode) || is_send_string_macro(keycode)) { + add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to next key. + return true; + } + + switch (keycode) { + // Keycodes that continue Caps Word, without shifting. + case PG_ODK: + case PG_UNDS: + case PG_TIRE: + case PG_SLSH: + case KC_1 ... KC_0: + //case KC_LEFT: + //case KC_RIGHT: + case KC_BSPC: + case LCTL(KC_BSPC): + case KC_DEL: + case PG_APOS: + return true; + + default: + return false; // Deactivate Caps Word. + } +} + + +// Num Word + +bool should_exit_num_word(uint16_t keycode, const keyrecord_t *record) { + + switch (keycode) { + // Keycodes which should not disable num word mode. + + // Numpad keycodes + case KC_1 ... KC_0: + case KC_PDOT: + case PG_MOIN: + case PG_ASTX: + case PG_PLUS: + case PG_SLSH: + case PG_EGAL: + case PG_EXP: + case PG_IND: + case PG_H: + case PG_2PTS: + case NNB_SPC: + + // Misc + case KC_BSPC: + case PG_ODK: // Not to exit Numword when chording it with ODK + //case NUMWORD: // For the combo NUMWORD to work + return false; + } + + return true; +} + + +// Caps List + +bool should_continue_caps_list(uint16_t keycode) { + if (keycode == KC_BSPC) { + capslist_countdown--; + return true; + } + if (is_letter(keycode) || is_send_string_macro(keycode)) { + capslist_countdown++; + return true; + } + if (caps_word_press_user(keycode)) { + // This condition can't be merged with the previous one + // because caps_word_press_user adds shift to letters and send-string macros. + capslist_countdown++; + return true; + } + + // Keycodes that continue Caps List, but not Caps Word. + // These keycodes trigger the countdown to end Caps List. + switch (keycode) { + case PG_VIRG: + case KC_SPC: + capslist_countdown++; + return true; + } + return false; // Deactivate Caps List. +} + + +bool caps_word_reactivation(void) { + + // Words that continue Caps List. + if (recent[RECENT_SIZE - 1] == KC_SPC) { + if (recent[RECENT_SIZE - 4] == KC_SPC && recent[RECENT_SIZE - 3] == PG_E && recent[RECENT_SIZE - 2] == PG_T) { + countdown_end = 1; + return true; + } + if (recent[RECENT_SIZE - 4] == KC_SPC && recent[RECENT_SIZE - 3] == PG_O && recent[RECENT_SIZE - 2] == PG_U) { + countdown_end = 1; + return true; + } + if (recent[RECENT_SIZE - 2] == PG_VIRG) { + return true; + } + } + return false; +} \ No newline at end of file diff --git a/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/word_conf.h b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/word_conf.h new file mode 100644 index 00000000..7e5d30d9 --- /dev/null +++ b/keyboards/splitkb/kyria/rev1/base/keymaps/Kawamashi/word_conf.h @@ -0,0 +1,27 @@ +/* Copyright 2025 @Kawamashi + * + * 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 . + */ + + +#pragma once + +#include "quantum.h" +#include "keymap.h" + +bool is_letter(uint16_t keycode); +bool is_send_string_macro(uint16_t keycode); +bool is_followed_by_apos(uint16_t keycode, uint16_t prev_keycode); + +bool should_exit_num_word(uint16_t keycode, const keyrecord_t *record); \ No newline at end of file