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 |
|
Most content derived from other documents and major contributions from: |
Contents
-
Guidelines for Writing Accessible GNOME Applications Using GTK+ and the Accessibility Toolkit (ATK)
- Abstract
- Notices
- Introduction
- Essential Accessibility Programming Practices
- GTK+ and ATK - A Foundation for GNOME Accessibility
- Using GTK+ and ATK to Build Accessible Applications
- The Accessible Toolkit (ATK) API Reference
- Building Custom Accessible Widgets
- GNOME Development Tools
- Testing for Accessibility
- Documentation, Online Information and Help
- Appendix
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.
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
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:
TheGLib library provides portability and convenience functions, generic data structures, and the GLib main loop.
The GDK library provides an abstraction layer between the GTK+ widgets in an application and the underlying X window system.
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.
The Pango engine and library provides functions for text layout and rendering, with internationalization considerations.
The ATK library provides all the accessible object classes (based on GObject) and the interfaces the accessible objects implement (based on GInterface).
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."
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.
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:
Wherever possible, use GTK+ widgets to build an application, as described in Atk section 4.0 Using GTK+ and ATK to Build Accessible Applications].
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].
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.
- Fedora extras
- gnome-common
- libgail-gnome
- accerciser
- Orca or LSR screen reader
- Glade GUI builder (optional)
Accessibility in GNOME is disabled by default. Before running any accessibility tools or accessible applications:
- 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);
- Enable accessibility by doing one of the following:
- Run "gconftool-2 -s -t boolean /desktop/gnome/interface/accessibility true" (preferred method)
- Include "GNOME_ACCESSIBILITY=1" in the user profile file (deprecated)
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:
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")); }
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)
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); }
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.
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.
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.
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.
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.
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.
Other relationships to point out? ([[http://developer.gnome.org/doc/API/2.0/atk/AtkRelation.html)
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
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:
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.
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.
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 |
GAIL |
ATK |
ATK_ROLE |
GailWidget |
|
AtkComponent, |
(base class) |
|
GailLabel |
GailWidget |
AtkObject, |
ATK_ROLE_LABEL |
|
|
GailLabel |
|
ATK_ROLE_ACCEL_LABEL |
|
GailArrow |
GailWidget |
ATK_ROLE_ICON |
||
GailImage |
GailWidget |
ATK_ROLE_ICON |
||
GailContainer |
GailWidget |
ATK_ROLE_UNKNOWN or |
||
|
GailContainer |
|
ATK_ROLE_VIEWPORT |
|
|
GailContainer |
|
ATK_ROLE_TOOLBAR |
|
GailScrolledWindow |
GailContainer |
ATK_ROLE_SCROLL_PANE |
||
GailFrame |
GailWidget |
ATK_ROLE_PANEL |
||
GailButton |
GailWidget |
AtkObject, |
ATK_ROLE_PUSH_BUTTON or |
|
GailToggleButton |
GailButton |
ATK_ROLE_TOGGLE_BUTTON |
||
|
GailToggleButton |
|
ATK_ROLE_CHECK_BOX |
|
GailRadioButton |
GailToggleButton |
ATK_ROLE_RADIO_BUTTON |
||
GailExpander |
GailContainer |
AtkObject, |
ATK_ROLE_TOGGLE_BUTTON |
|
GailItem |
GailContainer |
ATK_ROLE_LIST_ITEM |
||
GailMenuItem |
GailWidget |
ATK_ROLE_MENU_ITEM |
||
|
GailMenuItem |
|
ATK_ROLE_SEPARATOR |
|
|
GailMenuItem |
|
ATK_ROLE_TEAR_OFF_MENU_ITEM |
|
GailCheckMenuItem |
GailMenuItem |
ATK_ROLE_CHECK_MENU_ITEM |
||
GailRadioMenuItem |
GailCheckMenuItem |
AtkObject, |
ATK_ROLE_RADIO_MENU_ITEM |
|
GailMenuShell |
GailContainer, |
ATK_ROLE_MENU_BAR |
||
GailMenu |
GailMenuShell |
ATK_ROLE_MENU |
||
|
GailMenuShell |
|
ATK_ROLE_MENU_BAR |
|
GailWindow |
GailWidget |
AtkObject, |
ATK_ROLE_WINDOW or |
|
|
GailWindow |
|
ATK_ROLE_DIALOG |
|
|
GailWindow |
|
ATK_ROLE_COLOR_CHOOSER |
|
|
GailWindow |
|
ATK_ROLE_FONT_CHOOSER |
|
|
GailWindow |
|
ATK_ROLE_COLOR_CHOOSER |
|
|
GailWindow |
|
ATK_ROLE_FONT_CHOOSER |
|
|
GailWindow |
|
ATK_ROLE_DIALOG |
|
|
GailWindow |
|
ATK_ROLE_ALERT |
|
|
GailWindow |
|
ATK_ROLE_WINDOW |
|
|
GailWindow |
|
ATK_ROLE_TOOL_TIP |
|
GailBox |
GailContainer |
ATK_ROLE_FILLER |
||
|
GailBox |
|
ATK_ROLE_FILLER |
|
GtkHButtonBox |
|
GailBox |
|
ATK_ROLE_FILLER |
GtkVButtonBox |
|
GailBox |
|
ATK_ROLE_FILLER |
GtkHBox |
|
GailBox |
|
ATK_ROLE_FILLER |
GailComboBox |
GailContainer |
ATK_ROLE_COMBO_BOX |
||
GailStatusBar |
GailContainer |
ATK_ROLE_STATUSBAR |
||
|
GailContainer |
|
ATK_ROLE_UNKNOWN |
|
|
GailContainer |
|
ATK_ROLE_UNKNOWN |
|
!GtkHPaned |
|
GailContainer |
|
ATK_ROLE_UNKNOWN |
GtkVpaned |
|
GailContainer |
|
ATK_ROLE_UNKNOWN |
|
GailContainer |
|
ATK_ROLE_UNKNOWN |
|
|
GailContainer |
|
ATK_ROLE_UNKNOWN |
|
|
GailContainer |
|
ATK_ROLE_UNKNOWN |
|
GailNotebook |
GailWidget |
ATK_ROLE_PAGE_TAB_LIST |
||
GailTreeView |
GailContainer |
AtkObject, |
ATK_ROLE_TREE_TABLE or |
|
GailRendererCell |
GailWidget |
ATK_ROLE_TABLE_CELL |
||
GailTextCell |
GailWidget |
ATK_ROLE_TABLE_CELL |
||
GailBooleanCell |
GailWidget |
ATK_ROLE_TABLE_CELL |
||
GailImageCell |
GailWidget |
ATK_ROLE_TABLE_CELL |
||
GailTextView |
GailContainer |
AtkObject, |
ATK_ROLE_TEXT |
|
GailCalendar |
GailWidget |
AtkObject |
ATK_ROLE_CALENDAR |
|
GailEntry |
GailWidget |
AtkObject, |
ATK_ROLE_TEXT or |
|
GailSpinButton |
GailWidget |
ATK_ROLE_SPIN_BUTTON |
||
GailRange |
GailWidget |
ATK_ROLE_SLIDER |
||
GailScale |
GailRange |
(base class) |
||
GtkHScale |
|
GailScale |
|
|
GtkVScale |
|
GailScale |
|
|
GailScrollbar |
GailRange |
ATK_ROLE_SCROLLBAR |
||
GtkHScrollbar |
|
GailScrollBar |
|
|
GtkVScrollbar |
|
GailScrollBar |
|
|
GailSeparator |
GailWidget |
ATK_ROLE_SEPARATOR |
||
GtkHSeparator |
|
GailSeparator |
|
|
GtkVSeparator |
|
GailSeparator |
|
|
GailProgressBar |
GailWidget |
ATK_ROLE_PROGRESS_BAR |
||
GailAdjustment |
GailWidget |
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:
- GObject
AtkHyperlink (implements AtkAction)
AtkUtil (supports adding and removing of event listeners and other utilities)
AtkObject (base object class)
AtkGObjectAccessible (can be basis for implementing accessible objects for GObjects which are not derived from GtkWidget)
AtkNoOpObject (implements AtkAction, AtkComponent, AtkEditableText, AtkHypertext, AtkImage, AtkSelection, AtkTable, AtkText, AtkValue)
- GInterface
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:
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.
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->create_accessible = newatklib_new_widget_factory_create_accessible; class->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:
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.
''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")
Example: Link with a break in it
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")
Example: Paragraph with a link in it
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")
Link with an image in it
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:
- Use standard desktop personal computers and software in different ways
- Use accessibility testing tools
- Use assistive technologies
- 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:
The Orca screen reader being developed by Sun Microsystems at gnome.org.
The LSR screen reader being developed by IBM Corp. at gnome.org.
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.
- Fully run your application using only the keyboard to ensure each component which performs a user function can be accessed through the keyboard.
- Ensure the keyboard focus is set to a component when a window is activated.
Use accerciser to analyze each component for accessibility
Ensure each relevant component has implemented AtkObject and other ATK interfaces as needed (e.g. AtkAction, AtkHypertext, AtkTable, AtkRelations, AtkImage, AtkText, AtkSelection, AtkState, etc)
- Ensure each accessibility field is filled in appropriately
- Ensure there is an accessible action set for components which can be activated with a mouse or keyboard
- Ensure components have proper labels.
- 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
- For each component, verify that the Accessible Action works as you intended
- 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:
DocBook. Need to find out how to create accessible DocBook documentation, or if it needs to be converted to HTML.
Accessible HTML. Follow the IBM Web accessibility checklistto produce accessible HTML.
- Man pages.
Texinfo. Need to find out how to create accessible Texinfo files, or if they need to be converted to HTML.
Accessible PDF. Follow the IBM Documentation Accessibility Checklist Checkpoint 1and refer to Adobe's accessibility information regarding how to create accessible PDF documents. We know this is not yet accessible on Linux.
- 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:
- Choosing access keys.
- Choosing shortcut keys.
- 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:
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 |
IAccessible2 Role |
CLOSEST ATK Role(s) |
Also implement these ATK Interfaces |
Potential ATK states in addition to general states (ATK_STATE_*) |
Description |
ALERT |
|
ALERT |
AtkObject, |
ACTIVE, |
An error, warning, or informational message |
ANIMATION |
|
ANIMATION |
ANIMATED |
A dynamic or moving image that changes over time. |
|
APPLICATION |
|
APPLICATION |
AtkObject, |
|
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, |
ACTIVE, |
Button that drops down a list of items |
BUTTONDROPDOWNGRID |
|
add custom role |
AtkObject, |
ACTIVE, |
Button that drops down a grid |
BUTTONMENU |
|
add custom role |
AtkObject, |
ACTIVE, |
Button that drops down a menu |
CARET |
|
don't use |
|
|
System caret |
CELL |
|
TABLE_CELL |
AtkObject, |
SINGLE_LINE, |
Cell in a table |
CHARACTER |
|
don't use |
|
|
Paperclip character. |
CHART |
|
CHART (proposed)? |
|
Graphical depiction of quantitative data |
|
CHECKBUTTON |
CHECK_MENU_ITEM, |
CHECK_BOX, |
AtkObject, |
ACTIVE, |
Choice that can be checked or unchecked. CHECK_BOX is most like CHECKBUTTON. |
CLOCK |
|
add custom role |
For digital clock, see SPINBUTTON. |
|
Clock object. |
COLUMN |
|
don't use |
|
|
Column of table cells. |
COLUMNHEADER |
|
TABLE_COLUMN_HEADER, |
|
Header which labels a column of data, or more specifically a column of data in a table. |
|
COMBOBOX |
|
COMBO_BOX |
AtkObject, |
ACTIVE, |
Edit control with a drop-down list of selections |
CURSOR |
|
don't use |
|
|
Mouse pointer. |
DIAGRAM |
|
IMAGE, |
|
Image is a generic graphic. |
|
DIAL |
|
DIAL |
|
Control with value changes using a rotating visual indicator |
|
DIALOG |
COLOR_CHOOSER, |
DIALOG, |
AtkObject, |
ACTIVE, |
Top level window with a title bar and border. |
DOCUMENT |
TEXT_FRAME |
HTML_CONTAINER or |
AtkObject, |
EDITABLE, |
For MSAA, a document is a window that corresponds to MDI document. |
DROPLIST |
|
add custom role or |
AtkObject, |
ACTIVE, |
Drop down list but not a combo box |
EQUATION |
|
add custom role |
|
Math and chemistry equations |
|
GRAPHIC |
DESKTOP_ICON, |
IMAGE, |
|
Desktop icon is an inconifed internal frame within a DESKTOP_PANE |
|
GRIP |
|
|
|
An object that can be moved to resize a pane |
|
GROUPING |
|
PANEL, |
VERTICAL, |
Container used to group objects, like a group box or a FIELDSET in HTML. |
|
HELPBALLOON |
|
don't use |
|
Help icon to click on to get tooltip help |
|
HOTKEYFIELD |
|
add custom role |
AtkObject, |
ACTIVE, |
Editable field for assigning keys |
INDICATOR |
|
ARROW or |
|
An indicator is a graphic, like an arrow, used to indicate something. |
|
LINK |
|
LINK |
AtkObject, |
|
Hypertext link in a document that can be an image or text |
LIST |
|
LIST |
AtkObject, |
ACTIVE, |
List of objects that allows one or more selections. |
LISTITEM |
|
LISTITEM |
SELECTABLE, |
Element in a selectable list |
|
MENUBAR |
|
MENU_BAR |
ACTIVE, |
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 |
|
MENU_ITEM, |
AtkObject, |
SELECTABLE, |
Element in a menu that presents a selectable action. |
MENUPOPUP |
|
POPUP_MENU, |
ACTIVE, |
|
|
OUTLINE |
|
TREE, |
AtkObject, |
ACTIVE, MANAGES_DESCENDANTS, |
A tree or an outline is an object used to present hierarchical information to the user, usually with expandable/collapsable elements. |
OUTLINEITEM |
|
use custom role |
SELECTABLE, |
A tree item. |
|
PAGETAB |
|
PAGE_TAB |
AtkObject, |
SELECTABLE, |
A tab that usually contains a label or title for a page or panel of a notebook container. |
PAGETABLIST |
|
PAGE_TAB_LIST |
ACTIVE, |
A tabbed notebook container, or a series of panels presented as tabbed pages. |
|
PANE |
GLASS_PANE, |
GLASS_PANE, |
ACTIVE, |
A pane in the current window. |
|
PROGRESSBAR |
|
PROGRESS_BAR |
BUSY, |
Object that shows the percentage of a task that has completed. |
|
PROPERTYPAGE |
|
PAGE_TAB_LIST or |
AtkObject, |
ACTIVE, |
Page showing properties of something. |
PUSHBUTTON |
|
PUSH_BUTTON |
AtkObject, |
ACTIVE, |
A push button tells the application to do something when it is activated. |
RADIOBUTTON |
RADIO_MENU_ITEM |
RADIO_BUTTON, |
ACTIVE, |
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. |
|
ROW |
|
don't use |
|
Row in a table. |
|
ROWHEADER |
|
ROW_HEADER, |
|
Header which labels a row of data, or more specifically a row of data in a table. |
|
SCROLLBAR |
|
SCROLL_BAR |
BUSY, |
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 |
VERTICAL, |
Object that provides a visual separation of contents in a menu or between 2 areas/panes. |
|
SLIDER |
|
SLIDER |
BUSY, |
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 |
|
System sound object. |
|
SPINBUTTON |
|
SPIN_BUTTON |
REQUIRED |
Object that allows the user to select a value from a set of choices. |
|
STATICTEXT |
LABEL |
LABEL, |
AtkObject, |
MULTI_LINE, |
A label presents text that provides a short name or description associated with another object, like a text entry field. |
STATUSBAR |
|
STATUS_BAR |
|
Display non-quantitative status information, in contrast to a progress bar which displays quantitative status. |
|
TABLE |
|
TABLE, |
AtkObject, |
ACTIVE, |
Presents information in terms of rows and columns. |
TEXT |
DATE_EDITOR, |
TEXT, |
AtkObject, |
MULTI_LINE, |
Text information in general. |
TITLEBAR |
|
add custom role |
AtkObject, |
|
Title or caption of a window or dialog. |
TOOLBAR |
|
TOOL_BAR |
|
A bar or palette usually comprised of push buttons or toggle buttons. |
|
TOOLTIP |
|
TOOL_TIP |
AtkObject, |
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 |
VERTICAL, |
Object that takes up space in a user interface. |
|
WINDOW |
FRAME, |
WINDOW, |
AtkObject, |
ACTIVE, |
A top level window with no title or border. |
|
RULER |
RULER |
|
Object that describes margins and tab stops. |
|
|
EMBEDDED_OBJECT |
EMBEDDED |
|
Object that is an embedded component container in a document. |
|
|
EDITBAR |
EDITBAR |
AtkObject, |
MULTI_LINE, |
Object that is an editable text object in a toolbar. |
CLIENT |
|
CANVAS |
AtkObject, |
|
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 |
IAccessible2 States |
CLOSEST ATK State(s) |
Description |
ANIMATED |
|
ANIMATED (proposed) or |
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, |
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) |
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. |
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 |
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 |
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 |
IAccessible2 Events |
CLOSEST ATK Object Event(s) |
Description |
CREATE, |
|
Window events: |
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. |
HIDE |
|
|
An object is hidden. The system sends this event for the following user interface elements: caret and cursor. |
REORDER |
children_changed_add |
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. |
FOCUS |
See: ACTIVE_DESCENDANT_CHANGED |
focus-event (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. |
|
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, |
|
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. |
STATECHANGE |
|
state-changed * (AtkObject) |
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. |
LOCATIONCHANGE |
TEXT_CARET_MOVED |
bounds-changed (AtkComponent) |
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. |
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. |
DESCRIPTIONCHANGE |
|
property-change::accessible-description (AtkObject) |
An object's description property has changed. |
VALUECHANGE |
|
value-changed (proposed - 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. |
|
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. |
|
TABLE_CAPTION_CHANGED |
Other property-change:: signals in AtkObject: |
|
|
|
Other property-change:: signals in AtkHyperlink: |
|
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 |
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: |
|
Relations
The table below shows which ATK relations correspond to IAccessible2 relations.
IAccessible2 Relations |
CLOSEST ATK Relation(s) |
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 |
AtkObject* atk_object_factory_create_accessible (AtkObjectFactory *factory, GObject *obj); |
MSAA: Creates an accessible object with the methods and properties for the specified type of system-provided user interface element. |
|
|
MSAA: creates an accessible object that has the properties and methods of the specified class of system-provided user interface element. |
|
MSAA: returns a reference, that is similar to a handle, to the specified object. Servers return this reference when handling WM_GETOBJECT. |
||
Accessibility::notifyEvent (in Event e) |
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. |
|
|
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. |
|
|
MSAA: returns the number of type descriptions for the object. For objects that support IDispatch, the type information count is always one. |
|
GType atk_object_factory_get_accessible_type (AtkObjectFactory *factory); |
MSAA: retrieves a description of the object's programmable interface. |
|
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. |
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. |
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. |
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 ===== |
|
|
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); |
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. |
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. |
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. |
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. |
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); |
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. |
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); |
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. |
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. |
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); |
MSAA: retrieves the specified object's current screen location. All visual objects must support this method; sound objects do not support it. |
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 |
|
|
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. |
|
|
void atk_object_set_description (AtkObject *accessible, const gchar *description); |
MSAA: No equivalent. |
|
void atk_object_set_parent (AtkObject *accessible, AtkObject *parent); |
MSAA: No equivalent. |
|
void atk_object_set_role (AtkObject *accessible, AtkRole role); |
MSAA: No equivalent. |
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. relation ([in] long relationIndex,[out, retval] IAccessibleRelation **relation) AtkRelation* atk_relation_set_get_relation (AtkRelationSet *set, gint i); IA2: get one accessible relation at the specified index for this object. 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); IA2: get multiple accessible relations for this object. Not sure if or how you can add new relationships in IA2. 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. 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. 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)] 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. nExtendedState ([out, retval] long *nExtendedStates) OR nStates ([out, retval] long *nStates) IA2: get number of extended? states. AtkStateType atk_state_type_register (const gchar *name); IA2: No State interface in IA2 - not needed. const gchar* atk_state_type_get_name (AtkStateType type); IA2: No State interface in IA2 - not needed. AtkStateType atk_state_type_for_name (const gchar *name); IA2: No State interface in IA2 - not needed. IA2: No StateSet interface in IA2 - not needed, but this method is in ATK and UNO. gboolean atk_state_set_add_state (AtkStateSet *set, AtkStateType type); IA2: No StateSet interface in IA2 - not needed, but this method is in ATK. 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. void atk_state_set_clear_states (AtkStateSet *set); IA2: No StateSet interface in IA2 - not needed, but this method is in ATK. 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. 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. gboolean atk_state_set_remove_state (AtkStateSet *set, AtkStateType type); IA2: No StateSet interface in IA2 - not needed, but this method is in ATK. 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. 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. 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. extendedRoles ([in] long maxRoles,[out, size_is(, maxRoles), length_is(,*nRoles)] BSTR **role,[out, retval] long *nRoles) const gchar* atk_role_get_name or use an enumerated role (like HEADING) and qualify it with text attributes like "xhtml:h1" 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. nExtendedRoles ([out, retval] long *nExtendedRoles) OR nRoles ([out, retval] long *nRoles) IA2: get number of extended? roles. childID ([out, retval] long *childID) IA2: unique ID, must be persistent so that OBJECT_REORDER events can be used to invalidate AT cache. 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 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. IA2: Get locale of object. Add IAccessible2::get_attributes? Need an atk_object_get_attributes? 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. 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); 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. 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. 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. 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. 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. gboolean atk_hyperlink_is_inline (AtkHyperlink *link_); IA2: No equivalent. gint atk_hyperlink_get_n_anchors (AtkHyperlink *link_); IA2: No equivalent. gboolean atk_hyperlink_is_selected_link (AtkHyperlink *link_); IA2: No equivalent 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. 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. locationInParent ([out, retval] Point *location) void atk_component_get_position (AtkComponent *component, gint *x, gint *y, AtkCoordType coord_type); IA2: Returns the location of the upper left corner x/y of the object's bounding box relative to the parent. foreground ([out, retval] Color *foreground) IA2: Returns the foreground color of this object. For chrome controls, such as the color dialog, the foreground will be the selected color. background ([out, retval] Color *background) IA2: Returns the background color of this object. 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 IA2: Returns the font of this object. titledBorderText ([out, retval] BSTR *titledBorderText) IA2: Returns the titled border text. toolTipText ([out, retval] BSTR *toolTipText) IA2: Returns the tool tip text of this object. 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 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 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 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 pasteText ([in] long offset,[out, retval] ) void atk_editable_text_paste_text (AtkEditableText *text, gint position); IA2: paste text from clipboard at specified offset replaceText ([in] long startOffset,[in] long endOffset,[in] BSTR *text,[out, retval] ) IA2: replace range of text with new text 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 IAccessibleImage - not needed From AtkImage const gchar* atk_image_get_image_description (AtkImage *image); IA2: Get description from IAccessible::get_accDescription void atk_image_get_image_position (AtkImage *image, gint *x, gint *y, AtkCoordType coord_type); IA2: Get x/y from IAccessible::get_accLocation void atk_image_get_image_position (AtkImage *image, gint *x, gint *y, AtkCoordType coord_type); IA2: Get x/y from IAccessible::get_accLocation IAccessibleRelation From AtkRelation and AtkRelationSet relationType ([out, retval] BSTR *relationType) AtkRelationType IA2: returns type of relation, but it is not localized. Add get_localizedRelationType nTargets ([out, retval] long *nTargets) IA2: returns the size of the relations targets array target ([in] long targetIndex,[out, retval] IUnknown **target) GPtrArray* atk_relation_get_target (AtkRelation *relation); IA2: get one accessible relation target targets ([in] long maxTargets,[out, size_is(maxTargets), length_is(*nTargets)] IUnknown **target,[out, retval] long *nTargets) IA2: get multiple accessible relation 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). 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. 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. nSelectedAccessibleChildren ([out, retval] long *nSelectedAccessibleChildren) gint atk_selection_get_selection_count (AtkSelection *selection); IA2: Returns the number of Accessible children that are 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. 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. 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 add index method. gint atk_table_get_index_at (AtkTable *table, gint row, gint column); IA2: No equivalent. add column method. gint atk_table_get_column_at_index (AtkTable *table, gint index_); IA2: No equivalent. add row method. gint atk_table_get_row_at_index (AtkTable *table, gint index_); IA2: No equivalent. 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. 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. 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 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. nColumns ([out, retval] long *columnCount) gint atk_table_get_n_columns (AtkTable *table); IA2: get total number of columns in table nRows ([out, retval] long *rowCount) gint atk_table_get_n_rows (AtkTable *table); IA2: get total number of rows in table nSelectedColumns ([out, retval] long *columnCount) gint atk_table_get_selected_columns (AtkTable *table, gint **selected); get total number of selected columns nSelectedRows ([out, retval] long *rowCount) gint atk_table_get_selected_rows (AtkTable *table, gint **selected); get total number of selected rows 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. 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 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. 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. 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 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. AtkAttributeSet* atk_text_get_default_attributes (AtkText *text); IA2: No equivalent. void atk_attribute_set_free (AtkAttributeSet *attrib_set); IA2: No equivalent. AtkTextAttribute atk_text_attribute_register (const gchar *name); IA2: No equivalent. const gchar* atk_text_attribute_get_name (AtkTextAttribute attr); IA2: No equivalent. AtkTextAttribute atk_text_attribute_for_name (const gchar *name); IA2: No equivalent. const gchar* atk_text_attribute_get_value (AtkTextAttribute attr, gint index_); IA2: No equivalent. 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 nSelections ([out, retval] long *nSelections) gint atk_text_get_n_selections (AtkText *text); IA2:get number of active non-contiguous selections 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 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. 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. AtkTextRange** atk_text_get_bounded_ranges (AtkText *text, AtkTextRectangle *rect, AtkCoordType coord_type, AtkTextClipType x_clip_type, AtkTextClipType y_clip_type); IA2: No equivalent. void atk_text_get_range_extents (AtkText *text, gint start_offset, gint end_offset, AtkCoordType coord_type, AtkTextRectangle *rect); IA2: No equivalent. void atk_text_free_ranges (AtkTextRange **ranges); IA2: No equivalent. 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. 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); IA2: get a specified amount of text that spans the specified offset. For getting a character, use get_textAtOffset CHAR boundary. 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 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. hyperlink ([in] long index,[out, retval] IAccessibleHyperlink **hyperlink) AtkHyperlink* atk_hypertext_get_link (AtkHypertext *hypertext, gint link_index); IA2: Return the specified link. 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. 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);
ATK: Determines the number of relations in a RelationSet.
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]]
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.
See also:atk_object_add_relationship and atk_object_remove_relationship
ATK: Gets the AtkRelationSet associated with the object.
ATK: No ATK equivalent.
ATK: No ATK equivalent.
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.
ATK: Gets a reference to the state set of the accessible; the caller must unreference it when it is no longer needed.
ATK: No equivalent.
ATK: Register a new object state.
ATK: Gets the description string describing the AtkStateType type.
ATK: Gets the description string describing the AtkStateType type
ATK: Checks whether the state set is empty, i.e. has no states set.
ATK: Add a new state for the specified type to the current state set if it is not already present.
ATK: Add the states for the specified types to the current state set.
ATK: Removes all states from the state set.
ATK: Checks whether the state for the specified type is in the specified set.
ATK: Checks whether the states for all the specified types are in the specified set.
ATK: Removes the state for the specified type from the state set.
ATK: Constructs the intersection of the two sets, returning NULL if the intersection is empty.
ATK: Constructs the union of the two sets.
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.
Add: roleName and localizedRoleName
See:[[BR]]AtkRole atk_role_register (const gchar *name);
atk_role_get_localized_name,
ATK: Registers the role specified by name, a character string describing the new role.
ATK: No equivalent.
ATK: Not needed.
ATK: No equivalent
ATK: No ATK equivalent.
Proposed:[[BR]]void atk_object_set_attribute( AtkObject *accessible, const gchar *name, const gchar *value);
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.
See also: atk_action_set_description
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.
ATK: Get a the URI associated with the anchor specified by i of link_. Multiple anchors are primarily used by client-side image maps.
ATK: Gets the index with the hypertext document at which this link begins.
ATK: Gets the index with the hypertext document at which this link ends.
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.
ATK: Indicates whether the link currently displays some or all of its content inline. Ordinary HTML links will usually return FALSE, but an inline <src> HTML element will return TRUE. a * Not being passed through to AT-SPI.
ATK: Gets the number of anchors associated with this hyperlink.
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?
ATK: Checks whether the specified point is within the extent of the component.
ATK: Gets a reference to the accessible child, if one exists, at the coordinate point specified by x and y.
See also: atk_component_set_position
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?
ATK: No equivalent.
ATK: No equivalent.
ATK: No direct equivalent.
ATK: No equivalent.
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.
ATK: Copy text from start_pos up to, but not including end_pos to the clipboard.
ATK: Delete text start_pos up to, but not including end_pos.
ATK: Insert text at a given position.
ATK: Copy text from start_pos up to, but not including end_pos to the clipboard and then delete from the widget.
ATK: Delete text start_pos up to, but not including end_pos.
ATK: No equivalent.
ATK: Sets the attributes for a specified range.
See also: atk_image_set_image_description
ATK: Get a textual description of this image.
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.
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.
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
ATK: When registering a relation type, associate name with a new AtkRelationType
See also: atk_relation_add_target
ATK: No true ATK call to get multiple targets.
ATK: Adds the specified accessible child of the object to the object's selection.
ATK: Determines if the current child of this object is selected
ATK: Causes every child of the object to be selected if the object supports multiple selections.
ATK: Gets the number of accessible children currently selected.
ATK: Gets a reference to the accessible object representing the specified selected child of the object.
ATK: Removes the specified child of the object from the object's selection.
ATK: Get a reference to the table cell at row, column.
ATK: Gets a gint representing the index at the specified row and column.
ATK: Gets a gint representing the column at the specified index_.
ATK: Gets a gint representing the row at the specified index_.
ATK: Sets the caption for the table.
ATK: Sets the description text for the specified column of the table.
ATK: Gets the number of columns occupied by the accessible object at the specified row and column in the table.
ATK: Sets the specified column header to header.
ATK: Gets the number of columns in the table.
ATK: Gets the number of rows in the table.
IA2: Has two calls for 1 ATK call. See also IAccessibleTable::selectedColumns.
IA2: Has two calls for 1 ATK call. See also IAccessibleTable::selectedRows.
ATK: Set row description.
ATK: Gets the number of rows occupied by the accessible object at a specified row and column in the table.
ATK: Sets the specified row header to header.
ATK: Sets the summary description of the table.
ATK: Gets a boolean value indicating whether the accessible object at the specified row and column is selected
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.
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.
ATK: Frees the memory used by an AtkAttributeSet, including all its AtkAttributes.
ATK: Associate name with a new AtkTextAttribute
ATK: Gets the name corresponding to the AtkTextAttribute
ATK: Get the AtkTextAttribute type corresponding to a text attribute name.
ATK: Gets the value for the index of the AtkTextAttribute
ATK: Get the bounding box containing the glyph representing the character at a particular text offset.
ATK: Gets the number of selected regions.
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.
ATK: Gets the text from the specified selection.
ATK: Gets the specified text.
ATK: Get the ranges of text in the specified bounding box.
ATK: Get the bounding box for text within the specified range.
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.
ATK: Gets the specified text based on boundary type (character or word/sentence/line start/end.)
gunichar atk_text_get_character_at_offset (AtkText *text, gint offset);
ATK: Gets the specified text based on boundary type. There's also a separate method for getting a character at offset.
ATK: No equivalent. Do we need this?
ATK: Gets the number of links within this hypertext document.
ATK: Gets the link in this hypertext document at index link_index
ATK: Gets the index into the array of hyperlinks that is associated with the character specified by char_index.
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
Adobe.http://www.adobe.com/enterprise/accessibility/main.html Creating accessible PDF documents.
AT-SPI (Assistive Technology Service Provider Interface)
GNOME Foundation.http://gnome.org/~billh/at-spi-new-idl/html/html/
Creating Accessible Applications in Eclipse
Mark Pilgrim, Kip Harris, Barry Feigenbaum, Richard Schwerdtfeger (IBM). http://w3.austin.ibm.com/~snsinfo/presentations/eclipse-accessibility-20041102.pdf (IBM Internal URL). Look at chapters 4, 9, and 13.
Creating Accessible Applications with Eclipse: An Introduction
Mark Pilgrim, Kip Harris, Barry Feigenbaum, Richard Schwerdtfeger (IBM). http://www-128.ibm.com/developerworks/rational/library/dec05/pilgrim/
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)
http://developer.gnome.org/doc/API/2.0/gail/. Implements ATK objects and interfaces for GTK+ widgets.
Glade
GNOME Foundation.http://developer.gnome.org/tools/glade.html User-interface builder you can use to rapidly prototype GTK+ and GNOME applications.
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 Foundation. http://developer.gnome.org/projects/gap/testing/index.html. A set of test cases for testing Linux accessibility enablement in your application using keyboard navigation, at-poke, gnopernicus, GOK, system themes (fonts and colors), and the mouse.
GNOME Assistive Technology Projects
GNOME Foundation. http://developer.gnome.org/projects/gap/AT/ Includes Gnopernicus and the GNOME Onscreen Keyboard (GOK).
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 Foundation. http://developer.gnome.org/documents/style-guide/ Provides guidelines for authors who want to contribute to the GNOME Documentation Project (GDP).
GNOME Files - GNOME/GTK+ Software Respository
OSNEWS LLC. http://www.gnomefiles.org/category.php?cat_id=8 Class libraries, debuggers, editors, example code, GUI creation, IDEs, languages, toolkits, other.
GNOME Handbook of Writing Software Documentation
Red Hat. http://developer.gnome.org/projects/gdp/handbook/gdp-handbook/. A guide for both writing user documentation for GNOME components and applications and for properly binding and packaging documentation into GNOME applications.
GNOME Human Interface Guidelines
GNOME Foundation. http://developer.gnome.org/projects/gup/hig/2.0/. Part of the GNOME Usability Project.
GTK+ Architecture
GNOME Foundation.http://developer.gnome.org/arch/gtk/. GLIb, GDK, GTK+ object system, drag and drop, themes.
GTK+ Reference
GNOME Foundation. http://developer.gnome.org/doc/API/2.0/gtk/index.html. Library of GTK+ widgets and objects and their interfaces.
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
Earl Johnson, Bill Haneman, Mark Novak, Will Walker. http://accessibility.freestandards.org/a11yspecs/kbd/AccessX-func-spec.html Describes XWindows keyboard accessibility support (StickyKeys, MouseKyes, RepeatKeys, SlowKeys, BounceKeys, ToggleKeys).
mail.gnome.org Mailing Lists
GNOME Foundation.http://mail.gnome.org/mailman/listinfo To subscribe to GNOME accessibility development lists for technical support.
Making GNOME Applications Accessible
Marc Mulcahy and Bill Haneman (Sun.) http://developer.gnome.org/projects/gap/presentations/GUAD3C/making-apps-accessible/start.html Presentation with overview of the developer's view of ATK, GTK+ accessibility, Glade, and custom widgets.
Mozilla Accessibility on Linux/UNIX
Jay Yan (Sun). http://www.mozilla.org/access/unix/architecture Includes description of the Mozilla ATK Implementation (MAI).
OpenOffice UNO API to ATK Patch
Michael Meeks (Novell). http://go-oo.org/ooo-build/patches/a11y/ Experimental source code patch.
Orca
Will Walker (Sun). http://cvs.gnome.org/viewcvs/orca/ A new Linux screen reader being developed by Sun using Python.
Pango
RedHat.http://www.pango.org/ Text layout and rendering engine and library included in GTK+, with internationalization considerations.
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
W3C Consortium. http://cita.rehab.uiuc.edu/wai-eval/index.php?option=Test%20Suites For testing user agent (Web browsers + assistive technologies) accessibility compliance.
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
Malcolm Tredinnick. http://cvs.gnome.org/viewcvs/yelp/ The GNOME help browser.
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:
- GNOME accessibility development: gnome-accessibility-list
- 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.