Fix for repeating in some instances, e.g. pidgin.

This commit is contained in:
Storm Dragon committed 2026-10-27 19:40:17 -04:00
1 parent 4d29f2bb23
commit b232c1eebb
20 files changed
+921 -7

No files matched your search

+4 -1
View File
@@ -14,7 +14,10 @@ background provider no longer clears another provider's cached document lines.
Window creation, activation, deactivation, destruction and defunct events keep
their existing handling. Native alerts, notification daemons and supported
Steam toasts retain their notification paths. Menu popups retain existing
foreground checks. Same-provider autocomplete relations and tooltip candidates
foreground checks. Verified active/showing `mate-panel` menu windows may pass
across provider boundaries, including over an empty desktop; ordinary panel
controls and hidden menus remain filtered. See [MATE desktop](mate-desktop.md).
Same-provider autocomplete relations and tooltip candidates
continue through the existing event-loop ownership checks; they do not acquire
focus merely by passing the early filter.
+97
View File
@@ -0,0 +1,97 @@
# MATE desktop accessibility
The MATE menu report was captured on X11 with Cthulhu revision
`4d29f2bb235a4e0131ea44ddac368a8148bc594f`. At 18:40:45 the active, showing
`mate-panel` popup was rejected because X11 still identified the previous
application as foreground. Routine panel events could then be discarded by
the native background filter before debug logging. This establishes a reader
filtering gap; the log does not establish a Fedora packaging defect.
## Orca comparison
Reviewed the local `orca/` checkout at revision `a8a851800`:
| Behavior | Orca source | Cthulhu handling |
| --- | --- | --- |
| Panel popup activation and selected menu item | `scripts/default.py:_on_window_activated`, `ax_utilities.py:can_be_active_window` | Adapted active/showing menu handling across the panel/application process boundary. |
| GTK menu focus | `scripts/toolkits/gtk/script.py:locus_of_focus_changed` | Existing window ownership and menu focus/selection handling; exercised with nested panel menus. |
| Marco window cycling | `script_manager.py`, `scripts/switcher/script.py`, `scripts/switcher/script_utilities.py` | Already implemented; see [window switcher checks](window-switcher.md). |
| MATE notification daemon | `script_manager.py`, `scripts/apps/notification-daemon/script.py` | Already routed through notification capture, speech, Braille and history; added an explicit MATE daemon regression. |
| Unnamed panel icons | `generator.py:_generate_accessible_name` | Adapted the containing panel's name/description when the icon supplies neither. Own names and descriptions retain precedence. |
Orca has no dedicated `mate-panel` script in this checkout. Its current app
script catalog also contains no Caja, Pluma, Atril, Engrampa or Eye of MATE
specialization. Those applications use shared toolkit/role behavior; this
comparison does not establish that every workflow in those applications works.
## Panel menu policy
The native adapter recognizes the `mate-panel` process, then freshly queries
the popup's state and menu structure on the GLib owner. It requires an active,
showing, non-iconified, non-defunct native menu window. The existing menu
structure check permits a window with one menu child, or an unnamed frame
with one menu-bar child. A panel application name alone grants no exception.
This check is used both before routine background content capture and during
foreground validation. It also works when X11 has no foreground client, as
when a panel menu opens over an empty desktop. Ordinary panel windows and
hidden menu items retain normal filtering. Native actions and review use the
same window validation. The correlated X11 application is preserved; no popup
cache, native references, timer or extra window owner is introduced.
## Automated checks
```sh
python3 tests/native_test_session.py env CTHULHU_NATIVE_PANEL_MENU=1 CTHULHU_NATIVE_WINDOW_SWITCHER=1 CTHULHU_NATIVE_BACKGROUND_EVENTS=1 go test -race ./internal/atspi ./internal/app -run '^TestNative(MatePanelMenu|MateWindowSwitcherOutsideForeground|BackgroundEventFiltering)' -count=1 -p=1 -timeout=90s -v
go test ./internal/app -run '^TestNotificationProvidersAndHistoryMatchReferenceBehavior$' -count=1
```
The private GTK fixture uses separate panel and editor providers. Native
checks cover menu activation over an editor and an empty desktop, forward and
reverse navigation, a submenu, Escape, editor restoration, rejection of an
ordinary panel window, a late focus signal from a hidden menu, and an unrelated
process claiming the panel's application name. Panel icon captures verify
inherited labels, own-name/description precedence and unrelated-container
rejection. The event-loop check verifies queued speech and Braille frames for
navigation, dismissal, editor return and reopening. It emits no audible speech.
The existing background flood regression checks that ordinary same-provider
and other-provider updates still cause zero content queries. The Marco
regression checks switcher insertions and showing events while an editor
retains foreground ownership.
Validation on 2026-10-27 passed the full Go suite, the combined native checks
above with the race detector, `go vet ./internal/atspi ./internal/app`, the
parity ledger validator and a candidate build. GTK/Qt traversal and menus,
same-process window recovery, Brave address focus, dialogs, empty workspaces
and shutdown also passed ownership verification using a temporary copy of
`tests/native_ownership.py` with current schema-2 settings and `--append` on
reader launches. The checked-in ownership script still uses legacy settings
and assumes logs survive reader restart. Its restart assertion fails on the
unchanged revision too, despite the expected activation appearing in the log.
That existing harness needs separate maintenance; it is not a product failure
or an unqualified passing check.
## Human review and live acceptance
Review the diff before submission, as required by the contribution policy.
The fixtures model the native contracts; they do not run the reporter's Fedora
MATE session. After starting the candidate through the normal launcher:
1. Open the Applications menu over a browser, a terminal and the desktop.
Navigate forward/backward, enter/leave submenus, and check spoken labels
and Braille if available. Repeat with Places/System menus and panel context
menus offered by the installed MATE configuration.
2. Press Escape and confirm reading resumes in the original application.
Reopen the menu and activate an application. Check its initial control,
typing and ordinary Tab navigation. Check terminal-reader handoff if used.
3. Use Control+Alt+Tab to reach the panel and navigate its applets. Confirm
applet icons use supplied labels without repeating unrelated container text.
4. Cycle windows with Alt+Tab and Shift+Alt+Tab, then cancel with Escape.
Check a MATE notification and its notification-history entry.
5. Return to browser heading navigation and address-bar suggestions, and open
ordinary GTK/Qt menus and dialogs. Background updates must not take over
speech. Panel menu events must remain silent while the screen is locked.
Audible speech, physical keyboard/Braille behavior, the exact Fedora panel
tree and real MATE application workflows remain live acceptance checks.
+23 -1
View File
@@ -9,6 +9,16 @@ received while this reader is running; it does not import an existing transcript
The legacy controls for separate conversation histories, room-name prefixes,
typing announcements, and message verbosity are not yet ported.
When plain Enter clears the focused message entry, the deleted draft is no
longer spoken before the transcript announces the sent message. This shared
presentation rule requires a freshly observed plain Enter and a known empty
native text line at offset zero. It keeps deletion feedback when text was
selected, including when selection removal arrives before the deletion.
Backspace/Delete, cut/paste, undo/redo, modified Enter, unknown input/caret data,
autocomplete, terminals and document editors retain their existing behavior.
Caret and Braille updates still run before speech is suppressed. This does not
change word echo or Thunderbird foreground handling.
## Shortcuts
Both desktop and laptop layouts use:
@@ -69,6 +79,8 @@ GOCACHE=/tmp/cthulhu-cache go test -race ./internal/messaging ./internal/input .
python3 tests/native_test_session.py env GOCACHE=/tmp/cthulhu-cache CTHULHU_NATIVE_MESSAGING=1 go test ./internal/atspi -run '^TestNativePidginTranscriptCapture$' -count=1 -v
python3 tests/native_test_session.py env GOCACHE=/tmp/cthulhu-cache CTHULHU_NATIVE_MESSAGING=1 go test ./internal/app -run '^TestNativeMessagingCopyPreservesClipboardText$' -count=1 -v
python3 tests/native_test_session.py env GOCACHE=/tmp/cthulhu-cache CTHULHU_NATIVE_X11=1 go test ./internal/platform/xorg -run '^TestNativeLearnModeCapturesKeysAndRestoresCommands$' -count=1 -v
go test ./internal/input ./internal/app -run '^(TestPlainEnterActivityLifetime|TestSubmittedMessageIsAnnouncedOnce|TestSubmissionClearPreservesEditingFeedback)$' -count=1
python3 tests/native_test_session.py env CTHULHU_NATIVE_SUBMISSION_ECHO=1 go test ./internal/app -run '^TestNativeSubmissionClearAndSelectedReplacement$' -count=1 -v
```
Native checks use private X11 and D-Bus sessions. The transcript fixture sets its
@@ -77,6 +89,11 @@ client. These checks verify copied metadata, recorded presentation, synthetic
keys, and clipboard contents. They do not establish audible speech, physical
keyboard behavior, or a connected Braille display.
The submission replay test reproduces both announcements with the original
presenter and only the chat announcement with the fix. The GTK submission
fixture uses the real X11 input listener and native deletion snapshots, and
checks Enter replacing a selection separately. It does not send real messages.
## Human review and live acceptance
Review the diff before submission under the contribution policy. Build a reader
@@ -93,7 +110,12 @@ The implementation work does not replace the running reader.
multiline content. Confirm the copy response follows a successful write.
4. Type in Pidgin's message entry and account/preferences fields. Check normal
echo and editing feedback. Buddy-list updates and remote typing status must
not enter chat history.
not enter chat history. Send an unselected draft with plain Enter and confirm
it is spoken once through the transcript. In a native text editor, check
Backspace/Delete, Ctrl+Backspace, cut/paste, undo/redo, typing over a selection,
and Enter replacing a selection. Verify the empty input is reflected on
Braille after sending. Modified Enter and sending selected drafts retain
their earlier behavior and need separate evidence before changing them.
5. Switch to another application and check chat commands do not replay Pidgin
history. Close a conversation window and check its messages are retired.
Lock/unlock and verify prior history is cleared and messages received while