CI fixes for the previous commit:
- Windows: announce one BoundsChanged on the window root when the scene
resizes, so UIA raises LayoutInvalidated again. Widgets still do not
report their own bounds changes.
- macOS: collapse identical pending notifications per element within one
update, so one text selection change posts a single
AXSelectedTextChanged. Created/Destroyed keep every occurrence, in order.
- MinGW: link the UIA test harness with -municode and uuid, which fixes
the nightly MinGW build.
Backends:
- Split the AT-SPI backend into a private header plus connection, events,
tree/marshalling and method files. Break the 600-line D-Bus dispatcher
into one handler per interface.
- Split the UIA backend into a private header plus core, element provider
and text range files.
- Share hasState/hasAction in accessibilitybackend.hpp instead of three
per-backend copies.
CI and docs:
- Run test_atspi.py --multi-window on Linux: closing a secondary window
while an AT-SPI client stays connected.
- Add docs/articles/uiaccessibilityarchitecture.md (layer map, files,
invariants, per-backend layout, common tasks, test matrix) and link it
from the articles index and the accessibility guide.
- Add a unit test for the single layout notification on scene resize.
Teardown and identity:
- Detach native backends before scene children are destroyed and clear
mRoot afterwards, fixing a use-after-free when an AT-SPI client is
connected while a window closes.
- Invalidate a deleted widget's subtree once, top-down, before OnClose
handlers run (NODE_FLAG_DESTROYING). Descendants never walk into
destroyed parents, and deleted identities cannot be re-registered.
- Closing scenes expose no accessibility manager through either accessor.
- Deleting widgets no client has seen allocates no identity and emits no
events.
- Ignore events from widgets not yet attached to a scene.
Events:
- Keep the order of state and structural events; coalesce only adjacent
query-again hints.
- Stop emitting per-widget BoundsChanged; bounds are queried on demand.
- Report the Focused state and keyboard focus only on the projected focus
owner, through a shared helper used by both paths.
Model views:
- Lazy child count and child queries, cached sibling indexes, selection
and hit testing without enumerating rows.
- Row identities follow inserted and removed rows; removed rows are
pruned from native wrapper caches.
- Expose the active cell editor as the child of the row or cell it edits.
AT-SPI:
- Correct state bits (EXPANDABLE/EXPANDED, SENSITIVE, CHECKABLE,
SELECTABLE, READ_ONLY, SINGLE/MULTI_LINE, SELECTABLE_TEXT) and the
password-text and panel roles.
- Emit text-changed insert/delete, caret-moved and selection-changed
events, diffed once per frame. Support line granularity,
SetCaretOffset and selection editing.
- Track clients by bus name so the active flag clears on disconnect.
- Fix the I/O thread busy-spin and stranded dispatch backlog, flush
queued signals, and type-check Properties.Set values.
UIA:
- Raise focus only for the focused element.
- Defer UiaDisconnectProvider out of widget destruction.
- Keep providers alive for in-flight cross-thread requests.
- Reject unknown interfaces without a UI-thread round trip.
- Require window-specific client activity.
macOS:
- Avoid repeated full node info builds.
- Use sibling indexes and lazy child access.
- Fix label/value deduplication for list items.
Tests and docs:
- Add regression tests for focus ownership, teardown, event ordering,
lazy model identities, nested scenes and cell editors.
- Extend the AT-SPI validation scripts and document the current
performance characteristics and limitations.
- Prevent dense-map iterator invalidation during widget deletion.
- Invalidate widget and model references when scene ownership changes.
- Expose nested-scene controls through the host accessibility manager.
- Preserve identities when reparenting within the same host.
- Synchronize AT-SPI state access with asynchronous initialization.
- Wake the shared SDL event loop without retaining window-owned Input pointers.
- Add lifecycle regression tests and hidden multi-window AT-SPI validation.
- Ensure test-bus failures cannot skip child-process cleanup.
- handle UIA text rectangle allocation and coordinate failures safely
- run the native macOS accessibility lifecycle harness in CI
- add public documentation for accessibility configuration, semantics, testing, and performance
- replace the obsolete Windows validation report with the general accessibility guide
- link the accessibility guide from the README
- skip accessibility tests cleanly when no graphical display is available