20 Commits
Author SHA1 Message Date
Storm Dragon e3de71e594 Improved self-cleaning tests. 2026-10-15 13:12:15 -04:00
Storm Dragon 77db0b83ab Version and better logging added. 2026-10-15 12:49:33 -04:00
Storm Dragon ed8c8e2467 Make wine-access more generic, not specifically cthulhu pathed. 2026-10-14 16:19:52 -04:00
Storm Dragon 95cb78d3e4 Merge branch 'deedra'
Resolve tests/README.md by retaining both UIA notification and MSAA/reader reply stall guidance. Preserve master's notification hooks and Deedra's responsiveness fixes.

Validation: CMake configure/build, all four CTest checks, nine stall integration variants, 64-bit and 32-bit UIA notification checks, menus, 64-bit and 32-bit editing, actual Wine Notepad, and git diff --check. Live speech and physical braille acceptance remain pending.
2026-10-13 19:34:31 -04:00
Storm Dragon 6e92ad13d1 Updates for when prism doesn't behave. 2026-10-13 17:42:56 -04:00
deedra 7d3ac09ea1 Keep Wine editor feedback responsive during reader reply stalls
PresentAccessibleEvent previously waited synchronously for the reader on
Wine Access's message-loop thread. A slow D-Bus acknowledgment prevented
that thread from receiving subsequent WM_COPYDATA editor notifications.
The hooks time out after 50 ms, so feedback disappeared even though the
application accepted the input. With a 350 ms delayed focus reply, the
original helper inserted all of abbacdef but forwarded only e and f.

Move menu, editor and standard-control event delivery to one reader worker.
Keep a FIFO of at most 128 pending events, retain each variant and the bus
connection until delivery completes, and preserve focus-before-text order.
Keep the 500 ms reply deadline and cancel outstanding calls during normal
shutdown without making the event thread wait for the reader. Event-thread
success now means queued; controller RPC calls retain their synchronous
reader status behavior.

Retain the most recent focus dependency on the worker. After a transport
failure, re-establish that focus before sending dependent editor actions.
Treat a successful false reply as a completed exchange because filtering
can suppress presentation while still establishing focus. Never replay a
timed-out text action. Report transport failures, recovery and queue
overflow without including event contents in diagnostics.

Add a native editor fixture and a private-session D-Bus integration runner
for delayed replies, reply timeouts, failed initial focus, repeated typing,
event order, unchanged native text/caret, and shutdown with a withheld
reply. Wait for editor-hook attachment before triggering typing so the
32-bit companion is exercised reliably. Document queue behavior, limits,
regression commands and remaining live acceptance checks.

Validation performed sequentially on a private Xorg dummy display with
disposable Wine prefixes and recording reader services:

- cmake --build build --parallel
- python3 tests/reader_stall_integration.py --build-dir build
- The reader-stall check with --32-bit, --timeout, --focus-error, and
  --32-bit --focus-error
- ctest --test-dir build --output-on-failure: all four checks passed
- python3 tests/menu_integration.py --build-dir build with --fixture menu,
  edit, edit --32-bit, edit --restart-helper, notepad, controls, and
  list --32-bit
- python3 tests/event_stall_integration.py --build-dir build
- python3 tests/controller_integration.py --build-dir build
- git diff --check

The delayed-reply regression failed against the original synchronous
helper and passed after the worker change. The failed-focus scenario also
failed before dependency recovery was added and passed afterward.

These recordings establish the shared failure paths, not the cause of
every live MUSHclient pause or audible speech and physical braille
acceptance. Live checks remain for command typing, incoming plugin speech,
output-buffer arrows, menus, switching between Wine and Linux, reader
restart, and protected fields. An unavailable reader can still cause
feedback loss or bounded queue overflow.
2026-10-13 05:26:11 -07:00
deedra 4b58fc1cdc Keep Wine event feedback responsive when MSAA providers stall
Synchronous AccessibleObjectFromEvent and IAccessible property queries on
the helper's WinEvent thread could block native typing and focus feedback
while an application-owned accessibility provider stopped responding.

Move those calls into MsaaEventReader, a single COM worker that owns its
native references and exchanges copied requests and results with the event
thread. Bound both queues to 32 entries, invalidate queued work on focus or
foreground changes, and discard results older than 500 ms. Validate the
window, process, thread, generation, and foreground relationship before
presenting a result. Read protected state before querying accessible values.

Reject unrelated background presentation events before invoking providers
or invalidating foreground work. Preserve accessible events from visible
popups owned by the foreground window. Keep existing native menu, editor,
combo, list, and item-control paths, and use native focus fallback when an
MSAA focus request expires or fails.

