Wine control integration
Temporary files and failure inspection
Wine CTests and the integration scripts below use fresh prefixes under the
temporary directory (/tmp by default). Successful runs stop their Wine
servers and remove their temporary files. Failures, timeouts and ordinary
interruptions retain the original files by default, with the directory path
printed before the test starts and again at exit. This preserves a one-off
failure for inspection without requiring a second reproduction. Retention
keeps files and registry state; test processes are still stopped.
Console output and fixture .log files are saved under
<build-dir>/Testing/WineAccessLogs/, outside the disposable prefix. These logs
remain even when temporary files are removed. CTest also keeps its usual
Testing/Temporary/LastTest.log report. Saved logs need occasional maintenance;
review them for private text before sharing.
To retain successful runs too, or explicitly clean a failed run:
xvfb-run -a python3 tests/menu_integration.py --build-dir build --keep
xvfb-run -a python3 tests/menu_integration.py --build-dir build --clean-on-failure
WINE_ACCESS_TEST_KEEP=1 xvfb-run -a ctest --test-dir build -V
WINE_ACCESS_TEST_KEEP_ON_FAILURE=0 xvfb-run -a ctest --test-dir build --output-on-failure
Each run requires at least 1024 MiB free on the temporary filesystem before
starting. If retained failures accumulate, the next run stops with an explicit
space error; it never deletes earlier evidence automatically. Remove retained
directories manually after inspecting them. TMPDIR can select another
filesystem, and WINE_ACCESS_TEST_MIN_FREE_MIB can adjust the space guard for
larger fixtures. CTests run serially because their fixtures share one display.
A teardown or log-preservation failure always retains the temporary files.
SIGKILL, machine shutdown and an outer test-runner kill cannot run Python
cleanup; occasional /tmp cleanup remains useful.
Check the runner without Wine:
python3 tests/wine_test_environment_test.py
UIA notifications
UIA notification routing uses the actual native application hooks and a private recording reader, without sending speech to the live reader:
xvfb-run -a python3 tests/notification_integration.py --build-dir build
xvfb-run -a python3 tests/notification_integration.py --build-dir build --32-bit --reader orca
To exercise a real 64-bit Prism DLL through its UIA backend, provide the matching
Prism C headers (prism.h and prism_version.h) without replacing the DLL:
xvfb-run -a python3 tests/notification_integration.py --build-dir build \
--prism-dll /path/to/prism.dll --prism-include /path/to/prism/headers
These checks cover Unicode text, interruption, empty-message cancellation, bounded payloads, and ignoring a background application's announcements. They do not establish audible speech. After installing, restart the reader and game; in Arcadelux, verify the introduction and repeated Up/Down menu announcements, including switching away and back. Also check existing NVDA/Tolk speech and ordinary Wine menus and Edit controls before submitting the change.
Reader reply stalls
Run sequentially on a private X display:
xvfb-run -a python3 tests/reader_stall_integration.py --build-dir build
xvfb-run -a python3 tests/reader_stall_integration.py --build-dir build --32-bit
xvfb-run -a python3 tests/reader_stall_integration.py --build-dir build --timeout
xvfb-run -a python3 tests/reader_stall_integration.py --build-dir build --focus-error
The recording reader delays an editor focus reply for 350 ms while its Wine
control types abbacdef. All eight actions, including repeated letters, must
arrive in order with focus established first, and native text and caret must
remain correct. --timeout extends the delay past the helper's D-Bus deadline;
--focus-error rejects the initial focus exchange and requires recovery before
later text. A second withheld reply checks normal helper shutdown. The fixture
waits for editor-hook attachment before typing, including the 32-bit host.
The original synchronous helper dropped six of the eight characters during the delayed-reply check. These private recordings establish that shared failure path; they do not establish the cause of every live MUSHclient speech pause. After installing the helper and restarting it, check command typing, incoming plugin speech, output-buffer arrows, menus, return from Linux applications and reader restart in MUSHclient. Check ordinary Notepad editing and password exclusion too. Audible speech and physical braille need separate live checks.
MSAA event stalls
Run sequentially on a private X display, for example with xvfb-run -a:
python3 tests/event_stall_integration.py --build-dir build
python3 tests/event_stall_integration.py --build-dir build --32-bit
python3 tests/event_stall_integration.py --build-dir build --getter
python3 tests/event_stall_integration.py --build-dir build --background
python3 tests/event_stall_integration.py --build-dir build --popup
The fixture needs the matching MinGW C++ compiler. It uses a disposable prefix
and recording reader service. It stalls either WM_GETOBJECT or MSAA
text-property retrieval for eight seconds. A separate foreground
application must deliver both repeated typed characters and native button
feedback before that stall ends, preserving native text, caret and selection.
The old focus must not surface afterward. A second stall checks normal
WM_QUIT shutdown before the provider completes. Background focus events must
neither query unrelated providers nor invalidate foreground feedback, and an
owned nonactivating accessible popup must retain reading without moving native
focus. Use --reader orca to check the alternate recording endpoint.
On October 12 the supplied Cthulhu log showed successful reader D-Bus calls, continued Xorg input and clean reader shutdown; it did not establish a reader crash. Source inspection found synchronous MSAA calls on the helper event thread. The original helper failed the blocked-provider typing check; the same editor fixture without a blocked provider passed. These synthetic checks establish the shared hang path, not the exact cause of every live MUSHclient failure. Recheck MUSHclient command typing, incoming plugin output, menus, plugin output-buffer arrows and keypad review after installing the helper and restarting the reader. Listen to speech and check physical braille separately.
Reader endpoint selection
After building, run these checks sequentially on private displays:
xvfb-run -a python3 tests/controller_integration.py --build-dir build
xvfb-run -a python3 tests/controller_integration.py --build-dir build --reader orca
xvfb-run -a python3 tests/menu_integration.py --build-dir build --reader orca
xvfb-run -a python3 tests/menu_integration.py --build-dir build --reader orca --fixture edit
xvfb-run -a python3 tests/review_integration.py --build-dir build --reader orca
The controller test drives the helper through a native Windows NVDA RPC client.
It verifies speech, cancellation, braille, SSML status forwarding, reader loss,
invalid reader values, and startup refusal when only the unselected service
exists. Both service names are owned while the selected reader handles requests.
It also rejects invalid endpoint overrides, missing objects/interfaces,
missing required methods and incorrect input/output signatures.
UIA speech and cancellation methods are checked even with the RPC controller
disabled; missing methods and incompatible input/output signatures must fail startup.
The menu/editor and review tests also accept --reader cthulhu; omit the option
to check existing default behavior. Review checks reject callers even when they
own the unselected service, then replace the selected service owner and verify
registration and capture access move to the new owner. Its provider object path
and interface remain the same for both readers.
To check an Orca extension endpoint, add --extension-endpoint:
xvfb-run -a python3 tests/controller_integration.py --build-dir build --reader orca --extension-endpoint
xvfb-run -a python3 tests/menu_integration.py --build-dir build --reader orca --extension-endpoint
xvfb-run -a python3 tests/menu_integration.py --build-dir build --reader orca --extension-endpoint --fixture edit
xvfb-run -a python3 tests/review_integration.py --build-dir build --reader orca --extension-endpoint
These publish /org/gnome/Orca1/Service/WineAccess with interface
org.gnome.Orca1.WineAccess, while retaining the org.gnome.Orca1.Service
bus name. Controller checks put overrides before reader selection; control
and review checks put them after it. Review checks still reject unrelated
callers and transfer capture access only when the selected bus owner changes.
These tests supply recording services implementing the Wine protocol; they do
not run Orca or prove audible speech or physical braille. Stock Orca still needs
the reader-side methods and helper lifecycle described in the
integration contract.
Before submitting, check Cthulhu's ordinary Wine menus, editor arrows, repeated
characters, selections, deletion, protected fields and keypad review with live
speech and braille. When an Orca integration exists, repeat those workflows
with --reader orca, including return to Linux controls and reader restart.
List-box navigation
For list-box navigation, run these checks sequentially:
xvfb-run -a python3 tests/menu_integration.py --build-dir build --fixture listbox
xvfb-run -a python3 tests/menu_integration.py --build-dir build --fixture listbox --32-bit
They cover native Up/Down navigation, Unicode text, positions, focus return, duplicate suppression, background changes and an emptied list. After installing the helper and restarting the reader, open AudioQuake's LDL tutorial/example map chooser and use Up/Down without leaving the list. Check that speech and braille follow each map and position, then Tab to OK/Cancel and Shift+Tab back. Recheck combo-box arrows, ordinary list views, tabs/trees and return from Wine menus. Recorded events alone do not establish audible speech or physical braille.
Virtual desktop focus recovery
xvfb-run -a ctest --test-dir build -R foreground-focus --output-on-failure
uses a disposable Wine prefix configured for a virtual desktop and a separate
Windows launcher fixture. It reproduces a visible launcher returned without
activation, then checks recovery of its native foreground and button focus.
It also checks Linux focus, mismatched window-manager/keyboard focus, disabled
windows, multiple visible applications, hidden windows, existing foreground,
and repeated recovery. It also reproduces X11 focus on the launcher child
with no Win32 foreground, as seen after AudioQuake exits. Recovery must restore
both Win32 activation/control focus and native keyboard focus, even when X11
already selects that child. The fixture deliberately leaves WM_STATE unset,
matching Wine's real virtual-desktop children. Adding a synthetic window-manager
acknowledgement masks the failure: native WM_TAKE_FOCUS alone can otherwise be
ignored while Wine awaits that state change. The runner propagates the fixture's
actual exit status.
Recovery queues SetWindowPos activation on the application's own window
thread and sets native X11 focus without changing its size or position. It
does not wait on the application's window procedure. A dispatched request
alone is not acceptance: the fixture then checks Win32 foreground and the
restored button focus after the application processes activation.
After installing the updated helper and restarting the reader, open AudioQuake, play and close a game, then Tab and Shift+Tab through the launcher. Check speech and braille for each control. Switch to Linux and back to workspace 3 and repeat. Recheck ordinary Wine menus, edits and lists, including password exclusion. With two visible applications in one virtual desktop, recovery intentionally does not choose between them; focus the intended application normally. Automated focus checks do not prove audible speech or physical braille.
Wine flat-review capture
Build the helper and run ctest --test-dir build --output-on-failure on a
private display. The review fixture covers both architectures: visible Edit
text, Unicode offsets before the viewport, wrapping/blank lines, an empty
focus anchor, hidden/password exclusion, password transitions before copying,
clipping, same-length Edit/ListBox/ListView races, native ListView cells,
negative coordinates, source limits and unchanged focus/selection.
It also covers output serviced by a 16 ms message loop, late scalar replies,
nested native containers, deeply clipped text, and maximized versus side-by-side
MDI documents. Covered documents are excluded while visible titles remain
available. These checks reproduce capture failures that can make review report
that it cannot find the current location despite valid Wine focus.
The padded MSAA status-name case checks that text after its terminating NUL
does not reach D-Bus and that range lengths match the text actually sent.
A local provider also checks that malformed UTF-16 padding cannot hide the
valid label.
Run python3 tests/review_integration.py --build-dir build and its --32-bit
variant sequentially. These exercise the exact wire types, actual-owner
authorization, deadline/busy behavior, blocked-provider focus feedback,
shutdown and older-reader compatibility. The matching reader's
tests/wine_review_x11.py drives physical XTest keycodes through its real
command router, D-Bus registry and speech/braille queues. Run its Go test with
CTHULHU_WINE_REVIEW_BUILD=/absolute/build and
go test ./internal/app -run NativeWineReviewPhysicalKeys -count=1 -v on a
private session/display; add CTHULHU_WINE_REVIEW_32=1 for a 32-bit application.
Recorded output proves queued text and input consumption, not audible speech or physical braille. In MUSHclient, focus the plugin's output text window and check current/previous/next line, words, characters, spelling/phonetics and window boundaries. Confirm review does not move the native caret; then confirm ordinary arrows and newly arriving game output still work. Check plugin dialogs and return to Linux/Fenrir. Custom painted output needs the output plugin; this protocol supplies no native braille routing or Say All.
Build the project, then run python3 tests/menu_integration.py --build-dir build
from the repository root in a graphical session. Dependencies are Wine,
MinGW's x86_64 and i686 C compilers, PyGObject, and dbus-run-session.
The test creates a temporary Wine prefix and a private D-Bus service. Its 64-bit PE application exercises the separately running Winelib helper's global menu hook, rather than calling helper functions inside the fixture. The test processes carry the managed-helper marker so the running Cthulhu supervisor does not start an additional helper in the test prefix.
Checks include actual keyboard navigation through File/Edit menus, a nested
submenu and a context menu; displayed command shortcuts; checked and disabled
items; escaped ampersands; duplicate menu selections and reopening; restored
button focus; and exiting with both reader capabilities disabled. Additional
WM_MENUSELECT messages exercise duplicate notifications deterministically.
The menu fixture also returns an application-owned MSAA object through
WM_GETOBJECT/LresultFromObject. The separate helper must retrieve its
client role through COM; native text fallback cannot satisfy the check.
This catches missing COM initialization that ordinary Wine control proxies
and the native menu hook did not expose.
The fixture window takes focus and closes automatically. Cleanup stops only the Wine server for the temporary prefix. The recorded events never reach the running reader's speech or braille service.
For live acceptance, rebuild/install the package and restart Cthulhu so it launches the updated helper. In a 64-bit Wine application, use Alt to reach File/Edit, arrows to move through commands and submenus, Escape to return, and Shift+F10 for a context menu where supported. Verify speech and braille contain the highlighted label, role, displayed shortcut, and checked/unavailable state, and that normal control reading resumes afterward. Test multiple Wine prefixes and reader shutdown separately. Automated event recording does not establish live listening or physical braille acceptance.
Entirely custom menus without WM_MENUSELECT and full object review are outside
the current implementation.
BARD Express managed menus
The October 10 investigation found two independent blockers. The helper's
message-loop thread did not initialize COM, so application-owned MSAA queries
failed with CO_E_NOTINITIALIZED and used native window text such as MenuBar.
The helper now initializes a single-threaded COM apartment before registering
callbacks and uninitializes it after removing them. The new marshaled-provider
check passes with the fix and fails with the previous helper.
BARD's prefix also registered IAccessible against UIA type library
{930299CE-9965-4DEC-B0F4-A54848D4B667}, version 1.0, while its installed
uiautomationcore.dll lacked the registered resource 3.
An initialized read-only query failed with TYPE_E_CANTLOADLIBRARY.
After backing up the prefix registry, the 32-bit and 64-bit
HKLM\Software\Classes\Interface\{618736E0-3C3D-11CF-810C-00AA00389B71}\TypeLib
registrations were pointed to the loadable standard accessibility type library
{1EA4DBF0-3C3B-11CF-810C-00AA00389B71}, version 1.1.
Read-only inspection then retrieved Account/View/Help and their command labels,
shortcuts and unavailable states from the open application. This repair is
specific to a verified prefix mismatch; the helper does not change registries.
After installing the helper, restart Cthulhu to load it. In BARD, press Alt, move Left/Right among Account, View and Help, then Down/Up among commands. Check unavailable items while working offline and Escape back to the main screen. Recheck Tab/Shift+Tab through buttons, preferences and login fields, including password exclusion, and ordinary Wine Notepad menus/editing. Verify audible speech and physical braille separately; querying menu labels alone does not establish either output gate.
Editor and actual Notepad checks
The CMake build also includes a small MSAA state decoder check. Run it with
xvfb-run -a ctest --test-dir build --output-on-failure. It uses its own prefix
under the build directory, marks it as a managed test process and never sends
reader output. It verifies combined bitmasks, unchecked radio buttons, mixed
checkboxes, focus-only state suppression and password flags. It does not
establish that a particular application's MSAA provider emits those states.
Run these against the built helper, optionally prefixed with xvfb-run -a for
a private X display:
python3 tests/menu_integration.py --build-dir build --fixture edit
python3 tests/menu_integration.py --build-dir build --fixture edit --late-helper
python3 tests/menu_integration.py --build-dir build --fixture edit --restart-helper
python3 tests/menu_integration.py --build-dir build --fixture edit --32-bit
python3 tests/menu_integration.py --build-dir build --fixture edit --32-bit --late-helper
python3 tests/menu_integration.py --build-dir build --fixture edit --32-bit --restart-helper
python3 tests/menu_integration.py --build-dir build --fixture winforms --32-bit
python3 tests/menu_integration.py --build-dir build --fixture notepad
The standard Edit fixture checks focus, typing echo, characters/words/lines, incremental selection and unselection, Backspace/Delete/Clear, read-only controls, password exclusion, surrogate pairs, rapid repeated letters, menu return at the caret, short replacements, CRLF deletion, long-line truncation, Undo snapshots, and Ctrl+End line reading, and Up/Down navigation in a read-only multiline output control. Typing checks include repeated letters, spaces, Enter/Tab, accented characters, surrogate pairs, selection replacement, documents beyond the full snapshot limit, and silence for password/background/read-only fields and input rejected at the text limit. Command-history checks consume queued Up/Down before dispatch, then replace the text and move the caret as MUSHclient does. They require ordered, single announcements for equal-length and rapid recalls and empty input, with no password, background or unrelated programmatic output. An unchanged history boundary is followed by a worker-thread text replacement before another queued message is removed. That replacement must stay silent, and subsequent navigation must read from the updated text snapshot. Both 32-bit and 64-bit fixtures use the same assertions. Lifecycle variants attach after the control has focus or restart the helper without closing it. Every text action must have an established focus source, matching the Go reader's filtering contract.
The Notepad fixture launches Wine's actual notepad.exe and uses SendInput
for typing, arrows, Ctrl+Right, Shift selection, Delete, and Alt/Escape menu return.
It checks resulting document text as well as recorded accessibility output. These
tests use a recording D-Bus service; they do not run the full reader or prove
audible typing echo, physical keys, or a physical braille display.
For live MUSHclient acceptance, install the helper, restart Cthulhu and reopen
MUSHclient so the updated 32-bit DLL can load. In the command field, check Left/Right and
Ctrl+Left/Right feedback without submitting a command. Use Up/Down to recall
existing command history. Check each recalled command is spoken once,
including equal-length entries and blank when returning to empty input.
Do not submit recalled commands just to test speech.
Use Ctrl+Tab to reach the read-only output notepad supplied by the Aardwolf
review-buffer plugin; check Up/Down line reading and Left/Right characters
there, then return to the command field. Check plugin menus and dialogs still
work, and repeat after restarting the reader. These hooks provide caret feedback; independent review
commands use the optional flat-review protocol described above. Native braille
routing into Wine text remains unsupported.
The earlier 2026-10-10 helper fixtures and Go package tests did not establish
that Go accepted editor text events. The reader follow-up adds that support,
focused name/state handling, repeated-action and password/focus tests, and a
real private-session D-Bus test through the Go presenter. See the sibling
reader's docs/testing/wine-accessibility.md for current evidence and live
acceptance gates. Run Xvfb fixtures sequentially; concurrent automatic display
allocation can collide.
GoldWave menus and combo boxes
The helper supplies both 32-bit and 64-bit menu hooks. Check both architectures:
xvfb-run -a python3 tests/menu_integration.py --fixture menu
xvfb-run -a python3 tests/menu_integration.py --fixture menu --32-bit
xvfb-run -a python3 tests/menu_integration.py --fixture controls
xvfb-run -a python3 tests/menu_integration.py --fixture controls --32-bit
xvfb-run -a python3 tests/menu_integration.py --fixture goldwave --goldwave-exe /path/to/GoldWave.exe
The controls fixture changes a combo selection without emitting a value WinEvent. It requires the new value while focus stays on the combo, with the same source identity as its focus event. This catches both missing polling and Wine's misleading focus notifications for the combo's internal list.
The optional GoldWave 5.70 fixture copies the application directory into a temporary directory and uses a fresh Wine prefix with Force screen reader mode enabled. It waits for the actual main form, dismisses the first-run settings prompt in the test copy, and drives Alt+F, menu arrows, Ctrl+O and file-type combo Down/Down/Up using SendInput. On October 11 it received File, New, Open and unavailable Close menu events, followed by Wave/MPEG Audio/Wave value updates without tabbing away. This confirms helper events through the private D-Bus recorder; audible speech and physical braille need live checks.
Install all five helper artifacts together, restart Cthulhu, and reopen GoldWave. With screen reader mode enabled, check File and other menus with Alt and arrows, then Escape back to the previous control. In Open Sound, check Files of type and Look in with arrows: expect the new value immediately in speech and braille, with keyboard focus remaining on the combo. Repeat Tab/Shift+Tab and Alt+Down/Escape dropdown opening and closing.
Notepad++ / Scintilla checks
Use a locally available 64-bit Notepad++ executable:
xvfb-run -a python3 tests/menu_integration.py --build-dir build --fixture scintilla --notepadpp-exe /path/to/notepad++.exe
The runner copies the executable and model XML files into a temporary directory,
uses local configuration, disables plugins/session restoration, and opens a
disposable UTF-8 document in its private Wine prefix. The user's running
Notepad++ and documents are untouched. The fixture uses actual SendInput
arrows, Ctrl+Right, Shift selection, Delete, Backspace, undo and menu return;
checks Ctrl+X, multibyte accented characters, emoji, a document over one million
bytes and truncation at a surrogate pair; and verifies document length
after a read-only deletion attempt. Add --late-helper or --restart-helper
to check attachment and reader restart while the editor stays open.
After installing, restart Cthulhu and close/reopen Notepad++ so its process loads the new DLL. In a disposable document with several lines, accented characters and emoji, check Up/Down line reading and Left/Right character reading in both directions. Check Ctrl+Left/Right words, Shift selection and unselection, Backspace/Delete, undo, Alt/Escape return and switching document tabs. Repeat ordinary Wine Notepad editing, menu navigation, and password fields in other applications for regressions. Check speech and physical braille separately. These recorder tests do not establish either live output.
List-view checks
xvfb-run -a python3 tests/menu_integration.py --build-dir build --fixture list
xvfb-run -a python3 tests/menu_integration.py --build-dir build --fixture list --32-bit
The second command requires i686-w64-mingw32-gcc. Both use a private prefix
and recording D-Bus service. They verify first-row reading without selecting
it, two columns, Unicode and literal ampersands, Down/Up, button/list focus
return, changed row text on a value event, and deletion of all rows without
stale output. Run them sequentially. Both architecture fixtures passed on
October 10, as did the existing menu, editor, actual Notepad and CTest MSAA
state checks. The reader's focused Wine race checks also passed.
The BARD Express bootstrapper was inspected in place on October 10. Its
32-bit SysListView32 has one row: Pending, Microsoft .NET Framework 4.7.2 Full.
The new query code retrieved that row without changing the installer. This
does not establish audible output or successful prerequisite installation.
After installing the helper and restarting Cthulhu, Tab to the prerequisite
list: expect the instructions, list role, pending component and 1 of 1.
Check arrows and Tab/Shift+Tab back to Install/Cancel. Also check a multirow
native list, normal menus, editor navigation, switching to a native Linux
application, and reader shutdown. Verify speech and physical braille separately.
Delphi Setup lists and checkboxes
The October 10 GoldWave 5.70 Setup inspection found a 32-bit TListView
with 14 checkbox rows, plus TButton and TBitBtn controls. Wine exposed
them as generic MSAA clients; the list client's name/value were empty. Focus
events were present for the buttons and on return to the list. The native
messages already exposed the option captions and checkbox state, but the
helper did not recognize these VCL class names or read list checkbox states.
The explicit VCL aliases and native checkbox query fix those shared gaps.
The updated query code read the actual open Setup's first option, Disable effect plug-ins, not checked, position 1 of 14, and the Backup/Restore/OK/
Cancel button roles without changing settings or sending speech. A later
live registry query also confirmed StartupOptions=0x3008 and Setup showed
Force screen reader mode checked; the earlier immediate persistence query
had still seen 0x1008.
xvfb-run -a python3 tests/menu_integration.py --build-dir build --fixture delphi --32-bit
xvfb-run -a python3 tests/menu_integration.py --build-dir build --fixture delphi
Both fixtures passed with native controls registered under VCL names. They check initial rows/labels, Down navigation, Space check/uncheck without synthetic accessibility events, button roles, return to the checked row, and empty-list state reset. The existing 32-bit plain-list regression also passed. These are private D-Bus recordings; audible GoldWave speech and physical braille remain a live acceptance check after installing the helper and restarting Cthulhu. List queries are independent of the menu/editor hooks.
Native tabs, trees and named clients
xvfb-run -a python3 tests/menu_integration.py --build-dir build --fixture controls
xvfb-run -a python3 tests/menu_integration.py --build-dir build --fixture controls --32-bit
These private fixtures exercise native and ATL:SysTabControl32 tab captions,
positions and arrow navigation, tree selection/expansion/navigation and focus
return, named native buttons exposed as generic MSAA clients, and combo boxes
with labels created after their fields. The 64-bit fixture also checks the
editor hook's late native label. Empty tabs/trees must drop their previous
caption. The existing menu, editor, Notepad, list and managed-field fixtures
remain regression checks; an application-owned MSAA provider in the menu
fixture must retain its role instead of being replaced by native queries.
The controls fixture also verifies literal ampersands in combo-box, edit and
list-box values and window titles, escaped ampersands in button/label captions,
and literal SS_NOPREFIX labels. Both control architectures exercise the
shared remote allocation used by native tabs and trees; the list fixtures
exercise the same allocation for multi-column rows.
Read-only inspection of foobar2000 v2.26.1 with the new native query code
retrieved All Music, Album List, and Default Playlist from the open
application. This identifies data missed by the old helper; it does not prove
live speech, physical braille, or complete foobar2000 support. Its custom
playlist MSAA provider is separate from native tabs and trees.
After rebuilding/installing all three helper files, restart the reader and reopen foobar2000 after saving work. Tab and Shift+Tab through the album tree, View combo box, Filter edit, album/property tabs and playlist tabs. Expect captions plus their roles; arrows should read the new selected tab/tree node, with expanded/collapsed states where appropriate. Check native buttons, combo-box value changes, custom playlist item reading, Alt menus and Escape return, ordinary Notepad editing, password exclusion, and switching back to a native Linux application. Verify speech and physical braille separately.
Windows Forms login fields
xvfb-run -a python3 tests/menu_integration.py --build-dir build --fixture winforms
xvfb-run -a python3 tests/menu_integration.py --build-dir build --fixture winforms --late-helper
This reuses the editing workflow with native controls registered under
Windows Forms class names and labels created after the fields. It verifies
Email, edit focus, Password, edit, password with no protected value,
navigation/selection/deletion and unrelated-label exclusion. It does not run
the .NET framework itself or establish live BARD speech/braille acceptance.
The ordinary and late-helper managed fixtures passed on October 10, together
with the existing native editor, Notepad, menu and 32/64-bit list regressions.
Read-only inspection of the BARD login on October 10 confirmed a 64-bit
Windows Forms application with WindowsForms10.EDIT.app.* email/password
controls, adjacent visible Email:/Password: labels, and the ES_PASSWORD
style on the password field. Its MSAA objects were unavailable to the probe;
the previous exact Edit class checks missed both fields. The helper now
recognizes the managed native-control class names in its standard reader and
editor hook. Existing native controls keep their original label lookup.
After installing the updated package, close BARD and restart Cthulhu so its helper and the application load the new DLL together. Reopen BARD in its own prefix. Tab and Shift+Tab between Email, Password, Sign in and Work Offline. Expect labels and edit/password roles; navigate and select ordinary email text, and confirm password contents stay excluded. Recheck native Notepad, menus, the installer list and switching to Linux applications. Standard Edit typing echo is now forwarded through editor events; routable Wine review remains unfinished.
Live Notepad acceptance
Install all three helper files together and use the matching Cthulhu source. Close existing Notepad windows after saving any work so the updated hook can load.
- Quit Cthulhu with Cthulhu+Q.
- Press Ctrl+Escape, then Shift+G. These are separate key presses. Shift+G rebuilds Cthulhu and its braille helper and opens the test terminal; it does not build wine-access.
- Run
wine notepadin the intended Wine prefix. Expect edit/blank focus feedback. Typehello beta, Enter, thensecond line. Expect each typed character, including bothlcharacters, spaces and the line break. Standard Edit typing uses the reader's editor feedback path. Check typing over selected text too, and confirm password fields never announce their typed contents. TypeAaÉé: capitals should use Cthulhu's uppercase pitch, with normal pitch restored for each lowercase letter. Repeat with a custom character echo voice if configured, and confirm braille preserves the original case. - Press Ctrl+Home, then Right three times. Expect the first line at Ctrl+Home,
then
e,l,l. Both repeated letters should produce feedback. Ctrl+Right should readbeta; Down should readsecond line. - Press Home, Shift+Right twice, then Shift+Left twice. Expect
s selected,e selected,e unselected,s unselected. Focus stays in the edit area. Delete should says deleted. Right followed by Backspace should saye; the second line is nowcond line. - Press Alt to enter the menus and Escape to return (Escape again if needed).
Expect menu labels while navigating and
edit, cond lineon return, not the start of the document. Arrows must continue to reach Notepad. - Use Undo, then navigate the restored text. Expect feedback to match the document. Switch to another application and back; verify focus and keyboard reading resume normally. Close Notepad without saving this test document.
Connected braille should show the corresponding feedback messages. This does
not establish a routable editor buffer. Report the step, exact speech and
braille, focused control, and any key that behaved differently. For unexpected
results inspect ~/devel/cthulhu.log; debug Wine editor feedback records
include source IDs, native UTF-16 selection ranges, action kinds and output text.
The Notepad fixture also opens the unsaved-document dialog and presses Tab, Tab, Shift+Tab and Escape. It records the actual Yes/No/Cancel focus and state sequence. Wine sends a focus-loss state event for the previous button before the new focus event; the Go presenter must suppress that unchanged state presentation. For live acceptance, change the document, close Notepad and verify each Tab announces only the newly focused button, including reverse navigation. Escape must return to the editor without discarding the document.
Helper identity and startup diagnostics
python3 tests/version_metadata_test.py
xvfb-run -a python3 tests/diagnostics_test.py --build-dir build
The metadata check uses a temporary Git repository and a source archive to
verify clean/modified builds, version edits, commit changes and unchanged
header timestamps. The Wine check uses a private D-Bus service, display and
prefix. It queries --version without a reader and while the singleton is
held, verifies identity on failed reader discovery, and checks normal and
missing-hook initialization records. It never contacts the active reader.
After installing both updates and restarting Cthulhu, launch AudioQuake and
check its log for Wine accessibility helper identity and
Wine accessibility helper initialized, with the expected version/revision.
Enable debug logging to confirm the executable, loader and prefix selected.
Check the launcher list with Down/Down/Up and Tab/Shift+Tab, its map chooser,
and returning to the launcher after game exit. Recheck ordinary Wine Notepad
typing, arrow navigation, menus and shutdown, including password exclusion.
Audible speech and physical Braille require separate live checks. This change
adds diagnostics; it does not establish a fix for a remote machine's silence.