• v1.7.4 189ddd4f3b

    V1.7.4 Stable

    serrebi released this 2026-06-21 09:35:32 -07:00 | 27 commits to main since this release

    Breaking

    • None

    Features

    • None

    Fixes

    • fix(a11y): announce virtual list rows to NVDA on arrow navigation

    Other

    • docs: add NVDA virtual list memory
    • The torrent list, file list, peers, trackers, and RSS article lists are all
    • wx.LC_VIRTUAL controls. NVDA announces the row carrying wx.LIST_STATE_FOCUSED,
    • but these lists never re-asserted a focused row after a refresh, so arrowing
    • went silent while Tabbing in still worked:
      • The torrent list's per-row Select() loop ran on every 2-second refresh, and
    • Select() sets only LVIS_SELECTED (never LVIS_FOCUSED), churning the focused
    • row out from under the user.
      • The Files/Peers/Trackers/Article lists called SetItemCount() on every refresh
    • (which wipes the focused row on a virtual list) and never established one.
    • Add AccessibleVirtualListMixin: after each populate it re-asserts a single
    • LIST_STATE_FOCUSED row via SetItemState (the state that fires the native MSAA
    • focus event NVDA reads), but only moves focus when the list actually holds
    • keyboard focus, so background refreshes never yank focus from elsewhere. The
    • torrent list preserves the focused row by hash across sort/refresh and
    • re-applies selection only when the row set actually changed; SetItemCount is
    • skipped when the count is unchanged.
    • Non-virtual controls (ListBox, CheckListBox, LC_SINGLE_SEL ListCtrl, TreeCtrl)
    • keep real per-item accessibles and were already fine.
    • Adds display-free unit tests for the focus-restoration decision logic.
    • Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
    Downloads