At-Spi2 is a protocol over DBus, toolkit widgets use it to provide their content to screen readers such as Orca.

Formal information is available on,

A C binding library for the client side, libatspi, is available, and its documentation provides details on how At-Spi works libatspi API

The core that defines the protocol and starts the dbus accessibility bus is at-spi2-core , the formal definition of RPCs is available as xml files in at-spi2-core/xml/

The protocol essentially consists in dbus RPCs and notifications. For each application (seen as a dbus sender), its tree of widgets is represented as a tree of dbus paths.

The server side, implemented in atk and at-spi2-atk, is basically the server implementation for all the RPC calls that one would make with the client-side library: atk API, and KDE atk overview

A Walkthrough documents the RPC and function calls details.

There are recommandation for applications to be accessible:

Convenient python bindings are available for screen readers: pyatspi2 , the documentation is available through pydoc pyatspi, pydoc pyatspi.text, etc. , a example of playing with it is available, and is probably the recommended way to explore At-Spi from the client side.

Getting it started by hand (normally done by the Desktop Environment session manager):

  • /usr/lib/at-spi2-core/at-spi-bus-launcher &
  • /usr/lib/at-spi2-core/at-spi2-registryd &
  • one can make sure it got registered by using

    $ xprop -root | grep SPI
    AT_SPI_BUS(STRING) = "unix:abstract=/tmp/dbus-6fNHBTP2lK,guid=9d17aaa3ca64ff4b66f0c5985442999e"
  • That was the bus address, one can watch what happens by spying on it:

    $ dbus-monitor --address unix:abstract=/tmp/dbus-6fNHBTP2lK,guid=9d17aaa3ca64ff4b66f0c5985442999e
  • Some applications need explicit accessibility enabling:

    export GTK_MODULES=gail:atk-bridge
    export OOO_FORCE_DESKTOP=gnome
  • Accessibility enabling can be tested with this script:

    $ git clone
    $ cd check-a11y
    $ ./troubleshoot
  • Accessibility working in toolkits can be tested with this script:

    $ git clone
    $ sudo apt-get install build-essential pkg-config libdbus-1-dev libatspi2.0-dev libgtk2.0-dev libgtk-3-dev libqt4-dev qtbase5-dev 
    $ cd check-a11y
    $ source
    $ make check

Accerciser to test the availability of the content


Works just the same :D