Skip to content

fix: finalize stacked held modifiers (S_HOLD_RELEASE timeout) - #58

Merged
stasmarkin merged 1 commit into
release-0.6.2from
emdash/4-tests-fix-970i4
Jun 15, 2026
Merged

stasmarkin merged 1 commit into
release-0.6.2from
emdash/4-tests-fix-970i4

Conversation

@stasmarkin

Copy link
Copy Markdown
Owner

Проблема

Постоянно падали 4 ассерта в unit-тестах test_stirred_long_mod_smtd_press2_fixed (наборы caps_word_enable и complex_layout).

Сценарий: два мода зажаты стопкой (CTRL → стадия S_HOLD, сверху держится MT1), затем нижний CTRL отпускают, пока MT1 ещё активен. В SMTD_STAGE_HOLD отпускание не-верхнего состояния переводит его в SMTD_STAGE_HOLD_RELEASE, но smtd_apply_stage для этой стадии не планировал defer_exec — состояние зависало навсегда, а его модификатор оставался зарегистрированным.

Это не только ломало тесты, но и реальный баг прошивки: нижний из двух зажатых модификаторов застревал в нажатом состоянии.

Причина

Функция timeout_hold_release была определена, но нигде не использовалась — потерянный кусок исходного дизайна. По замыслу SMTD_STAGE_HOLD_RELEASE должен планировать её, чтобы зависший зажатый мод финализировался по release-терму.

Фикс

В smtd_apply_stage, ветка SMTD_STAGE_HOLD_RELEASE, добавлено планирование timeout_hold_release с release-термом — по аналогии с уже существующим SMTD_STAGE_TOUCH_RELEASE.

Тесты

  • Python unit: 117 тестов — OK
  • QMK 0.33.5 integration (8 сьют): 51 тест — все PASSED

Итого 168 тестов зелёные, exit code 0.

A held key released while another key is stacked on top entered
SMTD_STAGE_HOLD_RELEASE but never scheduled a deferred, so the state
hung forever and its modifier stayed registered. Schedule the
(previously dead) timeout_hold_release callback with the release term,
mirroring SMTD_STAGE_TOUCH_RELEASE.

Fixes the 4 failing test_stirred_long_mod_smtd_press2_fixed assertions
in caps_word_enable and complex_layout suites.
@stasmarkin
stasmarkin changed the base branch from main to release-0.6.2 June 15, 2026 20:22
@stasmarkin
stasmarkin merged commit b544b49 into release-0.6.2 Jun 15, 2026
4 checks passed
@stasmarkin
stasmarkin deleted the emdash/4-tests-fix-970i4 branch June 15, 2026 20:24
stasmarkin added a commit that referenced this pull request Jun 16, 2026
… fix

- Fix: SMTD_LT now uses native QMK layer_on/layer_off instead of the old
  LAYER_PUSH/LAYER_RESTORE (layer_move) macros. Layer activation is
  additive and no longer wipes foreign layer bits on release
  - fixes #57: a TG()/TO() toggled layer held alongside an SMTD_LT stays
    on after the SMTD_LT is released
  - unblocks #44: two SMTD_LT layers can coexist, so a tri-layer
    layer_state_set hook can light up the third layer
- Fix: a held key released while another key is stacked on top now
  schedules timeout_hold_release, so the state finalizes and its
  modifier is released instead of hanging forever (fixes #58)
- Tests: regression coverage for layer interaction in tests/unit/layer_features
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant