Fix for repeating in some instances, e.g. pidgin.
This commit is contained in:
1 parent
4d29f2bb23
commit
b232c1eebb
20 files changed
+921
-7
No files matched your search
@@ -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.
|
||||
|
||||
|
||||
@@ -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.
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user