GNOME Accessibility Logo

GNOME Accessibility Team

/!\ The following content is being kept here for historical preservation only. The information contained herein may or may not be accurate. It is definitely not being maintained.

Guidelines for Writing Accessible GNOME Applications Using GTK+ and the Accessibility Toolkit (ATK)

Version 1.0 August 2006 � Copyright IBM Corporation 2006

GNU Free Documentation License (GFDL)

Document Author/Editor:

Catherine Laws
IBM Software Group Accessibility Architecture and Development
e-mail

Most content derived from other documents and major contributions from:
Bill Haneman (Sun)
IBM Accessibility Architecture team (George Kraft, Pete Brunet, Larry Weiss, Aaron Leventhal, Richard Schwerdtfeger, Mark Pilgrim, Sueann Nichols, Donald B Clippingdale, Peter Parente)
Authors of the documents in the /References section.

Abstract

Application developers should consider the special needs of disabled users when they develop software programs for the Linux GNOME desktop. Meeting the needs of disabled users will benefit all users. In these guidelines, we discuss the following topics:

  • Essential accessibility programming practices that make applications usable by people with disabilities.
  • Accessibility features and implementations in the GTK+ Toolkit, the GNU Image Manipulation (GIMP) Toolkit, which is is a multi-platform toolkit for creating graphical user interfaces. The GTK+ Toolkit is based on 4 libraries: the GLib core library, the GTK object library, Pango for layout and rendering, and the Accessibility Toolkit (ATK).

  • How to use the GTK+ and ATK libraries, GUI builder tools such as Glade, and accessibility tools and technologies such as Accerciser and Linux screen readers to enhance GTK+ widgets and to build accessibility into custom widgets.

  • How to map Windows MSAA (Microsoft Active Accessibility) roles, states, events (aka signals), and accessible interfaces to the ATK interface for Linux GNOME applications.

These topics are covered in detail with supporting rationale, citing specific GTK+ and ATK interfaces. Examples are provided where appropriate.

These guidelines highlight the GNOME accessibility features and provide guidance for creating accessible Linux GNOME software. To print the guidelines document it is best to print all linked documents. The latest version of this document, as well as additional accessibility resource information, can be found in the Accessibility References section of this document.

Notices

THIS DOCUMENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

All statements regarding future intent are subject to change or withdrawal without notice and represent goals and objectives only.

Information in this document about non-IBM products was obtained from the suppliers of those products, published announcement material, or other publicly available sources.

The information contained in this document represents the current views of IBM on the issues discussed as of the date of publication. IBM cannot guarantee the accuracy of any information after the date of publication.

Introduction

When writing a GTK+ application, think about the fact that users with varying abilities will want to use the application. Some users with mobility impairments cannot use their hands for traditional mouse and keyboard input; other users who are blind may not be able to use a mouse, see the screen, or read a printed User's Guide.

Over the years, disabled users and Assistive Technology Vendors (ATVs) have invented incredibly clever work-arounds for these problems. Voice input replaced the mouse, mouth sticks and switches replaced the keyboard, text-to-speech synthesis replaced the screen, and online books replaced printed books.

Some products include unintentional roadblocks to people who have disabilities. Some examples:

  • Programs that provide mouse only input are inaccessible for use by people who are blind or who have mobility impairments and require alternative inputs, such as input using voice recognition. In addition, programs with mouse only input may not be adaptable to devices which do not have a mouse.
  • Programs that use audio-only messages (individuals who are deaf cannot hear the messages - this also applies to people with systems that do not have sound capability).
  • Operating systems that define Ctrl+Alt+Del to reboot the system (try doing this with only one hand).

The following section discusses disability issues. Understanding these issues enables better understanding of how to create an accessible GTK+ solution.

Disability Needs

The following describes what disabled users need:

Users who are blind or who have low vision need:

  • Keyboard alternatives to the mouse (mouseless operation).
  • Text descriptions of graphics (such as short alternative or title text, and longer descriptions for complex graphics like tables).
  • Text description of video and/or a descriptive audio track.
  • To know which object has focus and when the focus changes.
  • To know the default action and how to take that action.
  • Online documentation.
  • Screen magnification.
  • High color contrast.

Users who are deaf or hard of hearing need:

  • A visual indication of any sound.
  • Text captioning of multimedia presentations.
  • Text description of significant audio.

Users who are mobility impaired need:

  • Voice or assistive device input
  • Equivalent keyboard support for mouse input
  • Modified keyboard response (sticky keys, bounce keys, repeat keys)
  • Alternatives to multiple key inputs.
  • Online documentation.

Users who have multiple disabilities need:

  • Combinations of solutions; for example, speech output and voice input that do not conflict.

However an application developer doesn't have to provide all of the solution. Enable an application so that assistive technology (AT) programmers can obtain from the application program what it needs to present to it's users.

Why use GTK+ and the ATK for Accessibility?

GTK+ is the GNU Image Manipulation (GIMP) Toolkit, which is is a multi-platform toolkit for creating graphical user interfaces. GTK+ is based on 4 libraries: the GLib core library, GTK object library, Pango for layout and rendering, and the Accessibility Toolkit (ATK). Many of the ATK accessibility interfaces were derived from the Java accessibility API, which was developed by software accessibility engineers at Sun and IBM. ATK describes a set of interfaces that GUI components in applications need to implement to be accessible. The interfaces are toolkit-independent, meaning that the implementations could be written for any widget set, such as GTK, Motif or Qt, but this document will focus on ATK with the GTK widget set. Widgets are user interface objects like buttons, menus, dialog boxes, text entry fields, combo boxes, etc. The GTK+ libraries are like the Active Template Library (ATL) on the Microsoft Platform, which provides a ready-made framework for creating Component Object Model (COM) Objects and Components (ActiveX EXEs and ActiveX DLLs).

The accessibility enablement of an application is easier if the GTK+ accessibility features are exploited during development. First, minimal development resource is required to incorporate the accessibility features of GTK+ widgets. Second, software will be universally accessible for all users. Third, features specifically designed for disabled users often make the product more usable for non-disabled users as well. For example, a "keyboard-enabled" application improves usability for blind users who use a screen reader as well as for people who use voice recognition software.

GAPArchitecture3.jpg

Assistive Technology Vendors (ATVs) benefit as well. If an application implements GTK+ accessibility features, ATVs, such as screen reader vendors, can more easily make their products work with that accessible GTK+ application. Screen reader software receives information from running GTK+ applications using AT-SPI(Assistive Technology Service Provider Interface). Accessibility support for applications is "built in" to application toolkits via toolkit-appropriate APIs. For instance, ATK is the accessibility toolkit for most native C applications, and the Java Accessibility API is the toolkit for Java applications. These application accessibility APIs are then exported to the common AT-SPI interface via the relevant "bridge" (see the diagram above) of the GNOME Accessibility Platform (GAP).

Look for the ATK API library in the atk module in GNOME CVS. Because support for the accessibility API is built into the GTK widgets used by GNOME, a GNOME program should function reasonably well with assistive technologies with no extra work. For example, ATVs can automatically read the widget labels that are normally set in an application with GTK function calls such as gtk_label_set_text() or gtk_button_new_with_label()). They can also find out if there is any tooltip text associated with a widget, and use that to describe the widget to the user.

The accessibility API for GTK widgets is implemented in the GAIL (GNOME Accessbility Implementation Library) module, which a GTK application can dynamically load at runtime. Once GAIL is loaded, application components which use standard GTK widgets have a basic level of accessibility without modification. If GAIL is not loaded, GTK widgets and applications are not considered accessible. Whether or not GNOME/GTK+ applications automatically load these accessibility support libraries depends on the value of the accessibility gconf key named "/desktop/gnome/interface/accessibility". A boolean value of "true" enables support for assistive technologies. To enable GNOME accessibility features by setting the accessibility gconf key, type the following command line:

gconftool-2 --type bool --set /desktop/gnome/interface/accessibility true

If an application calls gnome_program_init, it will automatically load the appropriate accessibility libraries at runtime, but that application will be limited to running on the GNOME desktop. "Pure GTK+ applications" (those that use gtk+ but do not link to libgnome) require the user (or the application?) to set the value of the GTK_MODULES environment variable to "gail:atk-bridge" to enable assistive technology support. GTK_MODULES cause libgail.so and libatk-bridge.so to be loaded. Pure GTK+ applications could potentially run on other UNIX desktops that support ATK, such as KDE.

A GTK+ widget is accessible if it follows the guidelines found in Using GTK+ and ATK to Build Accessible Applications. ATK implementations are provided for the "stock" GTK+ widgets. In many cases new widgets which derive from existing GTK+ widgets will also inherit suitable accessibility support.

Though GTK+ widget's built-in accessibility support provides significant functionality without any accessibility-specific code changes on the part of the application, application developers can often improve on the accessible information provided for some of the widgets, and tailor it to that widget's specific purpose in an application, via straightforward calls to ATK methods in the application. For instance, in most cases developers should add or change the textual names and descriptions, add mnemonic keyboard bindings to labels, and associate labels for these widgets with the appropriate ATK function call, so that an assisitive technology can describe their purpose or state, key bindings, and labels to the user.

Essential Accessibility Programming Practices

The IBM accessibility developer guidelines provide an excellent set of essential accessibility programming practices plus other references for software applications in general, Web documents and applications, Java and Eclipse-based applications, IBM Lotus Notes�, hardware, and documentation in general.

Also reference the user interface accessibility guidelines from the GNOME Accessibility for Developers guide.

GTK+ and ATK - A Foundation for GNOME Accessibility

GTK+AppArchitecture.jpg

FIGURE 1.0 GTK+ Accessible Application Architecture

The GTK+ accessibility architecture depends on a number of libraries and interfaces for programming a GTK+ application, and for making the objects and interfaces accessible, translatable, and usable:

  1. TheGLib library provides portability and convenience functions, generic data structures, and the GLib main loop.

  2. The GDK library provides an abstraction layer between the GTK+ widgets in an application and the underlying X window system.

  3. The GTK+ Object System provides a library and class hierarchy of objects (including widgets, containers, windows) with features that include inheritance, polymorphism and reference counting, signal notification, and attributes.

    • Drag and drop interfaces support the Motif or Xdnd Drag and Drop protocols.

    • User-interface customization is accomplished using themes. Without recompiling either GTK+ or the application, users can choose a new look for their applications by installing a new theme. A theme can either be simply a set of colors and pixmaps used by the existing drawing code or it can be a complete replacement of the functions used to draw widgets. Themes are useful for low vision users.

  4. The Pango engine and library provides functions for text layout and rendering, with internationalization considerations.

  5. The ATK library provides all the accessible object classes (based on GObject) and the interfaces the accessible objects implement (based on GInterface).

  6. ATK is an in-process accessibility API, written to by applications and implemented for GTK+ widgets by GAIL (GNOME Accessbility Implementation Library), which a GTK application dynamically loads at runtime if the value of the accessibility gconf key (/desktop/gnome/interface/accessibility) is "true."

  7. AT-SPI is an out-of-process CORBA API implementation used by assistive technologies. The ATK bridge exports ATK to AT-SPI for GTK+ applications.

Why use GTK+ widgets?

When using the GTK+ widget set, most accessibility information is built into the widgets by GAIL except for doing the following:

  • Provide names and descriptions of some controls and images using atk_object_set_name and atk_object_set_description() or atk_image_set_description().
  • Specify relationships between labels and controls and between groups of controls using atk_relation_new() and atk_relation_set_add(). Note that GAIL does automatically create RELATION_LABELLED_BY/RELATION_LABEL_FOR labels and widgets which are attached next to one another in table layouts.
  • Define access key mnemonics for controls using GTK methods such as gtk_radio_button_new_with_mnemonic. For controls which have separate labels (like text boxes, combo boxes, sliders, sping buttons, etc), use GTK methods to set the mnemonic on the label (gtk_label_new_with_mnemonic) and to associate the mnemonic access key with its control (gtk_label_set_mnemonic_widget).
  • For commonly used functions in menus, define accelerators, or shortcut keys, using the GtkAccelLabel and GtkAccelGroup interfaces plus the methods gtk_window_add_accel_group and gtk_widget_add_accelerator.

ATKObjectArchitecture.jpg

Figure 1.1 Accessible Component Architecture for GTK+ Object

Creating accessible custom widgets

While many applications for Linux may not use GTK+ widgets, the discussion of how to make GTK+ widgets accessible using ATK interfaces and Atk#ATKIFORGTK how GAIL implements ATK for GTK+ widgets] provides us with a model for implementing ATK interfaces (methods, attributes, signals, etc) to make custom widgets in Linux GNOME applications accessible.

Since ATK uses the standard GObject and GType model, take advantage of inheritance by creating custom widgets. Implement ATK objects and interfaces for widgets either directly in a custom ATK implementation library, in the application itself, or in an external implementation library, like the GAIL library. For example, create an AtkObject subclass which can inherit from the "default" GAIL ATK implementation, override selected ATK methods, support selected ATK interfaces, and use GAIL utilities such as AtkText helpers for Pango classes. Custom widgets should fire appropriate ATK events, such as focus and property changes. To associate a widget's ATKObject subtype, override get_accessible for the GtkWidgetClass OR associate an AtkObjectFactory with the AtkRegistry. All the application ATK interface, object, and event information is exported through the ATK bridge to the AT-SPI interface for use by assistive technologies like the Orca and Gnopernicus screen readers.

To build an accessible application with the least amount of effort do the following:

  1. Wherever possible, use GTK+ widgets to build an application, as described in Atk section 4.0 Using GTK+ and ATK to Build Accessible Applications].

  2. If the rich class library in GTK+ does not have a desired widget, create a custom widget by subclassing the AtkObject class. Implement the Accessibility API for a widget as described in Custom section 5.0 Building Custom Accessible Widgets].

  3. If steps 1 and 2 are not sufficient, implement the Accessibility API for a class library or widget as described in AtkApi section 6.0 The Accessibility API]

Making GNOME Applications Accessible by Marc Mulcahy and Bill Haneman from Sun provides a good overview of using ATK, GTK+, and Glade to make both standard and custom widgets accessible in an application.

A custom ATK implementation is the Mozilla ATK Implementation (MAI), which exposes its nsIAccessible and nsIAcc extensions through ATK objects and interfaces. When accessible events that need to be reported are generated in Mozilla, MAI creates the proper ATK objects and sends ATK signals for those events. When Mozilla receives accessible commands from AT-SPI through the ATK interface, MAI sends the commands to Mozilla though nsIAccessible and nsIAcc extensions.

Eclipse developers use SWT widget accessibility interfaces (org.eclipse.swt.accessibility) to enable custom SWT widgets. Eclipse then exposes both standard and custom accessible SWT widgets as accessible GTK+ widgets by implementing ATK objects and interfaces for the SWT widgets. Especially look at chapters 4, 9, and 13 to understand SWT accessibility interfaces, how they relate to ATK objects, and how to enable accessibility for custom SWT widgets.

Note: Externally refer to Creating accessible applications with Eclipse: An Introduction.

CKL: The SWT widget set and the Eclipse accessibility interface needs to be enhanced to support more of the ATK interfaces related to relationships, tables, images, hypertext, hyperlinks, etc.


Currently, the UNO Accessibility API for OpenOffice and StarOffice is wrapped by the Java Accessibility API and is exported through the GNOME Java Access Bridge to AT-SPI. Work is in progress by Novell to map the OpenOffice/StarOffice UNO Accessibility API directly to ATK, and to go through the ATK bridge to AT-SPI.

Setting up the accessible application development and test environment

To set up an environment for developing and testing accessible GTK+ applications on Fedora Core 6, download and install the following packages.

  1. Fedora extras
  2. gnome-common
  3. libgail-gnome
  4. accerciser
  5. Orca or LSR screen reader
  6. Glade GUI builder (optional)

