67 lines
3.7 KiB
Markdown
67 lines
3.7 KiB
Markdown
# MATE window switcher
|
|
|
|
Marco exposes the selected window title as a status-bar accessible. While Alt
|
|
is held, the old application can remain the X11 foreground client and the
|
|
switcher need not send a focus event. Ordinary foreground and editable-text
|
|
filters therefore cannot present its selection.
|
|
|
|
Following Orca's switcher event contract, Cthulhu reads the container name on
|
|
text insertion, selection change and showing-state gain. The accompanying
|
|
accessible-name signal does not repeat the announcement. The native adapter
|
|
handles this before routine background filtering and selected-child lookup.
|
|
It requires the `marco` process identity, the Marco application name, a known
|
|
visible/showing non-defunct status bar and a containing window on the same
|
|
provider bus. It refreshes only that accessible before reading the selection.
|
|
|
|
The application handler presents the title as transient speech and a Braille
|
|
message. It preserves application/native focus, browser mode and review
|
|
position, and rejects stale foreground epochs. Terminal handoff permits these
|
|
window-manager announcements; screen lock and internal UI still block them.
|
|
Normal key interruption and queued speech policy apply. No switcher state,
|
|
native references, timers or polling are retained. Other window managers are
|
|
outside this change.
|
|
|
|
## Automated checks
|
|
|
|
```sh
|
|
go test ./internal/app -run '^TestMateWindowSwitcher' -count=1
|
|
python3 tests/native_test_session.py env CTHULHU_NATIVE_WINDOW_SWITCHER=1 CTHULHU_NATIVE_BACKGROUND_EVENTS=1 go test -race ./internal/atspi -run '^TestNative(MateWindowSwitcherOutsideForeground|BackgroundEventFiltering)$' -count=1 -timeout=60s -v
|
|
```
|
|
|
|
The application regression reproduces the rejected non-focused status event
|
|
from the reported log, repeated forward/reverse selections, showing and
|
|
selection events, duplicate name rejection, stale/hidden/dead/impostor
|
|
rejection, terminal handoff, screen lock and Braille flash requests. A later
|
|
name change on the original control verifies that focus ownership survives.
|
|
|
|
The private GTK fixture publishes a non-focusable status bar with Marco's
|
|
application and process identity. It verifies that repeated insertions and a
|
|
showing event survive native background filtering while the editor retains
|
|
X11 foreground ownership. It models Marco's AT-SPI contract; it does not run
|
|
the real MATE window manager. The existing background flood test checks both
|
|
other-provider and same-provider inactive windows and zero content queries.
|
|
All native checks use a disposable X server and accessibility bus.
|
|
|
|
## Live acceptance
|
|
|
|
After reviewing the diff and starting the candidate through the normal local
|
|
launcher when ready:
|
|
|
|
1. Open at least three differently titled windows. Hold Alt and press Tab
|
|
repeatedly. Confirm each selected title is spoken; repeat with Shift+Tab.
|
|
2. Release Alt and confirm normal reading follows the chosen application.
|
|
Repeat from a terminal, and check that terminal delegation resumes.
|
|
3. Open the switcher, cycle through titles and press Escape. Confirm reading
|
|
returns to the original control and review/navigation still work.
|
|
4. With a browser open, check heading navigation, address-bar editing and
|
|
switching between two windows of the same application. Background status
|
|
updates must stay quiet.
|
|
5. If using Braille, confirm each selection appears as a transient message
|
|
and normal application content returns after dismissal. Switcher output
|
|
must not appear while the screen is locked.
|
|
|
|
Physical keys, audible speech, real Marco cycling/cancellation and physical
|
|
Braille remain live acceptance checks. The original log contains an initial
|
|
status insertion but no later insertions for its subsequent Tab presses; keep
|
|
a fresh timed log if actual cycling still fails.
|