# GNOME Barrierefreiheitshandbuch für Entwickler

## Was ist Barrierefreiheit?

Barrierefreiheit bedeutet, Menschen mit Behinderungen zu helfen, an grundlegenden Lebensaktivitäten teilzunehmen. Das beinhaltet einer Arbeit nachzugehen und Dienste, Produkte und Informationen zu nutzen. GNOME enthält Bibliotheken und ein Framework, das es Menschen mit Behinderungen ermöglicht, alle Funktionen der GNOME-Benutzerumgebung zu verwenden.

Im Zusammenspiel mit gegebenenfalls notwendigen Hilfstechnologien wie Sprachausgaben, Bildschirmlesern oder alternativen Eingabegeräten wird Menschen mit vorübergehenden oder dauerhaften Behinderungen die Nutzung der GNOME-Arbeitsumgebung und deren Anwendungen ermöglicht. Hilfstechnologien können auch sinnvoll sein, wenn Rechner außerhalb von Zuhause oder Büro genutzt werden. Wenn Sie beispielsweise im Stau stehen, werden Sie vielleicht die Spracheingabe und -ausgabe für E-Mail-Nachrichten bevorzugen.

Hilfstechnologien empfangen Informationen von Anwendungen über die Schnittstelle des »Accessibility Toolkit (ATK)«, welches Sie im Modul »atk« des GNOME-Softwarebestandes finden. Da die Unterstützung für die Barrierefreiheits-Schnittstelle bereits in die GNOME-Widgets eingebaut ist, sollte Ihr GNOME-Programm Hilfstechnologien bereits grundlegend unterstützen, ohne dass Mehraufwand Ihrerseits notwendig wäre. Beispielsweise können Hilfstechnologien automatisch die Beschriftungen lesen, die Sie ohnehin in der Benutzeroberfläche festlegen (mit Hilfe von GTK-Funktionsaufrufen wie `gtk_label_set_text()` oder `gtk_button_new_with_label()`). Sie finden auch heraus, ob eine Beschriftung mit einer Minihilfe gekoppelt ist, und verwenden diese für die Beschreibung des Widgets für den Benutzer.

Mit geringem Mehraufwand können Sie Ihr Programm besser auf die Zusammenarbeit mit Hilfstechnologien trimmen. Sie helfen in erster Linie bestimmten Benutzergruppen, machen Ihr Programm aber auch attraktiver für Endanwender im Verwaltungs- und Bildungssektor, wo barrierefreie Anwendungen oft gesetzlich vorgeschrieben sind.

### Arten von Behinderungen

Allein in den USA leben schätzungsweise 30 Millionen Menschen, deren Fähigkeit zur Benutzung von Rechnern durch nicht barrierefreies Design eingeschränkt ist. Weltweit haben etwa 8% der Nutzer des World Wide Web irgendeine Art von Behinderung. Solche Behinderungen fallen in eine dieser Kategorien:

- Seheinschränkungen - sie reichen von Sehschwäche (dazu gehört unter anderem trübe oder verschwommene Sicht, starke Weit- oder Kurzsichtigkeit, Farbenblindheit und Tunnelblick) bis hin zu totaler Blindheit. Eine schlechte Wahl der Textgröße und -farbe sowie Aufgaben, die eine gute Hand-Auge-Koordination benötigen (z.B. das Bewegen der Maus) können Probleme für diese Benutzer verursachen.

- Bewegungseinschränkungen - Benutzer mit geringer Muskelkontrolle oder Muskelschwäche können Probleme haben, eine Standardtastatur und -maus zu verwenden. Es mag ihnen zum Beispiel nicht möglich sein, zwei Tasten gleichzeitig gedrückt zu halten, oder sie treffen Tasten versehentlich.

- Hörschädigungen - Diese reichen von der Fähigkeit, einige Geräusche wahrzunehmen, jedoch gesprochene Worte nicht erkennen zu können, bis hin zu vollständiger Gehörlosigkeit. Anwendungen, die wichtige Informationen nur über Geräusche vermitteln, stellen ein Problem für diese Benutzer dar.

- Geistige und sprachliche Einschränkungen - Diese reichen von Lernhürden bis zu Gedächtnisschwächen, Schwierigkeiten Probleme zu lösen und gesprochene und geschriebene Sprache zu verwenden. Komplizierte oder widersprüchliche Anzeigen sowie eine schwache Wortwahl erschweren diesen Benutzern den Zugang zum Computer.

- Anfälle - Bestimmte Licht- oder Geräuschereignisse können einen epileptischen Anfall bei einigen anfälligen Benutzern hervorrufen.

### Wie funktioniert Barrierefreiheit in GNOME?

Das Accessibility Toolkit (ATK) beschreibt eine Sammlung von Interfaces, die von GUI-Komponenten implementiert werden müssen, um sie barrierefrei zu gestalten. Die Interfaces sind unabhängig vom Toolkit - Implementierungen können für beliebige Widgets geschrieben sein, u.a. GTK, Motif und Qt.

Die Implementierung der GTK-Widgets wird von der Klasse GTKAccessible übernommen. Dabei handelt es sich um einen dünnen Wrapper um AtkObjekt, welches Möglichkeiten zum Assoziieren eines Widgets mit seinem barrierefreien Objekt hinzufügt. Die Teile Ihrer Anwendung, die Standard-GTK-Widgets verwenden, haben bereits ein gewisses Maß an Barrierefreiheit, ohne dass sie selbst Hand anlegen müssen.

Die meisten Hilfstechnologien (AT), die auf anderen Arbeitsumgebungen laufen, fanden es wichtig, ein kompliziertes, vom Bildschirm losgelöstes Modell für Arbeitsflächenanwendungen zu unterhalten, das auf dem Auslesen von Betriebssystem-Ereignissen aufbaute, sowie nicht unterstützte Betriebssystem- und Anwendungseigenschaften und APIs, und andere kaum portierbare Techniken. Dies führte zu einer »spröden« und höchst betriebssystem- und anwendungsspezifischen, manchmal sogar versionsspezifischen Unterstützung von Hilfstechnologien. Im Gegensatz dazu steht die GNOME-Arbeitsumgebung, auf der alle von Hilfstechnologien benötigten Informationen von den laufenden Anwendungen bereitgestellt werden. Diese laufen über das GNOME Barrierefreiheits-Framework zu einem Toolkit-unabhängigen »Service Provider Interface« (SPI, etwa »Dienstleistungs-Anbieter-Schnittstelle«). Das SPI bietet Mittel für UNIX-basierte Hilfstechnologien, wie zum Beispiel Bildschirmleser und Bildschirmlupen, um Barrierefreiheitsinformationen für laufende Anwendungen über eine konsistente und stabile API zu erhalten und kann den Bedarf an vom Bildschirm losgelöste Modelle in vielen Fällen beseitigen. Unterstützung für Barrierefreiheit für Anwendungen ist in Anwendungstoolkits über Toolkit-entprechende APIs »eingebaut« (z.B. ATK für die meisten nativen C-Anwendungen und die Java Accessibility API für Java Apps), und wird über die betreffenden »Brücken« in die allgemeine »AT-SPI«-Schnittstelle exportiert (siehe Diagramm).

Die in GNOME enthaltene Unterstützung für Barrierefreiheit drückt sich darin aus, dass Sie bei der Verwendung von Standard-GNOME-Widgets die Unterstützung für Hilfstechnologien praktisch »umsonst« erhalten, sofern die Widgets nicht auf unübliche Weise verwendet werden, was zu Konflikten in der eingebauten Unterstützung führen kann.

Ein GTK/GNOME-Widget ist barrierefrei, wenn dessen Benutzung den allgemeinen Richtlinien zur Barrierefreiheit in diesem Dokument folgt, und es die ATK-Interfaces umsetzt, die zur Rolle in der Benutzeroberfläche gehören. ATK-Umsetzungen werden für die Standard-GNOME-Toolkit-Widgets (d.h. nicht veraltete GTK- und GNOME-Widgets) bereit gestellt, und in vielen Fällen erben neue Widgets passende Unterstützung für Barrierefreiheit, welche sich trivial von existierenden GTK- oder GNOME-Widgets ableiten.

Die in GNOME eingebaute Unterstützung für Hilfstechnologien bietet bereits einen beträchtlichen Funktionsumfang, ohne dass Anwendungscode hinsichtlich Barrierefreiheit angepasst werden muss. Dennoch können Anwendungen häufig davon profitieren, wenn die bereitgestellten Standardbeschreibungen für einige Widgets verbessert und auf den spezifischen Zweck in der Anwendung zugeschnitten werden, indem ATK-Methoden direkt innerhalb der Anwendung aufgerufen werden. Beispielsweise können Textbeschreibungen für diese Widgets mit dem geeigneten ATK-Funktionsaufruf hinzugefügt oder geändert werden, so dass Hilfstechnologien dem Nutzer deren Zweck oder Status beschreiben können. Lesen Sie dazu auch Programmierrichtlinien zur Unterstützung von Barrierefreiheit für weitere Informationen.

Wenn Ihr Programm benutzerdefinierte Widgets verwendet, müssen Sie eventuell ein wenig Arbeit leisten, um diese Widget-Eigenschaften Hilfstechnologien zugänglich zu machen. Lesen Sie auch Eigene Komponenten barrierefrei machen und Beispiele, welche die Barrierefreiheit-API verwenden für weitere Informationen.

Zusätzliche, weiterführende Informationen zu GTK finden Sie im GTK-Referenzhandbuch, dem veralteten, bei GNOME gehosteten GTK-2.0-Tutorial und den offiziellen GTK-FAQ.

### Schnelleinstieg für Entwickler

Hier einige übliche Einstiegspunkte:

#### Wie kann ich überprüfen, ob meine Anwendung barrierefrei ist oder nicht?

Um direkt reinzuspringen, lesen Sie Eine GNOME-Anwendung barrierefrei gestalten - Überblick. Für eine generellere Betrachtung vor dem Programmieren, lesen Sie Richtlinien für Benutzeroberflächen zur Unterstützung der Barrierefreiheit oder Code-Richtlinien zur Unterstützung der Barrierefreiheit. Eine Checkliste zum Testen Ihrer Anwendung finden Sie unter Checkliste für Benutzeroberflächen.

#### Wo lauern die häufigsten Fallen?

Die Checkliste für Benutzeroberflächen deckt alle Bereiche ab, die manchmal in der Planungsphase übersehen werden.

#### Wie führe ich allgemeine ATK-Angelegenheiten aus?

Eine gekürzte Liste häufiger ATK-Aufrufe finden Sie hier.

#### Wie führe ich komplexere ATK-Angelegenheiten aus?

Siehe Benutzerdefinierte Komponenten barrierefrei gestalten und Beispiele für die Nutzung der Barrierefreiheits-API für weitere Informationen.

#### Einführung in ATK, AT-SPI, und GTK

Architektur der Zugangshilfen von GNOME

