Fix issues with Oneshot disabling (#14934)

master
Drashna Jaelre 2021-11-01 09:41:24 -07:00 committed by GitHub
parent f7e94f6624
commit 2980c63d3d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 105 additions and 66 deletions

View File

@ -27,6 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "action_util.h" #include "action_util.h"
#include "action.h" #include "action.h"
#include "wait.h" #include "wait.h"
#include "keycode_config.h"
#ifdef BACKLIGHT_ENABLE #ifdef BACKLIGHT_ENABLE
# include "backlight.h" # include "backlight.h"
@ -87,6 +88,7 @@ void action_exec(keyevent_t event) {
keyrecord_t record = {.event = event}; keyrecord_t record = {.event = event};
#ifndef NO_ACTION_ONESHOT #ifndef NO_ACTION_ONESHOT
if (!keymap_config.oneshot_disable) {
# if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) # if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
if (has_oneshot_layer_timed_out()) { if (has_oneshot_layer_timed_out()) {
clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
@ -100,6 +102,7 @@ void action_exec(keyevent_t event) {
} }
# endif # endif
# endif # endif
}
#endif #endif
#ifndef NO_ACTION_TAPPING #ifndef NO_ACTION_TAPPING
@ -195,7 +198,7 @@ void process_record(keyrecord_t *record) {
if (!process_record_quantum(record)) { if (!process_record_quantum(record)) {
#ifndef NO_ACTION_ONESHOT #ifndef NO_ACTION_ONESHOT
if (is_oneshot_layer_active() && record->event.pressed) { if (is_oneshot_layer_active() && record->event.pressed && !keymap_config.oneshot_disable) {
clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
} }
#endif #endif
@ -260,7 +263,7 @@ void process_action(keyrecord_t *record, action_t action) {
# ifdef SWAP_HANDS_ENABLE # ifdef SWAP_HANDS_ENABLE
&& !(action.kind.id == ACT_SWAP_HANDS && action.swap.code == OP_SH_ONESHOT) && !(action.kind.id == ACT_SWAP_HANDS && action.swap.code == OP_SH_ONESHOT)
# endif # endif
) { && !keymap_config.oneshot_disable) {
clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
do_release_oneshot = !is_oneshot_layer_active(); do_release_oneshot = !is_oneshot_layer_active();
} }
@ -304,6 +307,32 @@ void process_action(keyrecord_t *record, action_t action) {
# ifndef NO_ACTION_ONESHOT # ifndef NO_ACTION_ONESHOT
case MODS_ONESHOT: case MODS_ONESHOT:
// Oneshot modifier // Oneshot modifier
if (keymap_config.oneshot_disable) {
if (event.pressed) {
if (mods) {
if (IS_MOD(action.key.code) || action.key.code == KC_NO) {
// e.g. LSFT(KC_LGUI): we don't want the LSFT to be weak as it would make it useless.
// This also makes LSFT(KC_LGUI) behave exactly the same as LGUI(KC_LSFT).
// Same applies for some keys like KC_MEH which are declared as MEH(KC_NO).
add_mods(mods);
} else {
add_weak_mods(mods);
}
send_keyboard_report();
}
register_code(action.key.code);
} else {
unregister_code(action.key.code);
if (mods) {
if (IS_MOD(action.key.code) || action.key.code == KC_NO) {
del_mods(mods);
} else {
del_weak_mods(mods);
}
send_keyboard_report();
}
}
} else {
if (event.pressed) { if (event.pressed) {
if (tap_count == 0) { if (tap_count == 0) {
dprint("MODS_TAP: Oneshot: 0\n"); dprint("MODS_TAP: Oneshot: 0\n");
@ -341,6 +370,7 @@ void process_action(keyrecord_t *record, action_t action) {
unregister_mods(mods); unregister_mods(mods);
} }
} }
}
break; break;
# endif # endif
case MODS_TAP_TOGGLE: case MODS_TAP_TOGGLE:
@ -523,6 +553,13 @@ void process_action(keyrecord_t *record, action_t action) {
# ifndef NO_ACTION_ONESHOT # ifndef NO_ACTION_ONESHOT
case OP_ONESHOT: case OP_ONESHOT:
// Oneshot modifier // Oneshot modifier
if (keymap_config.oneshot_disable) {
if (event.pressed) {
layer_on(action.layer_tap.val);
} else {
layer_off(action.layer_tap.val);
}
} else {
# if defined(ONESHOT_TAP_TOGGLE) && ONESHOT_TAP_TOGGLE > 1 # if defined(ONESHOT_TAP_TOGGLE) && ONESHOT_TAP_TOGGLE > 1
do_release_oneshot = false; do_release_oneshot = false;
if (event.pressed) { if (event.pressed) {
@ -556,6 +593,7 @@ void process_action(keyrecord_t *record, action_t action) {
} }
} }
# endif # endif
}
break; break;
# endif # endif
default: default:

View File

@ -170,7 +170,7 @@ void reset_oneshot_layer(void) {
void clear_oneshot_layer_state(oneshot_fullfillment_t state) { void clear_oneshot_layer_state(oneshot_fullfillment_t state) {
uint8_t start_state = oneshot_layer_data; uint8_t start_state = oneshot_layer_data;
oneshot_layer_data &= ~state; oneshot_layer_data &= ~state;
if ((!get_oneshot_layer_state() && start_state != oneshot_layer_data) || keymap_config.oneshot_disable) { if ((!get_oneshot_layer_state() && start_state != oneshot_layer_data) && !keymap_config.oneshot_disable) {
layer_off(get_oneshot_layer()); layer_off(get_oneshot_layer());
reset_oneshot_layer(); reset_oneshot_layer();
} }
@ -189,6 +189,7 @@ void oneshot_set(bool active) {
if (keymap_config.oneshot_disable != active) { if (keymap_config.oneshot_disable != active) {
keymap_config.oneshot_disable = active; keymap_config.oneshot_disable = active;
eeconfig_update_keymap(keymap_config.raw); eeconfig_update_keymap(keymap_config.raw);
clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
dprintf("Oneshot: active: %d\n", active); dprintf("Oneshot: active: %d\n", active);
} }
} }