8.6 KiB
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. |
| 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. |
| Embedded panel applets | script_utilities.py:frame_and_dialog, script_utilities.py:top_level_object, scripts/default.py:_on_focused_changed |
Follow the accessible parent chain through a GTK plug/socket to its host window before normal foreground validation. |
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.
Embedded applet ownership
The newer kendell/mate.log, recorded with revision 702894ee, shows a
different failure: Bottom Panel controls are accepted, but focused icons from
other provider buses are rejected as outside the X11 foreground. The reader
announces the host's generic "panel" while discarding the embedded icon.
A real GTK socket/plug reproduction exposes the same structure. The applet publishes its own frame, whose accessible parent chain crosses the socket's provider and reaches the panel frame. Window resolution now follows that chain to the host instead of stopping at the plug frame. The background filter also resolves this window before rejecting a different provider bus. The source object retains its own bus, path and process identity for focus and actions.
This is shared window ancestry handling: it requires no MATE process-name exception. Normal X11 process, state and geometry checks still apply to the host. Same-provider nested frames retain their existing nearest-window behavior. An unembedded or detached applet cannot borrow the host's identity, and a background host cannot admit applet focus. Parent links beyond the plug frame are refreshed on the GLib owner; no embedding cache is retained.
Automated checks
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
python3 tests/native_test_session.py env CTHULHU_NATIVE_PANEL_APPLET=1 go test -race ./internal/atspi ./internal/app -run '^TestNativeEmbeddedPanelApplet' -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 socket/plug fixture uses separate host, applet and editor processes. It checks the shared containing-window identity, preserved applet identity, icon label inheritance, Tab/Shift+Tab within the applet, host controls on either side, and editor restoration. It also checks a non-MATE host, background applet focus, an unrelated applet claiming the MATE application name, and stale focus after socket destruction. The event-loop check verifies speech requests and Braille frames through two panel/editor round trips.
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:
- 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.
- 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.
- Use Control+Alt+Tab to reach the panel and navigate its applets. Confirm applet icons use supplied labels without repeating unrelated container text. Traverse both directions through launchers, clock, notification area and configured external applets. Open and dismiss applet controls, then return to the previous application. Background applet updates must stay silent.
- Cycle windows with Alt+Tab and Shift+Alt+Tab, then cancel with Escape. Check a MATE notification and its notification-history entry.
- 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.