ATK ist das Toolkit, welches GNOME einsetzt, um Barrierefreiheit für Benutzer zu schaffen, welche eine Zusatzunterstützung brauchen, um ihre Rechner vollständig nutzen zu können. ATK wird von Werkzeugen wie Bildschirmleser, Lupen und Eingabegeräte verwendet, um eine gute Interaktion mit der Arbeitsumgebung mittels alternativer Wege zu schaffen. Lesen Sie auch das ATK-SourceForge-Projekt und die ATK-Bibliothek für weitere Informationen.

AT-SPI ist das primäre Service-Interface für Hilfstechnologien, um Informationen von laufenden Anwendungen anzufragen und zu empfangen. Die vollständige API ist hier dokumentiert.

GTK ist eine Bibliothek zum Erstellen grafischer Benutzeroberflächen. Sie funktioniert auf vielen UNIX-ähnlichen Plattformen, unter Windows und mit Framebuffer-Geräten. GTK wird unter der GNU Library General Public License (GNU LGPL) veröffentlicht, die eine flexible Lizenzierung der Client-Anwendungen erlaubt. GTK verfügt über eine C-basierte objektorientierte Architektur, die ein Maximum an Flexibilität ermöglicht. Es wurden Bindings für andere Sprachen geschrieben, beispielsweise C++, Objective-C, Guile/Scheme, Perl, Python, TOM, Ada95, Free Pascal und Eiffel. Seine GtkAccessible-Klasse ist die Basisklasse für barrierefreie Implementierungen von GtkWidget-Subklassen. Es ist ein dünner Wrapper um AtkObjekt, welches Möglichkeiten zum Assoziieren eines Widgets mit seinem barrierefreien Objekt hinzufügt.

Zusätzliche, weiterführende Informationen zu GTK finden Sie im GTK-Referenzhandbuch, dem GTK-Abschnitt der ATK-Richtlinien, dem veralteten, bei GNOME gehosteten GTK-2.0-Tutorial und den offiziellen GTK-FAQ.

### Eine GNOME-Anwendung barrierefrei gestalten - Überblick

Wenn Ihr Programm nur Standard-GTK-Widgets nutzt, werden Sie vermutlich wenig bis gar nichts tun müssen, um Ihr Programm (einigermaßen) barrierefrei zu gestalten. Sie sollten aber nach Objekten in Ihrer GUI schauen, welche keine Text-Beschreibung haben, welche mit ihnen verknüpft ist, wie z.B. grafische Knöpfe oder Statusanzeigen, die keine Aufschriften oder Mini-Hilfen haben.

Sie könnten vielleicht auch die bereitgestellten Standardbeschreibungen für einige Widgets verbessern, und sie auf den Widget-spezifischen Zweck Ihres Programms zuschneiden. Sie sollten Textbeschreibungen für diese Widgets mit dem geeigneten ATK-Funktionsaufruf hinzufügen oder ändern, so dass Hilfstechnologien dem Nutzer deren Zweck oder Status beschreiben können. Lesen Sie dazu auch Programmierrichtlinien zur Unterstützung von Barrierefreiheit für weitere Informationen.

Wenn Ihr Programm benutzerdefinierte Widgets verwendet, müssen Sie eventuell ein wenig Arbeit leisten, um diese Widget-Eigenschaften Hilfstechnologien zugänglich zu machen. Lesen Sie auch Eigene Komponenten barrierefrei machen und Beispiele, welche die Barrierefreiheit-API verwenden für weitere Informationen.

### Code-Richtlinien zur Unterstützung der Barrierefreiheit

Hier finden Sie einige Dinge, die Sie in Ihren Code einbauen können, damit Ihr Programm so gut wie irgend möglich mit Hilfstechnologien funktioniert (Sie finden eine Liste der beim Entwurf Ihrer Benutzeroberfläche zu beachtenden Dinge im Abschnitt Richtlinien für Benutzeroberflächen zur Unterstützung der Barrierefreiheit weiter unten in diesem Dokument):

- Geben Sie Komponenten, die keine kurze Zeichenkette anzeigen (wie ein grafischer Knopf), mit `atk_object_set_name()` einen Namen. Sie können das für Knöpfe mit einem Bild, Panels mit logischen Gruppierungen, Textbereiche usw. tun.

- Falls Sie keine Minihilfe für eine Komponente verwenden können, verwenden Sie stattdessen `atk_object_set_description()`, um eine Beschreibung bereitzustellen, die eine Hilfstechnologie an den Benutzer weitergeben kann. Eine barrierefreie Beschreibung für einen Close-Knopf stellen Sie beispielsweise folgendermaßen bereit:

  #### Bereitstellung einer barrierefreien Beschreibung für einen GtkButton

      {
        AtkObject *obj;
        obj = gtk_widget_get_accessible(button);
        atk_object_set_description(obj,_("Closes the window"));
      }

- Verwenden Sie `atk_image_set_description()`, um eine Beschreibung in Textform für alle Bilder und Symbole in Ihrem Programm bereitzustellen.

- Falls verschiedene Komponenten eine logische Gruppe bilden, versuchen Sie, diese in einem Container unterzubringen.

- Wenn Sie eine Beschriftung (ein Label) haben, die eine andere Komponente beschreibt, verwenden Sie `atk_relation_set_add_relation()`, damit Hilfstechnologien erkennen, auf welche Komponente sich die Beschriftung bezieht. (Alternativ können Sie die Beschriftung auch über `gtk_label_set_mnemonic_widget()` mit einer Komponente verknüpfen. Dadurch wird die Beziehung `ATK_RELATION_LABEL_FOR` automatisch generiert, sodass der folgende Code nicht notwendig wäre):

  #### Beziehen eines GtkLabel auf ein GtkWidget

      {
        GtkWidget *widget;
        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));
      }

- Falls Sie ein benutzerdefiniertes Widget erstellen, sollten Sie sicherstellen, dass es barrierefrei ist. Benutzerdefinierte Komponenten, die von anderen GTK-Widgets abstammen, erben die notwendigen Barrierefreiheits-Informationen. Weitere Informationen hierzu finden Sie in Benutzerdefinierte Komponenten barrierefrei gestalten.

- Machen Sie nicht kaputt, was Sie umsonst bekommen! Wenn Ihre Benutzeroberfläche einen nicht-barrierefreien Container beinhaltet, könnten auch die Komponenten im Container nicht-barrierefrei werden.

### Die Barrierefreiheits-API

Nachfolgend finden Sie einige grundlegende API-Aufrufe, die Sie in Ihrer Anwendung nutzen können, um das reibungslose Zusammenwirken mit Hilfstechnologien sicher zu stellen. Die gesamte Barrierefreiheits-API ist erweiterbar, so dass Sie beispielsweise Ihre eigenen benutzerdefinierten, barrierefreien Widgets erstellen können.

### Häufig genutzte API-Aufrufe von ATK

API | Beschreibung
`AtkObject* gtk_widget_get_accessible (GtkWidget*)` | Gibt das barrierefreie Objekt zurück, welches das angegebene GTK-Widget für eine Hilfstechnologie beschreibt.
`void atk_object_set_name (AtkObject*, const gchar*)` | Legt den Namen des barrierefreien Objekts fest. Wenn beispielsweise das Objekt ein grafischer Knopf ist, der beim Anklicken die Anwendung beendet, könnte der Name »Quit« lauten.
`void atk_object_set_description (AtkObject*, const gchar*)` | Legt die Beschreibung in Textform für das barrierefreie Objekt fest. Wenn beispielsweise das Objekt ein grafischer »Close«-Knopf ist, dann könnte die Beschreibung »Closes the window« lauten.
`AtkRelation* atk_relation_new (AtkObject**, gint, AtkRelationType)` | Erstellt einen neuen Bezug zwischen dem angegebenen Schlüssel und der angegebenen Liste der Zielobjekte. Eine solche Beziehung informiert normalerweise die Hilfstechnologie darüber, dass ein Widget in einem bestimmten Verhältnis zu einem anderen steht. Beispielsweise ist ein bestimmtes GtkLabel eine Beschriftung für ein GtkTreeView im gleichen Fenster.
`void atk_image_set_description (AtkImage*, const gchar*)` | Legt die Beschreibung in Textform für das barrierefreie Bildobjekt fest. Wenn das Objekt beispielsweise ein Vorschaubild auf eine virtuelle Arbeitsfläche in einem Panel-Applet ist, dann könnte die Beschreibung »Image showing window arrangement on desktop 1« lauten.

### Beispiele für die Nutzung der Barrierefreiheits-API

Wie bereits erwähnt, sollte der Aufwand gering sein, wenn Sie Ihre Anwendung mit Hilfe der GTK-Widgetsammlung oder jeder anderen die ATK-Schnittstelle nutzenden Widgetsammlung barrierefrei gestalten. Dies sind die zwei häufigsten Aufgaben in diesem Fall:

- Bereitstellung von Beschreibungen von Bedienelementen mit `atk_object_set_description()` oder `atk_image_set_description():`

  #### Festlegen der barrierefreien Beschreibung für einen Knopf

      {
         AtkObject *obj;
         obj = gtk_widget_get_accessible(button);
         atk_object_set_description(obj,_("Opens Preferences dialog"));
      }

- Angeben von Beziehungen zwischen unüblichen Widget-Gruppierungen mittels `atk_relation_new()` und `atk_relation_set_add()`:

  #### Festlegen einer barrierefreien Beziehung zwischen zwei Bedienelementen

      {
        GtkWidget *widget;
        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));
      }

Die übrigen Beispiele in diesem Abschnitt sollen Ihnen vornehmlich einen Eindruck verschaffen, was Sie mit ATK erreichen können. Es werden Techniken gezeigt, die Sie als Anwendungsentwickler vielleicht niemals einsetzen müssen, auch wenn sie gegebenenfalls interessant werden, wenn Sie Ihre eigenen benutzerdefinierten Widgets schreiben möchten (siehe Benutzerdefinierte Komponenten barrierefrei gestalten), oder wenn Sie eine Hilfstechnologie-Anwendung schreiben möchten.

#### Barrierefreiheitsinformationen einer Anwendung sammeln

Ein Programm, das ATK-Aufrufe auswerten möchte, muss voraussichtlich eine (oder mehrere) der folgenden Dinge integrieren:

1. Erzeugen Sie einen EventListener, zum Beispiel über die Funktion `atk_add_focus_tracker()`:

       atk_add_focus_tracker (_my_focus_tracker);

   wobei `_my_focus_tracker()` eine Funktion folgenden Prototyps ist:

       void _my_focus_tracker (AtkObject *aobject);

2. Erstellen Sie einen globalen EventListener mit »atk_add_global_event_listener()«:

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

   wobei `_my_global_listener` den Prototypen eines Glib `GSignalEmissionHook` besitzt. Bei diesem Beispiel würde `_my_global_listener()` jedes Mal aufgerufen werden, wenn es ein »enter_notify_even«-Signal auf einem `GtkWidget` gibt.

3. Greifen Sie mit folgendem Funktionsaufruf auf das Toplevel-ATK-Objekt zu:

       AtkObject *root_obj = atk_get_root();

   Dies gibt ein `AtkObject` zurück, das alle Toplevel-Fenster in dem aktuell laufenden Programm enthält. Der Benutzer kann anschließend durch die Objekt-Hierarchie navigieren, indem er auf die Kindelemente des Wurzelobjekts zugreift, die den Toplevel-Fenstern entsprechen.

#### Die Interfaces eines `AtkObject`s abfragen

Sobald Sie das `AtkObject` identifiziert haben, das mit einem Objekt in der Anwendung verknüpft ist (z.B. indem Sie `gtk_widget_get_accessible()` verwendet haben), können Sie auf verschiedene Wege herausfinden, welche Interfaces es implementiert:

1. Verwenden Sie die `ATK_IS_...` Makros, zum Beispiel:

   - `ATK_IS_ACTION(atkobj)`

   - `ATK_IS_COMPONENT(atkobj)`

   - etc. (es gibt eins für jedes Interface)

   Wenn das Makro `TRUE` zurückgibt, können Sie sicher Interface-Aufrufe auf das ATK-Objekt durchführen.

2. Testen Sie die Rolle des `AtkObject`s, indem Sie `atk_object_get_role()` aufrufen. Jede Rolle implementiert eine Anzahl an ATK-APIs.

#### Einen ATK-Signalhandler einrichten

Als Beispiel verwenden wir das Signal `column_inserted`:

    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);

Hier wird `_my_table_column_inserted_func()` jedes Mal aufgerufen, wenn das Signal »column_inserted« auf dem `AtkObject` `my_atk_object` ausgesandt wurde.

Sich mit einem Signal zu verbinden funktioniert etwas unterschiedlich, wenn das Signal Details unterstützt. Das Signal `children_changed` unterstützt das Detail `add`. Um sich mit einem Signal zu verbinden, wenn zusätzlich das `add` -Detail angegeben ist, können Sie folgende Technik verwenden:

    child_added_id = g_signal_connect_closure (my_atk_obj,"children_changed::add",
    g_cclosure_new (G_CALLBACK(_my_children_changed_func), NULL, NULL), FALSE);

Dies führt dazu, dass `_my_children_changed_func()` jedes Mal aufgerufen wird, wenn das Signal `children_changed` mit dem `add`-Detail auf dem `AtkObject` `my_atk_obj` ausgesandt wird.

#### Implementieren eines ATK-Objekts

##### Registry

Für dieses Beispiel nehmen wir an, dass es ein Objekt namens GTK_TYPE_MYTYPE gibt. Die ATK-Implementierung wird `MYATKIMP_TYPE_MYTYPE` genannt. Es wird eine Factory benötigt, die `MYATKIMP_TYPE_MYTYPE_FACTORY` heißt.

Um eine ATK-Implementierung auf einem GTK-Objekt zu registrieren, müssen die folgenden Schritte in der Modulfunktion `gtk_module_init()` ausgeführt werden:

1. Greifen Sie auf die Standard-Registry zu:

       default_registry = atk_get_default_registry();

2. Registrieren Sie das ATK-Objekt in der Funktion `gtk_module_init()` dieses Moduls über folgenden Funktionsaufruf:

       atk_registry_set_factory_type (default_registry, GTK_TYPE_MYTYPE,
       MYATKIMP_TYPE_MYTYPE_FACTORY);

Dies registriert die AtkObject-Implementierung von `GTK_TYPE_MYTYPE` in `MYATKIMP_TYPE_MYTYPE_FACTORY`. Die Factory wird so implementiert, dass sie in der Lage ist, Objekte vom Typ `MYATKIMP_TYPE_MYTYPE` zu erzeugen.

##### Factory

Die Factory muss als Kind des Klassentyps `ATK_TYPE_OBJECT_FACTORY` implementiert sein und die Funktion `create_accessible()` implementieren. Diese Funktion muss ein entsprechendes `AtkObject` erzeugen. Eine Factory kann zum Erzeugen mehrerer Objekttypen verwendet werden, wobei dessen `create_accessible()`-Funktion intelligent genug sein muss, das korrekte `AtkObject` zu erstellen und zurück zu liefern.

##### ATK-Implementierung für ein bestimmtes Objekt

Jedes `GObject` implementiert eine `get_type()`-Funktion. Im vorstehenden Beispiel wäre die Namenskonvention für diese Funktion `myatkimp_mytype_get_type()`.

In dieser Funktion geben Sie an, welche Interfaces Ihr Objekt implementiert. Falls die folgende Logik in der `get_type()`-Funktion eingeschlossen wäre, dann würde das folgende Objekt das Interface `ATK_TEXT` implementieren:

###### Beispiel für eine `get_type()`-Funktion

    static const GInterfaceInfo atk_text_info =
    {
       (GInterfaceInitFunc) atk_text_interface_init,
       (GInterfaceFinalizeFunc) NULL,
       NULL
    };

    g_type_add_interface_static (type, ATK_TYPE_TEXT,
                                 &atk_text_info);

Die Funktion `atk_text_interface_init()` mit dem folgenden Prototyp müsste implementiert werden:

    void atk_text_interface_init (AtkTextIface *iface);

Diese Funktion würde die Funktionsaufrufe des Interfaces zur spezifischen Implementierung wie folgt verbinden:

###### Benutzerdefinierte Interface-Aufrufe mit einer AtkObject-Implementierung verbinden

    void
    atk_text_interface_init (AtkTextIface *iface)
    {
       g_return_if_fail (iface != NULL);
       iface->get_text = myatkimp_mytype_get_text;
       iface->get_character_at_offset = myatkimp_mytype_get_character_at_offset;
       ...
    }

Dann müssen die Funktionen `myatkimp_mytype_get_text()`, `myatkimp_mytype_get_character_at_offset()` und der Rest der `ATK_TEXT`-Interfacefunktionen implementiert werden.

##### `AtkObject`-Implementierung

`AtkObject`e sind `GObject`e, und jedes `GObject` muss die Funktion `get_type()` spezifizieren. Im Folgenden wird ein Beispiel präsentiert, das einen Klassen- sowie Instanz-Initialisierer erstellt. Die Funktion `get_type()` spezifiziert ebenfalls, dass das Objekt `ATK_TEXT` implementiert, als auch, dass das Elternobjekt ein `MYATKIMP_MYPARENTTYPE` ist.

##### Initialisierung von Klassen und Instanzen

Sie müssen einen Klassen-Initialisierer für das `GObject` implementieren, falls Ihre `AtkObject`-Implementierung entweder:

1. Funktionsaufrufe überschreibt, die vom Elternobjekt definiert sind. Dies ist für gewöhnlich notwendig, wenn ein Objekt eine Funktion wie `atk_object_get_n_accessible_children()` implementieren muss. Diese Funktion etwa muss implementiert werden, wenn das Objekt Kindelemente besitzt, die aber nicht durch Widgets dargestellt werden.

2. Eine `parent->init`-, `parent->notify_gtk`- oder `parent->finalize`-Funktion benötigt.

   1. parent->init

      Die Funktion `parent->init()` könnte erforderlich sein, wenn die ATK-Implementierung eine der folgenden Aufgaben besitzt:

      1. Daten vom einem begleitenden GTK-Widget zwischenspeichern (cache).

      2. Signale des begleitenden GTK-Widgets abhören (listen).

   2. parent->notify_gtk

      Falls die ATK-Implementierung auf Änderungen einer Eigenschaft des begleitenden GTK-Widgets achten soll, könnte eine `parent->notify_gtk()`-Funktion notwendig sein. Zum Beispiel:

      ###### Eine benutzerdefinierte `notify_gtk()`-Funktion

          void
          myatkimp_mytype_real_notify_gtk (GObject    *obj,
                                           GParamSpec *pspec)
          {
             GtkWidget *widget = GTK_WIDGET (obj);
             AtkObject* atk_obj = gtk_widget_get_accessible (widget);

             if (strcmp (pspec->name, "property-of-interest") == 0)
             {
                /* Handle the property change. */
             }
             else
             {
                parent_class->notify_gtk (obj, pspec);
             }
          }

   3. parent->finalize

      Eine `finalize()`-Funktion ist erforderlich, wenn Daten freigegeben werden müssen, sobald eine `GObject`-Instanz zerstört wird. Zum Beispiel:

      ###### Eine benutzerdefinierte `finalize()`-Funktion

          void
          myatkimp_mytype_finalize (GObject *object)
          {
             MyAtkimpMyType *my_type = MYATKIMP_MYTYPE (object);

             g_object_unref (my_type->cached_value);
             G_OBJECT_CLASS (parent_class)->finalize (object);
          }

### Benutzerdefinierte Komponenten barrierefrei gestalten

Das Hinzufügen von ATK-Unterstützung zu Ihrem benutzerdefinierten Widget stellt die Zusammenarbeit mit der Barrierefreiheits-Infrastruktur sicher. Folgende grundlegende Schritte sind hierzu erforderlich:

- Ein benutzerdefiniertes Widget gemäß den dafür relevanten Richtlinien für Benutzeroberflächen beurteilen;

- Herausfinden, welche ATK-Interfaces ein benutzerdefiniertes Widget implementieren sollte, gemäß dem Funktionsumfang des Widgets;

- Herausfinden, welche ATK-Interfaces von der übergeordneten Klasse des Widgets geerbt werden können;

- Die erforderlichen ATK-Interfaces für die Widgetklasse auf einem von zwei Wegen implementieren:

  - Direkt in dem benutzerdefinierten Widget, oder

  - In einem Untertyp von `AtkObject`, indem eine neue Unterklasse von `AtkObjectFactory` erstellt wird

  Wenn die zweite Methode verwendet wird, muss der zugehörige Factory-Typ zur Laufzeit mit der `AtkObjectFactoryRegistry` registriert werden.

### Richtlinien für Benutzeroberflächen zur Unterstützung der Barrierefreiheit

Wenn Sie die Benutzeroberfläche Ihrer Anwendung entwerfen, gibt es eine Reihe einfacher Richtlinien, die Sie befolgen sollten, um die Anwendung möglichst vielen Nutzern zugänglich zu machen. Das gilt sowohl mit als auch ohne den Einsatz von Hilfstechnologien. Lassen Sie sich nicht täuschen: Es geht dabei nicht einfach darum, die Oberfläche auf Menschen mit Beeinträchtigung anzupassen und dass Sie die Richtlinien ignorieren können, wenn doch sowieso kein Mensch mit einer Beeinträchtigung Ihr Programm verwenden wird. Indem Sie die folgenden Richtlinien beachten, verbessern Sie die Bedienbarkeit Ihrer Anwendung für alle Nutzer - einschließlich Ihnen!

#### Allgemein

Wir alle sind frustriert, wenn wir eine Funktion in einem Programm nicht finden können, oder wenn das Programm einen Fehler macht, weshalb es eine Zeit lang braucht, um wieder zum Normalzustand zurückzukehren, wenn das überhaupt geht. Wenn Sie eine Beeinträchtigung besitzen, werden sowohl der Aufwand als auch die verschwendete Zeit dadurch häufig umso höher sein. Einigen Grundrichtlinien zu folgen, kann helfen, diese Situationen für alle Nutzer zu vermeiden.

- Stellen Sie eine Rückgängig-Funktion für jede Aktion bereit, welche die Benutzerdaten oder die Anwendugseinstellungen beeinflusst. Falls möglich, sollten für Rückgängig- und Wiederherstellungsfunktionen mehrere Schritte ermöglichen und eine Chronikansicht anbieten, die eine Vorschau auf rückgängig zu machende Aktionen enthält.

- Stellen Sie Befehle zum Wiederherstellen von Standardeinstellungen bereit. Falls eine bestimmte Einstellung eine Anwendung für einen bestimmten Benutzer unbenutzbar machen könnte, beispielsweise durch eine viel zu kleine Schrift, dann kann eine Wiederherstellungsfunktion außerhalb der Anwendung sehr nützlich sein. Das kann zum Beispiel über einen entsprechenden Schalter in der Befehlszeile geschehen.

- Verhindern Sie, dass der Benutzer das Falsche tut. Das ist insbesondere für Aktionen von Bedeutung, die versehentlich geschehen können (z.B. durch Mausbedienung) oder die nicht ohne Weiteres rückgängig gemacht werden können (z.B. Überschreiben von Dateien). Stellen Sie Informationsdialoge bereit oder zwingen Sie den Benutzer, gefährliche Aktionen nur in einem bestimmten Modus auszuführen.

- Überstrapazieren Sie das Gedächtnis des Benutzers nicht. Lassen Sie den Benutzer beispielsweise mehrere Dokumente gleichzeitig betrachten und stellen Sie eine Online-Hilfe oder andere Hilfeanweisungen zur Verfügung, während die beschriebene Prozedur ausgeführt wird. Ermöglichen Sie das Kopieren jeglicher angezeigter Informationen und das Einfügen an beliebigen Stellen, wo Daten eingegeben werden können.

- Lassen Sie den Benutzer keine Speichermedien einlegen. Abhängig von der jeweiligen Behinderung kann es schwierig sein, ein Medium physikalisch betrachtet einzulegen oder zu wechseln, oder das korrekte Medium richtig zu identifizieren. Falls Ihre Anwendung von CD-ROM installiert wird, sollten Sie dem Benutzer die Möglichkeit bieten, alle benötigten Dateien direkt auf die Festplatte zu kopieren.

- Vergraben Sie häufig genutzte Funktionen nicht tief in einer Menüstruktur. Egal ob Sie eine Maus, die Tastatur oder ein anderes Eingabegerät verwenden, sollten tief ineinander verschachtelte Einträge besser vermieden werden. Da sich der Benutzer daran erinnern muss, wo diese zu finden sind, ist der Zugriff zu schwierig und erfordert zu viel Zeit.

- Führen Sie den Benutzer nicht durch unnötige Schritte. Einrichtungsassistenten können zwar für Benutzer hilfreich sein, die Schwierigkeiten haben, mit vielen Optionen gleichzeitig umzugehen, aber andere wiederum möchten die Zeit oder die Anzahl der Tastenbedienungen minimieren. Solche Benutzer profitieren davon, nicht benötigte Schritte überspringen und direkt zum nächsten gewünschten Schritt gehen zu können. Stellen Sie in Ihrem Einrichtungsassistenten einen Finish-Knopf bereit, der direkt zum Ende des Assistenten führt und für die verbleibenden Schritte Standardwerte annimmt. Falls der Assistent aus sehr vielen Schritten besteht, sollten Sie den Benutzer zu Beginn fragen, ob alle diese Schritte angeboten werden oder nur diejenigen, die am häufigsten genutzt werden.

#### Tastatursteuerung

Eine gut durchdachte Tastaturschnittstelle spielt eine Schlüsselrolle beim Entwerfen barrierefreier Software. Blinde Benutzer können wesentlich effektiver mit der Tastatur navigieren, weil die Nutzung der Maus die visuelle Rückmeldung des Ortes des Mauszeigers erfordert. Auch Bewegungseinschränkungen können der Grund dafür sein, dass ein Benutzer erfolgreich mit der Maus navigieren kann, da dies von der Feinmotorik abhängt.

Es ist daher wichtig, dass alle Mausaktionen auch über die Tastatur erreichbar sind, einschließlich des Zugriffs auf alle Werkzeugleisten, Menüs, Verknüpfungen und Knöpfe. Jede von Ihrer Anwendung bereitgestellte Funktion sollte auch ausschließlich mit der Tastatur erreichbar sein. Legen Sie Ihre Maus besser zur Seite, wenn Sie Ihre Anwendung testen!

Die meiste Funktionalität lässt sich über Zugriffstasten und Tastenkürzel und die Navigationsfunktionen der Toolkits barrierefrei machen. Dennoch erfordern Vorgänge, die Ziehen-und-Ablegen beinhalten, weitere Überlegungen.

- Stellen Sie effizienten Zugriff auf alle Funktionen der Anwendung über die Tastatur her. Einige Benutzer könnten nicht in der Lage sein, eine Maus zu bedienen, und viele »Power-User« bevorzugen die Tastatur sowieso. Außerdem können spezialisierte Hilfstechnologien eher Tastaturereignisse als Mausereignisse simulieren. Da Tippen für einige Benutzer schwierig oder sogar schmerzhaft sein kann, ist eine Tastaturschnittstelle wichtig, welche die für eine gestellte Aufgabe nötige Anzahl der Tastaturzugriffe auf ein Minimum reduziert.

- Verwenden Sie für die Tastaturnavigation eine logische Reihenfolge. Beim Navigieren durch Fensterinhalte mit der Tabulatortaste sollte die Bewegungsrichtung des Tastaturfokus voraussehbar sein. In westlichen Spracheinstellungen ist dies normalerweise von links nach rechts und von oben nach unten.

- Stellen Sie die richtige Tabulator-Reihenfolge aller Bedienelemente sicher, deren Aktiv-Status von einem Ankreuzfeld, Auswahlknopf oder Umschaltknopf abhängt. Wenn solch ein Feld/Knopf ausgewählt ist, sollten alle vom ihm abhängigen Elemente aktiv und alle von anderen Feldern/Knöpfen abhängigen Elemente in der Gruppe inaktiv sein. Wenn der Benutzer ein Ankreuzfeld, einen Auswahlknopf oder Umschaltknopf auswählt, von dem anderen Elemente abhängen, sollten Sie nicht automatisch den Fokus auf das erste abhängige Element legen, sondern den Fokus bei dem Feld/Knopf selbst lassen.

- Überschreiben Sie keine Barrierefreiheits-Funktionen des Systems. AccessX ist beispielsweise eine Erweiterung von XServer, die seit X11R6 unterstützt wird. Das Funktionsmerkmal »MouseKeys« (Maustasten) dieser Erweiterung ermöglicht es, Mausbewegungen und Anklicken von Knöpfen mit der Tastatur auszuführen. Implementieren Sie daher keine Funktionen, die nur per Tastendruck bedient werden können: Nutzer, die auf die MouseKeys-Funktion angewiesen sind, werden sie nicht nutzen können.

- Bieten Sie wenn möglich mehrere Methoden an, Aufgaben mit der Tastatur auszuführen. Für manche Benutzer sind bestimmte Tasten und Tastenkombinationen leichter oder schwieriger als für andere.

- Stellen Sie nach Möglichkeit immer sowohl die Bedienung mit Maus als auch Tastatur sicher. Einige Nutzer können nur von einer Variante Gebrauch machen.

- Weisen Sie häufig benutzten Tastaturoperationen keine umständlichen, schwer zu erreichenden Tastenkombinationen zu. Einige Nutzer können die Tastatur nur mit einer Hand bedienen, weshalb Tastenkombinationen für typische Operationen bevorzugt werden sollten, die auch mit einer Hand zu aktivieren sind.

- Vermeiden Sie, Tastenkombinationen häufig zu verwenden, bei denen man mehrere Tasten gleichzeitig drücken muss. Einige Nutzer können nicht mehrere Tasten gleichzeitig drücken und gedrückt halten. Hilfstechnologien wie AccessX können das zwar umgehen und in sequentielle Kombinationen umwandeln, dies erfordert aber natürlich mehr Zeit.

- Stellen Sie sicher, dass mit der Maus auswählbarer Text auch mit der Tastatur ausgewählt werden kann. Davon profitieren alle Benutzer, aber besonders jene, deren Feinmotorik die genaue Maussteuerung erschwert.

- Stellen Sie sicher, dass Objekte, die eine Größenänderung oder ein Verschieben per Ziehen-und-Ablegen mit der Maus ermöglichen, auch mit der Tastatur in der Größe geändert oder verschoben werden können. Dazu zählen etwa Symbole und Fenster auf dem Schreibtisch. Wo präzise Größenänderung und Platzierung potenziell wichtig ist, zum Beispiel in einem Diagramm, sollten Sie auch einen Dialog bereitstellen, in dem Koordinaten eingegeben werden können, oder eine Möglichkeit zum Einrasten von Objekten in einem benutzerdefinierten Raster.

- Verwenden Sie keine allgemeinen Navigationsfunktionen zum Auslösen von Aktionen. Zum Beispiel sollten Sie in einem Dialog keine Tastaturnavigation per Tabulatortaste verwenden, um irgendwelche Aktionen auszulösen, die mit einem Bedienelement verknüpft sind.

- Zeigen Sie durch die Tastatur ausgelöste Menüs, Fenster und Minihilfen nahe der Objekte an, auf die sie sich beziehen. In GNOME 2.0 können Nutzer Einblendmenüs mit Umschalttaste F10 aufrufen, sowie Minihilfen mit Umschalttaste F1. Verbergen Sie das Objekt aber nicht vollständig, auf das sich das Menü oder die Minihilfe bezieht.

#### Maus-Interaktion

Denken Sie daran, dass nicht alle Benutzer mit der gleichen Geschicklichkeit eine Maus bedienen können und dass einige sogar Schwierigkeiten haben, den Mauszeiger zu sehen oder ihm zu folgen.

- Stellen Sie Alternativen für Klicks mit der mittleren und rechten Maustaste bereit. Diese können einerseits körperlich schwierig auszuführen sein, andererseits unterstützen einige Mäuse und viele Hilfstechnologien nur die primäre Maustaste. Manche Hilfstechnologien unterstützen sogar gar keine Maus, sondern erzeugen ausschließlich Tastaturereignisse.

- Ermöglichen Sie den Abbruch sämtlicher Mausaktionen. Ein Druck auf die Esc-Taste sollte jede laufende Mausaktion abbrechen, zum Beispiel Ziehen und Ablegen einer Datei in der Dateiverwaltung oder Zeichnen einer Form in einem Zeichenprogramm.

- Geben Sie während einer Ziehen-und-Ablegen-Aktion visuelle Rückmeldung. Wenn sich die Maus über möglichen Zielen befindet, heben Sie diese hervor und ändern den Mauszeiger. Verwenden Sie beim Überfahren unzulässiger Ablageziele den »Nicht-Ablegen«-Mauszeiger. Siehe Beispiele für Maus-Interaktionen.

- Bewegen Sie den Mauszeiger nicht automatisch oder beschränken ihn auf einen Teilbereich auf dem Bildschirm. Dies kann zu Problemen mit Hilfstechnologien führen, und ist auch für andere Nutzer verwirrend.

- Ziele für die Maus sollten nicht zu klein sein. Im Allgemeinen sollte das Ziel für eine Maus mindestens so groß wie der Bereich um den Fensterrand im aktuellen Fenstermanager/Thema herum, innerhalb dessen man die Fenstergröße ändern kann. Bedenken Sie, dass ein Nutzer mit eingeschränkter Geschicklichkeit oder Sehstärke einen Fenstermanager mit größeren Bereichen verwenden könnte.

##### Beispiele für Maus-Interaktionen

###### Beispiel eines »Nicht-Ablegen«-Zeigers aus CDE/Motif

Beispiel für eine Form des Mauszeigers für »Nicht-Ablegen«

#### Grafische Elemente

Stellen Sie Optionen bereit, die Darstellung aller wichtigen grafischen Elemente in Ihrer Anwendung anzupassen. Dies erleichtert Benutzern mit Sehschwäche oder kognitiven Störungen die Bedienung.

- Grafische Attribute wie die Stärke von Linien, Rändern oder Schatten sollte nicht unveränderlich im Quellcode festgelegt werden (hardcoden). Diese Elemente sollten idealerweise vom GTK- oder Fenstermanager-Thema ausgelesen werden können. Falls das nicht möglich ist, bieten Sie Einstellungen in Ihrer Anwendung an, mit denen man diese Attribute anpassen kann.

- Stellen Sie Beschreibungen für alle Oberflächenelemente bereit. GTK bietet zwar barrierefreie Standard-Beschreibungen für viele GTK-Widgets, Sie werden aber in einigen Fällen dennoch eigene hinzufügen müssen. Ein Beispiel dafür sind Widgets, die Grafiken statt Text verwenden, zum Beispiel ein Symbol ohne Beschriftung. Überlegen Sie auch, ob Sie die Standard-Beschreibungen durch hilfreichere oder Anwendungsbezogene Beschreibungen ersetzen können.

- Erlauben Sie, dass mehrfarbige grafische Elemente (z.B. Werkzeugleisten-Symbole) auch monochrom dargestellt werden können. Die monochromen Bilder sollten in den Vorder- und Hintergrundfarben des Systems dargestellt werden, da der Benutzer diese über das GTK-Thema für sich einstellen kann. Dies ermöglicht maximale Lesbarkeit.

- Interaktive Oberflächenelemente sollten gut erkennbar sein. Ein Benutzer sollte beispielsweise nicht erst die Maus über ein Objekt ziehen müssen, um zu erkennen, ob er es anklicken kann oder nicht. Lassen Sie ausreichend Platz zwischen Objekten und grenzen Sie Objekte klar voneinander ab. Zeigen Sie keine Elemente in der Benutzeroberfläche an, die zwar hübsch aussehen, aber nichts bewirken und nicht deaktiviert werden können.

- Stellen Sie eine Einstellung bereit, um Grafiken zu deaktivieren, die keine essentiellen Informationen beinhalten. Grafiken können Benutzer mit kognitiven Einschränkungen irritieren. Die Symbole in der GNOME-Fußleiste können abgeschaltet werden, ohne dass die Funktionalität darunter leidet.

#### Schriften und Text

Textausgaben nehmen für gewöhnlich den größten Teil der Informationen und Rückmeldungen einer Anwendung ein, auch für Benutzer mit normaler Sehkraft. Umso wichtiger ist es, Textfelder richtig auf dem Bildschirm zu positioneren und dem Benutzer die Wahl der Schriftart und -Größe zu überlassen. Letzteres erlaubt auch Nutzern mit eingeschränkter Sehkraft, Ihre Anwendung effektiv zu nutzen.

- Legen Sie Schriftart und -Größe nicht unveränderlich fest. Der Benutzer sollte in der Lage sein, alle Größen und Schriftarten anzupassen. Falls Sie aus irgendwelchen Gründen nicht dazu in der Lage sind, stellen sie keine Schriftgrößen kleiner als 10 Punkt ein.

- Stellen Sie Einstellungen bereit, grafische Hintergründe oder Wasserzeichen hinter Text zu entfernen. Diese Bilder verringern unter Umständen den Kontrast zwischen Text und Hintergrund, und können für Nutzer mit visuellen Einschränkungen Probleme bereiten.

- Beschriften Sie Objekte mit Namen, sodass diese auch außerhalb des Kontexts Sinn ergeben. Benutzer, die Bildschirmleser oder ähnliche Hilfstechnologien verwenden, sehen eventuell nicht unmittelbar den Zusammenhang zwischen Bedienelementen.

- Verwenden Sie nicht die gleiche Beschriftung für mehrere Elemente auf dem gleichen Fenster. Sie können den gleichen Namen in unterschiedlichen Fenstern verwenden, wenn er die gleiche Bedeutung besitzt. Verwenden Sie auch keine Beschriftungen, die unterschiedlich geschrieben, aber gleich ausgesprochen werden, zum Beispiel »Read« und »Red«. Dies kann Nutzer mit Bildschirmlesern verwirren.

- Bleiben Sie konsistent bei der Platzierung Ihrer Beschriftungen. Für gewöhnlich bedeutet dies, dass Beschriftungen direkt unterhalb von großen Symbolen, rechts von kleinen Symbolen und links oder oberhalb von anderen Bedienelementen platziert werden. Weitere Beispiele finden Sie unter Beispiele für Schriften und Text.

- Wenn Sie statischen Text verwenden, um ein Bedienelement zu beschriften, beenden Sie die Beschriftung mit einem Doppelpunkt. Verwenden Sie zum Beispiel Username:, um eine Texteingabe zu beschriften, in die der Nutzer seinen Benutzernamen eingeben soll. Das hilft beim Verständnis, dass es sich bei dem Objekt um ein Bedienelement handelt statt um ein unabhängiges Textfeld.

- Wenn Sie statischen Text verwenden, um ein Bedienelement zu beschriften, stellen Sie sicher, dass die Beschriftung in der Tabulator-Reihenfolge unmittelbar vor dem Bedienelement liegt. Dadurch gewährleisten Sie, dass das der Beschriftung zugeordnete Mnemonic auch zu dem richtigen Bedienelement springt bzw. es aktiviert.

- Ermöglichen Sie Alternativen zu WYSIWYG (»What You See Is What You Get«, zu deutsch etwa »Was du siehst, ist, was du bekommst«). Einige Benutzer können Text nur in einer hohen Schriftgröße bearbeiten, wollen ihn aber kleiner drucken. Mögliche Alternativen wären, den gesamten Text in der gleichen Schriftart und -größe darzustellen (welche vom Benutzer eingestellt werden können); Eine Einstellung »Text am Fenster umbrechen«, mit der der ganze Text gelesen werden kann, ohne waagerecht rollen zu müssen; eine Einstellung, mit der alle Fensterinhalte in einer einzelnen Spalte dargestellt werden, selbst wenn sie in mehreren Spalten gedruckt werden; sowie ein Text-Modus, in dem Grafiken als Platzhalter oder Textbeschreibungen dargestellt werden. Besitzt die Anwendung Leisten mit Unterelementen, sollten Sie erwägen, die Leisten gemeinsam mit dem übergeordneten Fenster zu vergrößern bzw. verkleinern.

##### Beispiele für Schriften und Text

###### Richtige Platzierung der Beschriftung bei verschiedenen Bedienelementen

List control with label above Listenansicht mit Beschriftung oben | Large file manager icon with label underneath Großes Dateiverwaltung-Symbol mit Beschriftung unten | Small toolbar icon with label to its right Kleines Werkzeugleistensymbol mit Beschriftung rechts | Spinbox control with label to its left Einstellfeld mit Beschriftung links

#### Farbe und Kontrast

Eine schlechte Farbauswahl auf dem Bildschirm kann für farbenblinde Benutzer (für die der Farbton wichtig ist) und Benutzer mit Sehbehinderung (für die Helligkeit und Kontrast wichtig sind) zu Problemen führen. Achten Sie grundsätzlich darauf, dass Nutzer überall dort Farben ändern können, wo diese wichtige Informationen übermitteln.

Benutzer mit visuellen Einschränkungen benötigen unter Umständen einen hohen Kontrast zwischen dem Hintergrund und Textfarben. Häufig wird ein schwarzer Hintergrund und weiße Schrift verwendet, damit der Hintergrund nicht überläuft. Diese Einstellung ist für Nutzer mit einer Sehschwäche jedoch kritisch.

- Legen sie Anwendungsfarben nicht unveränderlich im Programmcode fest. Einige Nutzer benötigen bestimmte Farb- und Kontrastkombinationen, damit sie den Bildschirm gut lesen können. Übernehmen Sie alle Hauptfarben in Ihrer GNOME-Anwendung daher vom GTK-Thema, damit der Nutzer darüber die Farben für alle Anwendungen für sich optimieren kann. Wenn Sie aus irgendwelchen Gründen Farben benötigen, die nicht im Thema verfügbar sind, stellen Sie Optionen innerhalb der Anwendung bereit, über die sie der Nutzer anpassen kann.

- Verwenden Sie Farben nicht als einziges Mittel, um Informationsblöcke voneinander zu trennen. Verwenden Sie mindestens ein weiteres Trennmerkmal wie etwa Form, Position oder Textbeschreibung. Weitere Informationen finden Sie unter Beispiele für Farbe und Kontrast.

- Unterstützen Sie alle Hochkontrast-Themen von GNOME. Wenn eines dieser Themen aktiviert ist, sollten Sie sicherstellen, dass all Ihr Anwendungstext in den kontrastreichen Vorder- und Hintergrundfarben des Themas dargestellt wird.

- Stellen Sie sicher, dass Ihre Anwendung kein bestimmtes Thema mit hohem Kontrast benötigt. Testen Sie sie mit verschiedenen Hochkontrast-Themen, um sicher zu stellen, dass Ihre Anwendung die Einstellungen respektiert.

##### Beispiele für Farbe und Kontrast

###### Beispiel für die redundante Farbverwendung

Beispiel, in dem Änderungen im Börsenkurs nur durch die Farbe dargestellt werden | Diese Anzeige könnte farbenblinden Benutzern mit einer Rot-Grün-Schwäche Probleme bereiten. Diese Art der Farbenblindheit betrifft in einigen Teilen der Welt ein Siebtel der Männer. Durch den mangelnden Kontrast zwischen dem roten Text und dem schwarzen Hintergrund ist die Lesbarkeit auch für Sehbehinderte beeinträchtigt, selbst unter Zuhilfenahme einer Bildschirmlupe.
Beispiel, in dem Änderungen im Börsenkurs sowohl durch die Farbe also auch durch Pfeile dargestellt werden | Diese Anzeige verwendet zusätzlich zur Farbgebung noch Pfeile, um Bewegungen im Börsenkurs darzustellen. Auch werden dunklere Rot- und Grün-Farbtöne auf einem hellen Hintergrund verwendet, wodurch sich ein höherer Kontrast ergibt. Hierbei muss es sich nicht um das Standard-Farbschema handeln, wenn es den Großteil der Nutzer ablenkt. Es sollte aber möglich sein, es auf diese Weise anzupassen, entweder über ein Thema oder über den Preferences-Dialog der Anwendung.

#### Vergrößerung

Viele Benutzer profitieren von der Vergrößerung von Text und Grafiken, selbst jene Benutzer ohne Sehbehinderung. Ohne Vergrößerung könnte ein sehbehinderter Benutzer möglicherweise überhaupt nicht in der Lage sein, Ihr Programm zu verwenden.

- Geben Sie dem Benutzer die Möglichkeit, den Arbeitsbereich zu vergrößern.

- Ermöglichen Sie, die Größe des Arbeitsbereiches Ihrer Anwendung zu verändern. Benutzer sollten den Arbeitsbereich auf 150-400% oder mehr vergrößern können. Testen sie Ihre Anwendung, um zu überprüfen, dass die Darstellung des betrachteten Objekts nicht durch die Vergrößerungseinstellung beeinträchtigt wird.

#### Klänge

Sowohl Leute mit eingeschränktem Hörvermögen als auch Benutzer, die Klänge auf Ihrem Rechner generell abgeschaltet haben, dürften nicht begeistert sein, wenn Ihre Anwendung Informationen allgemein über Klangausgaben bereitstellt. Stellen Sie sicher, dass der Benutzer in der Lage ist, als Klang ausgegebene Informationen auch auf anderen Wegen zu erhalten.

- Nehmen Sie nicht einfach an, dass ein Benutzer Klänge hören will. Das betrifft sowohl Benutzer mit defekten Soundkarten als auch Hörgeschädigte!

- Betrachten Sie Klänge nicht als den einzigen Weg, Informationen bereitzustellen. Geben Sie dem Benutzer die Möglichkeit, alle Klanginformationen auch visuell darstellen zu können. Dies beinhaltet geschlossene Beschriftungen und Textausgaben von allen wichtigen gesprochenen Soundclips.

- Ermöglichen Sie dem Benutzer, die Frequenz und die Lautstärke alle Warntöne und sonstigen Klänge einzustellen. Die Klänge sollten auch vollständig abschaltbar sein.

#### Animation

Sparsam verwendet, können Animationen durchaus nützlich zur Darstellung wichtiger Informationen in Ihrer Anwendung sein - und sie können natürlich auch cool aussehen. Allerdings können sie für bestimmte Benutzer auch problematisch sein, daher sollten Sie eine Möglichkeit vorsehen, die Animationen abzuschalten.

- Verwenden Sie keine blitzenden oder blinkenden Elemente mit einer Frequenz oberhalb von 2 Hz und unterhalb von 55 Hz. Dies betrifft sowohl Text als auch jegliche grafische Objekte. Alles innerhalb dieses Frequenzbereichs kann Benutzern mit Sehbehinderungen Probleme bereiten. Denken Sie daran, dass es keine »sichere« Frequenz gibt. Falls Blinken von essenzieller Bedeutung ist, dann sollten Sie die Blinkfrequenz des Systemzeigers verwenden (die an sich schon konfigurierbar ist) oder den Benutzern ermöglichen, eine eigene Frequenz festzulegen.

- Lassen Sie keine größeren Bereiche des Bildschirms blitzen oder blinken. Kleine Bereiche verursachen weit weniger Probleme für Benutzer mit Sehbehinderungen.

- Alle Animationen sollten optional sein. Animierte Informationen sollten auch in mindestens einem nicht-animierten Format zur Verfügung gestellt werden können, wenn der Benutzer es wünscht.

#### Tastaturfokus

Die Position des Tastaturfokus jederzeit anzuzeigen ist nicht nur für Nutzer mit einer Sehbehinderung wichtig, sondern auch für »Power-User«, die lieber mit der Tastatur als der Maus arbeiten. Es sollte niemals unklar sein, welches Bedienelement auf dem Bildschirm gerade im Fokus steht. Der Benutzer sollte in der Lage sein, den Rechner zu verlassen und mit Freunden zu telefonieren oder dem Hund rauszugehen, bis er vergessen hat, woran er gearbeitet hat. Wenn er dann zurückkommt, sollte er sich unmittelbar wieder einfinden können, wo er stehen geblieben ist.

Ein visueller Fokusindikator ist eine akustische Repräsentation der Position der Tastatur-Eingabemarke im Verhältnis zu den übrigen Objekten auf dem Bildschirm. Er erlaubt Nutzern, zwischen Objekten interaktiv zu navigieren, während sich der Fokus ändert. Der visuelle Fokus muss programmatisch von Hilfstechnologien aufgegriffen werden können. Meistens wird dies automatisch von ATK erledigt, ohne dass sie selbst Hand anlegen müssen. Sie sollten sich dessen aber bewusst sein, etwa wenn Sie ein benutzerdefiniertes Widget programmieren.

- Der Fokus sollte anfangs bei dem Bedienelement liegen, das am häufigsten verwendet wird. Gibt es solch ein »häufigstes« Element nicht, legen Sie den anfänglichen Fokus auf das erste Element im Fenster, wenn das Fenster geöffnet wird. Der Fokus sollte nicht bei den Knöpfen OK oder Cancel im Dialog starten, auch wenn sie die am häufigsten verwendeten Elemente sind, da man diese jederzeit per Tastendruck auf die Eingabetaste oder Escape aktiveren kann.

- Zeigen Sie den aktuellen Eingabefokus jederzeit deutlich an. Denken Sie dran, dass es Bedienelementen mit einer Bildlaufleiste nicht nur genügt, das aktuell ausgewählte Element anzuzeigen, da dieses nicht immer sichtbar sein könnte. Ein Beispiel dazu finden Sie unter Beispiele für den Tastaturfokus.

- Nur im aktiven Fenster sollte der Eingabefokus angezeigt werden. Verdecken Sie alle primären, visuellen Fokusindikatoren in allen Fenster, die nicht gerade aktiv sind und im Fokus stehen. Wenn ein Fenster mehrere Bereiche besitzt, sollte nur ein Bereich den Fokusindikator haben. In den übrigen Bereichen sollte der Indikator verdeckt sein. Falls es wichtig ist, dass das ausgewählte Element in einer nicht-fokussierten Liste angezeigt wird, können Sie einen zweiten Fokusindikator verwenden. Ein Beispiel dazu finden Sie unter Beispiele für den Tastaturfokus.

- Bieten Sie ausreichend Feedback, wenn der Benutzer versucht, aus einer logischen Gruppe von Objekten heraus zu navigieren. Wenn der Benutzer etwa durch eine Liste navigiert und am letzten Element angelangt ist, sollten Sie ihm eher einen Hinweiston abspielen, als einfach den Fokus wieder auf das erste Element der Liste zu legen. Blinde Nutzer oder solche mit einer schwachen Sehkraft könnten anderenfalls nicht realisieren, dass sie wieder am Anfang angelangt sind. Bei einer Textsuche in einem Dokument können Sie einen Dialog anzeigen lassen, wenn Sie am Ende angelangt sind und fragen, ob der Nutzer die Suche wieder am Anfang starten möchte.

- Spielen Sie die Standardklänge des Systems ab oder geben Sie visuelle Warnsymbole, wenn der Benutzer eine ungültige Taste drückt oder wenn eine Navigationstaste den Fokus nicht verschieben kann. Beispiele dazu wären, wenn der Fokus auf dem ersten Zeichen in einem Text liegt und der Nutzer die linke Pfeiltaste drückt, oder wenn er versucht, eine Mehrfachauswahl in einem Einfachauswahl-Dialog zu treffen. (Bedenken Sie dabei, dass Benutzer mit Hörproblemen dazu in der Lage sein sollten, systemweit eine visuelle Alternative zu dem Standard-Warnton einzustellen.)

##### Beispiele für den Tastaturfokus

###### Beispiel zur Verdeutlichung, wie wichtig ein eindeutiger Tastaturfokus ist

Das fokussierte Element in diesem Fenster ist außerhalb des sichtbaren Bereichs | Eines der Elemente in diesem Fenster ist fokussiert, aber es ist unmöglich zu sagen, welches …
Das fokussierte Element in der Liste ist jetzt sichtbar, weil die Liste runtergerollt wurde | … bis man die Liste rollt, wodurch erkenntlich wird, dass ein Listenelement ausgewählt ist.
Die Liste in diesem Beispiel besitzt einen kräftigen Rand, der den Fokus indiziert, selbst wenn das ausgewählte Listenelement nicht im sichtbaren Bereich liegt | Wenn die Liste selbst einen »Fokus«-Rand besitzt, ist klar, dass auf ihm gerade der Fokus liegt, selbst das aktuell ausgewählte Listenelement gerade nicht sichtbar ist.

###### Beispiel für die Nutzung eines sekundären Fokus

Aufgeteiltes Fenster mit zwei Bereichen, in denen beide Bereiche fokussiert zu sein scheinen | In diesem Beispiel ist visuell nicht erkennbar, welcher Bereich gerade den tatsächlichen Tastaturfokus besitzt
Aufgeteiltes Fenster, in dem eine sekundäre Hervorhebung genutzt wird, um zu verdeutlichen, welcher Bereich gerade den Fokus besitzt | Indem eine sekundäre Hervorhebungsfarbe im inaktiven Bereich verwendet wird, ist unmittelbar klar, dass hier das Baumelement den Fokus besitzt …
Aufgeteiltes Fenster, in dem eine sekundäre Hervorhebung genutzt wird, um zu verdeutlichen, welcher Bereich gerade den Fokus besitzt | … und hier das Listenelement den Fokus besitzt.

#### Zeitabläufe

Oberflächen, in denen Dinge abhängig von festen Zeiten erscheinen oder verschwinden, sind schlecht für die Barrierefreiheit. Einige Nutzer können nur sehr langsam reden, tippen und auf Änderungen reagieren. Wenn benötigte Informationen für sie zu schnell verschwinden oder durch neue Informationen verdeckt werden, die sie nicht ausdrücklich angefordert haben, wird Ihre Anwendung bei diesen Nutzern Frust erzeugen oder kann überhaupt nicht verwendet werden.

- Schreiben Sie Zeitüberschreitungen und andere zeitbasierte Funktionen nicht fest in den Quellcode. Dazu gehören etwas das automatische Rollen, wenn ein Objekt an die Nähe des Fensterrands gezogen wird, wenn der Knopf einer Bildlaufleiste gehalten wird, oder wenn sich ein Baumelement automatisch ausklappt, wenn ein Objekt eine kurze Zeit lang darüber gezogen und gehalten wird. Diese Zeiten sollten entweder in der Anwendung, den GNOME-Einstellungen oder wenigstens über die Befehlszeile per Konfigurationsdatei oder GConf-Eintrag einstellbar sein.

- Informationen sollten nicht abhängig von der Bewegung des Mauszeigers nur kurz angezeigt oder verdeckt werden. (Ausnahme: Systemfunktionen wie Minihilfen, die systemweit konfiguriert werden können). Wenn Sie solche Funktionen benötigen, sollten Sie eine Option bereitstellen, über die der Nutzer sie deaktivieren kann, wenn ein Bildschirmleser installiert ist.

#### Dokumentation

