forked from mirrors/qmk_userspace
		
	Fix issues with Oneshot disabling (#14934)
This commit is contained in:
		
					parent
					
						
							
								f7e94f6624
							
						
					
				
			
			
				commit
				
					
						2980c63d3d
					
				
			
		
					 2 changed files with 105 additions and 66 deletions
				
			
		| 
						 | 
				
			
			@ -27,6 +27,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		|||
#include "action_util.h"
 | 
			
		||||
#include "action.h"
 | 
			
		||||
#include "wait.h"
 | 
			
		||||
#include "keycode_config.h"
 | 
			
		||||
 | 
			
		||||
#ifdef BACKLIGHT_ENABLE
 | 
			
		||||
#    include "backlight.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -87,6 +88,7 @@ void action_exec(keyevent_t event) {
 | 
			
		|||
    keyrecord_t record = {.event = event};
 | 
			
		||||
 | 
			
		||||
#ifndef NO_ACTION_ONESHOT
 | 
			
		||||
    if (!keymap_config.oneshot_disable) {
 | 
			
		||||
#    if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
 | 
			
		||||
        if (has_oneshot_layer_timed_out()) {
 | 
			
		||||
            clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
 | 
			
		||||
| 
						 | 
				
			
			@ -100,6 +102,7 @@ void action_exec(keyevent_t event) {
 | 
			
		|||
        }
 | 
			
		||||
#        endif
 | 
			
		||||
#    endif
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef NO_ACTION_TAPPING
 | 
			
		||||
| 
						 | 
				
			
			@ -195,7 +198,7 @@ void process_record(keyrecord_t *record) {
 | 
			
		|||
 | 
			
		||||
    if (!process_record_quantum(record)) {
 | 
			
		||||
#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);
 | 
			
		||||
        }
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -260,7 +263,7 @@ void process_action(keyrecord_t *record, action_t action) {
 | 
			
		|||
#    ifdef SWAP_HANDS_ENABLE
 | 
			
		||||
        && !(action.kind.id == ACT_SWAP_HANDS && action.swap.code == OP_SH_ONESHOT)
 | 
			
		||||
#    endif
 | 
			
		||||
    ) {
 | 
			
		||||
        && !keymap_config.oneshot_disable) {
 | 
			
		||||
        clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
 | 
			
		||||
        do_release_oneshot = !is_oneshot_layer_active();
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -304,6 +307,32 @@ void process_action(keyrecord_t *record, action_t action) {
 | 
			
		|||
#    ifndef NO_ACTION_ONESHOT
 | 
			
		||||
                case MODS_ONESHOT:
 | 
			
		||||
                    // 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 (tap_count == 0) {
 | 
			
		||||
                                dprint("MODS_TAP: Oneshot: 0\n");
 | 
			
		||||
| 
						 | 
				
			
			@ -341,6 +370,7 @@ void process_action(keyrecord_t *record, action_t action) {
 | 
			
		|||
                                unregister_mods(mods);
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
#    endif
 | 
			
		||||
                case MODS_TAP_TOGGLE:
 | 
			
		||||
| 
						 | 
				
			
			@ -523,6 +553,13 @@ void process_action(keyrecord_t *record, action_t action) {
 | 
			
		|||
#        ifndef NO_ACTION_ONESHOT
 | 
			
		||||
                case OP_ONESHOT:
 | 
			
		||||
                    // 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
 | 
			
		||||
                        do_release_oneshot = false;
 | 
			
		||||
                        if (event.pressed) {
 | 
			
		||||
| 
						 | 
				
			
			@ -556,6 +593,7 @@ void process_action(keyrecord_t *record, action_t action) {
 | 
			
		|||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
#            endif
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
#        endif
 | 
			
		||||
                default:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -170,7 +170,7 @@ void reset_oneshot_layer(void) {
 | 
			
		|||
void clear_oneshot_layer_state(oneshot_fullfillment_t state) {
 | 
			
		||||
    uint8_t start_state = oneshot_layer_data;
 | 
			
		||||
    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());
 | 
			
		||||
        reset_oneshot_layer();
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -189,6 +189,7 @@ void oneshot_set(bool active) {
 | 
			
		|||
    if (keymap_config.oneshot_disable != active) {
 | 
			
		||||
        keymap_config.oneshot_disable = active;
 | 
			
		||||
        eeconfig_update_keymap(keymap_config.raw);
 | 
			
		||||
        clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
 | 
			
		||||
        dprintf("Oneshot: active: %d\n", active);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue