Skip to content

Add a Linux accessibility backend (AT-SPI 2)#1667

Open
omartijn wants to merge 1 commit into
juce-framework:developfrom
omartijn:linux-accessibility
Open

Add a Linux accessibility backend (AT-SPI 2)#1667
omartijn wants to merge 1 commit into
juce-framework:developfrom
omartijn:linux-accessibility

Conversation

@omartijn

@omartijn omartijn commented Jun 2, 2026

Copy link
Copy Markdown

juce_gui_basics has no accessibility implementation on Linux: the generic juce_Accessibility.cpp compiles an empty stub, so the AccessibilityHandler tree that JUCE already maintains is invisible to assistive technologies and UI automation tools. This adds a native backend that exposes that tree as AT-SPI 2 objects over D-Bus (direct D-Bus, as Qt does; not ATK).

  • No new dependencies: libdbus is loaded with dlopen and its (ABI-stable) types are declared locally, matching how juce_gui_basics treats its other optional Linux libraries.
  • All bus traffic is handled on the message thread: the bus socket fd is added to the event loop via LinuxEventLoop::registerFdCallback, so the connection is pumped on read-readiness with no polling, no extra thread and no locking.
  • One fallback object serves the whole /org/a11y/atspi subtree. Implemented interfaces: Accessible, Component, Application, Action, Value, Table, TableCell, Text, EditableText, Cache, the freedesktop Properties and Introspectable interfaces, plus AT-SPI event signals (state/children/bounds/ text/value changes, focus and window events).

Tested on Ubuntu 24.04 (at-spi2-core 2.52) with busctl and a libatspi client driving a running application: tree walking with roles/names/states/bounds, coordinate-free invocation via Action.DoAction, value get/set, and Cache.GetItems.

Thank you for submitting a pull request.

Please make sure you have read and followed our contribution guidelines (.github/contributing.md in this repository). Your pull request will not be accepted if you have not followed the instructions.

juce_gui_basics has no accessibility implementation on Linux: the generic
juce_Accessibility.cpp compiles an empty stub, so the AccessibilityHandler tree
that JUCE already maintains is invisible to assistive technologies and UI
automation tools. This adds a native backend that exposes that tree as AT-SPI 2
objects over D-Bus (direct D-Bus, as Qt does; not ATK).

 - No new dependencies: libdbus is loaded with dlopen and its (ABI-stable) types
   are declared locally, matching how juce_gui_basics treats its other optional
   Linux libraries.
 - All bus traffic is handled on the message thread: the bus socket fd is added
   to the event loop via LinuxEventLoop::registerFdCallback, so the connection is
   pumped on read-readiness with no polling, no extra thread and no locking.
 - One fallback object serves the whole /org/a11y/atspi subtree. Implemented
   interfaces: Accessible, Component, Application, Action, Value, Table,
   TableCell, Text, EditableText, Cache, the freedesktop Properties and
   Introspectable interfaces, plus AT-SPI event signals (state/children/bounds/
   text/value changes, focus and window events).

Tested on Ubuntu 24.04 (at-spi2-core 2.52) with busctl and a libatspi client
driving a running application: tree walking with roles/names/states/bounds,
coordinate-free invocation via Action.DoAction, value get/set, and Cache.GetItems.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants