MUSHclient consumes queued Up/Down keys in PreTranslateMessage before the Edit control receives WM_KEYDOWN. It recalls commands with SetWindowText followed by SetSel at the end of the replacement. The editor subclass only refreshed its snapshot for WM_SETTEXT, so the recalled command was silent or followed by a stray character or blank from the caret update. Recalling equal-length commands also leaves the final caret position unchanged. Observe Up/Down for the focused standard Edit control in WH_GETMESSAGE, excluding Ctrl-modified navigation. Associate the next successful WM_SETTEXT with that retrieved key and announce the bounded recalled text as an existing ordered text-read action. Report empty input as blank. Consume the pending recall after the replacement and suppress the ensuing EM_SETSEL feedback so each recalled command is announced once. Reset recall tracking on subsequent retrieved messages, actual focus and ordinary dispatched navigation. Preserve snapshot refreshes and normal Left/Right reading after recalls. Keep password and foreground/focus exclusion in place, leave unrelated programmatic text updates silent, and check the control class before accessing the shared attachment property so Scintilla's different state structure is untouched. Both native hook architectures receive the fix through the existing build. Extend the Edit fixture with application-side pretranslation of queued history arrows. Assert the exact ordered feedback for Up/Down, equal-length entries, rapid recalls, empty input and horizontal navigation afterward. Require silence for unchanged history boundaries, unrelated programmatic updates, protected fields and independently unprotected background fields. Document history behavior and live MUSHclient acceptance steps. Validation used a private Xorg dummy display, disposable Wine prefixes and recording D-Bus services, with GUI checks run sequentially: - cmake --build build --parallel - ctest --test-dir build --output-on-failure: all four checks passed - python3 tests/menu_integration.py --build-dir build --fixture edit - The Edit check with --32-bit, --32-bit --late-helper, and --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 - python3 tests/menu_integration.py --build-dir build --fixture menu --32-bit - git diff --check The new 32-bit history regression failed against the original hook, recording only blank actions, and passed with the fix. Final 32-bit, 64-bit and Windows Forms editor checks passed, including existing typing, selection, deletion, Unicode, password and read-only assertions. Built and installed the helper into the existing user-local installation, backed up the previous five files and verified the installed artifacts. The user subsequently confirmed that the installed fix works in MUSHclient. Physical braille acceptance was not separately established.
30 KiB
Wine control integration
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.
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.
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. The fixture acknowledges ICCCM window visibility on
the private display; the runner propagates the fixture's actual exit status.
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. 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-Go 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-go.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.