Harden Wine standard control support

This commit is contained in:
Storm Dragon
2026-07-17 22:18:25 -04:00
parent f6b7f2ad71
commit 2100fba3ce
3 changed files with 294 additions and 39 deletions
+14 -7
View File
@@ -10,15 +10,16 @@ The manager starts one helper per prefix, uses `WINEPREFIX` or
`STEAM_COMPAT_DATA_PATH/pfx`, and passes the prefix's own loader through `WINELOADER`. Discovery
requires an actual Wine loader process, so exported prefix variables and idle `wineserver`
processes do not keep helpers alive. A helper is stopped after its prefix has been idle for ten seconds. Repeated early exits use exponential
restart backoff. If an actual NVDA window already exists in the prefix, the helper exits and yields
to it.
restart backoff. If an actual NVDA window already exists in the prefix, the helper yields the
controller endpoint to it while continuing to provide standard-dialog reading.
## Controller Compatibility
The helper registers the current `NvdaCtlr.<session>.<desktop>` local RPC endpoint, the legacy
`NvdaCtlr` endpoint used by older official controller clients, and the Controller 1, 2, and 3
interface UUIDs. It also creates the `wxWindowClassNR` / `NVDA` window used
by official Tolk releases for detection. Therefore applications can keep the original
by official Tolk releases for detection. The compatibility window is explicitly hidden,
nonactivating, and excluded from ordinary window switching. Therefore applications can keep the original
`nvdaControllerClient32.dll`, `nvdaControllerClient64.dll`, and `Tolk.dll`; no DLL override is
required.
@@ -33,10 +34,16 @@ The current Meson target builds the 64-bit helper. A 32-bit helper requires a 32
## Standard Dialog Reading
The first reader stage listens for MSAA focus, name, value, state, and selection events. This makes
ordinary Win32 dialogs and controls useful. It does not expose custom-drawn, DirectX, or
game-specific interfaces. UI Automation coverage and an AT-SPI object broker remain separate later
stages; the current helper presents normalized events directly through Cthulhu.
The first reader stage listens for MSAA focus, name, value, state, and selection events. When Wine's
MSAA proxy has no useful data for a standard control, the helper falls back to the control's Win32
class and message protocol. Combo boxes, list boxes, edits, buttons, sliders, and static controls can
therefore expose useful names, roles, values, and states without replacing the MSAA path for controls
which already read correctly.
This class-based fallback is adapted from the LGPL `wine-a11y` reader published by Mudb0y.
The reader does not expose custom-drawn, DirectX, or game-specific interfaces. UI Automation coverage
and an AT-SPI object broker remain separate later stages.
## Prism