Accessibility
Contour reports where the terminal caret is to the operating system, so assistive technology can follow it. This is what makes a screen magnifier keep the cursor in view while you type, and what lets a screen reader know where it should be reading.
There is nothing to switch on. Reporting is always available and costs effectively nothing while no assistive client is attached; the platform activates it when one appears.
Should you ever need to rule the caret reports out — when diagnosing input latency, say — set
accessibility_caret_reporting: false in contour.yml. That silences the caret reports only; the
announcements below have their own setting.
What is reported
| Reported | Meaning |
|---|---|
| The caret's position and screen rectangle | Where the cursor is, updated whenever it moves. |
| The visible screen's text | The grid contents, addressed by offset, rows separated by newlines. |
| The shell prompt region | Where the current prompt is — see below. |
The caret is reported whenever it moves and is visible, and also whenever it becomes visible after having been hidden — so an application that hides the cursor while it redraws and then shows it again does not leave a client pointing at a stale position.
A blinking cursor is not reported on every blink. Only the focused pane reports, so a split window does not make a magnifier jump between panes.
The prompt region
When your shell has OSC 133 shell integration enabled, Contour additionally exposes the live shell prompt — the one you are typing at — as its own focusable region. Assistive technology that follows focus (rather than the text caret) uses this to keep the prompt itself in view, which is usually what you want while typing a command.
While a command is running there is no prompt to report, and Contour says so rather than pointing at a stale one. Without shell integration, or with a shell that marks only prompt starts, the caret is still reported as usual — only the prompt region is unavailable.
This needs no opt-in beyond the shell integration itself: it is driven by the OSC 133 marks directly and does not require DEC mode 2034.
The window around the terminal
The tab bar is exposed as a tab list whose tabs announce themselves as you switch between them, the window and tab buttons say what they do rather than naming the glyph they are drawn with, and every field on the settings page carries its own label.
Things that are only announced
Some of what a terminal does has no representation in the accessibility tree at all — nothing's state changed, so nothing is reported unless it is said explicitly. Contour announces:
| Event | Politeness |
|---|---|
| The bell | Polite — it waits for your screen reader to finish its sentence |
| A desktop notification (OSC 99 / OSC 777) | Polite |
| Read-only mode being switched on or off | Assertive — it interrupts, because it changes what typing does |
Set accessibility_announcements: false in contour.yml to switch these off. They cost nothing while
no assistive client is attached.
Reading a selection aloud
Select some text and press ++ctrl+shift+s++, or pick Read Aloud from the right-click menu, to have the operating system's speech synthesizer read it. ++ctrl+shift+s++ again reads the new selection.
Text is prepared before it is spoken: the blank padding every terminal line carries out to the right margin is dropped, runs of empty lines collapse to a single pause, and a very long selection is cut at a line boundary so that selecting a build log gives a readable excerpt rather than many minutes of speech.
This needs a speech engine, and it is optional
Reading aloud needs Qt's TextToSpeech module at build time and a speech engine with an installed
voice at run time — on Linux that means speech-dispatcher or flite. Where either is missing the
feature is simply not offered: the menu row does not appear and the shortcut does nothing, rather
than appearing and staying silent.
A build that omitted it says so in its own build log, so a packager can see it without having to run the application.
Platform notes
| Platform | Technology | Notes |
|---|---|---|
| Linux | AT-SPI 2 | Works with Orca and with KDE Plasma's zoom — see the note below. |
| Windows | UI Automation | Works with Magnifier's follow keyboard focus / text cursor modes. |
| macOS | NSAccessibility | Qt maps the text interface to AXTextArea. Not verified. |
KDE Plasma: caret tracking is off by default
Plasma's zoom (Meta++ / Meta+- / Meta+0) follows the mouse pointer out of the box and
ignores the text caret until you say otherwise. Turn on Enable caret tracking in
System Settings → Accessibility → Screen Magnifier; without it the zoom will not follow the cursor
in Contour — or in any other application — no matter what the application reports.
KWin consumes the AT-SPI object:text-caret-moved signal for this. If tracking still does not follow
after enabling the option, KWIN_WAYLAND_ZOOM_FORCE_LEGACY_TEXT_CARET_TRACKING=1 forces KWin onto
that AT-SPI path rather than its newer one.
Qt's own environment variables apply. In particular QT_ACCESSIBILITY=0 disables accessibility for the
process, and on Linux QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1 forces the AT-SPI bridge on even when no client
has announced itself.
Verifying it
To inspect what Contour actually exposes:
- Linux — Accerciser. Select the Contour window; the terminal appears with a text interface, and the caret offset updates as you type. A shell prompt child appears while you are at a prompt and disappears while a command runs.
- Windows — Accessibility Insights, or
Inspect.exefrom the Windows SDK.