From 34a708feb8070f6eb0e09ae17427657fe15ab4fc Mon Sep 17 00:00:00 2001 From: Anthony Richir Date: Wed, 5 Sep 2018 15:29:11 +0200 Subject: [PATCH 1/3] Improvement of Space Cadet Shift by preventing to automatically apply a modifier on the key and allow to override the default modifier. Closes qmk/qmk_firmware#3815 --- docs/feature_space_cadet_shift.md | 16 ++++++++++------ quantum/quantum.c | 25 +++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/docs/feature_space_cadet_shift.md b/docs/feature_space_cadet_shift.md index bec7cbd3d9fd..427d2a58127c 100644 --- a/docs/feature_space_cadet_shift.md +++ b/docs/feature_space_cadet_shift.md @@ -25,9 +25,13 @@ COMMAND_ENABLE = no By default Space Cadet assumes a US ANSI layout, but if your layout uses different keys for parentheses, you can redefine them in your `config.h`. You can also disable the rollover, allowing you to use the opposite Shift key to cancel the Space Cadet state in the event of an erroneous press, instead of emitting a pair of parentheses when the keys are released. - -|Define |Default |Description | -|------------------------------|-------------|------------------------------------------------------------| -|`LSPO_KEY` |`KC_9` |The keycode to send when Left Shift is tapped | -|`RSPC_KEY` |`KC_0` |The keycode to send when Right Shift is tapped | -|`DISABLE_SPACE_CADET_ROLLOVER`|*Not defined*|If defined, use the opposite Shift key to cancel Space Cadet| +Also, by default, the Space Cadet applies modifiers LSPO_MOD and RSPC_MOD to keys defined by LSPO_KEY and RSPC_KEY. You can override this behavior by redefining those variables in your `config.h`. You can also prevent the Space Cadet to apply a modifier by defining DISABLE_SPACE_CADET_MODIFIER in your `config.h`. + +|Define |Default |Description | +|------------------------------|-------------|--------------------------------------------------------------------------------| +|`LSPO_KEY` |`KC_9` |The keycode to send when Left Shift is tapped | +|`RSPC_KEY` |`KC_0` |The keycode to send when Right Shift is tapped | +|`LSPO_MOD` |`KC_LSFT` |The keycode to send when Left Shift is tapped | +|`RSPC_MOD` |`KC_RSFT` |The keycode to send when Right Shift is tapped | +|`DISABLE_SPACE_CADET_ROLLOVER`|*Not defined*|If defined, use the opposite Shift key to cancel Space Cadet | +|`DISABLE_SPACE_CADET_MODIFIER`|*Not defined*|If defined, prevent the Space Cadet to apply a modifier to LSPO_KEY and RSPC_KEY| diff --git a/quantum/quantum.c b/quantum/quantum.c index ab47fa48ff48..df35a3246fa7 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -177,6 +177,13 @@ void reset_keyboard(void) { #define RSPC_KEY KC_0 #endif +#ifndef LSPO_MOD + #define LSPO_MOD KC_LSFT +#endif +#ifndef RSPC_MOD + #define RSPC_MOD KC_RSFT +#endif + // Shift / Enter setup #ifndef SFTENT_KEY #define SFTENT_KEY KC_ENT @@ -627,14 +634,21 @@ bool process_record_quantum(keyrecord_t *record) { } else { #ifdef DISABLE_SPACE_CADET_ROLLOVER - if (get_mods() & MOD_BIT(KC_RSFT)) { + if (get_mods() & MOD_BIT(RSPC_MOD)) { shift_interrupted[0] = true; shift_interrupted[1] = true; } #endif if (!shift_interrupted[0] && timer_elapsed(scs_timer[0]) < TAPPING_TERM) { + unregister_mods(MOD_BIT(KC_LSFT)); + #ifndef DISABLE_SPACE_CADET_MODIFIER + register_mods(MOD_BIT(LSPO_MOD)); + #endif register_code(LSPO_KEY); unregister_code(LSPO_KEY); + #ifndef DISABLE_SPACE_CADET_MODIFIER + unregister_mods(MOD_BIT(LSPO_MOD)); + #endif } unregister_mods(MOD_BIT(KC_LSFT)); } @@ -649,14 +663,21 @@ bool process_record_quantum(keyrecord_t *record) { } else { #ifdef DISABLE_SPACE_CADET_ROLLOVER - if (get_mods() & MOD_BIT(KC_LSFT)) { + if (get_mods() & MOD_BIT(LSPO_MOD)) { shift_interrupted[0] = true; shift_interrupted[1] = true; } #endif if (!shift_interrupted[1] && timer_elapsed(scs_timer[1]) < TAPPING_TERM) { + unregister_mods(MOD_BIT(KC_RSFT)); + #ifndef DISABLE_SPACE_CADET_MODIFIER + register_mods(MOD_BIT(RSPC_MOD)); + #endif register_code(RSPC_KEY); unregister_code(RSPC_KEY); + #ifndef DISABLE_SPACE_CADET_MODIFIER + unregister_mods(MOD_BIT(RSPC_MOD)); + #endif } unregister_mods(MOD_BIT(KC_RSFT)); } From afc189a81c7f09d861a0e131fb12628c09209ca3 Mon Sep 17 00:00:00 2001 From: Anthony Richir Date: Thu, 6 Sep 2018 16:32:32 +0200 Subject: [PATCH 2/3] Improve the use of the DISABLE_SPACE_CADET_MODIFIER flag to avoid unregistering KC_LSFT when equals to LSPO_MOD --- quantum/quantum.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/quantum/quantum.c b/quantum/quantum.c index df35a3246fa7..cc185b284a1f 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -640,14 +640,20 @@ bool process_record_quantum(keyrecord_t *record) { } #endif if (!shift_interrupted[0] && timer_elapsed(scs_timer[0]) < TAPPING_TERM) { - unregister_mods(MOD_BIT(KC_LSFT)); - #ifndef DISABLE_SPACE_CADET_MODIFIER - register_mods(MOD_BIT(LSPO_MOD)); + #ifdef DISABLE_SPACE_CADET_MODIFIER + unregister_mods(MOD_BIT(KC_LSFT)); + #else + #if LSPO_MOD != KC_LSFT + unregister_mods(MOD_BIT(KC_LSFT)); + register_mods(MOD_BIT(LSPO_MOD)); + #endif #endif register_code(LSPO_KEY); unregister_code(LSPO_KEY); #ifndef DISABLE_SPACE_CADET_MODIFIER - unregister_mods(MOD_BIT(LSPO_MOD)); + #if LSPO_MOD != KC_LSFT + unregister_mods(MOD_BIT(LSPO_MOD)); + #endif #endif } unregister_mods(MOD_BIT(KC_LSFT)); @@ -669,14 +675,20 @@ bool process_record_quantum(keyrecord_t *record) { } #endif if (!shift_interrupted[1] && timer_elapsed(scs_timer[1]) < TAPPING_TERM) { - unregister_mods(MOD_BIT(KC_RSFT)); - #ifndef DISABLE_SPACE_CADET_MODIFIER - register_mods(MOD_BIT(RSPC_MOD)); + #ifdef DISABLE_SPACE_CADET_MODIFIER + unregister_mods(MOD_BIT(KC_RSFT)); + #else + #if RSPC_MOD != KC_RSFT + unregister_mods(MOD_BIT(KC_RSFT)); + register_mods(MOD_BIT(RSPC_MOD)); + #endif #endif register_code(RSPC_KEY); unregister_code(RSPC_KEY); #ifndef DISABLE_SPACE_CADET_MODIFIER - unregister_mods(MOD_BIT(RSPC_MOD)); + #if RSPC_MOD != KC_RSFT + unregister_mods(MOD_BIT(RSPC_MOD)); + #endif #endif } unregister_mods(MOD_BIT(KC_RSFT)); From 5c6f7b660ccd3c6f629a55d7d6976e6e92c57175 Mon Sep 17 00:00:00 2001 From: leico Date: Sat, 8 Sep 2018 13:25:19 +0900 Subject: [PATCH 3/3] change #if to if statement --- quantum/quantum.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/quantum/quantum.c b/quantum/quantum.c index cc185b284a1f..71e2570e4c8e 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -643,17 +643,17 @@ bool process_record_quantum(keyrecord_t *record) { #ifdef DISABLE_SPACE_CADET_MODIFIER unregister_mods(MOD_BIT(KC_LSFT)); #else - #if LSPO_MOD != KC_LSFT + if( LSPO_MOD != KC_LSFT ){ unregister_mods(MOD_BIT(KC_LSFT)); register_mods(MOD_BIT(LSPO_MOD)); - #endif + } #endif register_code(LSPO_KEY); unregister_code(LSPO_KEY); #ifndef DISABLE_SPACE_CADET_MODIFIER - #if LSPO_MOD != KC_LSFT + if( LSPO_MOD != KC_LSFT ){ unregister_mods(MOD_BIT(LSPO_MOD)); - #endif + } #endif } unregister_mods(MOD_BIT(KC_LSFT)); @@ -678,17 +678,17 @@ bool process_record_quantum(keyrecord_t *record) { #ifdef DISABLE_SPACE_CADET_MODIFIER unregister_mods(MOD_BIT(KC_RSFT)); #else - #if RSPC_MOD != KC_RSFT + if( RSPC_MOD != KC_RSFT ){ unregister_mods(MOD_BIT(KC_RSFT)); register_mods(MOD_BIT(RSPC_MOD)); - #endif + } #endif register_code(RSPC_KEY); unregister_code(RSPC_KEY); #ifndef DISABLE_SPACE_CADET_MODIFIER - #if RSPC_MOD != KC_RSFT + if ( RSPC_MOD != KC_RSFT ){ unregister_mods(MOD_BIT(RSPC_MOD)); - #endif + } #endif } unregister_mods(MOD_BIT(KC_RSFT));