Accessibility in GNOME is disabled by default. Before running any accessibility tools or accessible applications:

  1. Set the value of the GTK_MODULES environment variable to "gail:atk-bridge". GTK_MODULES cause libgail.so and libatk-bridge.so to be loaded. (Note: For GNOME applications, this step is not necessary but for GTK+ applications, it is. Add the following code to the beginning of applications to setup the accessibility environment. Also, add the following to the compile linker line "-lgnome-2 -lgnomeui-2".:
              gnome_program_init(
    
                             "dialog", "0.1",
    
                             libgnomeui_module_info_get(),
    
                                     argc, argv,
    
                             "app-datadir",
    
                                     "/usr/local/share",
    
                             NULL);
  2. Enable accessibility by doing one of the following:
    1. Run "gconftool-2 -s -t boolean /desktop/gnome/interface/accessibility true" (preferred method)
    2. Include "GNOME_ACCESSIBILITY=1" in the user profile file (deprecated)
    3. Select Desktop -> Preferences -> Accessibility -> Assistive Technology Support. Check the Enable assistive technology box.

After enabling accessibility, run an application from the command prompt and the following messages should be displayed:

Bonobo accessibility support initialized

GTK Accessibility Module initialized

ATK Accessibility Bridge initialized

Fedora extras and gnome-common

Install the gnome-common package, but first setup Fedora Extras:

su - root
rpm --import http://download.fedora.redhat.com/pub/fedora/linux/extras/RPM-GPG-KEY-Fedora-Extras
# missing step to create /etc/yum.repos.d/fedora-extras.repo
yum install gnome-common

libgail-gnome

Fedora does not provide the libgail-gnome.pc package configuration file required to build and run accerciser, so build and install it manually:

su - root
cd /usr/tmp
cvs -d:pserver:anonymous@anoncvs.gnome.org:/cvs/gnome checkout libgail-gnome
cd libgail-gnome
./autogen.sh
make
install -m 444 libgail-gnome.pc /usr/lib/pkgconfig

accerciser

Build and install Accerciser:

su - root
cd /usr/local/src
git clone git://git.gnome.org/accerciser
cd accerciser
./autogen.sh
make
make install

Orca screen reader

In addition to installing Fedora extras and gnome-common, install pyorbit-devel.

yum install pyorbit-devel

Then build and install Orca:

su - root
cd /usr/local/src
git clone git://git.gnome.org/orca
cd orca
./autogen.sh
make
make install

Run orca once.

Glade GUI builder (optional)

Refer to the Glade CVS README for requirements and instructions about installing Glade on a system.

PLEASE NOTE: This document is no longer being maintained and eventually will be deleted. Instead, please refer to the GNOME Desktop Accessibility Guide which includes the information found on this page.

Using GTK+ and ATK to Build Accessible Applications

This section discusses how to use GTK+ widgets and ATK to build an accessible GTK+ application:

Using the GTK+ Widgets Unmodified

The GTK+ is an extremely rich class library that has implemented keyboard accessibility, as well as the accessibility API (ATK) is implemented by the GNOME Accessibility Implementation Library (GAIL) for each GTK+ widget. (Note: If developing proprietary code, do not review GAIL or any other open source code protected by open source licenses. Violating this rule could compromise the originality of proprietary code.) If using GTK+ "as is", do the following:

  1. Set the accessible name on all GTK+ widgets that are rendered on the screen

    For interactive widgets, the accessible name should match the visible text label associated with the widget, if there is one. If not, the name should be the implied label for the widget, such as "Search" for a search text entry field. For images and icons, the name should be a short title, alternative text, or caption that identifies the image. Provide a name for both interactive and non-interactive images and icons using atk_object_set_name.

    C example:

      {
    
         AtkObject *obj;
    
         obj = gtk_widget_get_accessible (save_button);
    
         atk_object_set_name (obj, _("Save"));
    
      }
  2. Provide descriptive text for all images and icons, and for interactive widgets that have tool tip or contextual help: Some GTK+ widgets provide default descriptions, but in some cases these descriptions should be more meaningful. Even if tool tips are added to GTK+ widgets, this text may not be accessible to an AT without providing the accessible description. Use atk_object_set_description to provide accessible, meaningful descriptions that match tool tip or contextual help for interactive widgets. C example:

      {
    
         AtkObject *obj;
    
         obj = gtk_widget_get_accessible (save_button);
    
         atk_object_set_description (obj, _("Saves all the settings and dismisses the dialog."));
    
      }

    In addition, provide descriptive text for all important images and icons that convey meaning to the user, including icons (like GtkStatusIcon), buttons with icons (like GtkButton, GtkColorButton, GtkArrow)), toolbar elements (GtkToolButton), images that are pictures (GtkImage), and images that are inserted into text (using GtkTextBuffer) or table cells (GtkCellRendererPixbuf). Use atk_image_set_description to specify meaningful descriptions for these images. C example:

      {
    
         AtkObject *obj;
    
         obj = gtk_widget_get_accessible (file_save_icon);
    
         atk_image_set_description (obj, _("Saves this document as a file."));
    
      }
    • Python example to set both accessible name and descriptive text:

      import gtk
    
      def setNameDesc(widget, name=None, description=None):
    
        '''
    
        Sets the name, and description (optional), of a GTK+ widget.  Example code:
    
          setNameDesc(apply_button, 'Apply')
    
          setNameDesc(up_button, 'Up', 'Move the selected item up")    
    
        '''
    
        acc = widget.get_accessible()
    
        if name is not None:
    
          acc.set_name(name)  # widget.set_name() is not sufficient
    
        if description is not None:
    
          acc.set_description(description)
  3. Label widgets by establishing a relationship

    When a GtkLabel is used to label another widget control, from the label widget, use atk_relation_new to specify the ATK_RELATION_LABEL_FOR type and point to the associated widget control. From the widget control, use atk_relation_new to specify the ATK_RELATION_LABELLED_BY type and point to the associated label widget. Then use atk_relation_set_add to add both relationships.

    C example:

      {
    
              GtkWidget *widget;
    
              [[http://library.gnome.org/devel/gtk/unstable/GtkLabel.html|GtkLabel]] *label;
    
              AtkObject *atk_widget, *atk_label;
    
              AtkRelationSet *relation_set;
    
              AtkRelation *relation;
    
              AtkObject *targets[1];
    
              atk_widget = gtk_widget_get_accessible (widget);
    
              atk_label = gtk_widget_get_accessible (GTK_WIDGET (label));
    
              relation_set = atk_object_ref_relation_set (atk_label);
    
              targets[0] = atk_widget;
    
              relation = atk_relation_new (targets, 1, ATK_RELATION_LABEL_FOR);
    
              atk_relation_set_add (relation_set, relation);
    
              g_object_unref (G_OBJECT (relation));
    
              relation_set = atk_object_ref_relation_set (atk_widget);
    
              targets[0] = atk_label;
    
              relation = atk_relation_new (targets, 1, ATK_RELATION_LABELLED_BY);
    
              atk_relation_set_add (relation_set, relation);
    
              g_object_unref (G_OBJECT (relation));
    
      }
    • Python example:

      import gtk, atk
    
      def setRelation(source, atk_relation, *targets):
    
        '''
    
        Sets the relation between a GTK+ source widget and one or more GTK+ target
    
        widgets. Example code:
    
          import atk, pyatk
    
          pyatk.setRelation(item, atk.RELATION_LABELLED_BY, item_label)
    
          pyatk.setRelation(group_label, atk.RELATION_LABEL_FOR, member1, member2)
    
          pyatk.setRelation(spinner_button, atk.RELATION_CONTROLLER_FOR, spinner)
    
        For a list and definition of ATK relationships, see: 
    
        [[http://developer.gnome.org/doc/API/2.0/atk/AtkRelation.html    
    
        '''
    
        acc_targets = [] # list of accessible widgets to apply relation attribute
    
        acc_src = source.get_accessible()
    
        relation_set = acc_src.ref_relation_set()
    
        # get a reference to each widget and add to the accessible target list
    
        for target in targets: 
    
          acc_targ = target.get_accessible()
    
          acc_targets.append(acc_targ)
    
        relation = atk.Relation(acc_targets, 1) # create the relation
    
        relation.set_property('relation-type', atk_relation)
    
        relation_set.add(relation) # apply the relation to the target widget(s)
    Note there is also a simpler API (atk_object_add_relationship) which can be used to add relationship between two widgets.
    • C example:

      {
    
              GtkWidget *widget;
    
              [[http://library.gnome.org/devel/gtk/unstable/GtkLabel.html|GtkLabel]] *label;
    
              AtkObject *atk_widget, *atk_label;
    
              atk_widget = gtk_widget_get_accessible (widget);
    
              atk_label = gtk_widget_get_accessible (GTK_WIDGET (label));
    
              atk_object_add_relation (atk_label, ATK_RELATION_LABEL_FOR, atk_widget);
    
              atk_object_add_relation (atk_widget, ATK_RELATION_LABELLED_BY, atk_label);
    
      }
  4. Enable keyboard access

    Default keyboard navigation, such as moving focus between interactive widgets using the Tab key, has built-in accessibility. If keyboard access features, such as mnemonics and accelerators, are added to widgets, GAIL implements the AtkAction interface and the atk_action_get_keybinding method for a widget if the following is done:

    • If the mnemonic is in a label (GtkLabel ) that is separate from its control (like GtkSpinButton, GtkHScale, GtkEntry, GtkComboBox, etc.), use gtk_label_set_mnemonic_widget to associate the mnemonic access key with its control and to cause focus to move to the control when the mnemonic key indicated in the label is pressed.

    • To add accelerator or shortcut keys to widgets like GtkMenuItem, use the GtkAccelLabel and GtkAccelGroup interfaces along with the gtk_window_add_accel_group, gtk_widget_add_accelerator, and gtk_menu_item_new_with_label methods.


  5. Group objects that go together inside named frames or notebook pages

    Logically group widgets that go together and assign that grouping a name. This facilitates navigation of an application. Two ways to do this include adding widgets to a GtkFrame (which is like a group box) or on pages of a GtkNotebook. Use atk_object_set_name to set the accessible name to the tab label for each page in a notebook, and to the frame label for a frame (group box). Use atk_relation_new and atk_relation_set_add to establish a relationship of ATK_RELATION_MEMBER_OF between the group (frame or notebook object) and each widget in the grouping.

  6. Make sure some widget has the focus at all times

    Make sure some widget in the application has the input focus at all times. When keyboard enabling an application, this should take care of itself. Most of the GTK+ widgets implement focus setting to support keyboard navigation. See Essential#_Toc412398974 section 2.3 Providing Focus] for additional information on setting the focus.

  7. Provide an accessible layout that yields a logical focus tab order

    When developing the visual layout of widgets, provide a logical layout which is determined by the order in which widgets are added in the source code. GTK+ layout containers help developers add widgets to an application in a logical order that matches the visual layout. The logical layout affects the keyboard tabbing sequence and the order an assistive technology uses to read an application. GTK+ automatically computes the focus tab order for widgets based on the order in which they are defined in the source code. If the focus tab order is changed by using gtk_container_set_focus_chain, for example, then the tab order may become confusing for users because it is not predictable. Usually it is better to change the visual layout to produce the desired logical layout than to change the focus chain.

  8. Show relationships when one widget controls another

    When the state of one widget, like a radio button, controls something about another widget, such as whether or not the widget is enabled or displayed, then use the ATK_RELATION_CONTROLLED_BY and ATK_RELATION_CONTROLLER_FOR relationships.

  9. Show relationships when one widget embeds another one

    When one widget, like an image, is embedded into another widget, like a text buffer, use the ATK_RELATION_EMBEDDED_BY and ATK_RELATION_EMBEDS relationships.

  10. Other relationships to point out? ([[http://developer.gnome.org/doc/API/2.0/atk/AtkRelation.html)

  11. Specify caption and summary for data tables and establish table cell and header relationships

    Identify the caption for a data table, describe the purpose of the table in a summary, describe rows and columns, and show the relationship between table cells and row/column headers using the following ATK methods:

      atk_table_set_caption
    
      atk_table_set_summary 
    
      atk_table_set_row_description
    
      atk_table_set_column_description 
    
      atk_table_set_row_header
    
      atk_table_set_column_header
  12. Add descriptions for the actions of interactive widgets

    Use atk_action_set_description to describe the results of the actions of interactive widgets.

    C example:

      {
    
      atko = gtk_widget_get_accessible (play_button);               
    
      AtkAction *action = atk_object_get_action (atko, 0);
    
      atk_action_set_description (action, _("Plays the selected audio file."));
    
      }

Exposing Accessible Information for Objects Embedded in GTK+ Text Widgets

GtkTextBuffer and GtkTextView are classes that allow the creation of a document object model. Text in a buffer can be marked with tags (GtkTextTag), which are attributes that can be applied to some range of text. However, tags can affect more than appearance; for example, they can affect the behavior of mouse and key presses or "lock" a range of text so the user can't edit it. Positions in the text buffer can be remembered or "marked" using the GtkTextMark widget, and images can be inserted into the text buffer as one character GDKPixbuf objects. Child widgets, like links and other control widgets, can be "anchored", or inserted inline as if they were characters, in the text buffer as GtkTextChildAnchor objects. The anchor can have multiple widgets anchored allowing for multiple views.

What enables assistive technologies, such as a screen reader, to obtain the accessible information and events for objects embedded in text widgets, which can be anything from a simple single line entry field to a complex document, are the implementation and maintenance of the methods, attributes, and signals in the following ATK interfaces:

  • AtkObject class to expose basic accessibility information (e.g. name, description, role, states, value) for the text buffer and view objects and all of its child objects (paragraphs, images, links, controls, etc). Note: Additional roles and states for document objects are being added.

  • AtkDocument interface, if the text widget is viewed as a document, to indicate the document boundaries in the accessibility hierarchy, the locale, and document attributes and to expose document events. Note: The AtkDocument interface is in the process of being updated.

  • AtkText interface for the text buffer and each text object in the buffer that is not editable to expose text attributes, caret position, selection, and text events, such as when the caret moves or the text or text attributes change. For text objects in the text buffer which are editable, the AtkEditableText interface should be implemented instead.

  • AtkHypertext interface to identify all embedded objects, including both text and image links, non-link images, form controls, plug-in objects, etc. All interactive objects, such as links and form controls, must also implement AtkAction to identify actions and key-bindings. The AtkRelation interface should also be implemented to indicate relationships between the text buffer and the embedded objects as well as between other objects, such as between labels and form controls.

  • AtkHyperlink object interface to identify all links or sets of links in a hypertext document and their link attributes, like the URI. AtkHyperlink objects must also implement the AtkAction interface to identify actions and key-bindings. <I don't think form controls implement AtkHyperlink, do they?>

  • AtkImage interface for images embedded in the text buffer to expose image descriptions, size, and location.

  • AtkTable interface for objects which need to expose row/column information (headers) and other tabular information (captions, summaries, etc), such as data tables, calendars, and spreadsheet-like widgets.

  • AtkSelection interface for the text buffer and all embedded object containers (like a table?) in the buffer if there are child objects which can be selected. Note that selection of text and other objects that are not children is done using other interfaces that have selection methods, such as AtkText.

For more information, refer to the ATK Reference, AT-SPI interface descriptions, and the Custom Building Custom Accessible Widgets] section in this guide.

!AttributeSets

An AttributeSet is a list of name-value pairs, returned as a sequence of strings; the name and value are separated by a colon. There are several different types of AttributeSets, some with pre-defined (enumerated) name-value pairs, and some to which custom name-value pairs can be added if needed:

  1. AtkObject AttributeSets. The attributes in this set may be considered weakly-typed, general properties or annotations which are not specific to visual text objects and cannot be applied to a specific range of characters being displayed. These attributes are not the same as the strongly-typed interface instance data attributes declared using the IDL "attribute" keyword. For example, attributes of Accessible objects which correspond to XHTML content elements should have attribute names and values which match those specified in the W3C XHTML specification, where such values are not already exposed as pre-defined ATK roles, objects, or interfaces. For example, "xhtml:navbar" could be used to expose a section of a document object that is a navigation bar.

  2. AtkDocument AttributeSets. These attributes are specified for a document as a whole, such as "docurl:http://www.ibm.com" to specify the URI for an HTML document.

  3. AtkText AttributeSets. These attributes are formatting, typographic, or semantic attributes or qualitites which apply to a range of text specified by starting and ending offsets. There are many text attributes defined in the ''AtkTextAttribute'' enumerations, but add more as needed. For example, add "abbr:International Business Machines" to expose the title attribute value for an abbreviation tag in an HTML document.

Whenever possible, use pre-defined attributes and ATK objects and interfaces to identify the objects in text and document objects. Assistive technologies may not know how to handle an object with a custom attribute defined by an application. In addition to checking the text attribute enumerations, make sure to check for pre-defined ATK roles or interfaces that could be implemented to define and expose the accessible information for a custom object. For example, to specify the title of a document, use atk_object_set_name instead of defining a custom document attribute.

Changing Data Models and Cell Renderers

<I'm not sure if this section is completely accurate. It's a mixture of what was said in the Java article and what is said in the GTK reference manual about cell renderers. But I don't see anything about cell renderers related to GtkTable, so there is only info about GtkTreeView cell renderers. >

The root component class is called GObject. The design of each component is based on the Model-View-Controller (MVC) architecture. Each component is broken into three parts:

  • Model or "data" portion of the component.
  • User Interface or "look and feel" portion, also called the view.
  • Controller portion, which manipulates the components.

Implementation of the Accessibility API is triggered from the "data portion" of each GTK component. This allows implementation of an accessible application without affecting its "look and feel."

When developing an application using GTK, it is important to avoid modifying or replacing the "data model portion" of each component with a custom one. Otherwise, there is risk of improper implementation of methods that are required to support the interfaces and the breaking of the accessibility features of the component.

Another GTK concept is a cell renderer, which is an object primarily used to draw certain graphical elements within a list of elements. For example, GtkTreeView widgets use GtkCellRenderer to draw many cells on the screen.

If changing the cell renderer for a GTK object, make sure it implements AtkObject. If implementing a cell renderer on an existing GTK object, configure the cell renderer for the given element and reuse an already accessible component.

ATK Implementations for GTK+ 2.0 Widgets

The following table lists GTK+ 2.0 user interface widgets with their ATK role and interface implementations in GAIL. If an interface or role is not listed, either the widget does not support that interface or it inherits its implementation of that interface or role from an ancestor widget indicated by the GAIL Inheritance column.

Note: Deprecated GTK+ widgets were not included in this table even though some of them have GAIL implementations (such as !GtkCList, GtkCombo, GtkList, GtkPixmap, and GtkOptionMenu). Also note the application programmer needs to make embedded objects and document structure accessible in the GtkTextView widget. While the GAIL ATK implementation for GTK+ widgets can be used as a sample ATK implementation, it may not represent the ideal implementation. For recommended ATK implementations (interfaces, states, role, actions, relations, events, etc) for common UI widgets, refer to the UI 11.3 Recommended ATK Implementations for Common UI Components].

Widget

GAIL
Implementation

GAIL
Inheritance

ATK
Interfaces

ATK_ROLE

GtkWidget

GailWidget

AtkComponent,
AtkObject,
AtkStateSet,
AtkRelationSet,
AtkRelation

(base class)
ATK_ROLE_UNKNOWN

GtkLabel

GailLabel

GailWidget

AtkObject,
AtkText (AtkAttributeSet),
AtkStateSet,
AtkRelationSet

ATK_ROLE_LABEL

GtkAccelLabel

GailLabel

ATK_ROLE_ACCEL_LABEL

GtkArrow

GailArrow

GailWidget

AtkObject,
AtkImage

ATK_ROLE_ICON

GtkImage

GailImage

GailWidget

AtkObject,
AtkComponent,
AtkImage

ATK_ROLE_ICON

GtkContainer

GailContainer

GailWidget

AtkObject

ATK_ROLE_UNKNOWN or
ATK_ROLE_PANEL

GtkViewPort

GailContainer

ATK_ROLE_VIEWPORT

GtkToolbar

GailContainer

ATK_ROLE_TOOLBAR

GtkScrolledWindow

GailScrolledWindow

GailContainer

AtkObject

ATK_ROLE_SCROLL_PANE

GtkFrame

GailFrame

GailWidget

AtkObject

ATK_ROLE_PANEL

GtkButton

GailButton

GailWidget

AtkObject,
AtkComponent,
AtkAction,
AtkImage
(if an image),
AtkText (AtkAttributeSet),
AtkStateSet

ATK_ROLE_PUSH_BUTTON or
ATK_TABLE_COLUMN_HEADER (if tree view)

GtkToggleButton

GailToggleButton

GailButton

AtkObject,
AtkAction,
AtkStateSet

ATK_ROLE_TOGGLE_BUTTON

GtkCheckButton

GailToggleButton

ATK_ROLE_CHECK_BOX

GtkRadioButton

GailRadioButton

GailToggleButton

AtkObject,
AtkRelationSet,
AtkRelation

ATK_ROLE_RADIO_BUTTON

GtkExpander

GailExpander

GailContainer

AtkObject,
AtkText (AtkAttributeSet),
AtkAction,
AtkStateSet

ATK_ROLE_TOGGLE_BUTTON

GtkItem

GailItem

GailContainer

AtkObject,
AtkText (AtkAttributeSet)

ATK_ROLE_LIST_ITEM

GtkMenuItem

GailMenuItem

GailWidget

AtkObject,
AtkAction

ATK_ROLE_MENU_ITEM

GtkSeparatorMenuItem

GailMenuItem

ATK_ROLE_SEPARATOR

GtkTearOffMenuItem

GailMenuItem

ATK_ROLE_TEAR_OFF_MENU_ITEM

GtkCheckMenuItem

GailCheckMenuItem

GailMenuItem

AtkObject,
AtkStateSet

ATK_ROLE_CHECK_MENU_ITEM

GtkRadioMenuItem

GailRadioMenuItem

GailCheckMenuItem

AtkObject,
AtkRelationSet

ATK_ROLE_RADIO_MENU_ITEM

GtkMenuShell

GailMenuShell

GailContainer,
GailWidget

AtkObject,
AtkSelection

ATK_ROLE_MENU_BAR

GtkMenu

GailMenu

GailMenuShell

AtkObject

ATK_ROLE_MENU

GtkMenuBar

GailMenuShell

ATK_ROLE_MENU_BAR

GtkWindow

GailWindow

GailWidget

AtkObject,
AtkComponent,
AtkRelation,
AtkRelationSet,
AtkStateSet

ATK_ROLE_WINDOW or
ATK_ROLE_PANEL or
ATK_ROLE_FRAME

GtkDialog

GailWindow

ATK_ROLE_DIALOG

GtkColorSelectionDialog

GailWindow

ATK_ROLE_COLOR_CHOOSER

GtkFileSelection

GailWindow

ATK_ROLE_FONT_CHOOSER

GtkColorSelection

GailWindow

ATK_ROLE_COLOR_CHOOSER

GtkFontSelection

GailWindow

ATK_ROLE_FONT_CHOOSER

GtkFontSelectionDialog

GailWindow

ATK_ROLE_DIALOG

GtkMessageDialog

GailWindow

ATK_ROLE_ALERT

GtkHandleBox

GailWindow

ATK_ROLE_WINDOW

GtkTooltips

GailWindow

ATK_ROLE_TOOL_TIP

GtkBox

GailBox

GailContainer

AtkObject,
AtkStateSet

ATK_ROLE_FILLER

GtkButtonBox

GailBox

ATK_ROLE_FILLER

GtkHButtonBox

GailBox

ATK_ROLE_FILLER

GtkVButtonBox

GailBox

ATK_ROLE_FILLER

GtkHBox

GailBox

ATK_ROLE_FILLER

GtkComboBox

GailComboBox

GailContainer

AtkObject,
AtkAction,
AtkSelection

ATK_ROLE_COMBO_BOX

GtkStatusBar

GailStatusBar

GailContainer

AtkObject,
AtkText (AtkAttributeSet)

ATK_ROLE_STATUSBAR

GtkFixed

GailContainer

ATK_ROLE_UNKNOWN

GtkPaned

GailContainer

ATK_ROLE_UNKNOWN

!GtkHPaned

GailContainer

ATK_ROLE_UNKNOWN

GtkVpaned

GailContainer

ATK_ROLE_UNKNOWN

GtkLayout

GailContainer

ATK_ROLE_UNKNOWN

GtkPacker

GailContainer

ATK_ROLE_UNKNOWN

GtkTable

GailContainer

ATK_ROLE_UNKNOWN

GtkNotebook

GailNotebook

GailWidget

AtkObject,
AtkSelection

ATK_ROLE_PAGE_TAB_LIST

GtkTreeView

GailTreeView

GailContainer

AtkObject,
AtkComponent,
AtkTable,
AtkSelection,
AtkRegistry,
AtkObjectFactory,
AtkRelationSet,
AtkRelation,
AtkStateSet

ATK_ROLE_TREE_TABLE or
ATK_ROLE_TABLE or
ATK_ROLE_UNKNOWN

GtkCellRenderer

GailRendererCell

GailWidget

AtkObject

ATK_ROLE_TABLE_CELL

GtkCellRendererText

GailTextCell

GailWidget

AtkObject,
AtkText (AtkAttributeSet)

ATK_ROLE_TABLE_CELL

GtkCellRendererToggle

GailBooleanCell

GailWidget

AtkObject

ATK_ROLE_TABLE_CELL

GtkCellRendererPixbuf

GailImageCell

GailWidget

AtkObject,
AtkImage,
AtkComponent

ATK_ROLE_TABLE_CELL

GtkTextView

GailTextView

GailContainer

AtkObject,
AtkEditableText,
AtkText (AtkAttributeSet),
AtkStateSet
(Why not AtkHyperlink
and AtkHypertext for when there
are links and AtkTable for when
there's a table?)

ATK_ROLE_TEXT

GtkCalendar

GailCalendar

GailWidget

AtkObject
(Why not AtkSelection?)

ATK_ROLE_CALENDAR

GtkEntry

GailEntry

GailWidget

AtkObject,
AtkEditableText,
AtkText (AtkAttributeSet),
AtkRelation,
AtkRelationSet,
AtkStateSet,
AtkAction

ATK_ROLE_TEXT or
ATK_PASSWORD_TEXT

GtkSpinButton

GailSpinButton

GailWidget

AtkObject,
AtkValue

ATK_ROLE_SPIN_BUTTON

GtkRange

GailRange

GailWidget

AtkObject,
AtkValue,
AtkStateSet

ATK_ROLE_SLIDER

GtkScale

GailScale

GailRange

AtkObject,
AtkText (AtkAttributeSet)

(base class)

GtkHScale

GailScale

GtkVScale

GailScale

GtkScrollbar

GailScrollbar

GailRange

AtkObject

ATK_ROLE_SCROLLBAR
(base class)

GtkHScrollbar

GailScrollBar

GtkVScrollbar

GailScrollBar

GtkSeparator

GailSeparator

GailWidget

AtkObject,
AtkStateSet

ATK_ROLE_SEPARATOR
(base class)

GtkHSeparator

GailSeparator

GtkVSeparator

GailSeparator

GtkProgressbar

GailProgressBar

GailWidget

AtkObject,
AtkValue

ATK_ROLE_PROGRESS_BAR

GtkAdjustment

GailAdjustment

GailWidget

AtkObject,
AtkValue

ATK_ROLE_UNKNOWN

The Accessible Toolkit (ATK) API Reference

For applications using the GTK graphical user interface (GUI), accessibility information is automatically provided to Assistive Technologies. In general, the programmer only needs to add the application's widget tool tip descriptions and relationships via the Accessible Toolkit (ATK) application programming interface (API). The rest of the ATK documentation is useful for Custom making custom widgets accessible].

The ATK documentation should be found on any development Linux system via the devhelp command. Run "devhelp" at the command line of your terminal emulator, or look for it at [usr/share/gtk-doc/html/atk/atk.html /usr/share/gtk-doc/html/atk/atk.html] (Linux only). Alternatively, you should be able to find the referenced documentation online (on both Linux and Windows).

Here is the object hierarchy for ATK:

Building Custom Accessible Widgets

This section is an introduction to building custom accessible widgets for a Linux GNOME application using ATK. There are basically two different ways to create a custom widget for a GNOME application:

  1. Start with a GTK widget class and override gtk_widget_get_accessible in your widget's AtkObject implementation. Assess which ATK interfaces (including attributes and events) can be inherited versus overridden from the parent widget class.

  2. Create an AtkObjectFactoryClass which overrides create_accessible and get_accessible_type. Register the AtkObject factory type usingatk_registry_set_factory_type. Determine which ATK interfaces a custom widget should implement based on the widget's features and functionality.

Note: The GAIL library is an ATK implementation libary for GTK widgets. Its source code may be helpful in understanding how to create custom ATK object implementations for custom widgets. However, if developing proprietary code, do not review GAIL or any other open source code protected by open source licenses. Violating this rule could compromise the originality of proprietary code.

Start with a GTK widget class

If creating a custom GTK widget, create an AtkObject subclass which overrides gtk_widget_get_accessible and inherits from a "default" ATK implementation for a similar GTK widget. Decide which ATK interface methods the new widget should override and if there are additional ATK interfaces that should be supported. For example, if the custom widget is like a GTK notebook widget, determine which AtkObject, AtkSelection, AtkComponent, AtkStateSet, and AtkRelationSet method implementations in the basic widget and notebook widget classes that the new custom widget ATK implementation should inherit versus override. If additional ATK interfaces (i.e. AtkText, AtkHypertext, AtkTable, etc), methods, role, states, or events should be supported, implement those.

Create and register an ''AtkObject'' factory

If a custom widget or set of custom widgets does not have an accessible object (AtkObject) implementation in an ATK implementation library, then the developer must provide custom AtkObject implementations in a GTK module. (Note that libgail.so is a GTK module containing all the ATK implementation classes for GTK widgets.) This module should be included in the GTK_MODULES environment variable so it is loaded at runtime. Each AtkObject implementation has a corresponding accessible object factory class (AtkObjectFactoryClass). A central ATK registry links object types (GTypes) to these accessible object factories.

Each factory must be implemented as a child of class type ATK_TYPE_OBJECT_FACTORY and must implement the function create_accessible. This function must create an appropriate AtkObject. A factory can be used to create more than one type of object, in which case its create_accessible function will need to include logic to build and return the correct AtkObject.

AtkObject* atk_object_factory_create_accessible
           (AtkObjectFactory *factory, GObject *obj);

Create an AtkObjectFactoryClass with an initialization function that overrides the default create_accessible and get_accessible_type methods for an AtkObjectFactory:

static void
newatklib_new_widget_factory_class_init (AtkLibNewWidgetFactoryClass *klass)
{
  AtkObjectFactoryClass *class = ATK_OBJECT_FACTORY_CLASS (klass);
  class-&gt;create_accessible = newatklib_new_widget_factory_create_accessible;
  class-&gt;get_accessible_type = newatklib_new_widget_factory_get_accessible_type;
}

Then implement those methods in the factory class.

In the base ATK implementation class, register an ATK object factory type for each ATK object in the ATK module initializaion method:

atk_registry_set_factory_type (atk_get_default_registry(), SOME_TYPE_NEW_WIDGET,
                               newatklib_new_widget_factory_get_accessible_type());

Macros could be defined in the factory class and then used by the accessibility_module_init function in the base widget class to create and register the ATK object factory types for new widgets.

Creating an ATK object implementation class

After ensuring that every custom widget in your application has an AtkObjectFactoryClass which is registered, developers must create an ATK object implementation class for each custom widget that either overrides ATK interfaces in the parent widget class or implements all the ATK interfaces required to support the features and functionality of the custom widget.

Implement get_type plus class and instance initializer functions

As a first step, all AtkObject implementation classes (which are GObjects) must implement a get_type() function to set up class and instance initializer functions, and to indicate which ATK interfaces the ATK object implements. The class_init() function can redefine any ATK functions calls defined by the object's parent class, and can define the object class' own custom init(), notify_gtk(), and finalize() functions. A custom init() function caches data or listens to signals retrieved from a backing GTK widget. If the ATK object needs to listen to property notifications from a backing GTK widget, a notify_gtk() function is needed. A finalize() function is needed to free data when the ATK object is destroyed. Examples 5 - 12 in the "GNOME Accessibility for Developers" guide show sample implementations of all these functions.

Implement base ''AtkObject'' methods and properties

If creating a base AtkObject class for a whole set of custom widgets, or if overriding base ATK object property values (such as name, description, relations, role, and states), in a more specific AtkObject class, you need to implement functions which override the methods or set properties found in the ''AtkObject'' interface. For example, a base AtkObject class for widgets should implement AtkObject methods such as atk_object_get_description, atk_object_get_parent, atk_object_ref_relation_set, atk_object_ref_state_set, atk_object_get_index_in_parent, and atk_object_initialize. Specific ATK widget classes, such as a widget class for a radio button, which inherit from a base AtkObject class may need to implement only atk_object_initialize to set the specific widget's role property.

Parent objects should identify their child objects in the logical order in which they should be navigated via the keyboard, and child objects should report who their parent is and where they are located within the parent object. To make it possible for assistive technologies to properly navigate all objects in the correct order, it is critical for application developers to implement the following ATK interfaces and methods:

When it is not possible to indicate parent/child relationships between objects that match relationships seen visually, implement ATK_RELATION_FLOWS_TO and ATK_RELATION_FLOWS_FROM to let the AT know the logical navigation order of those objects.

The AtkObject interface provides a significant number of built-in role enumerations.

The atk_object_ref_state_set returns information about object states, for which enumerations are defined in the AtkState interface. Associate states with custom objects using AtkStateSet.

The atk_object_ref_relation_set returns an object's relationship types, which are enumerated in the ''AtkRelation'' interface. [bmgapguidegtkatk.html#_Toc412398981 Establish relationships between objects] for custom objects using the same AtkRelation, AtkRelationSet, and AtkObject methods used for defining relationships between GTK+ widgets.

Flyweight objects are AtkObjects created on the behalf of objects that aren't full-blown widgets, like cells in a treeview or table, and icons in an icon list. Their state is ATK_STATE_TRANSIENT, and they need to be generic enough to be useful in other widgets.

Two derived implementations of AtkObject are:

  1. AtkNoOpObject, which is the type of AtkObject created if an accessible object is requested for an object type for which no factory type is specified. When implementing this type of accessible object, all ATK interfaces should also be implemented. I think this just happens but application developers shouldn't do anything with this interface.

  2. ''AtkGObjectAccessible'', which should be implemented for GObjects which are not derived from GtkWidget, such as a canvas item.

Implementing ATK Subinterfaces

Custom widget developers must also decide which of the following ATK subinterfaces should be implemented for each widget to further define for an AT the specialized type of object and its features, functions, and behaviors.

AtkAction: Interactive AtkObjects (such as buttons, checkboxes, menu items, etc) should implement this interface to execute and describe an object's activations (click, press, toggle, expand, etc) and expose its key bindings, except when the user interaction is already covered by another appropriate interface. Exceptions include ''AtkEditableText'', which handles text insertion and deletion, and AtkValue, which handles the setting of values. When mouse and keyboard actions are redundant, expose only one action.

AtkComponent: All graphical user interface (GUI) objects which have screen coordinates should implement this interface to expose information about an object's size, position, and focus. A possible exception may be a text object with a transparent background that implements ''AtkText'' instead. Be sure to implement atk_component_ref_accessible_at_point and atk_component_get_extents to assist an AT in restricting their review of objects to what's visible in order to achieve better performance. A base ATK object class could implement AtkComponent, and ATK object classes which subclass the base class would inherit that implementation.

''AtkImage:'' Objects which display image or pixmap content on the screen, such as icons, buttons with icons, toolbar elements, and image viewing panes, should implement this interface to expose image descriptions (such as alternative text), size, and position.

''AtkSelection:'' UI components whose children can be selected, such as selectable lists and tree views, should implement this interface. For text selection, use the AtkText interface instead. If multiple children can be selected at the same time, set the ATK_STATE_MULTISELECTABLE state.

''AtkTable'': UI components which order child cell objects in rows and columns or present tree-structured information should implement this interface to expose row and column information (descriptions, headers, number of, selection, content at specific index) and the table caption and summary. The child objects (cells, headers, captions, summaries) implement other interfaces, such as AtkText and AtkImage, as required.

AtkValue: UI objects, such as sliders or dials, which either display and/or allow the user to specify a value from a bounded range should implement this interface for setting the current value and getting the minimum, maximum, or current value for a control. Values may be read-only.

AtkStreamableContent: UI text objects should implement this interface to provide access to a flat, streamable content view of a document. This interface is primarily useful for saving, printing, or post-processing entire documents, or for persisting alternate views of a document.

AtkText and AtkEditableText: Non-trivial objects which have non-editable text content with text attributes, are multi-line, and/or are selectable should implement the AtkText interface to expose text, character, caret, selection, range, and attribute content and information. If the text content is editable, the AtkEditableText interface should be implemented instead to expose all AtkText information as well as content which is copied, cut, pasted, inserted, and deleted. If the text is short and simple with no attributes, implement atk_object_get_name in the AtkObject interface instead.

If the text object is a document object, also implement AtkDocument (which is being updated) to indicate the document boundaries, locale, attributes, and events, plus implement all the ATK interfaces required to [GAP/AtkGuide/Atk#_Toc412398982 expose the accessibility information for each embedded object in the document]. Parent objects in a document should identify their child embedded objects in the logical order in which they should be navigated via the keyboard, and child objects in a document should report who their parent is and where they are located within the parent object using the parent and child methods in AtkObject as described above when implementing any accessible object. For example, a single paragraph may be a parent object for multiple child objects, such as images.

Remember to [bmgapguidegtkatk.html#_Toc412398981 establish relationships between objects] for form controls embedded in a document using the same AtkRelation, AtkRelationSet, and AtkObject methods used for defining relationships between GTK+ widgets.

Use the AtkSelection interface on the top-level document object to show which paragraphs have selected text, especially if selections span paragraphs or if there are multiple text selections in a document.

  • Implement AtkAction for all form controls and elements with event handlers in a document as well as the atk_action_get_keybinding method to identify access keys when defined for interactive elements.

    Identify and expose the accessible information for all types of embedded objects in documents, including images, tables, hyperlinks, paragraphs, and text controls, by implementing AtkImage, AtkTable, AtkText, AtkHypertext, and AtkHyperlink.

The AtkText interface provides a set of enumerated text attributes, but when necessary, new name-value pairs can be defined as text attributes to describe new object characteristics using atk_text_attribute_register. To set attributes for text objects, implement atk_editable_text_set_run_attributes in the AtkEditableText interface, even if the text object is read-only.

To assist an AT in restricting their review of objects to what's visible in order to achieve better performance, be sure to implement atk_text_get_character_extents, atk_text_get_offset_at_point, and atk_text_ get_bounded_ranges.

Note: To improve the efficiency of complex document navigation by assistive technologies, a new AtkCollection interface may be defined to match the new AT-SPI ''Collection'' interface sometime in the near future. For now, the AT-SPI Collection interface will be implemented in the ATK bridge to use the ATK interfaces implemented for objects embedded in complex, rich text documents. Complete implementation of ATK interfaces for embedded objects is critically important for the success of the Collection interface implementation.

''AtkHypertext''and '''AtkHyperlink''': Each UI object containing links should implement the AtkHypertext interface to provide a way to get links, their offsets, and the number of links. Each object which contains a link or set of links should also implement AtkHyperlink to provide a way to get URIs and find out information about the anchors (location, validity, is inline, is selected, how many), but the information is returned via calls to AtkHypertext. AtkHyperlink implements AtkAction for activating links.

For recommendations about which ATK interfaces, states, role, events, actions, and other accessible information and behaviors should be implemented for common types of user interface objects, refer to section [GAP/AtkGuide/UI Recommended ATK Implementations for Common UI Components].

Managing Children

There are two types of children you can have in any GUI application. One is a "live" child, created by adding a component to a container. These live children operate as separate entities and respond to events propagated by the component hierarchy.

The second type of child is drawn and managed by the parent in an effort to save system resources. Here, the parent is a "proxy" for its child. This lightweight, proxied child is usually a transient object. A typical proxied child would be a list box entry. A list box could have 100 items in it and you would not want to have the overhead of creating a live child for each item. So, proxied children are manufactured and drawn by their parent from the list boxes data as needed.

An example of this is implementation of GTK cell renderers for a list box, which is created using a GtkTreeView widget. In a GTK list box, each list entry is created through the use of a single GtkCellRenderer. The GtkTreeView widget for the list box tells the renderer where to draw, when to "appear" selected, and so on. The GtkTreeView component does not care what the cell renderer draws in it as long as the renderer does what it is told. The cell renderer does not receive focus from the windowing system, even though GtkTreeView may ask it to appear focused.

The GtkNotebook widget presents a different parent/child relationship that might best be described as a limited proxy. In the case of notebook page tabs, you know you will be dealing with a limited number of children. Here, the tabs are not actually components, but merely visual page tab elements with a reference to the component to be shown, based on the page tab selected. Because the list of elements is small, and generally persistent, it is easier to maintain a vector of accessible objects representing each page tab. When assistive technology requests an accessible child, the ATK implementation for GtkNotebook, merely goes to the internal vector of accessible page tab objects and returns the corresponding object.

The parent component should report its accessible children using atk_object_get_n_accessible_children andatk_object_ref_accessible_child.

Here are some basic rules to follow when managing children:

  • Make sure the children implement AtkObject.

  • If the children are selectable, a proxying parent should:
    • Implement AtkSelection. This is not the case when the parent does not proxy for the child.

    • The children must indicate the state ATK_STATE_SELECTED in their AtkStateSet interface implementation when selected.

  • Proxying parents managing states for their children should fire property-change events from their AtkObject interface for their children. This is very important for proxying components that manage large lists of children. Assistive technology developers would like to avoid adding ObjectEventListeners to each list entry.

  • When managing focus for a child, make sure the children are accessible via the keyboard.
  • Make sure the parent reports the children (0 through n-1) in the logical order they appear and are navigable via the keyboard.
  • Make sure all property change events are fired. If you have a child whose text changes, make sure to fire a visible-data-changed property event unless the child implements AtkText, which should fire the text_changed event.

  • All children must report who their accessible parent is. For live GTK components this is done automatically. For all custom components the parent should be the actual accessible parent.
  • Only report proxied children in accessible child count and when acquiring the accessible children. The other live children are already handled via the component count from their container.

Managing Events

The main purpose of the class AtkUtil is to provide methods for adding and removing event listeners and for inquiring about the root AtkObject of the application and the name and version of the GUI toolkit. The adding and removing of the listeners must be done in the same thread. The following event listeners can be added:

  • Focus tracker: Use atk_add_focus_tracker to provide a function that gets called when an object receives focus.

  • Global events: Use atk_add_global_event_listener to provide a function that gets called when a specific type of event occurs.

An application or toolkit that bridges to ATK needs to subclass AtkUtil and to re-implement these methods. For event notification it is necessary to manually notify each of the event listeners.

Since live children need to be available to receive events, they are are also available to fire events, such as accessible state change events, needed by an assistive technology. However, unlike live children, proxied children are usually transient and therefore an assistive technology would not be able to receive any events from them. Therefore, all accessibility events pertaining to the proxied children should be generated from the proxying parent.

Refer to section [GAP/AtkGuide/Atk2Msaa#msaaevents Object Level Events aka Signals] for a list of ATK events.

To set up event listeners for ATK objects and which functions should be called when a specified event type occurs, use AtkEventListener(), atk_add_global_event_listener, atk_add_focus_tracker, and related methods in the AtkUtil class. Object events are also known as signals in GNOME and ATK. Some new events/signals are being proposed as a result of AT-SPI 1.7 interface changes.

Examples:

  • Create an event watcher, for example in a base ATK implementation class, with the atk_add_focus_tracker() function:

      atk_focus_tracker_init (my_focus_tracker_init);
      focus_tracker_id = atk_add_focus_tracker (my_focus_tracker);

    where _my_focus_tracker() is a function with this prototype:

      static void _my_focus_tracker (AtkObject *aobject);
    • What about atk_component_add_focus_handler in AtkComponent? How is that different from the focus tracker in AtkUtil?)

  • Set up a global event listener, with atk_add_global_event_listener():

      mouse_watcher_focus_id =
         atk_add_global_event_listener(_my_global_listener,
         "Gtk:GtkWidget:enter_notify_event");

    where _my_global_listener has the prototype of a Glib GSignalEmissionHook. This example would cause the _my_global_listener() to be called whenever an enter_notify_even signal occurs on a GtkWidget object.

  • Setting up an ATK signal handler: Using the column_inserted signal as an example:

         table_column_inserted_id = g_signal_connect_closure_by_id (my_atk_obj,
         g_signal_lookup ("column_inserted", G_OBJECT_TYPE (my_atk_obj)),
         0, g_cclosure_new (G_CALLBACK (_my_table_column_inserted_func),
         NULL, NULL), FALSE);

    This will cause _my_table_column_inserted_func() to be called whenever a column_inserted signal is emitted on the AtkObject my_atk_object.

  • Connecting to or generating a signal is slightly different if the signal supports detail. The children_changed signal supports the add detail. To generate this signal with the add detail is also specified, this technique is used:

      g_signal_emit_by_name (atk_obj, "children_changed::add",
      ((row * n_cols) + column_count), NULL, NULL);

ATK implementation examples for documents

Below is a table containing HTML document samples with recommend ATK implementations.

Note: All accessible objects implement AtkObject and AtkComponent. Key: * = Embedded object character (0xfffc), used when no text from the object will be inserted in the parent AtkHypertext

Example: Paragraph with an Image in it

HTML source
  • <h1>This is a heading</h1>
    <p>
      This is a paragraph with an
      <image src="image.gif"
             alt="some image"/>
      image in it.
    </p>
    <h2>This is another heading</h2>

Recommended ATK implementation
  • (parent AtkText, role=ATK_ROLE_HEADING,
     objattr="xhtml:role=h1",
       text-attributes="css:font-size=LARGER",
       text="This is a heading")
    (parent AtkHypertext, role=ATK_ROLE_PARAGRAPH,
     attr="xhtml:role=p"
     text="This is a paragraph with an * image in it")
      (child AtkImage, AtkHyperlink, role=ATK_ROLE_IMAGE,
       ImageDescription ="some image",
       AccessibleName = "" [the HTML title attribute,
         if present]
       hyperlink-range=[28,29])
    (parent AtkText, role=ATK_ROLE_HEADING,
       objattr="xhtml-role:h2",
       text-attributes="css:font-size=LARGE",
       text="This is another heading")

Example: Header with a break in it

HTML source
  • <p>Hey!<br>Tell me something.</p>

Recommended ATK implementation
  • (parent AtkText, role=ATK_ROLE_PARAGRAPH, attr="xhtml:role=p",
     text="Hey!\nTell me something")

HTML source
  • <a href="http://www.google.com">Hey!
    <br>Tell me something.</a>

Recommended ATK implementation
  • (parent AtkHyperlink, AtkText, role=ATK_ROLE_LINK
     attr="xhtml:role=a;link-type=anchor",
     text="Hey!\nTell me something",
     hyperlink-range=[depends on the containing context],
     hyperlink-URI="http://www.google.com",
     hyperlink-Object=AtkText)

Example: Two paragraphs with a horizontal line

HTML source
  • <p>Hey</p><hr/>
    <p>Tell me something</p>

Recommended ATK implementation
  • (parent1 AtkText, role=ATK_ROLE_PARAGRAPH,
     text="Hey")
    (parent2 role=ATK_ROLE_SEPARATOR,
     [note: AtkState doesn't include ATK_STATE_VERTICAL,
           to distinguish from vsep])
    (parent3 AtkText, role=ATK_ROLE_PARAGRAPH,
     text="Tell me something")

Example: Pagragraph with an emphasis

HTML source
  • <p>
      You <em>are</em> a nice person.
    </p>

Recommended ATK implementation
  • (parent AtkText, role=ATK_ROLE_PARAGRAPH, attr="html:role=p",
     text="You are a nice person",
     attribute run for "are", with textattr="em=true,
    css:text-style=oblique")

HTML source
  • <p>
      Here is a
      <a href="http://foo.bar.com">
        bartending site
      </a>
     .
    </p>

Recommended ATK implementation
  • (parent AtkHypertext, role=ATK_ROLE_PARAGRAPH, attr="html:role=p"
      text="Here is a bartending site.",
      attribute run for "bartending site." with textattr="link=true,
      css:text-decoration=underline, css:color=(0,0,255)")
       (child AtkText,  AtkHyperlink,
         role=ATK_ROLE_LINK, attr="html:role=a, link-type:anchor",
         text="bartending site",
         hyperlink-indices=[10,26]
         hyperlink-URI="http://foo.bar.com")

HTML source
  • <p>
      Here is a
      <a href="http://foo.bar.com">
        <image src="beerglass.GIF"
               alt="beer glass"/>
        bartending site
      </a>
      .
    </p>

Recommended ATK implementation
  • (parent AtkHypertext, role=ATK_ROLE_PARAGRAPH,
    attr="html:role=p" text="Here is a bartending site."
     attribute run for "bartending site." with textattr="link=true,
      css:text-decoration=underline, css:color=(0,0,255)")
       (child AtkHypertext, AtkHyperlink,
         role=ATK_ROLE_LINK,
         text="*bartending site"
               hypertext-indices=[10,26],
    [not sure if we need to dup textattrs here, or add them to defaulttextattrs],
         hypertext-URI="http://foo.bar.com")
             (grandchild AtkImage, AtkHyperlink
               role=ATK_ROLE_IMAGE, attr="html:role=img,
               link-type=image"
               AccName/ImageDescription="beer glass",
               hyperlink-indices=[0,0]
            hyperlink-URI="beerglass.GIF")
    [don't know if the URIs should always be fully specified, or if omitting the base URI is OK]

Example: BLAH with a break in it

HTML source
  • <p>
      Here is a
      <image src="beerglass.GIF"
             alt="beer glass"/>
      <a href="http://foo.bar.com">
        bartending site
      </a>
      .
    </p>

Recommended ATK implementation
  • (parent AtkHypertext, role=ATK_ROLE_PARAGRAPH, attr="html:role=p",
      text="Here is a *bartending site."}
       {child AtkImage, AtkHyperlink,
         role=ATK_ROLE_IMAGE, attr="html:role=img, link-type=image"
         AccName/ImageDescription="beer glass",
         hyperlink-indices=[10,10]
         hyperlink-URI="beerglass.GIF")
       (child AtkText, AtkHyperlink, AtkAction,
        AtkHypertext, role=ATK_ROLE_LINK,
         action-names="activate", [others?]
         attr="html:role=a, link-type=anchor"
         text="bartending site",
         textattr=[as in above examples]
         hypertext-indices=[10,26],
         hypertext-URI="http://foo.bar.com")

Example: image map

HTML source
  • <p>
      <IMG SRC="sitemap.gif"
           ALT="Site map"
           USEMAP="#mymap"></p>
      <MAP name="htmlcat_ibmgapguidecustom.html_mymap" title="site map">
        <AREA href="#htmlcat_1.html" ALT="Bar"
              COORDS="5,5,95,195">
        <AREA href="#htmlcat_2.html" ALT="Baz"
              COORDS="105,5,195,195">
        <AREA href="#htmlcat_3.html" ALT="Fu"
              COORDS="205,5,295,195">
      </MAP>
    </p>

Recommended ATK implementation
  • (parent AtkHypertext, role=ATK_ROLE_PARAGRAPH,
     text="*")
      (child AtkImage, AtkHypertext,
       role=ATK_ROLE_IMAGE_MAP,
       attr="html:role=map",
       hyperlink-URI="sitemap.gif",
       ImageBounds=[entire map area]
       AccName and ImageDescription="Site map"}
        (grandchild AtkHyperlink, AtkAction,
         action-names="click", role=ATK_ROLE_LINK,
         attr="html:role=area", hyperlink-URI="1.html", name="htmlcat_ibmgapguidecustom.html_Bar")
        (grandchild AtkHyperlink, AtkAction,
         action-names="click", role=ATK_ROLE_LINK,
         attr="html:role=area", hyperlink-URI="2.html", name="htmlcat_ibmgapguidecustom.html_Baz")
        (grandchild AtkHyperlink, AtkAction,
         action-names="click", role=ATK_ROLE_LINK,
         attr="html:role=area", hyperlink-URI="3.html", name="htmlcat_ibmgapguidecustom.html_Fu")
    [note that the component bounds of the areas correspond to their rectangular bounding boxes]

Example: bulleted list

HTML source
  • <ul>
      <li>This is a list item.</li>
      <li>This is another list item.</li>
    </ul>

Recommended ATK implementation
  • (parent AtkObject, role=ATK_ROLE_LIST,
       attr="css:list-style-type=disc")
      (child AtkText, role=ATK_ROLE_LIST_ITEM,
       text="This is a list item.",
       attribute run "static" first 2 chars)
      (child AtkText, role=ATK_ROLE_LIST_ITEM,
       text="This is another list item.",
       attribute run "static" first 2 chars)
    [we should be able to support list-style=image, and "list-style-image=URL()", etc. this way.
    In the above example, it's not clear whether the bullet should be a unicode char
    or just omitted and implied by the list style..
    my guess is the latter (i.e. bullets don't appear in the text)]

Example: numbered list

HTML source
  • <ol>
      <li>This is a list item.</li>
      <li>This is another list item.</li>
    </ol>

Recommended ATK implementation

(parent AtkObject, role=ATK_ROLE_LIST,
   attr="html:role=ol, css:list-style-type:decimal")
  (child AtkText, role=ATK_ROLE_LIST_ITEM,
   text="1. This is a list item.",
   attribute run "static" first 3 chars)
  (child AtkText, role=ATK_ROLE_LIST_ITEM,
   text="2. This is another list item.",
    attribute run "static" first 3 chars)
[we should clearly define a text attribute which means "this text is
not explicit in the content, but was added by the presentation/user agent. I
believe MSAA/IE uses "static" ?]

Example: nested bulleted lists

HTML source
  • <ul>
      <li>
        This is a list item.
        <ul>
          <li>Nested item 1</li>
          <li>Nested item 2</li>
        </ul>
      </li>
      <li>This is another list item.</li>
    </ul>

Recommended ATK implementation
  • (parent AtkObject, role=ATK_ROLE_LIST,
       attr="html:role=ul, css:list-style-type=disc")
      (child AtkHypertext, role=ATK_ROLE_LIST_ITEM,
       text="This is a list item.*"}
         (grandchild AtkObject, AtkHyperlink, role=ATK_ROLE_LIST,
          attr="html:role=ul, css:list-style-type=circle,
          link-type=child",
          hyperlink-indices=[20,20],
          hyperlink-URI="",
    [Hmm, degenerate case here...] )
            (great-grandchild AtkText, role=ATK_ROLE_LIST_ITEM,
              attr="html:role=li" text="Nested item 1")
            (great-grandchild AtkText, role=ATK_ROLE_LIST_ITEM,
               attr="html:role=li" text="Nested item 2")
       (child AtkText, role=ATK_ROLE_LIST_ITEM,
        text="This is another list item.")
    [Note that unlike user interface ATK_ROLE_LIST objects, these lists don't
    implement AtkSelection, and the list items' AtkStateSets do not include
    ATK_STATE_SELECTABLE. There is a question here as to whether <ul> and <ol> elements
    should always implement AtkText or not. I think it would be better if they did not, unless they had
    non-empty text content, but this may prove impractical.]

Example: form with a text area

HTML source
  • <form>
      <div>
        <label for="self"/>
          Tell me a little more:
        </label>
      </div>
      <div>
        <textarea>
          I am a monkey with a long
          tail. I like to swing from
          trees and eat bananas. I've
          recently taken up typing
          and plan to write my memoirs.
        </textarea>
      </div>
    </form>

Recommended ATK implementation
  • (parent AtkObject, role=ATK_ROLE_FORM, text="")
      (child1 AtkObject, role=ATK_ROLE_SECTION?
    [or should we use ATK_ROLE_PANE?]
    )
         (grandchild AtkText,
          role=ATK_ROLE_LABEL,
          ATK_RELATION_LABEL_FOR=child2,
          text="Tell me a little more:")
      (child2 role=ATK_ROLE_SECTION?)
        (grandchild AtkEditableText,
         AtkRelation, AtkStateSet, AtkAction,
         ATK_ROLE_ENTRY,
         text="I am a monkey with ..."),
         ATK_RELATION_LABELLED_BY=child1,
         STATE_MULTILINE,
         STATE_REQUIRED allowed)
    [ attribute run over the portion of the text scrolled into view?
    CONTROLLER_FOR/CONTROLLED_BY for the scrollbar/viewport?
    Alternative would be to treat all the text content as though it were visible, but that's no good
    for magnifiers and ATs for the mobility-impaired. Probably the textarea needs to be expanded somewhat, or at least fitted with AtkActions for scrolling
    plus text attribution for determining what parts of the text are
    currently scrolled into view, without the AT client having to resort to bounds checking in the
    "screen review" fashion. This is, however, a general problem with multiline text in viewports.
    The relatively new AtkText getBoundedRanges API reduces the pain somewhat since you can
    feed it the AtkComponent bounds and it will give you back the visible text.]

Example: form with checkbox

HTML source
  • <form aaa:describedby="checkhelp">
      <p>
        <span
         x2:role="wairole:description"
         id="checkhelp">
            Check one or more:
        </span>
        <input id="cb1" type="checkbox"/>
        <label for="cb1">Red</label>
        <input id="cb2" type="checkbox"/>
        <label for="cb2">Blue</label>
        <input id="cb3" type="checkbox"/>
        <label for="cb3">Green</label>
      </p>
    </form>

Recommended ATK implementation
  • (parent AtkObject,
     role=ATK_ROLE_FORM,
     attr="html:role=form",
     RELATION_DESCRIBED_BY=grandchild1,
     text="?")
      (child AtkText,
       role=ATK_ROLE_PARAGRAPH, attr="html:role=p", text="")
        (grandchild1 AtkText,
         role=ATK_ROLE_LABEL,
         RELATION_DESCRIPTION_FOR=parent,
         attr="html:role=wairole:description")
         text="Check one or more:"}
        (grandchild2 AtkAction,
         AtkStateSet, role=ATK_ROLE_CHECK_BOX,
         attr="html:role=input",
    [and same with other elements, expose html:role]
    [note also that these objects do NOT have accessible names, because they are labelled;
    accessible-name would presumably come from the HTML title attribute or other attribute.
    This is mainly to make it easier for ATs to avoid highly redundant speech in these cases.]
         ATK_RELATION_LABELLED_BY=grandchild3)
        (grandchild3 AtkText,
         role=ATK_ROLE_LABEL, text="Red",
         ATK_RELATION_LABEL_FOR=grandchild2)
        (grandchild4 AtkAction,
         AtkStateSet, role=ATK_ROLE_CHECK_BOX,
         ATK_RELATION_LABELLED_BY=grandchild5)
        (grandchild5 AtkText,
         role=ATK_ROLE_LABEL, text="Blue",
         ATK_RELATION_LABEL_FOR=grandchild4)
        (grandchild6 AtkAction,
         AtkStateSet, role=ATK_ROLE_CHECK_BOX,
         ATK_RELATION_LABELLED_BY=grandchild7)
        (grandchild7 AtkText,
         role=ATK_ROLE_LABEL, text="Green",
         ATK_RELATION_LABEL_FOR=grandchild6)
    [RFE: add ATK_RELATION_DESCRIBED_BY
    and ATK_RELATION_DESCRIPTION_FOR to match MSAA/DHTML.
    Also, I thought we had ATK_ROLE_FORM, but it seems not to be there.
    Did I miss something?]

Example: form with a selection

HTML source
  • <form>
      <label for="beverage">
        Make a selection:
      </label>
      <select id="beverage">
        <option>Water</option>
        <option>Wine</option>
        <option>Whiskey</option>
      </select>
    </form>

Recommended ATK implementation
  • (parent role=ATK_ROLE_FORM?)
      (child AtkText,
       role=ATK_ROLE_LABEL,
       ATK_RELATION_LABEL_FOR=child,
       text="Make a selection:")
      (child AtkAction,
       AtkStateSet, AtkSelection,
       attr="html:role=select",
       role=ATK_ROLE_COMBO_BOX,
       ATK_RELATION_LABELLED_BY)
           {grandchild,
            AtkText,
            AtkStateSet=...SELECTABLE, SELECTED...,
            attr="html:role=option",
            role=ATK_ROLE_LIST_ITEM, text="Water")
           (grandchild,
            AtkText,
            AtkStateSet=...SELECTABLE...,
            attr="html:role=option",
            role=ATK_ROLE_LIST_ITEM, text="Wine")
           (grandchild AtkText,
            AtkStateSet=...SELECTABLE...,
            role=ATK_ROLE_LIST_ITEM,
            attr="html:role=option",
            text="Whiskey")
    [note that because the entry field is not editable, but just displays the current
    selection, I think it should not be exposed (especially since it represents a node
     which is not present in the HTML DOM. The list items need not implement AtkAction,
    since the AtkSelection interface is used by the client to select among them.]

Example: form with a multi line selection

HTML source
  • <form>
      <label for="sports">
        Which sports do you like:
        <br>
        <select id="sports"
                multiple="multiple"
                size="3">
          <option>
            <img src="beerglass.gif"
                 alt="Beer"/>
            Baseball
          </option>
          <option>Basketball</option>
          <option>Football</option>
        </select>
      </label>
    </form>

Recommended ATK implementation
  • (parent role=ATK_ROLE_FORM?)
      (child1 AtkText,
       role=ATK_ROLE_LABEL,
       ATK_RELATION_LABEL_FOR=child2,
       text="Which sports do you like:\n*")
      (child2 AtkObject,
       accessible-name="htmlcat_ibmgapguidecustom.html_sports"
    [not sure exposing the id is a good idea though],
       AtkSelection,
       AtkStateSet=...MULTISELECT...
       attr="html:role=select",
       role=ATK_ROLE_LIST,
       ATK_RELATION_LABELLED_BY=child2)
           (grandchild1,
            AtkHyperText,
            AtkStateSet=...SELECTABLE, SELECTED...,
            attr="html:role=option",
            role=ATK_ROLE_LIST_ITEM, text="*Baseball")
              (great-grandchild AtkImage, AtkHyperlink,
               role=ATK_ROLE_IMAGE,
               attr="html:role=img, link-type=image",
               hyperlink-URI="beerglass.gif",
               hyperlink-indices=[0,0])
           (grandchild2,
            AtkText,
            AtkStateSet=...SELECTABLE...,
            attr="html:role=option",
            role=ATK_ROLE_LIST_ITEM, text="Basketball")
           (grandchild3 AtkText,
            AtkStateSet=...SELECTABLE...,
            role=ATK_ROLE_LIST_ITEM,
            attr="html:role=option",
            text="Football")

GNOME Development Tools

To find GNOME development tools use http://developer.gnome.org/tools/ or http://www.gnomefiles.org/category.php?cat_id=8. Below are some useful tools and some of their features which can help you develop and test accessibility enablement in GTK+ and other accessible GNOME applications.

Glade

Glade is a user-interface builder you can use to rapidly prototype GTK+ and GNOME applications. This tool can generate C/C++ user interface code or an XML user interface description that you can use in your application. From a tool palette, you can select different types of windows, dialogs, control widgets, and containers. If you are a developer from a Microsoft Windows background, you will be tempted to use the GTK Fixed container. You should avoid that temptation and learn to use the box containers for control widget layouts in your windows, dialogs, notebooks, panes, etc. For each widget, you should add appropriate accessiblity information using the Properties Window. You can look at the generated code file (.c and .h) to see the GTK and ATK methods used to set the accessible information for each widget. Refer to Essential Accessibility Programming Practices section in this guide for more detailed information about how to enable your GTK+ applications for accessibility. Refer to the GTK+ Reference Manual and ATK API reference documentation for more detailed information about interfaces and methods.

Keyboard equivalents, mnemonics for access keys, and accelerators

Under the Widget tab, if you want to add an access key mnemonic in a label for a control widget, type an underline before the access key letter (mnemonic) in the Label text. If there is a Use Underline property, set that to "Yes". For labels which are separate from the control widget (like text boxes, combo boxes, scales/sliders, spin buttons, etc), set the Focus Target property to the name of the widget which should receive keyboard focus when the underlined access key is pressed. Glade generates code that uses the following GTK methods to set access keys (mnemonics) and associate those access keys with their respective widgets:

gtk_label_new_with_mnemonic

gtk_label_set_mnemonic_widget

gtk_radio_button_new_with_mnemonic

You can set accelerators (shortcut keys) for commonly used functions, usually menu items. In Glade, you can use the Accelerators property under the Common tab. GTK functions which define global key combinations for applications and associate key bindings with specific widgets include:

gtk_window_add_accel_group
gtk_widget_add_accelerator

Accessible names and descriptions

Under the Accessibility tab (with the wheelchair icon), specify a Name property for each control widget that matches the text label for the widget. Type a Description for each widget that matches the tooltip (contextual) help for a widget. The actual Tooltip property is set under the Common tab for some control widgets. Glade does not allow you to set the tooltip for all controls, but you can use the gtk_tooltips_set_tip method to set a tooltip for any widget control that receives events. Also, add a Name and Description property for image widgets. Glade generates code that uses the following GTK and ATK methods to set accessible names, descriptions, and tooltips:

gtk_widget_get_accessible

atk_object_set_name

atk_object_set_description

atk_image_set_name

atk_image_set_description

gtk_tooltips_set_tip

Accessible relationships

Under the Accessibility tab (with the wheelchair icon), you should show the relationships between labels (including group labels) and controls using the Label For and Labelled By properties. When you have a logical group, such as radio buttons within a Frame widget, you should specify the Member Of property to show that each control is a member of the same group. If interaction with one widget controls the state, visibility, or some other property of another widget, then use the Controlled By and Contoller For properties to show that relationship between those widgets. Refer to the ATK Relation interface for descriptions of other relationships. Glade generates code that uses the following GTK and ATK methods to establish accessible relationships between widgets:

gtk_widget_get_accessible

atk_object_ref_relation_set

atk_relation_type_for_name

atk_relation_new

atk_relation_set_add

Accerciser

The Accerciser tool allows developers to inspect every running accessible program by viewing its complete widget tree and accessible information as well as log and listen to accessible events (focus, mouse, object, window, keyboard, toolkit) in the application.

To use accerciser to examine the accessibility information for pure GTK+ applications, be sure to set /desktop/gnome/accessibility with gconf or set the value of the GTK_MODULES environment variable to "gail:atk-bridge".

Testing for Accessibility

Today, there are several ways to test your application for accessibility:

  1. Use standard desktop personal computers and software in different ways
  2. Use accessibility testing tools
  3. Use assistive technologies
  4. Use assistive technology vendors and users during the development process

An example of the first method of using standard desktop personal computers is to unplug your mouse and try to navigate your application using only the keyboard. Is there documentation on how to use the tab, arrow, and shortcut keyboard keys? This approach will uncover where you need to implement keyboard access and how to do it in a way that is usable. Making Your Application Keyboard Accessible will help you in your implementation.

The second way to test your application for accessibility is to use an accessibility test tool. The Accerciser tool is one which you can use to help test the accessibility of your application. For example, accerciser will display each component's accessibility information (e.g. accessible names, descriptions, relationships, etc). A developer can use the tools to ensure that relevant information is available on components.

The third way to test your application for accessibility is to test your application with an assistive technology that presents your application in the form needed for a specific disability. There are a number of different GNOME assistive technologies being developed today:

  1. The Orca screen reader being developed by Sun Microsystems at gnome.org.

  2. The LSR screen reader being developed by IBM Corp. at gnome.org.

  3. The GNOME Onscreen Keyboard (GOK) being developed by the University of Toronto for users with mobility difficulties.

The fourth way to test your applications for accessibility is to involve assistive technology vendors and users who have disabilities in your development process.

Accessibility testing checklist

Follow this testing checklist that explains how to use accerciser and a screen reader to test your GNOME or GTK+ application for accessibility.
Later: Add more details for testing with specific screen readers.

  1. Fully run your application using only the keyboard to ensure each component which performs a user function can be accessed through the keyboard.
  2. Ensure the keyboard focus is set to a component when a window is activated.
  3. Use accerciser to analyze each component for accessibility

  4. Listening to a Linux screen reader output and/or viewing the output window, make sure text and components are spoken properly
    • Ensure text is echoed when you type characters
    • Ensure highlighted text is spoken
    • Ensure component labels are spoken
    • Ensure icon descriptions are set and spoken by a Linux screen reader
  5. For each component, verify that the Accessible Action works as you intended
  6. Make sure that all text and components in the visible parts of your application are read out loud and/or displayed in an output window.

The GNOME Foundation provides a set of test cases for testing general Linux software accessibility enablement in your application using keyboard navigation, Accerciser, Orca, LSR, GOK, system themes (fonts and colors), and the mouse. Refer to the IBM Accessibility Guidelines for a complete set of checkpoints against which you should test your Linux application for accessibility. Eventually we (the AC Test lab) want to add a complete set of Linux accessibility tests to all the IBM Accessibility Guidelines using a more developed Linux screen reader (Orca or LSR), Accerciser, and a Linux magnifier.

If your Linux application is a Web browser, you should also test the user agent accessibility compliance of your application using the W3C User Agent Accessibility Guidelines Test Suite.

Documentation, Online Information and Help

When developing documentation for your application in HTML, please follow the IBM Web accessibility checklist.

The World Wide Web Consortium (W3C) publishes Web content, tool, and user agent accessibility guidelines at http://www.w3.org/WAI.

Accessible format for documentation

Provide documentation in an accessible format.

Rationale

Some users may not be able to access documentation if it is not in an accessible format.

Techniques

The GNOME Documentation System consists of DocBook, Yelp (GNOME Help Browser), Scrollkeeper (document cataloging system), and some DocBook XML tools. DocBook is a markup language, like HTML. The GNOME Documentation Project (GDP) provides DocBook XSLT stylesheets to help in the conversion of DocBook files to HTML for viewing in Yelp. However, GDP DocBook XSLT stylesheets are not required to view DocBooks in Yelp, which has its own DocBook stylesheets. DocBook source can also be converted to PDF and PostScript formats. The GNOME Handbook of Writing Software Documentation describes how to create documentation using DocBook in greater detail.

Yelp, which uses a GECKO engine, can access several different documentation systems on Linux: man pages, texinfo pages, HTML, and DocBook. Scrollkeeper, which uses an Open Source Metadata Framework (OMF), works with Yelp to provide a table of contents, search engine, and indexing capabilities.

Man pages are plain text files created using gedit or another text editor and read using the terminal command line or Yelp.

Texinfo, from the GNU project, uses a single source file, loosely based on Brian Reid's Scribe and other formatting languages , to produce output in a number of formats (dvi, html, info, pdf, xml, etc.).

At this time we haven't studied how to create accessible Linux documentation, or how accessible the different documentation formats are on GNOME is using Linux screen readers with Yelp, Firefox, or terminal emulation.

The GNOME Documentation Style Guide has a section on Writing Accessible Documentation.

  • Provide application documentation in at least one or more of the following accessible formats:
  • Include text descriptions of illustrations and graphics in the documentation.
  • If the documentation is not available in an accessible format, provide documentation in braille or audio cassette, upon request from the user.

Testing

Test the software to ensure that it complies with accessibility requirements. The IBM Documentation Accessibility Checklist Checkpoint 1 covers how to test documentation for accessibility. But only using Microsoft Windows, not on Linux GNOME yet.

  • Test the accessibility of DocBook files using Linux screen readers and Yelp, with stylesheets and/or converted to HTML. Need to try this out with Gnopernicus and Orca to see how well it works and then add more detail.

  • Test the accessibility of man pages using a Linux screen reader, both from the terminal command line and using Yelp. Need to try this out with Gnopernicus and Orca to see how well it works and then add more detail.

  • Test the accessibility of texinfo files using a Linux screen reader and Yelp. Need to try this out with Gnopernicus and Orca to see how well it works and then add more detail.

  • Test the accessibility of HTML files using a Linux screen reader and Yelp and/or Firefox on Linux. Until Linux screen readers and browsers (Yelp and Firefox) have implemented ATK interfaces for document objects and structures, use Microsoft Windows assistive technology such as IBM Home Page Reader, JAWS, or Window Eyes to verify that HTML documentation is accessible.

  • Test the accessibility of PDF documents using a Linux screen reader with Adobe Reader on Linux and/or use the Adobe Acrobat Accessibility Checker. Until Linux screen readers and the Linux version of Adobe Reader have implemented ATK interfaces for document objects and structures, use the Accessibility Checker - Full Check in Adobe Acrobat on Microsoft Windows, or Microsoft Windows assistive technology like JAWS, Window Eyes, or IBM Home Page Reader. An accessible Linux Adobe Reader is not yet available.

See Test section Testing for Accessibillity].

Documentation for accessibility features

Provide documentation on all accessibility features as part of the regular product documentation..

Rationale

People with disabilities cannot effectively use the software if they cannot access information on how to use accessibility features. This is particularly important for keyboard access. Since most products focus on navigation with the mouse, it is not always clear how to use the product with the keyboard. All keyboard navigation which does not follow documented system conventions should be documented.

Techniques

The following techniques are required.

  • Provide a section where all accessibility features are documented. The online help documentation in Lotus Notes is a good example of this technique.
  • Provide a section where unique keyboard accessibility features are documented. If the software uses standard system keyboard commands for navigation, they do not have to be documented. The keyboard accessibility information could also be included as part of the general accessibility section.
  • When the software provides instructions for completing tasks using the mouse, include the instructions for doing those tasks using the keyboard.

The techniques above are required; the following techniques are recommended to enhance accessibility:

  • Include a keyword search and help topic item for accessibility.
  • Document any shortcut keys in the software by adding the information next to the command in the pull-down menu.
  • Future:' Include documentation on how to use a custom "Perk" or script for the IBM Linux Screen Reader and/or other Linux screen readers.

Testing

Test the software to ensure that it complies with accessibility requirements. Several techniques are available to verify that accessibility information is documented.

  • If the software does not use standard keyboard access or does not support the accessibility options available in the operating system, the accessibility features must be documented. Open the software documentation and verify there is a section which discusses accessibility features in the product.
  • If the product provides "how to" instructions or pop-up help, verify that instructions for performing the actions using the keyboard are available in addition to instructions for using the mouse.

See Test section Testing for Accessibillity].

Future Discussions

Linux accessibility enablement and assistive technologies are still evolving. These guidelines will need to be updated as applications like Yelp, Firefox and OpenOffice are further enabled for accessibility, as Linux assistive technologies and development tools are further developed, and as other areas of accessibility are addressed, such as multimedia (closed captioning and video descriptions). Other areas we need to address?

Appendix

The appendix describes keyboard bindings, acknowledgments, accessibility references and trademarks.

Keyboard Bindings

Refer to the GNOME Human Interface Guidelines under the Keyboard Interaction section for information about:

  1. Choosing access keys.
  2. Choosing shortcut keys.
  3. Standard GNOME shortcut, access, and navigation keys for applications, the Window Manager, widgets, and Emacs-style navigation. .

GNOME keyboard bindings are very similar to Microsoft Windows key bindings. Here are some common standard key binding differences that you should be aware of:

Function

Microsoft Windows

GNOME

Close document

None

Ctrl + W

Close application

Alt + F4

Ctrl + Q

Find next

F3

Ctrl + G

Go to

Ctrl + G

None?

Rename

None

F2

Repeat

Ctrl + Y

None?

Invert selection

None

Ctrl + I

Refresh/reload

F5

Ctrl + R

Add bookmark/favorite

None

Ctrl + D

Location (URL address)

Ctrl + O, or F4

Ctrl + L

Switch panels

Ctrl + Tab

Ctrl + Alt + Tab

Restore

None

Alt + F5

Switch secondary windows

F6

Alt + F6

Move

None

Alt + F7

Resize

None

Alt + F8

Minimize

None

Alt + F10

Maximize

None

Alt + F10

Full screen

F11

Ctrl + F11

Tooltips/context sensitive help

F1

Ctrl + F1 or Shift + F1

Menubar focus

Alt or F10

F10 but not Alt

Reserved Key Mappings for Mobility Access Features

These keys are reserved for assistive technologies that assist mobility impaired users for desktops like GNOME on top of the XWindows system.

Keyboard Mappings

Mobility Access Feature

5 consecutive clicks of Shift key

On/Off for StickyKeys

Shift key held down for 8 seconds

On/Off for SlowKeys

Others?

Table 21: Reserved Key Mappings for Mobility Access Features

For more information, refer to the Keyboard Access Functional Specification for XWindows.

Recommended ATK Implementations for Common UI Components

This section specifies the accessibility information and behavior which should be exposed for common UI components for use by assistive technologies on the Gnome desktop.

All components should implement AtkComponent, AtkObject, AtkStateSet, and AtkRelationSet. Each section below identifies additional ATK properties, behaviors, events, sources of accessible information, interfaces and methods, and relations which should be implemented for common components in menus and dialogs as well as in documents.

All components can potentially set the following general ATK states: DEFUNCT, FOCUSED, SHOWING, VISIBLE, FOCUSABLE, SENSITIVE, and ENABLED.

Unless otherwise stated, refer to the GNOME Human Interface Guidelines under the Keyboard Interaction section for information about the standard keys for navigation (access keys indicated by underlined letters, shortcut keys, and ordered navigation) and interaction with the components.


General Notes:

  1. An alternative to using the FLOWS_FROM and FLOWS_TO relation to identify a taborder different than document order (e.g. the use of tabindex attributes for interactive HTML controls and links) is to use object attributes. <Need to discuss this.>

<Add list of links (list of components) like a table of contents to go to each section>

Checkbox or Toggle Button

A checkbox, which can be selected (checked or toggled) to enable or disable one or more features or options from a set, usually contains a small box with adjoining text and can be found in dialog boxes or forms in a document. When selected, the box displays a check mark.

A toggle button looks like a push button, but it shows or changes a state rather than initiates an action. It's two states, set and unset, are indicated with a "pushed in" or "popped out" appearance, respectively.

Source of accessible name: Obtained from the checkbox or toggle button text.

Role: ATK_ROLE_CHECK_BOX or ATK_TOGGLE_BUTTON

Source for description: Tooltip text for the checkbox or toggle button, if it exists.

Possible supported states:

  • ATK_STATE_INDETERMINATE if the checkbox is a tri-state checkbox.
  • ATK_STATE_CHECKED if the checkbox is checked or the toggle button is set.
  • ATK_STATE_EXPANDABLE if the checkbox is for a tree which is expanded.
  • ATK_STATE_INVALID if the checkbox is in an invalid state.
  • ATK_STATE_ACTIVE if the checkbox is in a list, table, or tree.
  • ATK_STATE_ARMED if the user is pressing the Spacebar to check the box or change the toggle button state but has not yet released the Spacebar.

Actions:

  • "Check" or "Click" if not selected or pushed in.
  • "Uncheck" or "Click" if selected or popped out.
  • "Toggle" if a tri-state checkbox.

Source of value: None.

Common relations:

  • ATK_RELATION_MEMBER_OF if the checkbox or toggle button is in a group box.
  • ATK_RELATION_NODE_CHILD_OF if the checkbox is in a tree.
  • ATK_ RELATION_CONTROLLER_FOR if the checkbox or toggle button controls the state, onscreen location, or other attributes of one or more target objects.
  • ATK_RELATION_CONTROLLED_BY if the checkbox or toggle button is modified/controlled by user interaction with one or more other objects.
  • ATK_RELATION_LABELED_BY if the checkbox is not in a group and not self-describing but there is static text available that describes it.
  • ATK_RELATION_FLOWS_FROM and ATK_RELATION_FLOWS_TO if the interactive objects in the tab order right before or after the checkbox are in a different order than the logical, visual tab order for a document (i.e. the previous/next object is not the previous/next sibling in the accessible hierarchy.)

Events:

  • "property-change::accessible-name" if the text for the checkbox changes.
  • "state-change" if the checkbox is toggled or checked/unchecked.
  • "property-change::accessible-description" if the tooltip text for the checkbox changes.

  • "focus" when the checkbox receives focus.

Special additional interfaces and methods:

  • AtkAction to provide the keybindings and action descriptions (Check, Uncheck, Toggle).

  • AtkText to expose text attributes.

  • AtkImage if the checkbox has an image instead of text as a label to provide the image description.

Pushbutton

A small, rectangular object used to perform an action when activated. For example, the OK and Cancel buttons on a dialog box are push buttons.

Source of accessible name: Obtained from the button text, unless the button has an image instead of text. Then an alternative accessible name needs to be provided by the author. Example: "OK" is the accessible name for an OK pushbutton.

Role: ATK_ROLE_PUSH_BUTTON (or maybe ATK_ROLE_DEFAULT_BUTTON if the button is the default button for the dialog)

Source for description: Tooltip text for the pushbutton, if it exists.

Possible supported states:

  • ATK_STATE_PRESSED if the pushbutton is currently being pressed.
  • ATK_STATE_ARMED if the user is pressing the Enter key to press the pushbutton but has not yet released the Enter key.

Actions:

  • "Press" or "Click"

Source of value: None.

Common relations:

  • ATK_ RELATION_CONTROLLER_FOR if the pushbutton controls the state, onscreen location, or other attributes of one or more target objects.
  • ATK_RELATION_CONTROLLED_BY if the pushbutton is modified/controlled by user interaction with one or more other objects.
  • ATK_RELATION_FLOWS_FROM and ATK_RELATION_FLOWS_TO if the interactive objects in the tab order right before or after the pushbutton are in a different order than the logical, visual tab order for a document (i.e. the previous/next object is not the previous/next sibling in the accessible hierarchy.)

Events:

  • "property-change::accessible-name" if the text for the pushbutton changes.
  • "state-change" if the pushbutton is pressed.
  • "property-change::accessible-description" if the tooltip text for the pushbutton changes.

  • "focus" when the pushbutton receives focus.

Special additional interfaces and methods:

  • AtkAction to provide the keybindings and action description (Press).

  • AtkImage if the button has an image instead of text as a label to provide the image description.

  • AtkText to expose text attributes.

Radio button

Radio buttons are used to select one of several options within a group of objects, of which only one can be on at a time. When you select one button, all the others in the group are automatically deselected. A radio button contains a small circle with text next to it. When selected, the circle has a smaller, filled circle inside it.

Source of accessible name: Obtained from the radio button text, unless the button has an image instead of text. Then an alternative accessible name needs to be provided by the author. Example: "Yes" is the accessible name for a radio button that has the text string "Yes" as its label.

Role: ATK_ROLE_RADIO_BUTTON

Source for description: Tooltip text for the radio button, if it exists.

Possible supported states:

  • ATK_STATE_CHECKED if the radio button is checked.
  • ATK_STATE_ARMED if the user is pressing the Enter key to check the radio button but has not yet released the Enter key.
  • ATK_STATE_ACTIVE if the radio button is in a list, table, or tree that manages descendants.

Actions:

  • "Check" if not selected.
  • "Uncheck" if selected.

Source of value: None.

Common relations:

  • ATK_RELATION_MEMBER_OF if the radio button is in a group box.
  • ATK_RELATION_NODE_CHILD_OF if the radio button is in a tree.
  • ATK_ RELATION_CONTROLLER_FOR if the radio button controls the state, onscreen location, or other attributes of one or more target objects.
  • ATK_RELATION_CONTROLLED_BY if the radio button is modified/controlled by user interaction with one or more other objects.
  • ATK_RELATION_LABELED_BY if the radio button is not in a group and not self-describing but there is static text available that describes it.
  • ATK_RELATION_FLOWS_FROM and ATK_RELATION_FLOWS_TO if the interactive objects in the tab order right before or after the radio button are in a different order than the logical, visual tab order for a document (i.e. the previous/next object is not the previous/next sibling in the accessible hierarchy.)

Events:

  • "property-change::accessible-name" if the text for the radio button changes.
  • "state-change" if the radio button is checked/unchecked.
  • "property-change::accessible-description" if the tooltip text for the radio button changes.

Special additional interfaces and methods:

  • AtkAction to provide the keybindings and action description (Check, Uncheck).

  • AtkImage if the button has an image instead of text as a label to provide the image description.

  • AtkText to expose text attributes.

Label or Static Text

Static text controls display text in dialog boxes and other windows, and often serve as labels for other controls. A label presents text that provides a short name or description associated with another object, like a text entry field. An accelerator label indicates the keyboard accelerators for its parent, like a menu item.

Source of accessible name: Obtained from the label or static text control.

Role: ATK_ROLE_LABEL, ATK_ROLE_ACCELERATOR_LABEL
<Is ATK_ROLE_ACCELERATOR_LABEL the right way to expose accelerators? Underlined access keys are showing up as the key bindings for menus in accerciser. So how should these accelerator (shortcut) keys be exposed?>

Source for description: None

Possible supported states: None. Note: ATK_STATE_MULTI_LINE and ATK_STATE_SINGLE_LINE should only be used for editable text.

Actions: None

Source of value: None.

Common relations:

  • ATK_RELATION_LABEL_FOR if the static text or label provides a short descriptive name for a target object, like a text field, combo box, etc.
  • ATK_RELATION_DESCRIPTION_FOR if the static text provides a more verbose description of another object, like a long description for a more complex image, or a prompt for a text field or other control.
  • ATK_RELATION_CONTROLLED_BY if the label is modified/controlled by user interaction with one or more other objects.

Events: None

Special additional interfaces and methods:

  • AtkText if the static text or label has text attributes and/or can be selected, such as in a Web or office suite document.

  • AtkAction if there is an underlined access key in the label object to provide the keybindings. <Is this true?>

Combo box

A combo box has the following components:

  • The combo box object which displays the currently selected item and has a drop-down arrow image.
  • Optionally, an edit control for entering information.
  • A menu which can be displayed when the user selects the drop-down arrow in the combo box, if there is one next to the edit control.
  • Menu items in the menu.

Source of accessible name:

  • For the combo box parent, the accessible name is the text equivalent of what is being displayed. Could be blank, typed text, or currently selected menu item.
  • For the edit control, obtained from the currently selected item if one is selected or what is typed. If no item selected, the accessible name is blank.
  • For the drop-down arrow push button and the list box, the accessible name is blank. While focused and the user is typing, the accessible name should not change.
  • For the menu itself, the accessible name is blank.
  • For the menu items, the accessible name is the text for the menu item.

Roles:

  • ATK_ROLE_COMBO_BOX for the parent combo box object
  • ATK_ROLE_TEXT or ATK_ROLE_ENTRY for an edit child control. <How are these 2 roles different?>

  • ATK_ROLE_MENU for the menu object
  • ATK_ROLE_MENUITEM for the menu item objects

Source for description: Tooltip text for the parent combo box object, if it exists. None for all the child objects. <True?>

Possible supported states:

  • ATK_STATE_REQUIRED for the parent combo box if a list item must be selected for the combo box.
  • ATK_STATE_EDITABLE and ATK_STATE_SINGLE_LINE for the edit child control.
  • ATK_STATE_INVALID_ENTRY if the edit child control has invalid user input.
  • ATK_STATE_SUPPORTS_AUTOCOMPLETE if the edit control supports automatic selection of a menu item from the menu.
  • ATK_STATE_EXPANDABLE for the menu object, ATK_STATE_EXPANDED if the menu is expanded, and ATK_STATE_COLLAPSED if the menu is collapsed. <Or should the state be ATK_STATE_SHOWING if the menu is open? How is this different from a tree?>

  • ATK_STATE_SELECTABLE for the menu item objects. ATK_STATE_SELECTED if a menu item is selected.

Actions:

  • "Open" for the combo box if the menu is closed. "Close" if menu is open.
  • "Select" or "Unselect" for a menu item.
  • None for the menu and edit control.

Source of value: None.

Common relations:

  • ATK_RELATION_MEMBER_OF if the combo box is in a group box.
  • ATK_ RELATION_CONTROLLER_FOR if the combo box controls the state, onscreen location, or other attributes of one or more target objects.
  • ATK_RELATION_CONTROLLED_BY if the combo box is modified/controlled by user interaction with one or more other objects.
  • ATK_RELATION_LABELED_BY if the combo box has a static text label that describes it.
  • ATK_RELATION_FLOWS_FROM and ATK_RELATION_FLOWS_TO if the interactive objects in the tab order right before or after the combo box are in a different order than the logical, visual tab order for a document (i.e. the previous/next object is not the previous/next sibling in the accessible hierarchy.)
  • ATK_RELATIon_DESCRIBED_BY if there is another object which provides a description of the combo box.

Events:

  • "property-change::accessible-name" if the text label for the combo box changes, the currently selected item in the edit or static text control changes, or the list item text changes.
  • "state-change" if the text in the edit control becomes invalid, if the drop-down arrow is pressed or released, if the drop-down list is expanded or collapsed, or if a list item becomes selected or unselected.
  • "property-change::accessible-description" if the tooltip text for the combo box changes.

  • "selection-changed" for the list box object when a different list item is selected.
  • "focus-event" when the menu receives keyboard control or the selection changes.

Special additional interfaces and methods:

  • AtkAction to provide the key bindings for the combo box object and the action descriptions (Open and Close, Select and Unselect ).

  • AtkSelection for the menu.

  • AtkText for the menu items and edit control.

  • AtkEditableText to provide clipboard functions for the edit control.

List box

<Need to try to create a list box in Glade to to do this section.>

A list box displays a list from which a user can select one or more items. A list box may have a vertical scroll bar, a horizontal control bar, or both.

Source of accessible name:

  • For the list box, the accessible name is obtained from the currently selected item if one is selected. If no item selected, the accessible name is blank.
  • For the list box items, the accessible name is the text for the list item.

Roles:

  • ATK_ROLE_LIST for the list box object
  • ATK_ROLE_LISTITEM for the list item objects

Source for description: Tooltip text for the list box, if it exists. None for the list items. <True?>

Possible supported states:

  • ATK_STATE_REQUIRED for the list box if a list item must be selected.
  • ATK_STATE_MANAGES_DESCENDANTS for the list box object.
  • ATK_STATE_MULTISELECTABLE for the list box object if more than one list item can be selected at the same time.
  • ATK_STATE_ACTIVE and ATK_STATE_SELECTABLE for the list item objects. ATK_STATE_SELECTED if a list item is selected.

Actions:

  • "Select" or "Unselect" for a list item.
  • None for the list box, and edit or static text control.

Source of value: None.

Common relations:

  • ATK_RELATION_MEMBER_OF if the list box is in a group box.
  • ATK_ RELATION_CONTROLLER_FOR if the list box controls the state, onscreen location, or other attributes of one or more target objects.
  • ATK_RELATION_CONTROLLED_BY if the list box is modified/controlled by user interaction with one or more other objects.
  • ATK_RELATION_LABELED_BY if the list box has a static text label that describes it.
  • ATK_RELATION_FLOWS_FROM and ATK_RELATION_FLOWS_TO if the interactive objects in the tab order right before or after the list box are in a different order than the logical, visual tab order for a document (i.e. the previous/next object is not the previous/next sibling in the accessible hierarchy.)

Events:

  • "property-change::accessible-name" if the currently selected item in the list box changes, or the list item text changes.
  • "state-change" if a list item becomes selected or unselected.
  • "property-change::accessible-description" if the tooltip text for the list box changes.

  • "active-descendant-changed" and "selection-changed" for the list box object when a different list item is selected.
  • "focus-event" when the list box receives keyboard control or the selection changes.
  • "children-changed" if the number or order of the list items in the list box changes.

Special additional interfaces and methods:

  • AtkAction to provide the key bindings for the list box object and the action descriptions (Select and Unselect for the list items).

  • AtkSelection for the list box.

  • AtkText for the list items.

AT-SPI events

Data logged from AT-SPI 1.7.0, gail 1.8.11

The following table details the AT-SPI events generated by the gail bridge. Events marked in a gray background have not been observed by the author at present. The data these events provide is unknown.

The class, major, minor, and detail columns are the four parts of an AT-SPI event name. For instance, focus: only has a class specified while object:text-changed:inserted has class, major, and minor. Detail1, detail2, and any_data are extra data carried by the event object. Every event carries the source object of the event (not depicted in the table).

N.B. - Other AT-SPI bridge implementations may choose to include additional or different information in each event. Standardization is preferred for the sanity of AT-SPI clients, but is not currently enforced.

Class

Major

Minor

Detail

detail1

detail2

any_data

focus







window

create





string: title

close





string: title

minimize





string: title

maximize





string: title

restore





string: title

reparent






desktop-create






desktop-destroy






activate





string: title

deactivate





string: title

raise





string: title

lower





string: title

move





string: title

resize





string: title

shade





string: title

unshade





string: title

restyle





string: title

object

text-caret-moved



int: new caret index



text-changed

inserted


int: start of inserted text

int: end of inserted text

string: inserted text

removed


int: start of deleted text

int: end of deleted text

string: deleted text

text-selection-changed






text-attributes-changed






property-change

accessible-parent



object: new parent

accessible-name



string: new name

accessible-description



string: new description

accessible-value





accessible-role





accessible-table-caption





accessible-table-column-description





accessible-table-column-header





accessible-table-row-description





accessible-table-row-header





accessible-table-summary





state-changed

*


bool: state set or state unset



children-changed

add


int: child index **


object: added child **

remove


int: child index **


object: added child **

visible-data-changed






bounds-changed






selection-changed






row-inserted



int: index of first row

int: number of rows


row-reordered






row-deleted



int: index of first row

int: number of rows


column-inserted



int: index of first column

int: number of columns


column-reordered






column-deleted



int: index of first column

int: number of columns


model-changed






active-descendant-changed



int: descendant index


object: descendant

attributes-changed






link-selected






document

load-complete






reload






load-stopped






content-changed






attributes-changed






terminal

line-changed






columncount-changed






linecount-changed






application-changed






charwidth-changed






mouse

abs



int: x

int: y


rel



int: delta x

int: delta y


button

1p


int: x

int: y


1r


int: x

int: y


2p


int: x

int: y


2r


int: x

int: y


3p


int: x

int: y


3r


int: x

int: y


  • Listeners for keyboard press and release events are only available using device listeners, not the global event listeners like the events about. pyLinAcc in LSR unifies the two event models.
  • object:state-changed events have the untranslated name of the state that changed in the minor part of the event name. For instance, object:state-changed:enabled or object:state-changed:focused are valid event names. The minor fields are omitted from this table in order to avoid getting out of sync with the current AT-SPI specification. The current list of AT-SPI states can be found at http://gnome.org/~billh/at-spi-new-idl/html/html/namespaceAccessibility.html#a213

  • Two implementations of this event have been observed. In the common case, the event carries the added or removed child object in the any_data field and the detail1 field is empty. In rare cases, the any_data field is empty and detail1 contains the index of the added or removed child.

Mapping MSAA and IAccessible2 to ATK

This section provides information about how to map MSAA and IAccessible2 roles, states, events (signals), relations, and accessible interfaces to the ATK interface for Linux GNOME applications. Refer to the ATK reference for details on implementing all the methods, roles, states, other attributes, events (signals), etc for each ATK interface.

Roles

The table below shows which ATK role or roles correspond to MSAA 1.3 and IAccessible2 roles. In addition to changing the role attribute for a widget, you must also implement ATK interfaces, states, attributes, and events/signals that further indicate the behavior of a widget and additional descriptive information. If a role is proposed but not yet defined as an ATK built-in enumerated role, or if there is no corresponding current or proposed ATK role, you can add the role as a custom role. To add custom roles, use the atk_role_register method in the AtkObject class. <Is this true?>

All widgets can potentially set the following general ATK_STATEs: DEFUNCT, FOCUSED, SHOWING, VISIBLE, FOCUSABLE, SENSITIVE, and ENABLED.

When implementing the ATK interfaces for a widget, also look at the signals associated with that interface and implement signal handling.

Note that if there is an MSAA role, an IA2 role is not needed.

MSAA 1.3 Role
(ROLE_SYSTEM_ *)

IAccessible2 Role
(IA2_ROLE_*)

CLOSEST ATK Role(s)
(ATK_ROLE_*)

Also implement these ATK Interfaces

Potential ATK states in addition to general states (ATK_STATE_*)

Description

ALERT

ALERT

AtkObject,
AtkComponent,
AtkRelation,
AtkRelationSet,
AtkStateSet

ACTIVE,
ICONIFIED,
MODAL,
RESIZABLE

An error, warning, or informational message

ANIMATION

ANIMATION

AtkObject,
AtkComponent,
AtkImage

ANIMATED

A dynamic or moving image that changes over time.

APPLICATION

APPLICATION

AtkObject,
AtkComponent,
AtkRelation,
AtkRelationSet,
AtkStateSet

Toplevel accessible object of an application, which may contain frame objects or other accessible objects.

BORDER

don't use

Window border as an object

BUTTONDROPDOWN

add custom role

AtkObject,
AtkComponent,
AtkAction,
AtkImage
(if button is an image),
AtkText (AtkAttributeSet),
AtkStateSet,
AtkSelection

ACTIVE,
ARMED,
EXPANDED,
EXPANDABLE,
COLLAPSED,
MANAGES_DESCENDANTS,
MULTISELECTABLE,
PRESSED,
REQUIRED

Button that drops down a list of items

BUTTONDROPDOWNGRID

add custom role

AtkObject,
AtkComponent,
AtkAction,
AtkImage
(if button is an image),
AtkText (AtkAttributeSet),
AtkStateSet,
AtkSelection,
AtkTable (if row/column headers)

ACTIVE,
ARMED,
EXPANDED,
EXPANDABLE,
COLLAPSED,
MANAGES_DESCENDANTS,
MULTISELECTABLE,
PRESSED,
REQUIRED

Button that drops down a grid

BUTTONMENU

add custom role

AtkObject,
AtkComponent,
AtkAction,
AtkImage
(if button is an image),
AtkText (AtkAttributeSet),
AtkStateSet,
AtkSelection

ACTIVE,
ARMED,
EXPANDED,
EXPANDABLE,
MANAGES_DESCENDANTS,
PRESSED

Button that drops down a menu

CARET

don't use

System caret

CELL

TABLE_CELL

AtkObject,
AtkText (if it contains text),
AtkImage (if it contains an image),
AtkComponent (if it contains an image)

SINGLE_LINE,
MULTI_LINE
TRANSIENT,
SELECTABLE,
SELECTED,
STALE,
EDITABLE,
INVALID_ENTRY,
SELECTABLE_TEXT,
REQUIRED,
SUPPORTS_TYPEAHEAD,
TRUNCATED

Cell in a table

CHARACTER

don't use

Paperclip character.

CHART

CHART (proposed)?

AtkObject,
AtkComponent,
AtkImage

Graphical depiction of quantitative data

CHECKBUTTON

CHECK_MENU_ITEM,
TOGGLE_BUTTON

CHECK_BOX,
CHECK_MENU_ITEM,
TOGGLE_BUTTON

AtkObject,
AtkAction,
AtkStateSet.
AtkSelection (if in a menu item),
AtkRelation and AtkRelationSet (if text label not part of widget)

ACTIVE,
ARMED,
CHECKED,
SELECTABLE,
SELECTED,
INDETERMINATE,,
EXPANDABLE.
INVALID

Choice that can be checked or unchecked. CHECK_BOX is most like CHECKBUTTON.
A checkbox and check menu item have a separate indicator for the state.
A toggle button is a specialized push button that does not have a separate indicator for the state.

CLOCK

add custom role

For digital clock, see SPINBUTTON.
For analog clock, see DIAL?

Clock object.

COLUMN

don't use

Column of table cells.

COLUMNHEADER

TABLE_COLUMN_HEADER,
COLUMN_HEADER

AtkObject,
AtkTable

Header which labels a column of data, or more specifically a column of data in a table.

COMBOBOX

COMBO_BOX

AtkObject,
AtkAction,
AtkSelection,
AtkEditableText (if you can type text as well as select item),
AtkText (AtkAttributeSet),
AtkRelation (to associate a text label with the control),
AtkRelationSet,
AtkStateSet

ACTIVE,
EXPANDED,
EXPANDABLE,
COLLAPSED,
MANAGES_DESCENDANTS,
MULTISELECTABLE,
INVALID_ENTRY,
EDITABLE,
SELECTABLE_TEXT,
REQUIRED,
SUPPORTS_TYPEAHEAD

Edit control with a drop-down list of selections

CURSOR

don't use

Mouse pointer.

DIAGRAM

IMAGE,
DRAWING_AREA,
or add custom role

AtkObject,
AtkComponent,
AtkImage

Image is a generic graphic.
Diagram is a specific type of a drawn graphic.
Drawing area is used for creating custom user interface elements.
Need to address this whole type of role later.

DIAL

DIAL

AtkObject,
AtkValue,
AtkStateSet,
AtkAction

Control with value changes using a rotating visual indicator

DIALOG

COLOR_CHOOSER,
FILE_CHOOSER,
FONT_CHOOSER

DIALOG,
COLOR_CHOOSER,
FILE_CHOOSER,
FONT_CHOOSER

AtkObject,
AtkComponent,
AtkRelation,
AtkRelationSet,
AtkStateSet

ACTIVE,
ICONIFIED,
MODAL,
RESIZABLE

Top level window with a title bar and border.
A file chooser is a specialized dialog that displays files in a directory and allows file selection, directory browsing, and filename specification.
A color chooser is a specialized dialog for choosing a color.

DOCUMENT

TEXT_FRAME

HTML_CONTAINER or
DOCUMENT_FRAME

AtkObject,
AtkComponent and AtkImages for embedded images,
AtkRelation and AtkRelationSet for relationships between text and embedded objects,
AtkStateSet,
AtkDocument,
AtkText (AtkAttributeSet),
AtkHypertext and AtkHyperlink for interactive elements plus non-link images,
AtkAction for interactive elements,
AtkTable for all data tables,
AtkSelection for embedded objects with children

EDITABLE,
MULTI_LINE,
SELECTABLE_TEXT,
BUSY

For MSAA, a document is a window that corresponds to MDI document.
An HTML container or document frame is an HTML document or a frame containing a view of document content.

DROPLIST

add custom role or
COMBO_BOX

AtkObject,
AtkAction,
AtkSelection,
AtkRelation (to associate a text label with the control),
AtkRelationSet,
AtkStateSet

ACTIVE,
EXPANDED,
EXPANDABLE,
COLLAPSED,
MANAGES_DESCENDANTS,
MULTISELECTABLE,
REQUIRED

Drop down list but not a combo box

EQUATION

add custom role

AtkObject,
AtkText (AtkAttributeSet)

Math and chemistry equations

GRAPHIC

DESKTOP_ICON,
SHAPE,
ICON

IMAGE,
DESKTOP_ICON,
ICON

AtkObject,
AtkComponent,
AtkImage

Desktop icon is an inconifed internal frame within a DESKTOP_PANE
Icon is small fixed size picture, typically used to decorate components
Graphic is an image.
Shape is an object with graphical representation used to represent content on draw pages.

GRIP

AtkObject,
AtkImage

An object that can be moved to resize a pane

GROUPING


PANEL,
PAGE (proposed),
SECTION (proposed)

AtkObject,
AtkRelation,
AtkRelationSet

VERTICAL,
HORIZONTAL

Container used to group objects, like a group box or a FIELDSET in HTML.
A page is defined for documents.
A section is a generic container of content within a document, such as a navigation bar, table of contents, main content section, content between headings, etc.

HELPBALLOON

don't use

AtkObject,
AtkImage

Help icon to click on to get tooltip help

HOTKEYFIELD

add custom role

AtkObject,
AtkAction,
AtkSelection (if you can select from a drop-down list),
AtkEditableText (if you can type text as well as select item),
AtkText (AtkAttributeSet),
AtkRelation (to associate a text label with the control),
AtkRelationSet,
AtkStateSet

ACTIVE,
EDITABLE,
MULTI_LINE,
SINGLE_LINE,
MULTISELECTABLE,
INVALID_ENTRY,
SELECTABLE_TEXT,
REQUIRED,
SUPPORTS_TYPEAHEAD

Editable field for assigning keys

INDICATOR

ARROW or
add custom role

AtkObject,
AtkImage

An indicator is a graphic, like an arrow, used to indicate something.
Arrow is a 2D directional indicator.

LINK

LINK

AtkObject,
AtkHyperlink,
AtkHypertext,
AtkImage and AtkComponent (if an image),
AtkAction
AtkText (to expose text attributes like visited)

Hypertext link in a document that can be an image or text

LIST

LIST

AtkObject,
AtkAction,
AtkSelection,
AtkRelation (to associate a text label with the control),
AtkRelationSet,
AtkStateSet

ACTIVE,
MANAGES_DESCENDANTS,
MULTISELECTABLE,
REQUIRED

List of objects that allows one or more selections.
A font chooser allows selection of a display font.

LISTITEM

LISTITEM

AtkObject,
AtkText (AtkAttributeSet)

SELECTABLE,
SELECTED

Element in a selectable list

MENUBAR

MENU_BAR

AtkObject,
AtkSelection

ACTIVE,
MANAGES_DESCENDANTS

Object drawn at the top of the primary window or dialog box of an application ((just below the title bar)) that contains a list of menus.

MENUITEM


RADIO_MENU_ITEM
CHECK_MENU_ITEM

MENU_ITEM,
RADIO_MENU_ITEM,
CHECK_MENU_ITEM,
MENU

AtkObject,
AtkAction,
AtkStateSet,
AtkRelationSet (if radio menu item)

SELECTABLE,
SELECTED

Element in a menu that presents a selectable action.
A radio menu item is both a radio button and a menu item.
A check menu item is both a check box and a menu item.
A menu item with a submenu has a role of ATK_ROLE_MENU in ATK. A menu is a list of actions from which the user can choose.

MENUPOPUP

POPUP_MENU,
TEAROFF_MENU_ITEM?

AtkObject,
AtkAction,
AtkComponent,
AtkSelection

ACTIVE,
MANAGES_DESCENDANTS


A pop-up menu is a temporary window that offers the user a list of choices, then hides itself once the user selects one of those choices.
A tearoff menu item is a is a menu that can be removed from the menubar and shown in its own window.

OUTLINE

TREE,
TREE_TABLE

AtkObject,
AtkComponent,
AtkTable,
AtkSelection,
AtkRegistry,
AtkObjectFactory,
AtkRelationSet,
AtkRelation,
AtkStateSet,
AtkAction

ACTIVE, MANAGES_DESCENDANTS,
EXPANDED,
COLLAPSED,
EXPANDABLE,
MULTISELECTABLE

A tree or an outline is an object used to present hierarchical information to the user, usually with expandable/collapsable elements.
A tree table presents both tabular and hierarchical information to the user.

OUTLINEITEM

use custom role

AtkObject,
AtkText (AtkAttributeSet)

SELECTABLE,
SELECTED

A tree item.

PAGETAB

PAGE_TAB

AtkObject,
AtkText (AtkAttributeSet),
AtkRelationSet,
AtkRelation

SELECTABLE,
SELECTED

A tab that usually contains a label or title for a page or panel of a notebook container.

PAGETABLIST

PAGE_TAB_LIST

AtkObject,
AtkSelection,
AtkAction

ACTIVE,
SELECTABLE,
SELECTED

A tabbed notebook container, or a series of panels presented as tabbed pages.

PANE

GLASS_PANE,
LAYERED_PANE,
OPTION_PANE,
SCROLL_PANE,
DIRECTORY_PANE,
ROOT_PANE,
SPLIT_PANE,
VIEWPORT

GLASS_PANE,
LAYERED_PANE,
OPTION_PANE,
SCROLL_PANE,
DIRECTORY_PANE,
ROOT_PANE,
SPLIT_PANE,
VIEWPORT

AtkObject

ACTIVE,
RESIZABLE

A pane in the current window.
A glass pane is painted on top of all panes beneath it.
A layered pane allows its children to be drawn in layers based on a stacking order. An option pane is a pane inside of a dialog.
A scroll pane contains scroll bars.
A directory pane contains selections (icons, lists, trees) for the content of a directory.
A root pane has a glass pane and a layered pane as its children.
A split pane is a panel that presents two other panels at the same time.
A viewport is a container of content, usually used in a scroll pane, that represents a clipped version of that pane that is onscreen (visible).

PROGRESSBAR

PROGRESS_BAR

AtkObject,
AtkValue

BUSY,
VERTICAL,
HORIZONTAL

Object that shows the percentage of a task that has completed.

PROPERTYPAGE

PAGE_TAB_LIST or
add custom role?

AtkObject,
AtkComponent,
AtkRelation,
AtkRelationSet,
AtkStateSet

ACTIVE,
RESIZABLE

Page showing properties of something.
An object that presents a series of panels (or page tabs), one at a time, through some mechanism provided by the object

PUSHBUTTON

PUSH_BUTTON

AtkObject,
AtkComponent,
AtkAction,
AtkImage
(if an image),
AtkText (AtkAttributeSet),
AtkStateSet

ACTIVE,
ARMED,
PRESSED

A push button tells the application to do something when it is activated.

RADIOBUTTON

RADIO_MENU_ITEM

RADIO_BUTTON,
RADIO_MENU_ITEM

AtkObject,
AtkRelationSet,
AtkRelation,
AtkAction

ACTIVE,
ARMED,
CHECKED

Usually in a group, only one radio button in a group can be "checked". Check one radio button causes all others in the group to be unchecked.
A radio menu item is both a radio button and a menu item.

ROW

don't use

AtkObject,
AtkTable

Row in a table.

ROWHEADER

ROW_HEADER,
TABLE_ROW_HEADER

AtkObject,
AtkTable

Header which labels a row of data, or more specifically a row of data in a table.

SCROLLBAR

SCROLL_BAR

AtkObject,
AtkValue

BUSY,
VERTICAL,
HORIZONTAL

Object which allows a user to incrementally view a large amount of data by moving the bounds of a viewport along a one-dimensional axis.

SEPARATOR

SEPARATOR

AtkObject,
AtkStateSet

VERTICAL,
HORIZONTAL

Object that provides a visual separation of contents in a menu or between 2 areas/panes.

SLIDER

SLIDER

AtkObject,
AtkValue,
AtkStateSet,
AtkAction

BUSY,
VERTICAL,
HORIZONTAL

Object that allows the user to select or adjust a value in increments from a bounded range of minimum to maximum values.

SOUND

IMAGE, ICON, or
add custom control?

AtkObject,
AtkComponent,
AtkImage

System sound object.

SPINBUTTON

SPIN_BUTTON

AtkObject,
AtkValue,
AtkRelation,
AtkRelationSet,
AtkAction

REQUIRED

Object that allows the user to select a value from a set of choices.

STATICTEXT

LABEL

LABEL,
ACCELERATOR_LABEL

AtkObject,
AtkText (AtkAttributeSet),
AtkRelation,
AtkRelationSet,
AtkStateSet,
AtkAction (keybindings)

MULTI_LINE,
SINGLE_LINE

A label presents text that provides a short name or description associated with another object, like a text entry field.
An accelerator label indicates the keyboard accelerators for its parent, like a menu item.

STATUSBAR

STATUS_BAR

AtkObject,
AtkText (AtkAttributeSet)

Display non-quantitative status information, in contrast to a progress bar which displays quantitative status.

TABLE

TABLE,
CALENDAR,
TREE_TABLE

AtkObject,
AtkComponent,
AtkTable,
AtkSelection,
AtkRegistry,
AtkObjectFactory,
AtkRelationSet,
AtkRelation,
AtkStateSet

ACTIVE,
MANAGES_DESCENDANTS,
EXPANDABLE,
EXPANDED,
COLLAPSED

Presents information in terms of rows and columns.
A calendar contains one or more dates, usually arranged in a tabular format, but not always.
A tree table presents information in both a tabular and hierarchical format.

TEXT

DATE_EDITOR,
PARAGRAPH,
HEADING,
HEADER,
FOOTER,
CAPTION

TEXT,
DATE_EDITOR,
PASSWORD_TEXT,
AUTOCOMPLETE,
<Should deprecate due to new state>
ENTRY,
PARAGRAPH,
HEADING,
HEADER,
FOOTER,
CAPTION

AtkObject,
AtkText (AtkAttributeSet),
AtkRelation,
AtkRelationSet,
AtkStateSet,
AtkEditableText (if editable),
AtkAction

MULTI_LINE,
SINGLE_LINE,
EDITABLE,
INVALID_ENTRY,
SELECTABLE_TEXT,
REQUIRED,
SUPPORTS_AUTOCOMPLETION

Text information in general.
A date editor allows entry of a date.
A password text entry object shows nothing or an alternative character, like an asterisk, when the password text is typed.
Autocomplete is a dialog or list containing items for insertion into an entry widget, such as a list of words or characters for completion of a text entry.
Entry is a text entry field which may be editable or read-only depending on the STATE_EDITABLE attribute.
A paragraph is a paragraph of text in a document.
A heading is the title for a section in a document.
A header is a section at the top of a document, or the top of each page in a document.
A footer is a section at the bottom of a document, or the bottom of each page of a document.
A caption is descriptive information, usually textual, about another user interface element such as a table, chart, or image.

TITLEBAR

add custom role

AtkObject,
AtkText (AtkAttributeSet),
AtkRelation,
AtkRelationSet,
AtkStateSet

Title or caption of a window or dialog.

TOOLBAR

TOOL_BAR

AtkObject,
AtkSelection

A bar or palette usually comprised of push buttons or toggle buttons.

TOOLTIP

TOOL_TIP

AtkObject,
AtkText (AtkAttributeSet)t,
AtkRelation,
AtkRelationSet

HAS_TOOLTIP (for object that has the tooltip)

An object that provides descriptive or helpful information about another object, often when the help key is pressed or the mouse moves over an object.

WHITESPACE

FILLER

AtkObject,
AtkText (AtkAttributeSet)

VERTICAL,
HORIZONTAL

Object that takes up space in a user interface.

WINDOW

FRAME,
INTERNAL_FRAME,
DESKTOP_PANE

WINDOW,
FRAME,
INTERNAL_FRAME,
DESKTOP_FRAME

AtkObject,
AtkComponent,
AtkRelation,
AtkRelationSet,
AtkStateSet

ACTIVE,
ICONIFIED,
RESIZABLE

A top level window with no title or border.
A frame is a top level window with a title bar, border, menubar, etc.
An internal frame is a frame clipped by a desktop frame.
A desktop frame is a pane that supports internal frames and icons for those internal frames.

RULER

RULER

AtkObject,
AtkImage,
AtkComponent,
AtkValue

Object that describes margins and tab stops.

EMBEDDED_OBJECT

EMBEDDED

AtkObject

Object that is an embedded component container in a document.

EDITBAR

EDITBAR

AtkObject,
AtkText (AtkAttributeSet),
AtkRelation,
AtkRelationSet,
AtkStateSet,
AtkEditableText,
AtkAction

MULTI_LINE,
SINGLE_LINE,
EDITABLE,
INVALID_ENTRY,
SUPPORTS_AUTOCOMPLETION

Object that is an editable text object in a toolbar.

CLIENT

CANVAS

AtkObject,
AtkComponent,
AtkRelation,
AtkRelationSet,
AtkStateSet,
AtkSelection

Object that can be drawn into and used to trap events.

INVALID

An error condition, such as an uninitialized role.

UNKNOWN

Object contains accessible information but its role is not known.

NOTE

add custom role

IMAGE_MAP

add custom role

FOOTNOTE

add custom role

END_NOTE

add custom role

States

The table below shows which ATK states correspond to MSAA 1.3 and IAccessible2 states. If a state is proposed but not yet defined as an ATK built-in enumerated state, or if there is no corresponding current or proposed ATK state, you can add the state as a custom state. If there is an MSAA 1.3 state, then there should not be an IAccessible2 state. In some cases, you need to implement an ATK or IAccessible2 interface or use a role or a relationship instead of a state to convey the accessible information. To add custom states, use the atk_state_type_register method in the AtkState class <Is this true?>.

MSAA 1.3 State
(STATE_SYSTEM_ *)

IAccessible2 States
(IA2_State_*)

CLOSEST ATK State(s)
(ATK_STATE_*)

Description

ANIMATED

ANIMATED (proposed) or
add custom state

Object's visual representation is changing or moving rapidly; it is dynamic not static. This state may be applied to an object during an animated 'effect' and be removed from the object once its visual representation becomes static. Note: Some applications, notably content viewers, may not be able to detect all kinds of animated content. Therefore the absence of this state should not be taken as definitive evidence that the object's visual representation is static; this state is advisory.

BUSY

BUSY

Control cannot accept input at this time. Usually used on objects such as progress bars, sliders, or scroll bars to indicate they are in a state of transition.

CHECKED

CHECKED

Checkbox, radio button, or toggle button is checked.

COLLAPSED

!EXPANDED,
COLLAPSED

Expandable objects that provide progressive disclosure, like a tree list or drop-down list is currently not expanded (i.e. the children are not showing or visible).

DEFAULT

DEFAULT_BUTTON (proposed)
<Or add as a state or relation enumeration, or an attribute>

Default button or menu item.

EXPANDED

EXPANDED

The children items of expandable objects that provide progressive disclosure, like trees and drop-down lists are currently showing and visible.

EXTSELECTABLE

add custom state

Object can extend its selection.

FLOATING

add custom state

Object is not clipped to the boundary of the parent (i.e. it does not auto-move with the parent).

FOCUSABLE

FOCUSABLE

Object can accept keyboard focus, which means all events resulting from typing on the keyboard will normally be passed to it when it has focus.

FOCUSED

FOCUSED

Object currently has the keyboard focus.

HASPOPUP

Use ATK_RELATION_POPUP_FOR to point to the parent of the popup.
Use ATK_ROLE_MENU to indicate a menu item has a submenu.

Object has a popup, but in ATK the popup children need to establish the relationship with the parent.

HOTTRACKED

don't use

Object's appearance has changed for a mouseover.

INVISIBLE

!VISIBLE

The object is hidden, whether on-screen or off-screen.

LINKED

Use ATK_ROLE_LINK

The object links to another object.

MARQUEED

ANIMATED (proposed)

The object is constantly changing and fleeting across the screen.

MIXED

INDETERMINATE or
add custom state

A checkbox object is in a state other than checked or not checked, such as a tri-state checkbox might be.

MOVEABLE

add custom state

Object can be moved or dragged around the screen.

MULTISELECTABLE

MULTISELECTABLE

Object allows more than one of its children to be selected at the same time.

NORMAL

Object has no states.

OFFSCREEN

!SHOWING

An object is currently not visible and not on-screen. Partially on-screen

PRESSED

PRESSED

Object is currently pressed down.

PROTECTED

Use ATK_PASSWORD_TEXT as the role

Object is a password field.

READONLY

!EDITABLE & SENSITIVE

Object is interactive (sensitive) but the contents currently cannot be edited (changed) by the user.

SELECTABLE

SELECTABLE

Object is the child of an object that allows its children to be selected, and this child is one that can be selected.

SELECTED

SELECTED

Object is the child of an object that allows its children to be selected, and this child is selected.

SELFVOICING

add custom state

Object is self-voiced by the application, so an AT should not speak this object.

SIZEABLE

RESIZABLE

The size of the object can be changed (i.e. it is not fixed.)

TRAVERSED

Use a object attribute or
add a custom state?
VISITED (Proposed)

The link object was traversed (visited).

UNAVAILABLE

!ENABLED

Object is grayed out and not available at this time.

ACTIVE

ACTIVE

A window is currently the active window, or is an active sub-element within a container or table. Includes windows, dialogs, frames, etc. In addition, this state is used to indicate the currently active child of a component such as a list, table, or tree. For example, the active child of a list is the child that is drawn with a rectangle around it. If ACTIVE state, then also MANAGES_DESCENDANTS.

ARMED

ARMED

The object is armed. Usually used on buttons that have been pressed but not yet released, and the mouse pointer is still over the button.

DEFUNCT

DEFUNCT

User interface object corresponding to this object no longer exists.

EDITABLE

EDITABLE

The contents of this object can change.

ENABLED

Object is not grayed out and can be interacted with if sensitive.

EXPANDED or COLLAPSED

EXPANDABLE

The children items of this object that provide progressive disclosure, like trees and drop-down lists, can be showing and visible (expanded) versus hidden (collapsed).

HAS_TOOLTIP

Object has an associated tooltip. Tooltip text should be accessible description.

HORIZONTAL

HORIZONTAL

Orientation of this object is horizontal.

ICONIFIED

ICONIFIED

Object is minimized and represented only by an icon.

INVALID

INVALID

Object is in an invalid state.

INVALID_ENTRY

INVALID_ENTRY

This object has indicated an error condition due to failure of input validation. For instance, a form control may acquire this state in response to invalid or malformed user input.

MANAGES_DESCENDANTS

MANAGES_DESCENDANTS

Indicates that "active-descendant-changed" event is sent when children become 'active' (i.e. are selected or navigated to onscreen). Typically used for trees and tables that have a large number of subcomponents and where the objects are created only when needed and otherwise remain virtual. The application should not manage the subcomponents directly. If ACTIVE state, then also MANAGES_DESCENDANTS.

MODAL

MODAL

Something must be done with this object before the user can interact with an object in a different window.

MULTI_LINE

MULTI_LINE

Text object can contain multiple lines of text.

OPAQUE

OPAQUE

Object paints every pixel within its rectangular region. A non-opaque component paints only some of its pixels, allowing the pixels underneath it to "show through". A component that does not fully paint its pixels therefore provides a degree of transparency.

REQUIRED

REQUIRED

Explicit user interaction with this object is required by the user interface.

SELECTABLE_TEXT

SELECTABLE_TEXT

Object supports text selection. It should only be exposed on objects which implement the Text interface, in order to distinguish this state from STATE_SELECTABLE, which infers that the object is a selectable child of an object which implements Selection. While similar, text selection and subelement selection are distinct operations.

SENSITIVE

Object can be interactive, although it may currently be read-only or not enabled (grayed out). STATE_SENSITIVE usually accompanies STATE_ENABLED for user-actionable controls, but may be found in the absence of STATE_ENABLED if the current visible state of the control is "disconnected" from the application state. In such cases, direct user interaction can often result in the object gaining STATE_SENSITIVE, for instance if a user makes an explicit selection using an object whose current state is ambiguous or undefined.

SHOWING

Object is visible and on-screen.

SINGLE_LINE

SINGLE_LINE

Text object can only contain a single line of text.

STALE

STALE

Index associated with this object has changed since the user accessed the object. The information returned for this object may no longer be synchronized with the application state.

SUPPORTS_AUTOCOMPLETION

SUPPORTS_AUTOCOMPLETION

Object implements some form of �typeahead� or pre-selection behavior whereby entering the first character of one or more sub-elements causes those elements to scroll into view or become selected. Subsequent character input may narrow the selection further as long as one or more sub-elements match the string. This state is normally only useful and encountered on objects that implement Selection. In some cases the typeahead behavior may result in full or partial �completion� of the data in the input field, in which case these input events may trigger text-changed events from the source.

TRANSIENT

TRANSIENT

Object is changing or moving rapidly. An assistive technology should not add a property change listener to an object with transient state, as that object will never generate any events. Transient objects are typically created to answer ATK accessibility method queries, but otherwise do not remain linked to the underlying object (for example, those objects underneath lists, tables, and trees, where only one actual UI component does shared rendering duty for all of the data objects underneath the actual list/table/tree elements).

?

TRUNCATED

Object is truncated, such as a numerical value in a spreadsheet cell.

VERTICAL

VERTICAL

Orientation of this object is vertical.

VISIBLE

Object is not hidden but may be off-screen. STATE_VISIBLE is no guarantee that the object is actually unobscured on the screen, only that it is 'potentially' visible, barring obstruction, being scrolled or clipped out of the field of view, or having an ancestor container that has not yet made visible. A widget is potentially onscreen if it has both STATE_VISIBLE and STATE_SHOWING. The absence of STATE_VISIBLE and STATE_SHOWING is semantically equivalent to saying that an object is 'hidden'.

Object Level Events aka Signals

The table below shows which ATK events correspond to MSAA 1.3 and IAccessible2 events.

Refer to section Custom#events 5.5 Managing Events] for more information and examples related to setting up ATK event handlers.

MSAA 1.3 EVENT
(EVENT_OBJECT_ *)

IAccessible2 Events
(IA2_EVENT_*)

CLOSEST ATK Object Event(s)
or Signals and the ATK Interface

Description

CREATE,
DESTROY

Window events:
create, close

An object has been created or destroyed. The system sends this event for the following user interface elements: caret, header, list view, tab, tree view, toolbar, and window objects.

SHOW


A hidden object is shown. The system sends this event for the following user interface elements: caret, cursor, and window object. Hidden objects do not set the ATK_STATE_VISIBLE flag; shown objects do set this flag. The SHOW event also indicates that the ATK_STATE_VISIBLE flag is set.
ATK:The visible data of this object has changed. The character offset of the text caret (visible or notional) within this object has changed. Events of this type may also be generated when an onscreen text caret appears or disappears.

HIDE

An object is hidden. The system sends this event for the following user interface elements: caret and cursor.
ATK: The character offset of the text caret (visible or notional) within this object has changed. Events of this type may also be generated when an onscreen text caret appears or disappears.

REORDER

children_changed_add
children_changed_remove
invalidate_all_children
page_change

children-changed (AtkObject)

A container object has been added, removed, or reordered its children. The system sends this event for the following user interface elements: header control, list view control, toolbar control, and window object. For example, this event is generated by a list view object when the number of child elements or the order of the elements changes. This event is also sent by a parent window when the z order for the child windows changes.
ATK: The number or identity of an object's children has changed.

FOCUS

See: ACTIVE_DESCENDANT_CHANGED

focus-event (AtkObject)
See: active-descendant-changed (AtkObject)

An object has received the keyboard focus. The system sends this event for the following user interface elements: list view control, menu bar, pop-up menu, switch window, tab control, tree view control, and window object.

SELECTION

selection-changed (AtkSelection)

The selection within a container object has changed. The system sends this event for the following user interface elements: list view control, tab control, tree view control, and window object.
ATK: An instance of Selection has undergone a change in the 'selected-ness' of its children, i.e. had a selection added, removed, and/or modified. Usually accompanied by corresponding "object:state-changed:selected" events from the corresponding children, unless the children are previously un-queried via AT-SPI and the Selection instance has STATE_MANAGES_DESCENDANTS.

ACTIVE_DESCENDANT_CHANGED

active-descendant-changed (AtkObject)

If the object includes STATE_MANAGES_DESCENDANTS, this event is fired to indicate that the descendant having STATE_ACTIVE has changed; this corresponds to "micro" keyboard focus when the containing/emitting object has "macro" or technical keyboard focus. For instance, this event is usually emitted while traversing tables and/or spreadsheet cells.

SELECTIONADD,
SELECTIONREMOVE,
SELECTIONWITHIN

selection-changed (AtkSelection)

An item within a container object has been added to or removed from the selection. The system sends these events for the following user interface elements: list box, list view control, and tree view control. For SELECTIONWITHIN, numerous selection changes have occurred within a container object. The system sends this event for list boxes. Used instead of sending several SELECTIONADD or SELECTIONREMOVE events.
ATK: An instance of Selection has undergone a change in the 'selected-ness' of its children, i.e. had a selection added, removed, and/or modified. Usually accompanied by corresponding "object:state-changed:selected" events from the corresponding children, unless the children are previously un-queried via AT-SPI and the Selection instance has STATE_MANAGES_DESCENDANTS.

STATECHANGE

Also:[[BR]] EVENT_SYSTEM_MENUPOPUPSTART
EVENT_SYSTEM_MENUPOPUPEND


state-changed * (AtkObject)
AtkObject::atk_object_notify_state_change

An object's state has changed. The system sends this event for the following user interface elements: check box, combo box, header control, push button, radio button, scroll bar, toolbar control, tree view control, up-down control, and window object. For example, a state change occurs when a button object is pressed or released, or when an object is enabled or disabled.
ATK: The object's StateSet has had a state added or removed. (Any states.)

LOCATIONCHANGE

TEXT_CARET_MOVED
or just is a location change

bounds-changed (AtkComponent)
text-bounds-changed (proposed - AtkText)
text-caret-moved (AtkText)

An object has changed location, shape, or size. The system sends this event for the following user interface elements: caret and window object. Server applications send this event for their accessible objects. This event is generated in response to the top-level object within the object hierarchy that has changed, not for any children it might contain. For example, if the user resizes a window, the system sends this notification for the window, but not for the menu bar, title bar, scroll bars, or other objects that have also changed. The system does not send this event for every non-floating child window when the parent moves. However, if an application explicitly resizes child windows as a result of resizing, the system sends multiple events for the resized children.
ATK: The 'bounds-changed" signal is emitted when the bposition or size of the a component changes.
The character bounds of a text object have changed, for instance in response to a reformatting or reflow operation.
The character offset of the text caret (visible or notional) within this object has changed. Events of this type may also be generated when an onscreen text caret appears or disappears.

NAMECHANGE

property-change::accessible-name (AtkObject)

An object's name property has changed. The system sends this event for the following user interface elements: check box, cursor, list view control, push button, radio button, status bar control, tree view control, and window object.
ATK: A base (strongly-typed) object attribute has changed, for instance "object:property-change:accessible-name". Notifed property subtypes include accessible-name, accessible-description, and accessible-parent.

DESCRIPTIONCHANGE

property-change::accessible-description (AtkObject)

An object's description property has changed.
ATK: A base (strongly-typed) object attribute has changed, for instance "object:property-change:accessible-name". Notifed property subtypes include accessible-name, accessible-description, and accessible-parent.

VALUECHANGE

value-changed (proposed - AtkObject?)
property-change::accessible-value (AtkObject)

An object's value property has changed. The system sends this event for the following user interface elements: edit control, header control, hot key control, progress bar control, scroll bar, slider control, and up-down control.
ATK: The value of this object has changed.

TEXT_CHANGED

text-changed (AtkText)

The text content of this object has changed.

HYPERTEXT_CHANGED

PARENTCHANGE

property-change::accessible-parent (AtkObject)

An object has a new parent object.
ATK: A base (strongly-typed) object attribute has changed, for instance "object:property-change:accessible-name". Notifed property subtypes include accessible-name, accessible-description, and accessible-parent.

TABLE_CAPTION_CHANGED
TABLE_COLUMN_DESCRIPTION_CHANGED
TABLE_COLUMN_HEADER_CHANGED
TABLE_ROW_DESCRIPTION_CHANGED
TABLE_ROW_HEADER_CHANGED
TABLE_SUMMARY_CHANGED

Other property-change:: signals in AtkObject:
accessible-component-layer
accessible-component-mdi-zorder
accessible-hypertext-nlinks
accessible-role
accessible-table-caption-object
accessible-table-column-description
accessible-table-column-header
accessible-table-row-description
accessible-table-row-header
accessible-table-summary

Other property-change:: signals in AtkHyperlink:
end-index
number-of-anchors
selected-link
start-index

HELPCHANGE

An object's help property has changed.

ACCELERATORCHANGE

An object's key bindings has changed.

DEFACTIONCHANGE

See: ACTION_CHANGED

An object's default action property has changed. The system sends this event for dialog boxes.

ACTION_CHANGED

The change of the number or attributes of actions of an accessible object is signaled. There will be cases where the action that changed is not the default action.

attribute-change (AtkObject - proposed)

A weakly-typed property has changed in value, been added, or been removed from the object. (attribute-change notifications were added in AT-SPI 1.7.0) Still need a way to register weakly-typed properties in AtkObject .

load-complete (AtkDocument - proposed)

A pending (static) document content load has completed.

reload (AtkDocument - proposed)

A reload of the document content has been initiated.

load-stopped (AtkDocument - proposed)

Loading of the document content has been interrupted.

content-changed (AtkDocument - proposed)

The contents of the Document container has changed.

attributes-changed (AtkDocument - proposed)

The global attributes (i.e. document-wide attributes) of the Document have changed.

TEXT_ATTRIBUTE_CHANGED

text-attributes-changed (AtkText)

The attributes of a range of text, or the range over which attributes apply, has changed.

TEXT_SELECTION_CHANGED

text-selection-changed (AtkText)

The range or number of text selections within this text object has changed

link-activated (AtkHyperlink)

The signal link-activated is emitted when a link is activated.

link-selected (AtkHypertext)

The "link-selected" signal is emitted by an AtkHyperText object when one of the hyperlinks associated with the object is selected.

object:row-deleted
object:row-inserted
object:row-reordered
object:column-deleted
object:column-inserted
object:column-reordered

column-deleted (AtkTable)column-inserted (AtkTable)column-reordered (AtkTable)row-deleted (AtkTable)row-inserted (AtkTable)row-reordered (AtkTable)model-changed (AtkTable)

The "column-deleted" signal is emitted by an object which implements the AtkTable interface when a column is deleted. The "column-inserted" signal is emitted by an object which implements the AtkTable interface when a column is inserted.The "column-reordered" signal is emitted by an object which implements the AtkTable interface when columns are reordered. The "row-deleted" signal is emitted by an object which implements the AtkTable interface when a row is deleted. The "row-inserted" signal is emitted by an object which implements the AtkTable interface when a row is inserted.The "row-reordered" signal is emitted by an object which implements the AtkTable interface when rows are reordered. The "model-changed" signal is emitted by an object which implements the AtkTable interface when the model displayed by the table changes.

EVENT_SYSTEM_MINIMIZESTART, :: EVENT_SYSTEM_MINIMIZEEND, EVENT_SYSTEM_MOVESIZESTART, :: EVENT_SYSTEM_MOVESIZEEND, EVENT_SYSTEM_FOREGROUND ::

window events:
minimize, maximize, restore, activate, deactivate, move, size

Relations

The table below shows which ATK relations correspond to IAccessible2 relations.

IAccessible2 Relations
(IA2_Relation_*)

CLOSEST ATK Relation(s)
(ATK_RELATION_*)

Description

CONTROLLED_BY

CONTROLLED_BY

Object state, position, etc. is modified/controlled by user interaction with one or more other objects. For instance a viewport or scroll pane may be CONTROLLED_BY scrollbars.

CONTROLLER_FOR

CONTROLLER_FOR

Object is an interactive object which modifies the state, onscreen location, or other attributes of one or more target objects.

DESCRIBED_BY

Indicates that another object provides descriptive information about this object; more verbose than ATK_RELATION_LABELLED_BY.

DESCRIPTION_FOR

Indicates that an object provides descriptive information about another object; more verbose than ATK_RELATION_LABEL_FOR.

EMBEDDED_BY

EMBEDDED_BY

Reciprocal of RELATION_EMBEDS; Used to denote content rendered by embedded renderers that live in a separate process space from the embedding context.

EMBEDS

EMBEDS

Similar to SUBWINDOW_OF, but specifically used for cross-process embedding.

FLOWS_FROM

FLOWS_FROM

Reciprocal of RELATION_FLOWS_TO.

FLOWS_TO

FLOWS_TO

Object renders content which flows logically to another object. For instance, text in a paragraph may flow to another object which is not the �next sibling� in the accessibility hierarchy.

LABEL_FOR

LABEL_FOR

Object is a label for one or more other objects.

LABELED_BY

LABELLED_BY

Object is labelled by one or more other objects.

MEMBER_OF

MEMBER_OF

Object has a grouping relationship (e.g. �same group as�) to one or more other objects.

NODE_CHILD_OF

NODE_CHILD_OF

Indicates an object is a cell in a treetable which is displayed because a cell in the same column is expanded and identifies that cell.

PARENT_WINDOW_OF

PARENT_WINDOW_OF

Indicates that an object is a parent window of another object.

POPUP_FOR

POPUP_FOR

Denotes that the object is a transient window or frame associated with another onscreen object. Similar to TOOLTIP_FOR, but more general. Useful for windows which are technically toplevels but which, for one or more reasons, do not explicitly cause their associated window to lose �window focus�. Creation of a ROLE_WINDOW object with the POPUP_FOR relation usually requires some presentation action on the part of assistive technology clients, even though the previous toplevel ROLE_FRAME object may still be the active window.

RELATION_EXTENDED (AT-SPI only?)

Used to indicate that a relationship exists, but its type is not specified in the enumeration and must be obtained via a call to getRelationName.

SUBWINDOW_OF

SUBWINDOW_OF

Object is visually and semantically considered a subwindow of another object, even though it is not the object's child. Useful when dealing with embedded applications and other cases where the widget hierarchy does not map cleanly to the onscreen presentation.

TOOLTIP_FOR (proposed)

Object is a tooltip associated with another object.

Interfaces and Methods

The tables below show how to map MSAA 1.3 and IAccessible2 interfaces and functions to ATK interfaces and functions.

Creating accessible objects

MSAA Server Interfaces and Functions

ATK (and AT-SPI) object interfaces

Description

'''CreateStdAccessibleObject'''

AtkObject* atk_object_factory_create_accessible (AtkObjectFactory *factory, GObject *obj);
void atk_object_initialize (AtkObject *accessible, gpointer data);

MSAA: Creates an accessible object with the methods and properties for the specified type of system-provided user interface element.
ATK: Provides an AtkObject that implements an accessibility interface on behalf of obj. atk_object_initialize is called when implementing subclasses of AtkObject.

'''CreateStdAccessibleProxy'''

MSAA: creates an accessible object that has the properties and methods of the specified class of system-provided user interface element.

'''LresultFromObject'''

AtkObject:: atk_implementor_ref_accessible

MSAA: returns a reference, that is similar to a handle, to the specified object. Servers return this reference when handling WM_GETOBJECT.
ATK: Gets a reference to an object's AtkObject implementation, if the object implements AtkObjectIface

'''NotifyWinEvent'''

Accessibility::notifyEvent (in Event e)
(*AtkEventListener) (AtkObject*);
See also:atk_add_global_event_listener
(*AtkEventListenerInit)
atk_remove_global_event_listener

MSAA: signals the system that a predefined event occurred. If any client applications have registered a hook function for the event, the system calls the client's hook function.

'''IAccessibleHandler::AccessibleObjectFromID'''

MSAA: retrieves an IAccessible interface pointer for the interface associated with the given object ID. Oleacc.dll uses this method to obtain an IAccessible interface pointer for proxies that are supplied by other code.

GetTypeInfoCount

MSAA: returns the number of type descriptions for the object. For objects that support IDispatch, the type information count is always one.

GetTypeInfo

GType atk_object_factory_get_accessible_type (AtkObjectFactory *factory);

MSAA: retrieves a description of the object's programmable interface.
ATK: Gets the GType of the accessible which is created by the factory.

GetIDsOfNames

MSAA: maps the name of a method or property to a DISPID, which is later used to invoke the method or property.

Invoke

MSAA: calls one of the object's methods, or gets or sets one of its properties.

Base accessible interfaces

MSAA IAccessible methods

ATK interface

Description

Navigation and Hierarchy

From AtkObject

accNavigate ( long, VARIANT, VARIANT* );

MSAA: traverses to another user interface (UI) element within a container and retrieves the object. All visual objects must support this method.
Note: Firefox extended this interface to to navigate to relations by adding new constants. IARelation is already being used so we will keep it.
ATK: No equivalent, except the future addition to AT-SPI of the Collection interface.

get_accChild ( VARIANT, IDispatch** );

AtkObject* atk_object_ref_accessible_child (AtkObject *accessible, gint i);

MSAA: retrieves an '''IDispatch''' interface pointer for the specified child, if one exists. All objects must support this property.
ATK: Gets a reference to the specified accessible child of the object. The accessible children are 0-based so the first accessible child is at index 0, the second at index 1 and so on.

get_accChildCount ( long* );

gint atk_object_get_n_accessible_children (AtkObject *accessible);

MSAA: retrieves the number of children that belong to this object. All objects must support this property.
ATK: Gets the number of accessible children of the accessible.

get_accParent ( IDispatch** );

AtkObject* atk_object_get_parent (AtkObject *accessible);

MSAA: retrieves the '''IDispatch''' interface of the object's parent. All objects support this property.

===== Descriptive Properties and Methods =====

From AtkAction, AtkObject, AtkValue

accDoDefaultAction ( VARIANT );

gboolean atk_action_do_action (AtkAction *action, gint i);

MSAA: performs the specified object's default action. Not all objects have a default action. Similar to IAccessibleAction::doAction, but it provides for more than one action. The first IAAction should be the default action.

get_accDefaultAction ( VARIANT, BSTR* );

const gchar* atk_action_get_name (AtkAction *action, gint i);
See also: atk_action_get_localized_name

MSAA: retrieves a string that describes the object's default action. Not all objects have a default action. IAccessibleAction has getters for description and the key binding. Both are strings.
ATK: Returns the name of the specified action of an object. If there are more than one action for an object, the first one is considered the "default" action.

get_accDescription ( VARIANT, BSTR* );

const gchar* atk_object_get_description (AtkObject *accessible);

MSAA: retrieves a string that describes the visual appearance of the specified object. Not all objects have a description.

get_accHelp ( VARIANT, BSTR* );

MSAA: retrieves an object's Help property string. Not all objects support this property.
ATK: No equivalent.

get_accHelpTopic ( BSTR*, VARIANT, long* );

MSAA: retrieves the full path of the WinHelp file associated with the specified object and the identifier of the appropriate topic within that file. Not all objects support this property.
ATK: No equivalent.

get_accKeyboardShortcut ( VARIANT, BSTR* );

const gchar* atk_action_get_keybinding (AtkAction *action, gint i);

MSAA: retrieves the specified object's shortcut key or access key, also known as the mnemonic. All objects that have a shortcut key or an access key support this property. Similar to IAccessibleAction::keyBinding. MSAA shortcuts can be on controls with no default action such as a text box or static text next to a text box (label). IAccessible2 key bindings are only on actionable controls. They are needed for image maps or a control that has more than one action. If there is only one action on an actionable control, there is no need to implement IAccessibleAction.
ATK: Get keybinding associated with action for object.

get_accName ( VARIANT, BSTR* );

const gchar* atk_object_get_name (AtkObject *accessible);

MSAA: retrieves the name of the specified object. All objects support this property.

get_accRole ( VARIANT, VARIANT* );

AtkRole atk_object_get_role (AtkObject *accessible);

See also: atk_role_get_name,atk_role_get_localized_name, [[BR]]atk_role_for_namehttp://developer.gnome.org/doc/API/2.0/atk/AtkObject.html#atk-role-get-localized-name

MSAA: retrieves information that describes the role of the specified object. All objects support this property. MSAA roles run from 1 - 0x40, new IAccessible2 roles will be mapped at higher values, starting at 0x100. There will be IAccessible2:roleName and IAccessible2::localizedRoleName.

get_accState ( VARIANT, VARIANT* );

AtkStateSet* atk_object_ref_state_set (AtkObject *accessible);

MSAA: retrieves the current state of the specified object. All objects support this property.Use MSAA get_accStates for states that map to MSAA states. For new states: IAccessible::states returns additional IAccessible2 states in a 32 bit bitstrip. The AT will sense for the presence of IAccessible2 and if found fetch the states.
ATK: Gets a reference to the state set of the accessible

get_accValue ( VARIANT, BSTR* );

void atk_value_get_current_value (AtkValue *obj, GValue *value);

MSAA: retrieves the value of the specified object. Not all objects have a value. IAccessibleValue::currentValue is not a duplicate. MSAA returns a string. IAccessible2 returns an integer. get_accValue is needed when something like "blue" is a meaningful return value. IAccessibleValue is needed when min/max/current integers are meaningful. MSAA has no min/max capability. IAccessible2 has no string capability. They are both needed.

Selection and Focus

From AtkSelection and AtkComponent

accSelect ( long, VARIANT );

gboolean atk_selection_add_selection (AtkSelection *selection, gint i);
AND
gboolean atk_component_grab_focus (AtkComponent *component);

MSAA: modifies the selection or moves the keyboard focus of the specified object. All objects that support selection or receive the keyboard focus must support this method. It does take focus, take/extend selection/add/remove. Duplicate of or similar to IAccessibleSelection::selectAccessibleChild. Get note from Aaron.
ATK: Adds the specified accessible child of the object to the object's selection. Plus Grabs focus for this component.

get_accFocus ( VARIANT* );

Walk the tree and check for object that has focus

MSAA: retrieves the object that has the keyboard focus. All objects that receive the keyboard focus must support this property.
ATK:

get_accSelection ( VARIANT * );

See: atk_selection_ref_selection, atk_selection_get_selection_count

MSAA: retrieves the selected children of this object. All objects that support selection must support this property.

===== Spatial Mapping =====

From AtkComponent

accLocation ( long*, long*, long* long*, VARIANT);

void atk_component_get_position (AtkComponent *component, gint *x, gint *y, AtkCoordType coord_type);

atk_component_get_extents (AtkComponent *component, gint *x, gint *y, gint *width, gint *height, AtkCoordType coord_type);

See also: atk_component_set_position

MSAA: retrieves the specified object's current screen location. All visual objects must support this method; sound objects do not support it.
ATK: Gets the position of component in the form of a point specifying components top-left corner.
Gets the rectangle which gives the extent of the
component.

accHitTest ( long, long, '''VARIANT'''* );

AtkObject* atk_component_ref_accessible_at_point (AtkComponent *component, gint x, gint y, AtkCoordType coord_type);

MSAA: retrieves the child element or child object at a given point on the screen. All visual objects support this method; sound objects do not support it. Similar to IAccessibleComponent:accessibleAtPoint.BR ATK: Gets a reference to the accessible child, if one exists, at the coordinate point specified by x and y.

Put functions

From AtkObject and AtkValue

put_accName

void atk_object_set_name (AtkObject *accessible, const gchar *name);

MSAA: is no longer supported. Client applications should use a control-specific workaround, such as the SetWindowText API. Servers should return E_NOTIMPL.
ATK: Sets the accessible name of the accessible.

void atk_object_set_description (AtkObject *accessible, const gchar *description);

MSAA: No equivalent.
ATK: Sets the accessible description of the accessible.

void atk_object_set_parent (AtkObject *accessible, AtkObject *parent);

MSAA: No equivalent.
ATK: Sets the accessible parent of the accessible.

void atk_object_set_role (AtkObject *accessible, AtkRole role);

MSAA: No equivalent.
ATK: Sets the role of the accessible.

put_accValue

gboolean atk_value_set_current_value (AtkValue *obj, const GValue *value);

MSAA: is supported for some user interface (UI) elements (usually edit controls). For UI elements that do not support this method, control-specific APIs are used instead. For more information, see Supported User Interface Element Reference. Duplicate of IAccessibleValue::setCurrentValue, or is the Value interface only integer? Probably not used.

Extended accessible interfaces

(MSAA extensions) IAccessible2 interfaces and functions (returns HRESULT)

ATK interfaces

Comments

IAccessible2

From AtkRelation, AtkObject, AtkAction, AtkState, AtkStateSet

nRelations ([out, retval] long *nRelations)

gint atk_relation_set_get_n_relations (AtkRelationSet *set);

IA2: get number of accessible relations for this object.
ATK: Determines the number of relations in a RelationSet.

relation ([in] long relationIndex,[out, retval] IAccessibleRelation **relation)

AtkRelation* atk_relation_set_get_relation (AtkRelationSet *set, gint i);
AtkRelation* atk_relation_set_get_relation_by_type (AtkRelationSet *set, AtkRelationType relationship);
gboolean atk_relation_set_contains (AtkRelationSet *set, AtkRelationType relationship);
See also: atk_relation_type_register,
atk_relation_set_add_relation_by_type,
atk_relation_set_remove, [[BR]]atk_relation_set_add[[BR]]

IA2: get one accessible relation at the specified index for this object.
ATK: Determines the relation at the specified position in the relation set. Or you can find out if a relation for the object matches a specified type.

relations ([in] long maxRelations,[out, size_is(maxRelations), length_is(*nRelations)] IAccessibleRelation **relation,[out, retval] long *nRelations)

AtkRelationSet* atk_object_ref_relation_set (AtkObject *accessible);

See also:atk_object_add_relationship and atk_object_remove_relationship

IA2: get multiple accessible relations for this object. Not sure if or how you can add new relationships in IA2.
ATK: Gets the AtkRelationSet associated with the object.

scrollTo ([in] boolean topLeft)

IA2: make object visible on screen. This allows a screen magnifier to programmatically scroll focus to a object in the document. Requested for use by ZoomText.
ATK: No ATK equivalent.

groupPosition ([out] long *groupLevel,[out] long *similarItemsInGroup,[out, retval] long *positionInGroup)

IA2: get position within group (used for tree items, list items, tab panel labels, radio buttons, etc.
ATK: No ATK equivalent.

extendedStates ([in] long maxStates,[out, size_is(, maxStates), length_is(,*nStates)] BSTR **state,[out, retval] long *nStates)

See: atk_state_type_get_name, atk_state_type_for_name, atk_state_type_register

IA2: get extended states (array of strings like "required", "invalid", etc.)

states ([in] long maxStates,[out, size_is(, maxStates), length_is(,*nStates)]
AccessibleState **state,[out, retval] long *nStates)
Rename IAccessible2::states method, which returns an array of integers, to IAccessible2::localizedStateNames and have it return an array of localized BSTRs
Add a replacement IAccessible2::states which will return a long (a bit strip of 32 state bits). There are 18 new IA2 states.

AtkStateSet* atk_object_ref_state_set (AtkObject *accessible);

IA2: Get all currently set states as a sequence of state ids. Different thanIAccessible::get_accStates. This call returns additional IAccessible2 states in a 32 bit bitstrip. The AT will sense for the presence of IAccessible2 and if found fetch the states.
ATK: Gets a reference to the state set of the accessible; the caller must unreference it when it is no longer needed.

nExtendedState ([out, retval] long *nExtendedStates) OR nStates ([out, retval] long *nStates)

IA2: get number of extended? states.
ATK: No equivalent.

AtkStateType atk_state_type_register (const gchar *name);

IA2: No State interface in IA2 - not needed.
ATK: Register a new object state.

const gchar* atk_state_type_get_name (AtkStateType type);

IA2: No State interface in IA2 - not needed.
ATK: Gets the description string describing the AtkStateType type.

AtkStateType atk_state_type_for_name (const gchar *name);

IA2: No State interface in IA2 - not needed.
ATK: Gets the description string describing the AtkStateType type

gboolean atk_state_set_is_empty (AtkStateSet *set);

IA2: No StateSet interface in IA2 - not needed, but this method is in ATK and UNO.
ATK: Checks whether the state set is empty, i.e. has no states set.

gboolean atk_state_set_add_state (AtkStateSet *set, AtkStateType type);

IA2: No StateSet interface in IA2 - not needed, but this method is in ATK.
ATK: Add a new state for the specified type to the current state set if it is not already present.

void atk_state_set_add_states (AtkStateSet *set, AtkStateType *types, gint n_types);

IA2: No StateSet interface in IA2 - not needed, but this method is in ATK.
ATK: Add the states for the specified types to the current state set.

void atk_state_set_clear_states (AtkStateSet *set);

IA2: No StateSet interface in IA2 - not needed, but this method is in ATK.
ATK: Removes all states from the state set.

gboolean atk_state_set_contains_state (AtkStateSet *set, AtkStateType type);

IA2: No StateSet interface in IA2 - not needed, but this method is in ATK and UNO.
ATK: Checks whether the state for the specified type is in the specified set.

gboolean atk_state_set_contains_states (AtkStateSet *set, AtkStateType *types, gint n_types);

IA2: No StateSet interface in IA2 - not needed, but this method is in ATK and UNO.
ATK: Checks whether the states for all the specified types are in the specified set.

gboolean atk_state_set_remove_state (AtkStateSet *set, AtkStateType type);

IA2: No StateSet interface in IA2 - not needed, but this method is in ATK.
ATK: Removes the state for the specified type from the state set.

AtkStateSet* atk_state_set_and_sets (AtkStateSet *set, AtkStateSet *compare_set);

IA2: No StateSet interface in IA2 - not needed, but this method is in ATK.
ATK: Constructs the intersection of the two sets, returning NULL if the intersection is empty.

AtkStateSet* atk_state_set_or_sets (AtkStateSet *set, AtkStateSet *compare_set);

IA2: No StateSet interface in IA2 - not needed, but this method is in ATK.
ATK: Constructs the union of the two sets.

AtkStateSet* atk_state_set_xor_sets (AtkStateSet *set, AtkStateSet *compare_set);

IA2: No StateSet interface in IA2 - not needed, but this method is in ATK.
ATK: Constructs the exclusive-or of the two sets, returning NULL is empty. The set returned by this operation contains the states in exactly one of the two sets.

extendedRoles ([in] long maxRoles,[out, size_is(, maxRoles), length_is(,*nRoles)] BSTR **role,[out, retval] long *nRoles)

Add: roleName and localizedRoleName

const gchar* atk_role_get_name or use an enumerated role (like HEADING) and qualify it with text attributes like "xhtml:h1"
See:[[BR]]AtkRole atk_role_register (const gchar *name);
atk_role_get_localized_name,

IA2: get extended roles (array of strings). MSAA roles run from 1 - 0x40, new IAccessible2 roles will be mapped at higher values, starting at 0x100.
ATK: Registers the role specified by name, a character string describing the new role.

nExtendedRoles ([out, retval] long *nExtendedRoles) OR nRoles ([out, retval] long *nRoles)

IA2: get number of extended? roles.
ATK: No equivalent.

childID ([out, retval] long *childID)

See: atk_object_ref_accessible_child

IA2: unique ID, must be persistent so that OBJECT_REORDER events can be used to invalidate AT cache.
ATK: Not needed.

windowHandle ([out, retval] long *windowHandle)

IA2: current WindowFromAccessibleObject uses nested get_accParent()'s until a ROLE_WINDOW object is found, and maps that to a window handle
ATK: No equivalent

accessibleParentIndex ([out, retval] long *accParentIndex)

gint atk_object_get_index_in_parent (AtkObject *accessible);

ATK: Gets the 0-based index of this accessible in its parent; returns -1 if the accessible does not have an accessible parent.

locale ([out, retval] Locale *locale)

IA2: Get locale of object.
ATK: No ATK equivalent.

Add IAccessible2::get_attributes?

Need an atk_object_get_attributes?
Proposed:[[BR]]void atk_object_set_attribute( AtkObject *accessible, const gchar *name, const gchar *value);

IA2: To support formulas. The return is a string of name value pairs, e.g. "formula:SUM(A1, B2), There's already an IAccessibleText:attributes.

IAccessibleAction

From AtkAction

nActions ([out, retval] long *nActions)

gint atk_action_get_n_actions (AtkAction *action);

IA2: get number of actions.
ATK: Gets the number of accessible actions available on the object. If there are more than one, the first one is considered the "default" action of the object.

doAction ([in] long actionIndex)

gboolean atk_action_do_action (AtkAction *action, gint i);

IA2: perform specified action on the object. Similar to IAccessible::accDoDefaultAction., but IAccessibleAction::doAction provides for more than one action. The first IAccessibleAction should be the default action.

description ([in] long actionIndex,[out, retval] BSTR *description)

const gchar* atk_action_get_description (AtkAction *action, gint i);
See also: atk_action_set_description

IA2: get description of specified action

keyBinding ([in] long actionIndex,[in] long nMaxBinding,[out, size_is(, nMaxBinding), length_is(,*nBinding)] BSTR **keyBinding,[out, retval] long *nBinding)

const gchar* atk_action_get_keybinding (AtkAction *action, gint i);

IA2: return key binding object (if any) associated with specified action key binding is string, e.g. "alt+d". This is the same string that IAccessible:: get_accKeyboardShortcut returns (but MSAA only provides for one action). IAccessibleAction is needed when there is more than one action.

IAccessibleHyperlink

From AtkHyperlink

accessibleActionAnchor ([in] long index,[out, retval] VARIANT *anchor)

AtkObject* atk_hyperlink_get_object (AtkHyperlink *link_, gint i);

IA2: Returns an object that represents the link anchor, as appropriate for that link.For an HTML link for example, this method would return the string enclosed by the <&a href> tag. Is this a convenience method? Different than ATK because it returns the text instead of an object.
ATK: Returns the item associated with this hyperlinks nth anchor. For instance, the returned AtkObject will implement AtkText if link_ is a text hyperlink, AtkImage if link_ is an image hyperlink etc. Multiple anchors are primarily used by client-side image maps.

accessibleActionURI ([in] long index,[out, retval] VARIANT *object)

gchar* atk_hyperlink_get_uri (AtkHyperlink *link_, gint i);

IA2: Returns an object that represents the link anchor, as appropriate for that link. For an HTML link for example, this method would return the URL of the <&a href> tag.
ATK: Get a the URI associated with the anchor specified by i of link_. Multiple anchors are primarily used by client-side image maps.

startIndex ([out, retval] long *index)

gint atk_hyperlink_get_start_index (AtkHyperlink *link_);

IA2: Returns the index at which the textual representation of the hyperlink (group) starts.
ATK: Gets the index with the hypertext document at which this link begins.

endIndex ([out, retval] long *index)

gint atk_hyperlink_get_end_index (AtkHyperlink *link_);

IA2: Returns the index at which the textual rerpesentation of the hyperlink (group) ends.
ATK: Gets the index with the hypertext document at which this link ends.

valid ([out, retval] boolean *valid)

gboolean atk_hyperlink_is_valid (AtkHyperlink *link_);

IA2: Returns whether the document referenced by this links is still valid. This is a volatile state that may change without further warning like e.g. sending an appropriate event.
ATK: Since the document that a link is associated with may have changed this method returns TRUE if the link is still valid (with respect to the document it references) and FALSE otherwise.

gboolean atk_hyperlink_is_inline (AtkHyperlink *link_);

IA2: No equivalent.
ATK: Indicates whether the link currently displays some or all of its content inline. Ordinary HTML links will usually return FALSE, but an inline &lt;src&gt; HTML element will return TRUE. a * Not being passed through to AT-SPI.

gint atk_hyperlink_get_n_anchors (AtkHyperlink *link_);

IA2: No equivalent.
ATK: Gets the number of anchors associated with this hyperlink.

gboolean atk_hyperlink_is_selected_link (AtkHyperlink *link_);

IA2: No equivalent
ATK: Determines whether this AtkHyperlink is selected Not being passed through to AT-SPI. Or should we just deprecate and just check the FOCUS state?

IAccessibleComponent

From AtkComponent and AtkText

containsPoint ([in] Point aPoint,[out, retval] boolean *containsPoint)

gboolean atk_component_contains (AtkComponent *component, gint x, gint y, AtkCoordType coord_type);

IA2: Tests whether the specified point lies within this object's bounds.
ATK: Checks whether the specified point is within the extent of the component.

accessibleAtPoint ([in] Point aPoint,[out, retval] IAccessible2 **accessible)

AtkObject* atk_component_ref_accessible_at_point (AtkComponent *component, gint x, gint y, AtkCoordType coord_type);

IA2: Returns the Accessible child that is rendered under the given point. The test point's coordinates are defined relative to the coordinate system of the object. Similar to IAccessible::accHitTest.
ATK: Gets a reference to the accessible child, if one exists, at the coordinate point specified by x and y.

locationInParent ([out, retval] Point *location)

void atk_component_get_position (AtkComponent *component, gint *x, gint *y, AtkCoordType coord_type);

See also: atk_component_set_position

IA2: Returns the location of the upper left corner x/y of the object's bounding box relative to the parent.
ATK: Gets the position of component in the form of a point specifying components top-left corner. How is this different from atk_image_get_image_position?

foreground ([out, retval] Color *foreground)

See: atk_text_get_run_attributes

IA2: Returns the foreground color of this object. For chrome controls, such as the color dialog, the foreground will be the selected color.
ATK: No equivalent.

background ([out, retval] Color *background)

See: atk_text_get_run_attributes

IA2: Returns the background color of this object.
ATK: No equivalent.

Add IAComponent::layer

AtkLayer atk_component_get_layer (AtkComponent *component);

IA2 and ATK: Gets the layer of the component. Layers group drawing objects. ODF has draw:layer.

Add IAComponent::zOrder

gint atk_component_get_mdi_zorder (AtkComponent *component);

IA2 and ATK: gets the zorder of the component, i.e. the depth at which the component is shown in relation to other components in the same container. ODF has draw:z-index

IAccessibleExtendedComponent

No real ATK equivalent

font ([out, retval] IUNOFont **font)

See: atk_text_get_run_attributes

IA2: Returns the font of this object.
ATK: No direct equivalent.

titledBorderText ([out, retval] BSTR *titledBorderText)

IA2: Returns the titled border text.
ATK: No equivalent.

toolTipText ([out, retval] BSTR *toolTipText)

IA2: Returns the tool tip text of this object.
Note: In Java if you use get desc if desc is not there then tool tip text is used.
SODC has two hover texts. First short hover text appears and then longer hover text. The short hover text is found in MSAA name and the long hover text is found in MSAA description.
ATK: No equivalent.

IAccessibleEditableText

From AtkEditableText

copyText ([in] long startOffset,[in] long endOffset,[out, retval] )

void atk_editable_text_copy_text (AtkEditableText *text, gint start_pos, gint end_pos);

IA2: copy a range of text to the clipboard
ATK: Copy text from start_pos up to, but not including end_pos to the clipboard.

deleteText ([in] long startOffset,[in] long endOffset,[out, retval] )

void atk_editable_text_delete_text (AtkEditableText *text, gint start_pos, gint end_pos);

IA2: delete a range of text
ATK: Delete text start_pos up to, but not including end_pos.

insertText ([in] long offset,[in] BSTR *text,[out, retval] )

void atk_editable_text_insert_text (AtkEditableText *text, const gchar *string, gint length, gint *position);

IA2: insert text at a specified offset
ATK: Insert text at a given position.

cutText ([in] long startOffset,[in] long endOffset,[out, retval] )

void atk_editable_text_cut_text (AtkEditableText *text, gint start_pos, gint end_pos);

IA2: cut a range of text to the clipboard
ATK: Copy text from start_pos up to, but not including end_pos to the clipboard and then delete from the widget.

pasteText ([in] long offset,[out, retval] )

void atk_editable_text_paste_text (AtkEditableText *text, gint position);

IA2: paste text from clipboard at specified offset
ATK: Delete text start_pos up to, but not including end_pos.

replaceText ([in] long startOffset,[in] long endOffset,[in] BSTR *text,[out, retval] )

IA2: replace range of text with new text
ATK: No equivalent.

setAttributes ([in] long startOffset,[in] long endOffset,[in] BSTR *attributes,[out, retval] )

gboolean atk_editable_text_set_run_attributes (AtkEditableText *text, AtkAttributeSet *attrib_set, gint start_offset, gint end_offset);

IA2: set attributes of range of text
ATK: Sets the attributes for a specified range.

IAccessibleImage - not needed

From AtkImage

const gchar* atk_image_get_image_description (AtkImage *image);
See also: atk_image_set_image_description

IA2: Get description from IAccessible::get_accDescription
ATK: Get a textual description of this image.

void atk_image_get_image_position (AtkImage *image, gint *x, gint *y, AtkCoordType coord_type);

IA2: Get x/y from IAccessible::get_accLocation
ATK: Get the width and height in pixels for the specified image. The values of width and height are returned as -1 if the values cannot be obtained.

void atk_image_get_image_position (AtkImage *image, gint *x, gint *y, AtkCoordType coord_type);

IA2: Get x/y from IAccessible::get_accLocation
ATK: Get the width and height in pixels for the specified image. The values of width and height are returned as -1 if the values cannot be obtained.

IAccessibleRelation

From AtkRelation and AtkRelationSet

relationType ([out, retval] BSTR *relationType)

AtkRelationType
atk_relation_get_relation_type (AtkRelation *relation);
gboolean atk_relation_set_contains (AtkRelationSet *set, AtkRelationType relationship);
See also: atk_relation_type_register,
atk_relation_type_for_name,
atk_relation_new

IA2: returns type of relation, but it is not localized.
ATK: When registering a relation type, associate name with a new AtkRelationType

Add get_localizedRelationType

nTargets ([out, retval] long *nTargets)

See: atk_relation_get_target

IA2: returns the size of the relations targets array

target ([in] long targetIndex,[out, retval] IUnknown **target)

GPtrArray* atk_relation_get_target (AtkRelation *relation);
See also: atk_relation_add_target

IA2: get one accessible relation target

targets ([in] long maxTargets,[out, size_is(maxTargets), length_is(*nTargets)] IUnknown **target,[out, retval] long *nTargets)

See: atk_relation_get_target

IA2: get multiple accessible relation targets
ATK: No true ATK call to get multiple targets.

IAccessibleSelection

From AtkSelection

Note: For IA2, this will be implemented on the document and used to expose child selections that cross paragraph boundaries.

selectAccessibleChild ([in] long childIndex,[out, retval] boolean *success)

gboolean atk_selection_add_selection (AtkSelection *selection, gint i);

IA2: Selects the specified Accessible child of the object. Depending on the implementing class the child is added to the current set a selected children (multi selection) or a previously selected child is deselected first (single selection).
ATK: Adds the specified accessible child of the object to the object's selection.

isAccessibleChildSelected ([in] long childIndex,[out, retval] boolean *selected)

gboolean atk_selection_is_child_selected (AtkSelection *selection, gint i);

IA2: Determines if the specified child of this object is selected.
ATK: Determines if the current child of this object is selected

clearAccessibleSelection ([out, retval] boolean *success)

gboolean atk_selection_clear_selection (AtkSelection *selection);

IA2 and ATK: Clears the selection in the object so that no children in the object are selected.

selectAllAccessibleChildren ([out, retval] boolean *success)

gboolean atk_selection_select_all_selection (AtkSelection *selection);

IA2: Select all children. Causes every child of the object to be selected if the object supports multiple selections. If multiple selection is not supported then the first child, if it exists, is selected and all other children are deselected.
ATK: Causes every child of the object to be selected if the object supports multiple selections.

nSelectedAccessibleChildren ([out, retval] long *nSelectedAccessibleChildren)

gint atk_selection_get_selection_count (AtkSelection *selection);

IA2: Returns the number of Accessible children that are currently selected.
ATK: Gets the number of accessible children currently selected.

selectedAccessibleChild ([in] long childIndex,[out, retval] IAccessible2 **accessible)

AtkObject* atk_selection_ref_selection (AtkSelection *selection, gint i);

IA2: Returns the specified selected Accessible child.
ATK: Gets a reference to the accessible object representing the specified selected child of the object.

deselectAccessibleChild ([in] long childIndex,[out, retval] boolean *success)

gboolean atk_selection_remove_selection (AtkSelection *selection, gint i);

IA2: Removes the specified child from the set of this object's selected children.
ATK: Removes the specified child of the object from the object's selection.

IAccessibleTable

From AtkTable

accessibleAt ([in] long row,[in] long column,[out, retval] IAccessible2 **accessible)

AtkObject* atk_table_ref_at (AtkTable *table, gint row, gint column);

IA2: get accessible table cell
ATK: Get a reference to the table cell at row, column.

add index method.

gint atk_table_get_index_at (AtkTable *table, gint row, gint column);

IA2: No equivalent.
ATK: Gets a gint representing the index at the specified row and column.

add column method.

gint atk_table_get_column_at_index (AtkTable *table, gint index_);

IA2: No equivalent.
ATK: Gets a gint representing the column at the specified index_.

add row method.

gint atk_table_get_row_at_index (AtkTable *table, gint index_);

IA2: No equivalent.
ATK: Gets a gint representing the row at the specified index_.

caption ([out, retval] IAccessible2 **accessible)

AtkObject* atk_table_get_caption (AtkTable *table);

Gets the caption for the table.

void atk_table_set_caption (AtkTable *table, AtkObject *caption);

IA2: No equivalent.
ATK: Sets the caption for the table.

columnDescription ([in] long column,[out, retval] BSTR *description)

const gchar* atk_table_get_column_description (AtkTable *table, gint column);

Gets the description text of the specified column in the table. Will not be implemented in SODC.

void atk_table_set_column_description (AtkTable *table, gint column, const gchar *description);

IA2: No equivalent.
ATK: Sets the description text for the specified column of the table.

columnExtentAt ([in] long row,[in] long column,[out, retval] Extent *spanColumns)

gint atk_table_get_column_extent_at (AtkTable *table, gint row, gint column);

IA2: get number of columns spanned by table cell
ATK: Gets the number of columns occupied by the accessible object at the specified row and column in the table.

columnHeader ([in] long column,[out, retval] IAccessible2 **accessible)

AtkObject* atk_table_get_column_header (AtkTable *table, gint column);

Gets the column header of a specified column in an accessible table.

void atk_table_set_column_header (AtkTable *table, gint column, AtkObject *header);

IA2: No equivalent.
ATK: Sets the specified column header to header.

nColumns ([out, retval] long *columnCount)

gint atk_table_get_n_columns (AtkTable *table);

IA2: get total number of columns in table
ATK: Gets the number of columns in the table.

nRows ([out, retval] long *rowCount)

gint atk_table_get_n_rows (AtkTable *table);

IA2: get total number of rows in table
ATK: Gets the number of rows in the table.

nSelectedColumns ([out, retval] long *columnCount)

gint atk_table_get_selected_columns (AtkTable *table, gint **selected);

get total number of selected columns
IA2: Has two calls for 1 ATK call. See also IAccessibleTable::selectedColumns.

nSelectedRows ([out, retval] long *rowCount)

gint atk_table_get_selected_rows (AtkTable *table, gint **selected);

get total number of selected rows
IA2: Has two calls for 1 ATK call. See also IAccessibleTable::selectedRows.

rowDescription ([in] long row,[out, retval] BSTR *description)

const gchar* atk_table_get_row_description (AtkTable *table, gint row);

Gets the description text of the specified row in the table. Not implemented in SODC.

void atk_table_set_row_description (AtkTable *table, gint row, const gchar *description);

IA2: No equivalent.
ATK: Set row description.

rowExtentAt ([in] long row,[in] long column,[out, retval] Extent *spanRows)

gint atk_table_get_row_extent_at (AtkTable *table, gint row, gint column);

IA2: get number of rows spanned by a table cell
ATK: Gets the number of rows occupied by the accessible object at a specified row and column in the table.

rowHeader ([in] long row,[out, retval] IAccessible2 **accessible)

AtkObject* atk_table_get_row_header (AtkTable *table, gint row);

Gets the row header of a specified row in an accessible table.

void atk_table_set_row_header (AtkTable *table, gint row, AtkObject *header);

IA2: No equivalent.
ATK: Sets the specified row header to header.

summary ([out, retval] IAccessible2 **accessible)

AtkObject* atk_table_get_summary (AtkTable *table);

Gets the summary description of the table. Not implemented in SODC.

void atk_table_set_summary (AtkTable *table, AtkObject *accessible);

IA2: No equivalent.
ATK: Sets the summary description of the table.

isColumnSelected ([in] long column,[out, retval] boolean *isSelected)

gboolean atk_table_is_column_selected (AtkTable *table, gint column);

Gets a boolean value indicating whether the specified column is selected

isRowSelected ([in] long row,[out, retval] boolean *isSelected)

gboolean atk_table_is_row_selected (AtkTable *table, gint row);

Gets a boolean value indicating whether the specified row is selected

isSelected ([in] long row,[in] long column,[out, retval] boolean *isSelected)

gboolean atk_table_is_selected (AtkTable *table, gint row, gint column);

IA2: determine if table cell is selected
ATK: Gets a boolean value indicating whether the accessible object at the specified row and column is selected

selectRow ([in] long row,[out, retval] )

gboolean atk_table_add_row_selection (AtkTable *table, gint row);

Adds the specified row to the selection. May not be implemented in SODC.

selectColumn ([in] long column,[out, retval] )

gboolean atk_table_add_column_selection (AtkTable *table, gint column);

Adds the specified column to the selection. May not be implemented in SODC.

unselectRow ([in] long row,[out, retval] )

gboolean atk_table_remove_row_selection (AtkTable *table, gint row);

Removes the specified row from the selection. May not be implemented in SODC.

unselectColumn ([in] long column,[out, retval] )

gboolean atk_table_remove_column_selection (AtkTable *table, gint column);

Removes the specified column to the selection. May not be implemented in SODC.

IAccessibleText

From AtkText

addSelection ([in] long startOffset,[in] long endOffset,[out, retval] boolean *success)

gboolean atk_text_add_selection (AtkText *text, gint start_offset, gint end_offset);

ATK: Adds a selection bounded by the specified offsets.

attributes ([in] long offset,[out] long *startOffset,[out] long *endOffset,[out, retval] BSTR *textAttributes)

AtkAttributeSet* atk_text_get_run_attributes (AtkText *text, gint offset, gint *start_offset, gint *end_offset);

IA2: Get text attributes returned in a string of name value pairs.
ATK: Creates an AtkAttributeSet which consists of the attributes explicitly set at the position offset in the text. start_offset and end_offset are set to the start and end of the range around offset where the attributes are invariant.

AtkAttributeSet* atk_text_get_default_attributes (AtkText *text);

IA2: No equivalent.
ATK: Creates an AtkAttributeSet which consists of the default values of attributes for the text. See the enum AtkTextAttribute for types of text attributes that can be returned. Note that other attributes may also be returned.

void atk_attribute_set_free (AtkAttributeSet *attrib_set);

IA2: No equivalent.
ATK: Frees the memory used by an AtkAttributeSet, including all its AtkAttributes.

AtkTextAttribute atk_text_attribute_register (const gchar *name);

IA2: No equivalent.
ATK: Associate name with a new AtkTextAttribute

const gchar* atk_text_attribute_get_name (AtkTextAttribute attr);

IA2: No equivalent.
ATK: Gets the name corresponding to the AtkTextAttribute

AtkTextAttribute atk_text_attribute_for_name (const gchar *name);

IA2: No equivalent.
ATK: Get the AtkTextAttribute type corresponding to a text attribute name.

const gchar* atk_text_attribute_get_value (AtkTextAttribute attr, gint index_);

IA2: No equivalent.
ATK: Gets the value for the index of the AtkTextAttribute

caretOffset ([out, retval] long *offset)

gint atk_text_get_caret_offset (AtkText *text);

ATK: Gets the offset position of the caret (cursor).

characterExtents ([in] long offset,[in] long coordType,[out] long *x,[out] long *y,[out] long *width,[out] long *height)

void atk_text_get_character_extents (AtkText *text, gint offset, gint *x, gint *y, gint *width, gint *height, AtkCoordType coords);

IA2: get bounding rect containing the glyph(s) representing the character at the specified text offset
ATK: Get the bounding box containing the glyph representing the character at a particular text offset.

nSelections ([out, retval] long *nSelections)

gint atk_text_get_n_selections (AtkText *text);

IA2:get number of active non-contiguous selections
ATK: Gets the number of selected regions.

offsetAtPoint ([in] long x,[in] long y,[in] long coordType,[out, retval] long *offset)

gint atk_text_get_offset_at_point (AtkText *text, gint x, gint y, AtkCoordType coords);

IA2: get bounding rect for the glyph at a certain point
ATK: Gets the offset of the character located at coordinates x and y. x and y are interpreted as being relative to the screen or this widget's window depending on coords.

selection ([in] long selection,[out] long *startOffset,[out] long *endOffset)

gchar* atk_text_get_selection (AtkText *text, gint selection_num, gint *start_offset, gint *end_offset);

IA2: get character offsets of N-th active text selection. This gets the offset rather than the text (ATK), so it's different than ATK. AT-SPI doesn't return a string, only the offsets so they are the same for the AT.
ATK: Gets the text from the specified selection.

text ([in] long startOffset,[in] long endOffset,[out, retval] BSTR *text)

gchar* atk_text_get_text (AtkText *text, gint start_offset, gint end_offset);

IA2: Return the specified text range.Returns the substring between the two given indices.
ATK: Gets the specified text.

AtkTextRange** atk_text_get_bounded_ranges (AtkText *text, AtkTextRectangle *rect, AtkCoordType coord_type, AtkTextClipType x_clip_type, AtkTextClipType y_clip_type);

IA2: No equivalent.
ATK: Get the ranges of text in the specified bounding box.

void atk_text_get_range_extents (AtkText *text, gint start_offset, gint end_offset, AtkCoordType coord_type, AtkTextRectangle *rect);

IA2: No equivalent.
ATK: Get the bounding box for text within the specified range.

void atk_text_free_ranges (AtkTextRange **ranges);

IA2: No equivalent.
ATK: Frees the memory associated with an array of AtkTextRange. It is assumed that the array was returned by the function atk_text_get_bounded_ranges and is NULL terminated.

textBeforeOffset ([in] long offset,[in] long boundaryType,[out] long *startOffset,[out] long *endOffset,[out, retval] BSTR *text)

gchar* atk_text_get_text_before_offset (AtkText *text, gint offset, AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset);

IA2: Gets specified amount of text based on boundary type (character, to cursor position, word, sentence, paragraph, start/end paragraph, line). - some different boundary types than ATK.
ATK: Gets the specified text based on boundary type (character or word/sentence/line start/end.)

textAfterOffset ([in] long offset,[in] long boundaryType,[out] long *startOffset,[out] long *endOffset,[out, retval] BSTR *text)

gchar* atk_text_get_text_after_offset (AtkText *text, gint offset, AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset);

ATK: Gets the specified text based on boundary type (character or word/sentence/line start/end.)

textAtOffset ([in] long offset,[in] long boundaryType,[out] long *startOffset,[out] long *endOffset,[out, retval] BSTR *text)

gchar* atk_text_get_text_at_offset (AtkText *text, gint offset, AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset);

gunichar atk_text_get_character_at_offset (AtkText *text, gint offset);

IA2: get a specified amount of text that spans the specified offset. For getting a character, use get_textAtOffset CHAR boundary.
ATK: Gets the specified text based on boundary type. There's also a separate method for getting a character at offset.

removeSelection ([in] long selectionIndex,[out, retval] boolean *success)

gboolean atk_text_remove_selection (AtkText *text, gint selection_num);

setCaretOffset ([in] long offset,[out, retval] boolean *success)

gboolean atk_text_set_caret_offset (AtkText *text, gint offset);

ATK: Sets the caret (cursor) position to the specified offset.

setSelection ([in] long selectionIndex,[in] long startOffset,[in] long endOffset,[out, retval] boolean *success)

gboolean atk_text_set_selection (AtkText *text, gint selection_num, gint start_offset, gint end_offset);

ATK: Changes the start and end offset of the specified selection.

nCharacters ([out, retval] long *nCharacters)

gint atk_text_get_character_count (AtkText *text);

IA2 and ATK: Get number of characters.

scrollToSubstring ([in] long startIndex,[in] long endIndex)

IA2: make specific part of string visible on screen
ATK: No equivalent. Do we need this?

IAccessibleHypertext

From AtkHypertext

nHyperlinks ([out, retval] long *hyperlinkCount)

gint atk_hypertext_get_n_links (AtkHypertext *hypertext);

IA2: Returns the number of links and link groups contained within this hypertext document. Is the link group concept unique to SODC, or is it also in ATK but not stated explicitly? Link groups might be referring to the groups of links in image maps.
ATK: Gets the number of links within this hypertext document.

hyperlink ([in] long index,[out, retval] IAccessibleHyperlink **hyperlink)

AtkHyperlink* atk_hypertext_get_link (AtkHypertext *hypertext, gint link_index);

IA2: Return the specified link.
ATK: Gets the link in this hypertext document at index link_index

hyperlinkIndex ([in] long charIndex,[out, retval] long *hyperlinkIndex)

gint atk_hypertext_get_link_index (AtkHypertext *hypertext, gint char_index);

IA2: Returns the index of the hyperlink that is associated with this character index.
ATK: Gets the index into the array of hyperlinks that is associated with the character specified by char_index.

IAccessibleValue

From AtkValue

currentValue ([out, retval] VARIANT *currentValue)

void atk_value_get_current_value (AtkValue *obj, GValue *value);

Gets the value of this object. See comments under IAccessible:get_accValue.

setCurrentValue ([in] VARIANT value,[out, retval] boolean *success)

gboolean atk_value_set_current_value (AtkValue *obj, const GValue *value);

IA2: Similar toIAccessible::put_accValue

maximumValue ([out, retval] VARIANT *maximumValue)

void atk_value_get_maximum_value (AtkValue *obj, GValue *value);

minimumValue ([out, retval] VARIANT *mininumValue)

void atk_value_get_minimum_value (AtkValue *obj, GValue *value);

Acknowledgments

The GNOME Accessibility Project is an open source effort that includes contributions from a number of groups. The Sun Microsystems Accessibility Group has been a major contributor to the project. Other large companies like IBM and Adobe, are becoming more active in their contributions to the accessibility API (AT-SPI and ATK), Linux assistive technology development, GNOME application accessibility enablement, and participation in the Free Standards Group (FSG) Accessibility Workgroup.

Review Team

In addition to the major authors and contributors, these guidelines are a result of contributions, technical edits, and suggestions from the following people:

Add in as the sections get reviewed.

References

Accessibility Toolkit (ATK) Reference

  • GNOME Foundation. http://developer.gnome.org/doc/API/2.0/atk/index.html A library that provides a set of interfaces for accessibility. By supporting the ATK interfaces, an application's interface can be accessed by tools such as screen readers, magnifiers, and alternative input devices.

Adobe Accessibility

AT-SPI (Assistive Technology Service Provider Interface)

Creating Accessible Applications in Eclipse

Creating Accessible Applications with Eclipse: An Introduction

Free Standards Group (FSG) Accessibilty Workgroup

  • Free Standards Group. http://accessibility.freestandards.org/ Develops and promotes free and open accessibility standards to enable comprehensive universal access to computer systems, applications, and services.

Gail (GNOME Accessibility Implementation Library)

Glade

GNOME Accessibility Project

  • GNOME Foundation. http://developer.gnome.org/projects/gap/. Defines accessibility for the GNOME desktop, ensures GNOME desktop applications conform to that definition, and build assistive technologies that people with disabilities can use to interact with the GNOME user environment.

GNOME Accessibility QA (Testing)

GNOME Assistive Technology Projects

GNOME CVS

  • GNOME Foundation.http://cvs.gnome.org/viewcvs/ The Concurrent Versions System (CVS) is a powerful repository that allows many GNOME developers to work on the same source code.

GNOME Documentation Project

  • GNOME Foundation. http://developer.gnome.org/projects/gdp/ Provides the GNOME community with high quality documentation, including online help, tutorials, application manuals, printed books, programming references, and user interface guidelines.

GNOME Documentation Style Guide

GNOME Files - GNOME/GTK+ Software Respository

GNOME Handbook of Writing Software Documentation

GNOME Human Interface Guidelines

GTK+ Architecture

GTK+ Reference

GTK+ Toolkit

  • Free Software Foundation and the GNU Project. http://www.gtk.org/ A multi-platform toolkit for creating graphical user interfaces - includes GLib, ATK, and Pango.

IBM Accessibility Guidelines

  • IBM Accessibility Center. http://www.ibm.com/able/ See the "Developer guidelines" section for accessibility checklists for Software, Notes, Web, Java, Documentation, and Hardware.

Keyboard Access Functional Specification

mail.gnome.org Mailing Lists

Making GNOME Applications Accessible

Mozilla Accessibility on Linux/UNIX

OpenOffice UNO API to ATK Patch

Orca

Pango

Sun Microsystems Enabling Technologies Program

  • Sun Microsystems. http://www.sun.com/access/ Driven by the belief that designing to meet the needs of users with disabilities can improve the productivity of ALL users.

Standards for Electronic and Information Technology, Section 508 of the Rehabilitation Act

  • U. S. Access Board. http://www.access-board.gov/ Independent federal agency whose primary mission is accessibility for people with disabilities.

Worldwide Web (W3C) User Agent Accessibility Guidelines (UAAG) 1.0 Test Suite

Worldwide Web (W3C) Web Accessibility Initiative

  • W3C Consortium. http://www.w3.org/WAI Develops strategies, guidelines, and resources to help make the Web accessible to people with disabilities.

Yelp

The most current version of these guidelines will be maintained in CVS under the

Trademarks

TO DO: Need to fix up this page and add in new trademarks later.

IBM �, OS/2 �, AIX �, AS/400 �, Screen Reader �, and Visual Age � are trademarks or registered trademarks of International Business Machines Corporation in the United States and/or other countries.

Lotustm is a trademark of Lotus Development Corporation in the United States and/or other countries.

Tivolitm is a trademark of Tivoli Systems Inc. in the United States and/or other countries.

Microsoft �, Windows �, Windows95 �, and WindowsNT � are registered trademarks of Microsoft Corporation.

Sun Microsystemstm, Javatm, 100%Pure Javatm, and Solaristm are trademarks of Sun Microsystems Inc.

X Window Systemtm, is a trademark of The Open Group.

Other company, product, and service names may be trademarks or service marks of others.

Technical support

For questions or comments about GNOME accessibility and assistive technologies, subscribe to GNOME accessibility mailing lists:

  1. GNOME accessibility development: gnome-accessibility-list
  2. Technical discussions and patches for at-spi, gail, and ATs: gnome-accessibility-devel

If you are using Glade for application development, you may want to subscribe to the Glade users mailing list.

Accessibility/Documentation/GNOME2/AtkGuide (last edited 2011-07-21 18:51:43 by JoanmarieDiggs)