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_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:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue