~ruther/qmk_firmware

e0eb90aba127f6bceacc9112bb89cb86da19f768 — NapOli1084 1 year, 8 months ago f35dee5
Fix OSM on a OSL activated layer (#20410)

2 files changed, 47 insertions(+), 1 deletions(-)

M quantum/action.c
M tests/basic/test_one_shot_keys.cpp
M quantum/action.c => quantum/action.c +1 -1
@@ 374,7 374,7 @@ void process_action(keyrecord_t *record, action_t action) {
    if (is_oneshot_layer_active() && event.pressed &&
        (action.kind.id == ACT_USAGE || !(IS_MODIFIER_KEYCODE(action.key.code)
#    ifndef NO_ACTION_TAPPING
                                          || (tap_count == 0 && (action.kind.id == ACT_LMODS_TAP || action.kind.id == ACT_RMODS_TAP))
                                          || ((action.kind.id == ACT_LMODS_TAP || action.kind.id == ACT_RMODS_TAP) && (action.layer_tap.code <= MODS_TAP_TOGGLE || tap_count == 0))
#    endif
                                              ))
#    ifdef SWAP_HANDS_ENABLE

M tests/basic/test_one_shot_keys.cpp => tests/basic/test_one_shot_keys.cpp +46 -0
@@ 337,3 337,49 @@ TEST_F(OneShot, OSLWithAdditionalKeypress) {
    run_one_scan_loop();
    VERIFY_AND_CLEAR(driver);
}

TEST_F(OneShot, OSLWithOsmAndAdditionalKeypress) {
    TestDriver driver;
    InSequence s;
    KeymapKey  osl_key     = KeymapKey{0, 0, 0, OSL(1)};
    KeymapKey  osm_key     = KeymapKey{1, 1, 0, OSM(MOD_LSFT), KC_LSFT};
    KeymapKey  regular_key = KeymapKey{1, 1, 1, KC_A};

    set_keymap({osl_key, osm_key, regular_key});

    /* Press OSL key */
    EXPECT_NO_REPORT(driver);
    osl_key.press();
    run_one_scan_loop();
    VERIFY_AND_CLEAR(driver);

    /* Release OSL key */
    EXPECT_NO_REPORT(driver);
    osl_key.release();
    run_one_scan_loop();
    EXPECT_TRUE(layer_state_is(1));
    VERIFY_AND_CLEAR(driver);

    /* Press and release OSM */
    EXPECT_NO_REPORT(driver);
    osm_key.press();
    run_one_scan_loop();
    osm_key.release();
    run_one_scan_loop();
    EXPECT_TRUE(layer_state_is(1));
    VERIFY_AND_CLEAR(driver);

    /* Press regular key */
    EXPECT_REPORT(driver, (osm_key.report_code, regular_key.report_code)).Times(1);
    EXPECT_EMPTY_REPORT(driver);
    regular_key.press();
    run_one_scan_loop();
    EXPECT_FALSE(layer_state_is(1));
    VERIFY_AND_CLEAR(driver);

    /* Release regular key */
    EXPECT_NO_REPORT(driver);
    regular_key.release();
    run_one_scan_loop();
    VERIFY_AND_CLEAR(driver);
}

Do not follow this link