Menschen mit Behinderungen können Ihre Anwendung nicht effektiv nutzen, wenn Sie keinen Zugriff auf die benötigten Handbücher und Hilfedateien haben. Besonders wichtig ist die Tastaturnavigation, da viele Nutzer nur darüber die Anwendung bedienen können.

- Stellen Sie Ihre Dokumentation barrierefrei bereit. Hilfstechnologien können zum Beispiel sehr gut mit ASCII-Text und HTML umgehen.

- Grafiken in Ihrer Dokumentation sollten alternative Textbeschreibungen besitzen.

- Dokumentieren Sie die barrierefreien Funktionen Ihrer Anwendung. Tastaturnavigation und Tastenkürzel sind besonders wichtig zu dokumentieren. Schreiben Sie einen Barrierefreiheit-Abschnitt in Ihrer Dokumentation, in dem Informationen zu allen barrierefreien Funktionen zu finden sind.

## Testen

Bevor Sie eine Anwendung als barrierefrei deklarieren, sollten Sie mehrere Dinge überprüfen. Im Laufe der Entwicklung sollten Sie automatisierte Tests in Betracht ziehen. Zum Beispiel könnte LDTP Ihre automatischen Tests ergänzen.

Dieser Abschnitt beschreibt eine Anzahl von Tests, die Sie manuell in einer Anwendung ausführen können, um deren Barrierefreiheit zu überprüfen. Das erfolgreiche Durchlaufen dieser Tests gewährleistet zwar nicht zwangsläufig, dass die Anwendung vollständig barrierefrei ist. Aber falls Ihre Anwendung an einem dieser Tests scheitert, dann sind weitere Aktionen notwendig, um die Barrierefreiheit zu verbessern.

### Tastatursteuerung

Die folgenden Tastaturoperationen sollten überprüft werden. Benutzen Sie in keinem Teil dieses Tests die Maus.

- Bewegen Sie den Fokus durch alle Menüleisten in der Anwendung und verwenden Sie dazu nur Tastaturbefehle.

- Überprüfen Sie, ob:

  - kontextabhängige Menüs korrekt dargestellt werden.

  - jegliche in der Werkzeugleiste sichtbare Funktionen auch über die Tastatur erreichbar sind.

  - Sie jedes Bedienelement im Anwender-Bereich der Anwendung und in Dialogfeldern ansprechen können.

  - Text und Objekte im Anwender-Bereich ausgewählt werden können.

  - alle Tastenkombinationen und Schnellzugriffe so funktionieren, wie gewünscht.

### Grafische Elemente

Testen Sie Ihre Anwendung mit einem Bildschirmleser und überprüfen Sie, ob:

- Beschriftung und Text korrekt gelesen werden, einschließlich in Menüs und Werkzeugleisten.

- Objektinformationen korrekt gelesen werden.

### Indikator für den visuellen Fokus

- Überprüfen Sie, ob der Indikator für den visuellen Fokus beim Bewegen durch die Objekte einfach zu erkennen ist.

- Die Tastatur-Navigation durch die Software und deren Menüs sollte deutlich sichtbar sein, wenn sich der Fokus verändert.

- Überprüfen Sie, ob der Bildschirmleser den Indikator für den visuellen Fokus verfolgt, wenn Sie eine Tastatur verwenden.

- Führen Sie ein Programm zur Vergrößerung der Bildschirminhalte aus (eine Bildschirmlupe), um sicherzustellen, dass die Bildschirmlupe den Indikator für den visuellen Fokus verfolgt, wenn Sie die Tastatur oder die Maus verwenden.

### Schriften und Text

- Ändern Sie die Schrift in der Anwendung und überprüfen Sie, ob die Einstellungen angewendet werden.

- Testen Sie die Anwendung, indem Sie die Farben ändern und überprüfen, ob die Einstellungen wirksam werden.

- Falls Vergrößerung verfügbar ist, dann überprüfen Sie die Schrift, die Farbe und die Größe der Vergrößerungsoption.

### Farbe und Kontrast

- Drucken Sie Bildschirmfotos mit einem einfarbigen Drucker aus und überprüfen Sie, ob alle Informationen sichtbar sind.

- Testen Sie Anwendungen in einer schwarzweißen Darstellung mit hohem Kontrast und überprüfen Sie, ob alle Informationen korrekt vermittelt werden.

- Testen Sie Ihre Anwendung daraufhin, ob sie mindestens drei Farbkombinationen als Thema unterstützt und dass Schemata in hohem Kontrast verfügbar sind, beispielsweise weiß auf schwarz oder gelb auf blau.

- Schalten Sie im GNOME-Kontrollzentrum die Einstellungen zu hohem Kontrast ein und überprüfen Sie, ob Ihre Anwendung diese Einstellungen berücksichtigt.

- Testen Sie verschiedene Themen, um sicherzustellen, dass die Software mit allen verfügbaren Einstellungen funktioniert.

### Klänge

Es sollte in der Anwendung eine Option geben, um akustische Benachrichtigungen visuell darstellen zu lassen.

Überprüfen Sie, ob die Ausgabe von Klängen korrekt funktioniert, indem Sie diese im GNOME-Kontrollzentrum einschalten und dann folgende Aktionen ausführen:

- Führen Sie eine Aktion aus, die eine akustische Warnung auslöst und überprüfen Sie, ob die Anwendung wie erwartet funktioniert.

- Stellen Sie sicher, dass Ihre Anwendung korrekt reagiert, wenn Sie die Lautstärke erhöhen oder verringern.

- Überprüfen Sie, ob Warnmeldungen auch in einer lauteren Umgebung korrekt verstanden werden können.

### Animation

Stellen Sie sicher, dass eine Option zum Abschalten von Animationen zur Verfügung steht und diese wie erwartet funktioniert.

Schalten Sie die Animationen ab. Überprüfen Sie, ob alle Informationen immer noch korrekt vermittelt werden können.

### Tastaturfokus

- Testen Sie alle Meldungen, um zu überprüfen, ob der Benutzer ausreichend benachrichtigt werden kann, bevor eine Meldung verschwindet, mit der Option anzugeben, dass mehr Zeit notwendig ist.

- Stellen Sie sicher, dass eine Option zum Einstellen der Antwortzeit verfügbar ist und diese wie erwartet funktioniert.

### Dokumentation

Testen Sie Dokumentation im ASCII-Format mit einem Bildschirmleser, um sicherzustellen, dass diese klar und präzise von Hilfstechnologien gelesen werden kann.

Testen Sie HTML-Anwendungen mit einem Webbrowser und Bildschirmleser, um zu überprüfen, ob die Dokumentation barrierefrei ist und durch Hilfstechnologien verarbeitet werden kann.

Hinweis: Es gibt Richtlinien für Barrierefreiheit im Web auf http://www.w3.org/TR/WAI-WEBCONTENT/.

Überprüfen sie, ob in der Dokumentation folgende Informationen enthalten sind:

- Notieren Sie, wenn die Anwendung nicht den Standard-Tastaturzugriff des Betriebssystems unterstützt.

- Notieren Sie anwendungsspezifische Tastenkombinationen.

- Notieren Sie anwendungsspezifische Barrierefreiheit-Funktionen.

- Falls eine Aktion für die Maus dokumentiert ist, stellen Sie bitte sicher, dass eine Alternative für die Tastatur bereitsteht.

### Checkliste für Benutzeroberflächen

Dieser Abschnitt fasst die in den Richtlinien für Benutzeroberflächen zur Unterstützung der Barrierefreiheit gegebenen Richtlinien zusammen. Sie sollten diesen Abschnitt für weitere Informationen über die Einträge dieser Checkliste zu Rate ziehen.

Beim Testen einer Anwendung auf Barrierefreiheit sollten Sie alle Einträge in dieser Liste abarbeiten. Beachten Sie dabei, ob Ihre Anwendung jeden dieser Tests besteht oder scheitert, oder ob der jeweilige Test auf Ihr Programm nicht anwendbar ist.

### Checkliste der allgemeinen Prinzipien

GP | Allgemeine Prinzipien | Bestanden/Durchgefallen/KA
GP.1 | Jede Aktion, welche die Benutzerdaten oder Anwendungseinstellungen beeinflusst, kann rückgängig gemacht werden.
GP.2 | Alle Anwendungseinstellungen können auf ihre Standardwerte zurückgesetzt werden, ohne dass der Benutzer wissen muss, wie diese Einstellungen aussehen müssen.
GP.3 | Nach der Installation kann die Anwendung benutzt werden, ohne dass der Benutzer eine CD oder einen sonstigen Datenträger einlegen muss.
GP.4 | Die am häufigsten benutzten Funktionen befinden sich in der obersten Ebene der Menüstruktur.

### Checkliste für die Tastaturnavigation

KN | Tastatursteuerung | Bestanden/Durchgefallen/KA
KN.1 | Effizienter Tastaturzugriff ist auf alle Funktionsmerkmale der Anwendung möglich.
KN.2 | Alle Fenster haben einen logischen Aufbau für die Tastaturnavigation.
KN.3 | Die korrekte Tabulator-Reihenfolge wird für Bedienelemente verwendet, deren Aktivierungsstatus von Ankreuzfeldern, Auswahlknöpfen oder Umschaltknöpfen abhängig ist.
KN.4 | Der Tastaturzugriff auf anwendungsspezifische Funktionen überschreibt keine vorhandenen Barrierefreiheits-Funktionsmerkmale des Systems.
KN.5 | Die Anwendung stellt eine oder mehrere Methoden zur Ausführung von Tastaturaufgaben bereit, wo immer es möglich ist.
KN.6 | Wo immer möglich, gibt es alternative Tastenkombinationen.
KN.7 | Es muss nicht umständlich nach häufig benutzten Tastaturoperationen gesucht werden
KN.8 | Die Anwendung erwartet keine wiederholten, gleichzeitigen Tastendrücke.
KN.9 | Die Anwendung stellt für alle Mausfunktionen entsprechende Bedienungsmöglichkeiten für die Tastatur bereit.
KN.10 | Jedes Objekt, das mit der Maus ausgewählt werden kann, lässt sich auch nur mit der Tastatur auswählen.
KN.11 | Jedes Objekt, das mit der Maus verschoben oder dessen Größe geändert werden kann, lässt sich ebenso auch nur mit der Tastatur verschieben oder dessen Größe ändern.
KN.12 | Die Anwendung nutzt keine generellen Navigationsfunktionen oder Auslöseroperationen.
KN.13 | Alle tastaturbezogenen Menüs, Fenster und Minihilfen erscheinen nahe des Objekts, auf welches sie sich beziehen.

### Checkliste zur Maus-Interaktion

MI | Maus-Interaktion | Bestanden/Durchgefallen/KA
MI.1 | Keine Operation ist abhängig von der Bedienung der rechten oder mittleren Maustaste.
MI.2 | Alle Mausaktionen können abgebrochen werden, bevor sie abgeschlossen werden.
MI.3 | Bei Zieh- und Ablegevorgängen wird visuelle Rückmeldung bereitgestellt
MI.4 | Der Mauszeiger gerät nie unter unmittelbare Kontrolle der Anwendung und seine Bewegungsfreiheit wird nie auf den Bildschirmbereich der Anwendung beschränkt.