Poll completed results from the existing event timer. On shutdown, retire
pending work and wait at most 100 ms for the worker; a blocked COM call keeps
only its own state until it completes or the helper process exits. Never
spawn additional workers behind an unresponsive provider.

Validation: CMake configure/build and git diff --check passed. On a private
dummy Xorg display, all four CTest checks passed, as did six event-stall
runs (default, --32-bit, --getter, --background, --popup, --reader orca)
and the existing menu, edit, controls, and list fixtures in both 64-bit and
32-bit modes. See the accompanying regression-test commit for commands.

Private recording-service fixtures do not establish audible speech, physical braille,
or acceptance of every live MUSHclient workflow. A provider that never
returns occupies the single MSAA worker until helper exit.
2026-10-12 23:31:03 -07:00
Storm Dragon 0f59809e9a Make d-bus available to orca if someone decides they want to implement it. 2026-10-12 04:37:12 -04:00
Storm Dragon c3e981b4c2 Restore wine access after program loses and regains focus. 2026-10-12 04:17:31 -04:00
deedra a8cb350467 Provide fresh Wine review snapshots and 32-bit Edit hooks
Expose visible Wine window text to the matching Go reader's independent
keypad review commands, and extend standard Edit feedback to 32-bit programs
such as MUSHclient without requiring 32-bit Linux GLib/Winelib libraries.

Add lifetime-aware instance/window/control identities and bounded capture
of standard Edit text, button/static captions, native ListBox/ListView items,
and usable MSAA text. Preserve focus, caret, selection, scrolling, and the
clipboard. Exclude hidden/password content before retrieval, retain both
rune and UTF-16 offsets, clip visible ranges, and reject changing or
oversized sources rather than returning incomplete text as a full snapshot.

Export CaptureWindow on the version-1 WineReview D-Bus interface. Register
with the current reader service owner and publish copied focus metadata.
Authorize capture only for the current same-user owner. Use a dedicated
GLib dispatcher and separate COM worker with a 500 ms deadline, one active
job and one pending job, bounded payloads, and explicit stale/busy/limited/
unavailable replies. Keep menu and focus forwarding responsive when an MSAA
provider stalls; retain ordinary feedback with older readers.

Read the actual X11 geometry associated with Wine HWNDs using bounded XCB
queries and __wine_x11_whole_window. Translate virtual-desktop coordinates
and recheck physical geometry before returning captured text. Link XCB in
the helper/tests and declare libxcb in the Arch package dependencies.

Build edit_hook.c into the 32-bit DLL and attach both menu and input hooks
to the foreground 32-bit UI thread. Release both hooks on transitions or
attachment failure. Keep Scintilla-specific hooks confined to 64-bit builds.
Expand Edit integration checks with read-only multiline navigation and
unsuccessful deletion, plus 32-bit editor/Windows Forms lifecycle support.

Add 32-bit/64-bit native capture fixtures, wire-protocol integration checks,
and design/implementation documents. Document exact schema, capture limits,
installation dependencies, compatibility, and live acceptance procedures.

Validation during commit preparation:
- git diff --check passed.
- cmake --build build --parallel passed.
- CTest could not start because xvfb-run is unavailable in this environment.
- Further tests were skipped at the user's request; capture, protocol, and
  menu/editor integration tests were not run during commit preparation.

Live speech and physical braille checks remain necessary, including review
without moving the native caret, incoming output, plugin dialogs, and return
to Linux/Fenrir. Custom painted output requires an accessible provider;
RichEdit/Scintilla capture, semantic object review, Say All, typing echo, and
native Wine braille routing remain unsupported by this protocol.
2026-10-11 20:50:56 -07:00
ak47 872388a59b More fixes for menus and combo boxes. 2026-10-11 00:10:21 -04:00
Storm Dragon df7879acb5 Notepad++ should work now. 2026-10-10 22:39:24 -04:00
Storm Dragon 5f78168c57 More accessibility fixes using foobar2000 as a test. 2026-10-10 15:30:23 -04:00
Storm Dragon 25e38907d3 Read Windows Forms login fields and associate their labels 2026-10-10 02:55:42 -04:00
Storm Dragon d7ea005a1f Read native Wine list-view rows in 32-bit and 64-bit applications 2026-10-10 02:03:56 -04:00
Storm Dragon 39b7488aea Fixes for edit boxes in wine. 2026-10-10 00:34:54 -04:00
ak47 c5657ee5d4 Finish up edit field accessibility. 2026-10-10 00:18:22 -04:00
Storm Dragon 6f6d4040c4 Work started on editor support. 2026-10-09 15:57:45 -04:00
Storm Dragon 0992ffee0d First pass at handling menus in wine. 2026-10-09 15:45:18 -04:00
Storm Dragon ed7ff763fb Create standalone Wine accessibility helper 2026-10-09 13:51:50 -04:00