### Checkliste für grafische Elemente

GE | Grafische Elemente | Bestanden/Durchgefallen/KA
GE.1 | Es gibt keine fest kodierten grafischen Attribute wie Linien-, Rand- oder Schattendicke.
GE.2 | Alle mehrfarbigen grafischen Elemente können auch nach Möglichkeit monochrom dargestellt werden.
GE.3 | Alle interaktiven Elemente der grafischen Oberfläche sind eindeutig von statischen Elementen unterscheidbar.
GE.4 | Eine Option zum Verbergen eher unwichtiger grafischer Elemente wird bereitgestellt.

### Checkliste für Schriften und Text

FT | Schriften und Text | Bestanden/Durchgefallen/KA
FT.1 | Schriftstile und -größen sind nicht fest kodiert.
FT.2 | Eine Option zum Abschalten grafischer Texthintergründe steht zur Verfügung.
FT.3 | Alle Bezeichnungen ergeben auch außerhalb des Kontextes einen Sinn.
FT.4 | Beschriftungen werden innerhalb eines Fensters nicht mehrfach verwendet.
FT.5 | Die Positionierung von Beschriftungen ist innerhalb der Anwendung konsistent.
FT.6 | Alle statischen Textbeschriftungen, die andere Bedienelemente bezeichnen, enden mit einem Doppelpunkt.
FT.7 | Statische Textbeschriftungen, die andere Bedienelemente bezeichnen, stehen unmittelbar vor diesen Elementen in der Anordnung.
FT.8 | Eine Alternative zu »WYSIWIG« steht zur Verfügung. Dies wäre zum Beispiel die Festlegung verschiedener Schriften für Bildschirm und Drucker in einem Texteditor.

### Checkliste für Farben und Kontrast

CC | Farbe und Kontrast | Bestanden/Durchgefallen/KA
CC.1 | Anwendungsfarben sind nicht fest kodiert, sondern werden entweder vom aktuellen Desktop-Thema oder von der Anwendungseinstellung gezeichnet.
CC.2 | Farben werden lediglich als Erweiterung der Darstellung verwendet und nicht als einzige Möglichkeit für die Darstellung von Informationen oder Aktionen.
CC.3 | Die Anwendung unterstützt alle Themen und Einstellungen mit hohem Kontrast.
CC.4 | Die Software ist nicht von einem bestimmten Thema mit hohem Kontrast abhängig.

### Checkliste zur Vergrößerung

MG | Vergrößerung | Bestanden/Durchgefallen/KA
MG.1 | Die Anwendung verfügt über eine Funktion zur Vergrößerung des Arbeitsbereiches.
MG.2 | Die Anwendung stellt eine Option zur Skalierung des Arbeitsbereiches zur Verfügung.
MG.3 | Die Funktionalität der Anwendung wird durch Vergrößerung oder Skalierung nicht beeinträchtigt.

### Checkliste zu Klängen

AU | Klänge | Bestanden/Durchgefallen/KA
AU.1 | Klänge werden nicht als einzige Möglichkeit für die Darstellung von Informationen oder Aktionen verwendet.
AU.2 | Der Benutzer kann die Frequenz und die Lautstärke aller Klänge und Warntöne einstellen.

### Checkliste zu Animationen

AN | Animation | Bestanden/Durchgefallen/KA
AN.1 | Es gibt keine blitzenden oder blinkenden Elemente mit einer Frequenz zwischen 2 Hz und 55 Hz.
AN.2 | Jedes Blitzen oder Blinken ist auf kleine Bereiche des Bildschirms beschränkt.
AN.3 | Falls Animation verwendet wird, dann ist eine Option zum Abschalten verfügbar, bereits bevor die Animation erstmals benutzt wird.

### Checkliste für den Tastaturfokus

KF | Tastaturfokus | Bestanden/Durchgefallen/KA
KF.1 | Wenn ein Fenster geöffnet wird, dann liegt der Fokus zunächst auf dem am häufigsten benutzten Bedienelement.
KF.2 | Die aktuelle Position des Fokus wird jederzeit klar und deutlich dargestellt.
KF.3 | Der Eingabefokus wird nicht in mehreren Fenstern gleichzeitig angezeigt.
KF.4 | Es werden geeignete akustische oder visuelle Rückmeldungen bereitgestellt, wenn der Benutzer versucht, an das Ende oder den Anfang einer Gruppe aufeinander bezogener Elemente zu navigieren.
KF.5 | Das Standardsignal für akustische oder visuelle Warnungen wird abgespielt, wenn der Benutzer eine im jeweiligen Fall nicht anwendbare Taste drückt.
KF.6 | Es gibt genügend Audio-Informationen für den visuellen Fokus, über die dem Benutzer mitgeteilt werden kann, was als Nächstes zu tun ist.
KF.7 | Bei der Nutzung von Hilfstechnologien, wie einem Bildschirmleser oder einer Braille-Zeile, ermittelt das Programm die Position und den Inhalt des visuellen Fokus-Indikators.

### Checkliste zu Zeitabläufen

TM | Zeitabläufe | Bestanden/Durchgefallen/KA
TM.1 | Es gibt keine fest kodierten Zeitüberschreitungen oder sonstigen zeitbasierten Funktionsmerkmale in der Anwendung.
TM.2 | Das Anzeigen oder Verbergen wichtiger Informationen wird durch die Bewegungen des Mauszeigers nicht beeinflusst.

### Checkliste zur Dokumentation

DC | Dokumentation | Bestanden/Durchgefallen/KA
DC.1 | Jegliche Dokumentation liegt in einem barrierefreien Format vor, mit einer alternativen Beschreibung in Textform für alle Abbildungen und Diagramme.
DC.2 | Die Dokumentation enthält einen Abschnitt, in dem die Barrierefreiheits-Funktionsmerkmale der Anwendung beschrieben werden.

### GOK (GNOME-Bildschirmtastatur)

Die Informationen auf dieser Seite sind teilweise überholt: GNOME 3 stellt mit Caribou einen Ersatz für gok in GNOME 2 bereit.

Ihre Anwendung sollte mit gok verwendet werden können; Tastatureingaben sollten vollständig von gok erzeugt werden anstatt von der Tastatur. Ziel dabei ist, generell mit Ihrer Anwendung und der Arbeitsumgebung umzugehen und dabei sicherzustellen, dass jegliche Zeicheneingabe mit der Bildschirmtastatur durchgeführt werden kann.

gok wird automatisch mit der GNOME-Arbeitsumgebung installiert und sollte daher bereits zur Verfügung stehen. Die vollständige Dokumentation finden Sie auf der offiziellen go-Seite.

Führen Sie die folgenden Schritte aus, um sicherzugehen, dass gok korrekt mit Ihrer Anwendung umgeht:

1. Melden Sie sich in der GNOME-Arbeitsumgebung an

2. Starten Sie gok

3. Starten Sie Ihre Anwendung

4. Geben Sie etwas in Ihre Anwendung mit einem Zeigegerät (z.B. einer Maus oder Kopf-Tracker) und gok ein.

5. Probieren Sie die Autovervollständigung und die Wortvorhersage-Funktion von gok aus.

6. Verifizieren Sie, dass gok die Knöpfe für Menüs und Werkzeugleisten abhängig von der Art der Anwendung ein- und ausschaltet; die Knöpfe für Menüs und Werkzeugleisten sollten zum Beispiel in der Anwendung »Schriftarten-Eigenschaften« ausgeschaltet, aber in der Anwendung Gedit eingeschaltet sein.

7. Verifizieren Sie, dass Sie mit der gok-Bildschirmtastatur, die über den Compose-Knopf hervorgerufen werden kann, jeglichen Text in die ausgewählte Anwendung einfügen können; starten Sie Gedit, klicken Sie auf das Textfeld und anschließend auf den Compose-Knopf in gok. Klicken Sie auf die benötigten Tasten auf der Bildschirmtastatur. Die Zeichen sollten im Gedit-Textfeld erscheinen.

8. Verifizieren Sie, dass Sie mit dem Launcher-Knopf das Terminal, den Webbrowser oder Texteditor öffnen können.

9. Verifizieren Sie, dass Sie mit dem Activate-Knopf alle momentan laufenden Anwendungen auf dem Schreibtisch ansteuern können, einschließlich der GNOME-Leisten und GNOME-Arbeitsumgebung.

10. Verifizieren Sie, dass Sie mit dem Menus-Knopf alle verfügbaren Menüs in der aktuellen Anwendung auflisten können. Verifizieren Sie, dass durch Klicken auf einen Menüknopf alle Untermenüs und Menüelemente in den Untermenüs angezeigt werden. Verifizieren Sie weiterhin, dass durch Klicken auf ein Menüelement dieses aktiviert wird. Klicken Sie zum Beispiel auf die Hilfebrowser-Anwendung und anschließend auf den Menüs-Knopf. Das gok-Fenster sollte nun die Knöpfe Datei, Gehe zu und Hilfe anzeigen (also die Menüs von Hilfebrowser). Klicken Sie auf Datei. Es sollten nun die Menüelemente Neues Fenster und Fenster schließen angezeigt werden.

11. Verifizieren Sie, dass Sie mit dem Werkzeugleisten-Knopf alle verfügbaren Knöpfe in der Werkzeugleiste der Anwendung auflisten können. Klicken Sie zum Beispiel auf die Anwendung Hilfebrowser und anschließend auf den Knopf Werkzeugleisten. Das gok-Fenster sollte nun die Knöpfe Zurück, Nächste und Home anzeigen.

12. Verifizieren Sie, dass Sie mit dem UI Grab-Knopf alle Knöpfe im ausgewählten Anwendungsfenster anzeigen lassen können. Öffnen Sie zum Beispiel die Anwendung »Schriftarten-Eigenschaften« und klicken Sie auf UI Grab im gok-Fenster. Das gok-Fenster sollte nun die Namen der Knöpfe in der Anwendung anzeigen: Serifen, Serifenlos, Schließen und Hilfe.

### Accerciser

Accerciser und die GNOME-Barrierefreiheits-Architektur

Accerciser ist ein in Python geschriebenes Programm zur Untersuchung der Barrierefreiheit für die GNOME-Arbeitsumgebung. Es benutzt AT-SPI zum Inspizieren und Steuern von Widgets. So können Sie überprüfen, ob eine Anwendung korrekte Informationen für Hilfstechnologie und automatisierte Testumgebungen bereitstellt. Accerciser verfügt über eine einfache Plugin-Schnittstelle, die Sie zur Erstellung eigener Ansichten auf Barrierefreiheitsinformationen nutzen können. Die vollständige Dokumentation finden Sie im offiziellen Accerciser-Handbuch. Für eine Demonstration von Accerciser und PyATSPI (Python-Schnittstelle für den Zugriff auf und Verwendung von AT-SPI) lesen Sie bitte diesen Artikel. Eine exzellente Beschreibung vom Autor selbst finden Sie im Artikel Make Your Application Accessible with Accerciser.

Accerciser ist ein effektiver Ersatz für das ältere at-poke-Werkzeug.