<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
<!ENTITY gnomeversion "2.24">
<!ENTITY manrevision "2.24.0">
<!ENTITY date "September 2008">
<!ENTITY LEGAL SYSTEM "legal.xml">
<!ENTITY gad SYSTEM "gad.xml">
<!ENTITY gtest SYSTEM "gtest.xml">
]>
<?db.chunk.max_depth 4?>
<book id="index" lang="es">
<title>Guía de accesibilidad para los desarrolladores de GNOME</title>
<bookinfo>
<abstract role="description">
<para>La Guía de accesibilidad de GNOME es para desarrolladores que quieren asegurarse de que sus esfuerzos de programación son accesibles a la mayoría de usuarios. Esta guía también cubre muchos de los requisitos de la Sección 508.</para>
</abstract>
<copyright> 
<year>2008</year>
<holder>Vincent Alexander</holder>
</copyright>
<copyright> 
<year>2001, 2002</year>
<holder>Calum Benson, Brian Cameron, Bill Haneman, Padraig O'Briain, Sharon Snider</holder>
</copyright><copyright><year>2009-2010</year><holder>Jorge González (jorgegonz@svn.gnome.org)</holder></copyright><copyright><year>2010</year><holder>Francisco Javier F. Serrador (fserrador@gmail.com)</holder></copyright><copyright><year>2011</year><holder>Daniel Mustieles (daniel.mustieles@gmail.com)</holder></copyright>
<publisher role="maintainer"> 
<publishername>Proyecto de documentación de GNOME</publishername> 
</publisher>
<legalnotice id="legalnotice">
<para>Se concede permiso para copiar, distribuir o modificar este documento según las condiciones de la GNU Free Documentation License (GFDL), Versión 1.1 o cualquier versión posterior publicada por la Free Software Foundation sin Secciones invariantes, Textos de portada y Textos de contraportada. Encontrará una copia de la GFDL en este <ulink type="help" url="ghelp:fdl">enlace</ulink> o en el archivo COPYING-DOCS distribuido con este manual.</para>
<para>Este manual es parte de la colección de manuales GNOME distribuidos bajo el GFDL. Si quiere distribuir este manual separadamente de la colección, puede hacerlo añadiendo una copia de la licencia al manual, como está descrito en la sección 6 de la licencia.</para>
<para>Muchos de los nombres utilizados por las empresas para distinguir sus productos y servicios se consideran marcas comerciales. Cuando estos nombres aparezcan en la documentación de GNOME, y siempre que se haya informado a los miembros del Proyecto de documentación de GNOME de dichas marcas comerciales, los nombres aparecerán en mayúsculas o con las iniciales en mayúsculas.</para>
<para>ESTE DOCUMENTO Y LAS VERSIONES MODIFICADAS DEL MISMO SE PROPORCIONAN SEGÚN LAS CONDICIONES ESTABLECIDAS EN LA LICENCIA DE DOCUMENTACIÓN LIBRE DE GNU (GFDL) Y TENIENDO EN CUENTA QUE: <orderedlist>
<listitem>
<para>EL DOCUMENTO SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, NI EXPLÍCITA NI IMPLÍCITA INCLUYENDO, SIN LIMITACIÓN, GARANTÍA DE QUE EL DOCUMENTO O VERSIÓN MODIFICADA DE ÉSTE CAREZCA DE DEFECTOS COMERCIALES, SEA ADECUADO A UN FIN CONCRETO O INCUMPLA ALGUNA NORMATIVA. TODO EL RIESGO RELATIVO A LA CALIDAD, PRECISIÓN Y UTILIDAD DEL DOCUMENTO O SU VERSIÓN MODIFICADA RECAE EN USTED. SI CUALQUIER DOCUMENTO O VERSIÓN MODIFICADA DE AQUÉL RESULTARA DEFECTUOSO EN CUALQUIER ASPECTO, USTED (Y NO EL REDACTOR INICIAL, AUTOR O CONTRIBUYENTE) ASUMIRÁ LOS COSTES DE TODA REPARACIÓN, MANTENIMIENTO O CORRECCIÓN NECESARIOS. ESTA RENUNCIA DE GARANTÍA ES UNA PARTE ESENCIAL DE ESTA LICENCIA. NO SE AUTORIZA EL USO DE NINGÚN DOCUMENTO NI VERSIÓN MODIFICADA DE ÉSTE POR EL PRESENTE, SALVO DENTRO DEL CUMPLIMIENTO DE LA RENUNCIA;Y</para>
</listitem>
<listitem>
<para>EN NINGUNA CIRCUNSTANCIA NI SEGÚN NINGÚN ARGUMENTO LEGAL, SEA POR MOTIVOS CULPOSOS (INCLUIDA LA NEGLIGENCIA), CONTRACTUALES O DE OTRO TIPO, NI EL AUTOR, NI EL REDACTOR INICIAL, NI CUALQUIER COLABORADOR, NI CUALQUIER DISTRIBUIDOR DEL DOCUMENTO O VERSIÓN MODIFICADA DEL MISMO, NI CUALQUIER PROVEEDOR DE CUALQUIERA DE DICHAS PARTES, SERÁN RESPONSABLES, ANTE NINGÚN TERCERO, DE NINGÚN DAÑO O PERJUICIO DIRECTO, INDIRECTO, ESPECIAL, INCIDENTAL O CONSIGUIENTE DE NINGÚN TIPO, INCLUIDOS, SIN LIMITACIÓN, LOS DAÑOS POR PÉRDIDA DE FONDO DE COMERCIO, INTERRUPCIÓN DEL TRABAJO, FALLO O MAL FUNCIONAMIENTO INFORMÁTICO, NI CUALQUIER OTRO DAÑO O PÉRDIDA DERIVADOS DEL USO DEL DOCUMENTO Y LAS VERSIONES MODIFICADAS DEL MISMO, O RELACIONADO CON ELLO, INCLUSO SI SE HABÍA COMUNICADO A AQUELLA PARTE LA POSIBILIDAD DE TALES DAÑOS.</para>
</listitem>
</orderedlist></para>
</legalnotice>
 
<authorgroup> 
<author>
<firstname>Vincent</firstname>
<surname>Alexander</surname>
<affiliation>
<orgname>Proyecto de documentación de GNOME</orgname>
</affiliation>
</author>
<author>
<firstname>Calum</firstname>
<surname>Benson</surname>
<affiliation>
<orgname>Proyecto de documentación de GNOME</orgname>
</affiliation>
</author>
<author>
<firstname>Brian</firstname>
<surname>Cameron</surname>
<affiliation>
<orgname>Proyecto de documentación de GNOME</orgname>
</affiliation>
</author>
<author> 
<firstname>Bill</firstname>
<surname>Haneman</surname>
<affiliation>
<orgname>Proyecto de documentación de GNOME</orgname>  
</affiliation>
</author>
<author>
<firstname>Padraig</firstname> 
<surname>O'Briain</surname> 
<affiliation> 
<orgname>Proyecto de documentación de GNOME</orgname>  
</affiliation> 
</author> 
<author> 
<firstname>Sharon</firstname> 
<surname>Snider</surname> 
<affiliation> 
<orgname>Proyecto de documentación de GNOME</orgname>  
</affiliation> 
</author>
</authorgroup>
<revhistory>
<revision> 
<revnumber>Guía de accesibilidad para los desarrolladores de GNOME 2.24 V2.24.0</revnumber> 
<date>Septiembre de 2008</date> 
<revdescription> 
<para role="author">Proyecto de documentación de GNOME</para> 
<para role="publisher">Proyecto de documentación de GNOME</para> 
</revdescription> 
</revision>
<revision> 
<revnumber>Guía de accesibilidad para los desarrolladores de GNOME 2.24 V2.24.0</revnumber> 
<date>Septiembre de 2008</date> 
<revdescription> 
<para role="author">Proyecto de documentación de GNOME</para> 
<para role="publisher">Proyecto de documentación de GNOME</para> 
</revdescription> 
</revision>
</revhistory>
<releaseinfo>Este manual describe la versión 2.24 del Escritorio GNOME.</releaseinfo>
<legalnotice> 
<title>Comentarios</title> 
<para>Para informar de un error o hacer una sugerencia respecto al Escritorio GNOME o este manual, siga las indicaciones en la <ulink type="help" url="ghelp:user-guide?feedback">Página de comentarios de GNOME</ulink>.</para>
</legalnotice> 
</bookinfo>
<chapter id="gad" status="draft">
<title>¿Qué es la accesibilidad?</title>
<para>Accesibilidad significa ayudar a que gente con discapacidades participe en las actividades sustanciales de la vida. Esto incluye trabajo, el uso de servicios, productos e información. GNOME incluye bibliotecas y soporte para entorno de trabajo que permite que personas con discapacidades utilicen toda la funcionalidad del entorno de usuario de GNOME.</para>
<para>Junto con las tecnologías de asistencia si es necesario (interfaces de voz, pantallas de lector, dispositivos de entrada alternativos, y similares) gente con discapacidades permanentes o temporales puede usar el escritorio y las aplicaciones de GNOME. Las tecnologías de asistencia también son útiles para gente que usa los equipos fuera de su casa u oficina. Por ejemplo, si está en un atasco de tráfico puede utilizar la entrada y salida de voz para comprobar su correo electrónico.</para>
<para>Las tecnologías de asistencia reciben información desde aplicaciones a través del API de las Herramientas de accesibilidad, que puede encontrar en el módulo de atk en el repositorio de GNOME. Debido a que el soporte de accesibilidad API está construido dentro de los widgets de GNOME, su programa GNOME debería funcionar razonablemente bien con las tecnologías de asistencia sin ningún trabajo adicional por su parte. Por ejemplo, las tecnologías de asistencia pueden leer automáticamente las etiquetas de los widgets que generalmente establecerá en su programa (ej. con las llamadas a funciones de GTK tales como <function>gtk_label_set_text()</function> o <function>gtk_button_new_with_label()</function>). También pueden encontrarse si hay cualquier descripción de texto asociada con un widget, y usarlo para describir el widget al usuario.</para>
<para>Con un poco de esfuerzo adicional puede hacer que su programa funcione aún más suavemente con tecnologías de asistencia. Además de ayudar a usuarios individuales, también hará que su producto sea más atractivo en el mercados del gobierno y educativo, muchos de los cuales ahora requieren que sus aplicaciones sean accesibles por ley.</para>

<section>
<title>Tipos de discapacidades</title>
<para>Sólo en los EE. UU. existe una estimación de 30 000 000 personas cuya capacidad para usar equipos puede estar comprometida por un diseño inaccesible. Globalmente alrededor del 8% de la población que usa Internet tiene algún tipo de discapacidad. Las discapacidades pueden ser de una de estas categorías:</para>
<itemizedlist>
<listitem>
<para><emphasis>Discapacidades visuales</emphasis>: estos pueden ir desde baja visión (incluyendo visión borrosa o nublada, visión extrema de hipermetropía o miopía, daltonismo, y visión de túnel, entre otros) hasta la ceguera completa. Una pobre elección del tamaño y color del texto, y tareas que implican una buena coordinación mano-ojo (tales como mover el ratón) pueden causan problemas para estos usuarios.</para>
</listitem>
<listitem>
<para><emphasis>Discapacidades de movimiento</emphasis>: los usuarios con un control pobre o debilidad en sus músculos pueden encontrar muy difícil usar un teclado estándar o un ratón. Por ejemplo, pueden ser incapaces de mantener pulsadas dos teclas a la vez, o pueden ser más propensos a pulsar teclas accidentalmente.</para>
</listitem>
<listitem>
<para><emphasis>Deficiencias auditivas</emphasis>: éstas pueden variar desde ser capaz de oír algunos sonidos pero no distinguir las palabras habladas, hasta sordera profunda. Las aplicaciones que comunican información importante exclusivamente a través del sonido pueden causar problemas para estos usuarios.</para>
</listitem>
<listitem>
<para><emphasis>Trastornos Cognitivos y del Lenguaje</emphasis> - éstas pueden ir desde la dislexia a las dificultades para recordar cosas, resolver problemas o comprender y utilizar el lenguaje hablado o escrito. Es difícil la exposición compleja o inconsistente, o la selección pobre de palabras usando ordenadores para estos usuarios.</para>
</listitem>
<listitem>
<para><emphasis>Trastornos convulsivos</emphasis>: cierta luz o patrones de sonido pueden causar ataques epilépticos en algunos usuarios susceptibles.</para>
</listitem>
</itemizedlist>
</section>

<section id="gad-how-it-works">
<title>Cómo funciona la accesibilidad en GNOME</title>
<para>El Kit de herramientas de accesibilidad (ATK) describe un grupo de interfaces que necesita ser implementado por los componentes IGU para hacerlos accesibles. Los interfaces son conjuntos de herramientas independientes; las implementaciones se pueden escribir para cualquier conjunto de widgets, como GTK, Motif o Qt.</para>
<para>La implementación para los widgets GTK está en un módulo llamado GAIL («GNOME Accessibility Implementation Library», Biblioteca de implementación de accesibilidad de GNOME), cargada dinámicamente, en tiempo de ejecución, por una aplicación GTK. Una vez cargadas, dichas partes de su aplicación que usan widgets estándar GTK tendrán un nivel básico de accesibilidad, sin tener que modificar nada de su aplicación. Si no se carga GAIL, los widgets GTK tendrán una implementación de accesibilidad predeterminada que esencialmente no devuelve ninguna información, aunque nominalmente se ajusta la API de ATK. Las aplicaciones que usan controladores Bonobo, particularmente aquellas fuera del proceso, también cargan códigos para el soporte de accesibilidad desde el módulo libgail-gnome. Que las aplicaciones del escritorio GNOME carguen automáticamente estas bibliotecas de soporte para la accesibilidad depende del valor de una clave de <application>gconf</application>, «/desktop/gnome/interface/accessibility»; un valor booleano cierto activa el soporte para las tecnologías de asistencia y las aplicaciones que llaman a gnome_program_init que cargará automáticamente librerías de accesibilidad en tiempo de carga. Las «aplicaciones GTK puras» por ejemplo, aquellas que usan gtk+ pero no enlazan libgnome, dependen del valor de la variable de entorno GTK_MODULES, las cual debe establecerse a «gail:atk-bridge» para activar el soporte de las tecnologías de asistencia.</para>
<para>La mayoría de las tecnologías de asistencia que funcionan en otros escritorios históricamente han encontrado necesario mantener un modelo complejo fuera de la pantalla de las aplicaciones del escritorio, basada en fisgonear los eventos del S.O., uso de S.O. no soportados y características de la aplicación y API y otras técnicas altamente no portables. Esto ha hecho que el apoyo tecnológico de la ayuda sea un poco frágil y la aplicación específica del S.O., incluso específicos de la aplicación de versiones. Por el contrario, en el escritorio GNOME, toda la información requerida por las TA lo proporcionan las aplicaciones en ejecución, a través del marco de accesibilidad de GNOME, un conjunto de herramientas independientes de la interfaz de proveedor de servicios (SPI). El SPI proporciona medios de TA basados en UNIX, tales como lectores de pantalla y magnificadores de pantalla, para obtener información sobre la accesibilidad de la ejecución de aplicaciones a través de una API consistente y estable, y en muchos casos puede eliminar la necesidad de un modelo fuera de la pantalla. El soporte de accesibilidad para las solicitudes está «incluída» en los kits de herramientas de aplicaciones a través del conjunto del API de herramientas adecuadas (por ejemplo, ATK para la mayoría de las aplicaciones nativas de C y el API de accesibilidad de Java para las aplicaciones Java), y exportados al interfaz común «AT-SPI» a través del correspondiente «bridge» (vea el diagrama abajo).</para>
<figure id="gad-architecture">
<title>Arquitectura de accesibilidad de GNOME</title>
<mediaobject>
<imageobject>
<imagedata fileref="figures/GNOME_desktop_Accessibility.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Diagrama de la arquitectura de accesibilidad en GNOME</phrase>
</textobject>
</mediaobject>
</figure>
<para>El soporte integrado de accesibilidad de GNOME significa que las aplicaciones creadas utilizando los widgets obtienen soporte para ñas tecnologías de asistencia de forma predeterminada, siempre que los widgets no se utilicen de forma inusual utilizan y entre en conflicto con este soporte integrado.</para>
<para>Un widget de GTK+/GNOME es accesible si su uso sigue las directrices de accesibilidad general en otras partes de este documento, e implementa los interfaces de ATK apropiadamente para su rol en el interfaz del usuario. La implementaciones de ATK se proporcionan para el kit de herramientas de los widgets de GNOME llamado «stock» (ej. GTK+ no obsoleto y los widgets de GNOME), y en muchos casos los widgets nuevos que derivan tribialmente desde los widgets de GTK+ y GNOME existentes que también heredarán el soporte adecuado de accesibilidad.</para>
<para>Aunque el soporte integrado de accesibilidad de GNOME proporciona una funcionalidad significativa, sin cambios de código específicos de accesibilidad en la parte de la aplicación, a menudo las aplicaciones puede mejorar sus descripciones predeterminadas que proporcionan algunos de los «widgets», y adaptarlas para algunos de los widgets específicos de su aplicación, a través de llamadas directas a los métodos de ATK en la aplicación. Por ejemplo, en la mayoría de los casos las solicitudes deben añadir o cambiar las descripciones textuales de los widgets con la llamada de función apropiada de ATK, de forma que una tecnología de asistencia puede describir su finalidad o del estado para el usuario. Para obtener más información consulte las <link linkend="gad-coding-guidelines">Instrucciones de programación para soporte de accesibilidad</link>.</para>
<para>Si su aplicación usa widgets personalizados, puede que tenga que hacer algún trabajo para exponer las propiedades de los widgets para las tecnologías de asistencia. Para obtener más información, consulte <link linkend="gad-custom">Creación de componentes personalizados accesibles</link> y <link linkend="gad-api-examples">Ejemplos de uso de la API de accesibilidad</link>.</para>
<para>Para obtener información en mayor profundidad acerca de GTK/GTK+, consulte el <ulink url="http://library.gnome.org/devel/gtk">Manual de referencia de GTK+</ulink>, <ulink url="http://live.gnome.org/GAP/AtkGuide/Gtk">la sección de GTK de la Guía de ATK</ulink>, la organización para GNOME del <ulink url="http://library.gnome.org/devel/gtk-tutorial/stable/">Tutorial de GTK+ 2.0</ulink> y las <ulink url="http://library.gnome.org/devel/gtk-faq/stable/">P+F de GTK+</ulink>.</para>
</section>

<section id="dev-start">
<title>Inicio rápido para desarrolladores</title>
<para>Aquí hay algunos puntos comunes de inicio:</para>

<section id="dev-start-1">
<title>¿Cómo compruebo si mi aplicación es accesible o no?</title>
<para>Para comenzar correctamente, consulte <link linkend="gad-overview">Programación de una aplicación accesible para GNOME - Información general</link>. Para obtener una perspectiva pre-codificación, consulte las <link linkend="gad-ui-guidelines">Directrices de interfaz de usuario para el soporte de accesibilidad</link> o <link linkend="gad-coding-guidelines">Instrucciones de codificación de apoyo de accesibilidad</link>. Para obtener una lista de elementos de prueba de post-diseño consulte la <link linkend="gad-checklist">Lista de comprobación de la interfaz de usuario</link>.</para>
</section>

<section id="dev-start-2">
<title>¿Cuáles son las principales dificultades?</title>
<para>La <link linkend="gad-checklist">lista de comprobación del interfaz de usuario</link> cubre todas las áreas y algunas veces ignoradas en la fase de diseño.</para>
</section>

<section id="dev-start-3">
<title>¿Cómo hago cosas ATK comunes?</title>
<para>Una lista abreviada de llamadas a ATK se puede encontrar <link linkend="gad-api">aquí</link>.</para>
</section>

<section id="dev-start-4">
<title>¿Cómo hago cosas ATK complejas?</title>
<para>Para obtener más información consulte <link linkend="gad-custom">Hacer los componentes personalizados accesibles</link> y <link linkend="gad-api-examples">Ejemplos que usano la API de accesibilidad</link>.</para>
</section>

<section id="dev-start-5">
<title>Introducción a ATK, AT-SPI, GAIL y GTK+</title>
<screenshot>
<mediaobject>
<imageobject>
<imagedata fileref="figures/gaa.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Arquitectura de accesibilidad de GNOME</phrase>
</textobject>
</mediaobject>
</screenshot>
<para>ATK es el kit de herramientas que usa GNOME para activar la accesibilidad para usuarios que necesiten un soporte adicional para sacar el mayor rendimiento de sus equipos. ATK lo usan herramientas tales como los lectores de pantalla, magnificadores y dispositivos de entrada para permitir una interacción rica con el escritorio a través de medios alternativos. Para obtener más información, consulte el <ulink url="http://java-gnome.sourceforge.net/4.0/doc/api/org/gnome/atk/package-summary.html">Proyecto ATK en SourceForge</ulink> y la <ulink url="http://library.gnome.org/devel/atk/stable/atk.html">biblioteca de ATK</ulink>.</para>
<para>AT-SPI es el servicio primario de interfaz por el que las tecnologías de asistencia solicitan y reciben notificaciones desde las aplicaciones en ejecución. Puede examinar la API <ulink url="http://library.gnome.org/devel/at-spi-cspi/stable/">aquí</ulink>. Existe material adicional disponible en la <ulink url="http://accessibility.kde.org/developer/atk.php#coreclasses">Comunidad de desarrollo de accesibilidad de KDE</ulink>.</para>
<para>GAIL («GNOME Accessibility Implementation Library», Biblioteca de implementación de accesibilidad de GNOME) es una implementación de las interfaces de accesibilidad definidas por ATK. GTK es un grupo de herramientas que ya está mapeado para ATK por el módulo de GAIL. Puede encontrar la licencia, la descarga y otra información <ulink url="http://www.t2-project.org/packages/gail.html">aquí</ulink>. El <ulink url="ftp://ftp.gnome.org/pub/GNOME/sources/gail/">código fuente de GAIL</ulink> también sirve como un tutorial excelente para el uso avanzado de ATK. Además, puede interesarle el <ulink url="http://library.gnome.org/devel/gail-libgail-util/stable/">Manual de Referencia de GAIL</ulink>.</para>
<para>GTK+ es una biblioteca para crear interfaces gráficas de usuario. Funciona en muchas plataformas UNIX, Windows y en dispositivos de framebuffer. GTK + se publica bajo la Licencia General Pública de GNU (GNU LGPL), la cual permite que la concesión flexible de licencias de aplicaciones cliente. GTK+ tiene una arquitectura basada en C orientada a objetos que proporciona una flexibilidad máxima. Se han escrito «bindings» para otros lenguajes, incluyendo C++, Objective-C, Guile/Scheme, Perl, Python, TOM, Ada95, Free Pascal y Eiffel.</para>
<para>Para obtener información en mayor profundidad acerca de GTK/GTK+, consulte el <ulink url="http://library.gnome.org/devel/gtk">Manual de referencia de GTK+</ulink>, <ulink url="http://live.gnome.org/GAP/AtkGuide/Gtk">la sección de GTK de la Guía de ATK</ulink>, la organización para GNOME del <ulink url="http://library.gnome.org/devel/gtk-tutorial/stable/">Tutorial de GTK+ 2.0</ulink> y las <ulink url="http://library.gnome.org/devel/gtk-faq/stable/">P+F de GTK+</ulink>.</para>
</section>
</section>

<section id="gad-overview">
<title>Hacer que una aplicación de GNOME sea accesible: Visión general</title>
<para>Si su aplicación sólo usa los widgets estándar de GTK, probablemente tendrá poco o nada que hacer para hacer (razonablemente) accesible su aplicación. Pero cuidado con los objetos de la interfaz gráfica de usuario que no tienen una descripción textual asociada a ellos, tales como botones gráficos o indicadores de estado que no tienen etiquetas o información sobre herramientas.</para>
<para>Probablemente también pueda mejorar las descripciones predeterminadas para algunos de los widgets, y adaptarlos a propósito específico del widget en su aplicación. Podría añadir o cambiar las descripciones textuales para estos widgets con la llamada de función ATK apropiada, de forma que una tecnología de asistencia puede describir su propósito o estado al usuario. Consulte las <link linkend="gad-coding-guidelines">Guías de codificación para soportar accesibilidad</link> para obtener más información.</para>
<para>Si su aplicación usa widgets personalizados, puede tener que trabajar un poco para exponer las propiedades de los widgets para las tecnologías de asistencia. Consulte <link linkend="gad-custom">Creación de componentes personalizados accesibles</link> y <link linkend="gad-api-examples">Ejemplos que usan la API de accesibilidad</link> para obtener más información. Puede encontrar información adicional detallada en la presentación de Marc Mulcahy's 2002 GUADEC, <ulink url="http://developer.gnome.org/projects/gap/presentations/GUAD3C/making-apps-accessible/start.html">"Making GNOME Applications Accessible".</ulink></para>
</section>

<section id="gad-coding-guidelines">
<title>Guías de programación para soporte de accesibilidad</title>
<para>Aquí hay algunas cosas que puede codificar para hacer que su programa trabaje tan bien como sea posible con las tecnologías de asistencia. (Puede encontrar una lista de cosas que tener en cuenta cuando diseñe su IGU en la sección <link linkend="gad-ui-guidelines">Guías de la interfaz de usuario para soportar accesibilidad</link> más tarde en sus documentos):</para>
<itemizedlist>
<listitem>
<para>Para los componentes que no muestren una cadena corta (tales como un botón gráfico), especifique un nombre para ellos con <function>atk_object_set_name()</function>. Puede querer hacerlo para botones con imagen exclusivamente, paneles que proporcionen agrupaciones lógicas, áreas de texto y demás.</para>
</listitem>
<listitem>
<para>Si no puede proporcionar una sugerencia para un componente, use <function>atk_object_set_description()</function> en su lugar para proporcionar una descripción que las tecnologías de asistencia puedan proporcionar al usuario. Por ejemplo, para proporcionar una descripción accesible para un botón <function>Cerrar</function>.</para>
<example>
<title>Proporcionar una descripción accesible para un GtkButton</title>
<programlisting>
{
  AtkObject *obj;
  obj = gtk_widget_get_accessible(button);
  atk_object_set_description(obj,_("Cierra la ventana"));
}
</programlisting>
</example>
</listitem>
<listitem>
<para>Use <function>atk_image_set_description()</function> para proporcionar una descripción de texto para todas las imágenes e iconos de su programa.</para>
</listitem>
<listitem>
<para>Si varios componentes forman un grupo lógico, intente ponerlos en un contenedor.</para>
</listitem>
<listitem>
<para>Cuando tenga una etiqueta que describe otro componente, utilice <function>atk_relation_set_add_relation()</function> para que la tecnología de asistencia pueda encontrar el componente con el que la etiqueta está asociada. (Si asocia la etiqueta con el componente usando <function>gtk_label_set_mnemonic_widget()</function>, generalmente la relación de <constant>ATK_RELATION_LABEL_FOR</constant> se genera automáticamente, así que el siguiente código podría no ser necesario):</para>
<example>
<title>Relacionar un GtkLabel con un GtkWidget</title>
<programlisting>
{
  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));
}
</programlisting>
</example>
</listitem>
<listitem>
<para>Si crea un widget personalizado, asegúrese que soporta accesibilidad. Los componentes personalizados que descienden de otros widgets GTK deben reemplazar la información heredada de accesibilidad según sea necesario. Para obtener más información, consulte la <link linkend="gad-custom">Creación de componentes accesibles personalizados</link>.</para>
</listitem>
<listitem>
<para>No rompa lo que consigue gratis. Si su IGU tiene un contenedor inaccesible, cualquier componente dentro de ese contenedor puede resultar inaccesible.</para>
</listitem>
</itemizedlist>
</section>

<section id="gad-api">
<title>La API de accesibilidad</title>
<para>Aquí hay unas pocas llamadas básicas de la API que puede necesitar usar en sus aplicaciones para asegurarse que funciona bien con la tecnología de asistencia. La API completa de accesibilidad es extensible, para permitirle escribir sus propios widgets personalizados de accesibilidad, por ejemplo.</para>
<table frame="all">
<title>Llamadas a la API de ATK comúnmente usadas</title>
<tgroup cols="2" align="left">
<thead>
<row>
<entry>API</entry>
<entry>Descripción</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<para>
<function>AtkObject* gtk_widget_get_accessible (GtkWidget*)</function>
</para>
</entry>
<entry>
<para>Devuelve a una tecnología accesible el objeto accesible que describe el widget GTK especificado.</para>
</entry>
</row>
<row>
<entry>
<para>
<function>void atk_object_set_name (AtkObject*, const gchar*)</function>
</para>
</entry>
<entry>
<para>Establece el nombre del objeto accesible. Por ejemplo, si el objeto es un botón gráfico que sale de la aplicación al pulsarlo, el nombre puede ser «Salir».</para>
</entry>
</row>
<row>
<entry>
<para>
<function>void atk_object_set_description (AtkObject*, const gchar*)</function>
</para>
</entry>
<entry>
<para>Establece la descripción textual del objeto accesible. Por ejemplo, si el objeto es un botón gráfico «Cerrar», la descripción puede ser «Cierra la ventana».</para>
</entry>
</row>
<row>
<entry>
<para>
<function>AtkRelation* atk_relation_new (AtkObject**, gint, AtkRelationType)</function>
</para>
</entry>
<entry>
<para>Crea una nueva relación entre la clave especificada y la lista especificada de objetos de destino. Generalmente una relación indica a las tecnologías de asistencia que un widget está relacionado, de alguna forma, con otro. Por ejemplo, que un widget GtkLabel en particular es el título de un GtkTreeView en la misma ventana.</para>
</entry>
</row>
<row>
<entry>
<para>
<function>void atk_image_set_description (AtkImage*, const gchar*)</function>
</para>
</entry>
<entry>
<para>Establece la descripción textual del objeto de la imagen accesible. Por ejemplo, si el objeto es una miniatura de un escritorio virtual en una miniaplicación del panel, la descripción puede ser «Imagen mostrando la organización de las ventanas en el escritorio 1».</para>
</entry>
</row>
</tbody>
</tgroup>
</table>
</section>

<section id="gad-api-examples">
<title>Ejemplos que usan la API de accesibilidad</title>
<para>Como se indicó anteriormente, podría tener poco o nada de trabajo para hacer su aplicación accesible si usa el conjunto de widgets de GTK, o cualquier otra biblioteca de widgets que implemente las interfaces de ATK. Las dos cosas más comunes que debe hacer en este caso son:</para>
<itemizedlist>
<listitem>
<para>proporcione descripciones de algunos controles e imágenes usando <function>atk_object_set_description()</function> o <function>atk_image_set_description():</function></para>
<example>
<title>Establecer la descripción accesible para un botón</title>
<programlisting>
{
   AtkObject *obj;
   obj = gtk_widget_get_accessible(button);
   atk_object_set_description(obj,_("Abre el diálogo de preferencias"));
}
</programlisting>
</example>
<para>
</para>
</listitem>
<listitem>
<para>Especifique la relación entre cualquier agrupación inusual de widgets usando <function>atk_relation_new()</function> y <function>atk_relation_set_add()</function>:</para>
<example>
<title>Especificar la relación accesible entre dos controles</title>
<programlisting>
{
  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));
}
</programlisting>
</example>
</listitem>
</itemizedlist>
<para>Los ejemplos en el resto de esta sección son mayoritariamente para que se haga una idea del alcance de ATK. Cubren técnicas que puede que nunca necesite usar como desarrollador de una aplicación, aunque pueden ser de interés si está escribiendo su propia modificación de los widgets (consulte <link linkend="gad-custom">Construir componentes accesibles personalizados</link>) o si quiere escribir una aplicación de tecnología asistida. Sea cual sea el propósito, los servicios del <ulink url="ftp://ftp.gnome.org/pub/GNOME/sources/gail/">código fuente de GAIL</ulink> son un excelente tutorial para conocer el uso avanzado de ATK.</para>

<section>
<title>Módulos GTK</title>
<para>Los programas que hacen uso de GAIL (la biblioteca de implementación de accesibilidad para los widgets de GTK) se escriben como módulos de GTK. Los módulos de GTK se cargan en el espacio del programa si la variable de entorno <varname>GTK_MODULES</varname> especifica el nombre o los nombres de la biblioteca del módulo. Si hay varias bibliotecas de módulos, sepárelas con dos puntos (:). Por ejemplo:</para>
<para>
<userinput>setenv GTK_MODULES "libgail:libtestprops"</userinput>
</para>
<para>Todos los módulos GTK tienen una función <function>gtk_module_init()</function>.</para>
</section>

<section>
<title>Obtener la información de accesibilidad de una aplicación</title>
<para>Un programa que quiera hacer llamadas ATK debería hacer una, o más, de las siguientes:</para>
<orderedlist>
<listitem>
<para>Crear un vigilante de eventos, por ejemplo con la función <function>atk_add_focus_tracker()</function>:</para>
<programlisting>atk_add_focus_tracker (_my_focus_tracker);</programlisting>
<para>donde <function>_my_focus_tracker()</function> es una función con este prototipo:</para>
<programlisting>void _my_focus_tracker (AtkObject *aobject);</programlisting>
</listitem>
<listitem>
<para>Configurar un detector de eventos globales, con atk_add_global_event_listener():</para>
<programlisting>
mouse_watcher_focus_id =   atk_add_global_event_listener(_my_global_listener,"Gtk:GtkWidget:enter_notify_event");
</programlisting>
<para>donde <function>_my_global_listener</function> tiene el prototipo de un <type>GSignalEmissionHook</type> de Glib . Este ejemplo podría hacer que la función <function>_my_global_listener()</function> se llamara cada vez que ocurra una señal «enter_notify_even» en un objeto <type>GtkWidget</type>.</para>
</listitem>
<listitem>
<para>Acceder al objeto ATK de nivel superior con la siguiente llamada de función.</para>
<programlisting>AtkObject *root_obj = atk_get_root();</programlisting>
<para>Esto devuelve un <type>AtkObject</type> que contiene todos las ventanas de nivel superior del programa en ejecución. El usuario puede navegar a través de la jerarquía de objetos accediendo a la raíz de los objetos hijos, que con las ventanas del nivel superior.</para>
</listitem>
</orderedlist>
</section>

<section>
<title>Preguntar a la interfaz de un <type>AtkObject</type></title>
<para>Una vez localizado el tipo <type>AtkObject</type> asociado a un objeto en la aplicación (ej. usando <function>gtk_widget_get_accessible()</function>), puede averiguar qué interfaces implementa de varias formas:</para>
<orderedlist>
<listitem>
<para>Use las macros proporcionadas <function>ATK_IS_...</function>, por ejemplo:</para>
<itemizedlist>
<listitem>
<para>
<function>ATK_IS_ACTION(atkobj)</function>
</para>
</listitem>
<listitem>
<para>
<function>ATK_IS_COMPONENT(atkobj)</function>
</para>
</listitem>
<listitem>
<para>etc. (existe uno para cada interfaz)</para>
</listitem>
</itemizedlist>
<para>Si la macro devuelve <function>TRUE</function>, las llamadas a la interfaz se pueden hacer de forma segura sobre ese objeto ATK.</para>
</listitem>
<listitem>
<para>Prueba del tipo <type>AtkObject</type> llamando la función <function>atk_object_get_role()</function>. Cualquier tipo asignado implementa un número específico de API de ATK.</para>
</listitem>
</orderedlist>
</section>

<section>
<title>Establecer un manejador de señal ATK</title>
<para>Usando la señal <constant>column_inserted</constant> como un ejemplo:</para>
<programlisting>
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);
</programlisting>
<para>Esto hará que se llame a la función <function>_my_table_column_inserted_func()</function> cada vez que se emita una señal «column_inserted» en el <type>AtkObject</type><varname>my_atk_object</varname>.</para>
<para>Conectar a una señal es levemente diferente si la señal del soporte detalles. La señal <constant>children_changed</constant> soporta el detalle <parameter>add</parameter>. Para conectar a una señal cuando el detalle <parameter>add</parameter> también está especificado, se usa esta técnica:</para>
<programlisting>
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); 
</programlisting>
<para>Esto hará que se llame a la función <function>_my_children_changed_func()</function> se siempre que una señal <constant>children_changed</constant> con el detalle <parameter>add</parameter> se emita en el <type>AtkObject</type><varname>my_atk_obj</varname>.</para>
</section>

<section>
<title>Implementar un objeto ATK</title>
<para>Tendrá que implementar sus propios objetos ATK para cualquier widget que todavía no tenga una implementación accesible en GAIL (o en la biblioteca equivalente para otro conjunto de widgets). Esto debería implementarse como un módulo de GTK, que, como antes, debe incluirse en la variable de entorno <envar>GTK_MODULES</envar> ya que se carga en tiempo de ejecución.</para>

<section>
<title>Registro</title>
<para>Para este ejemplo se asume que hay un objeto llamado «GTK_TYPE_MYTYPE». La implementación de ATK se llamará <type>MYATKIMP_TYPE_MYTYPE</type>. Será necesaria una factoría, que se llamará <type>MYATKIMP_TYPE_MYTYPE_FACTORY</type>.</para>
<para>Para registrar una implementación ATK de un objeto GTK, se deben seguir estos pasos en la función <function>gtk_module_init()</function> del módulo:</para>
<orderedlist>
<listitem>
<para>Acceso al registro predeterminado:</para>
<programlisting>
default_registry = atk_get_default_registry();
</programlisting>
</listitem>
<listitem><para>Registrar el objeto ATK en la función <function>gtk_module_init()</function> de este módulo haciendo esta llamada a la función:</para>
<programlisting>
atk_registry_set_factory_type (default_registry, GTK_TYPE_MYTYPE, MYATKIMP_TYPE_MYTYPE_FACTORY); 
</programlisting>
</listitem>
</orderedlist>
<para>Esto registrará la implementación AtkObject de <type>GTK_TYPE_MYTYPE</type> en <type>MYATKIMP_TYPE_MYTYPE_FACTORY</type>. Esta factoría se implementará para que sepa cómo construir objetos de tipo <type>MYATKIMP_TYPE_MYTYPE</type>.</para>
</section>

<section>
<title>Fábrica</title>
<para>La factoría debe ser implementada como un hijo del tipo de clase <type>ATK_TYPE_OBJECT_FACTORY</type> y debe implementar la función <function>create_accessible()</function>.  Esta función debe crear un <type>AtkObject</type> apropiado. Una factoría se puede usar para crear más de un tipo de objeto, en cuyo caso su función <function>create_accessible()</function> necesitará ser suficientemente inteligente para construir y devolver el <type>AtkObject</type> correcto.</para>
</section>

<section>
<title>Implementación ATK para un objeto específico</title>
<para>Todos los <type>GObject</type> implementan una función <function>get_type()</function>. Usando el ejemplo anterior, la convención de nombres para el nombre de esta función sería <function>myatkimp_mytype_get_type()</function>.</para>
<para>En esta función, especifique qué interfaces implementa su objeto. Si la siguiente lógica se incluyese en esta función <function>get_type()</function>, este objeto podría implementar la interfaz del tipo <type>ATK_TEXT</type>:</para>
<example>
<title>Ejemplo de función <function>get_type()</function></title>
<programlisting>
static const GInterfaceInfo atk_text_info = 
{ 
   (GInterfaceInitFunc) atk_text_interface_init, 
   (GInterfaceFinalizeFunc) NULL, 
   NULL 
}; 

g_type_add_interface_static (type, ATK_TYPE_TEXT, 
                             &amp;atk_text_info); 
</programlisting>
</example>
<para>La función <function>atl_text_interface_init()</function>, que tiene el siguiente prototipo, deberá implementarse:</para>
<programlisting>
void atk_text_interface_init (AtkTextIface *iface); 
</programlisting>
<para>Esta función conectará las llamadas de función de interfaz con la implementación específica tal y como sigue:</para>
<example>
<title>Conectar llamadas de interfaz personalizadas con una implementación de un AtkObject</title>
<programlisting>
void 
atk_text_interface_init (AtkTextIface *iface) 
{ 
   g_return_if_fail (iface != NULL); 
   iface-&gt;get_text = myatkimp_mytype_get_text; 
   iface-&gt;get_character_at_offset = myatkimp_mytype_get_character_at_offset; 
   ... 
}
</programlisting>
</example>
<para>Entonces podría ser necesario implementar las funciones <function>myatkimp_mytype_get_text()</function>, <function>myatkimp_mytype_get_character_at_offset()</function>, y el resto de las funciones <type>ATK_TEXT</type> de la interfaz.</para>
</section>

<section>
<title>Implementación de <type>AtkObject</type></title>
<para>Los <type>AtkObject</type> son <type>GObjects</type>, y todos los <type>GObject</type> necesitan especificar la función <function>get_type()</function>. Aquí hay un ejemplo que establece una clase e inicializa una instancia. Esta función <function>get_type()</function> también especifica que el objeto implementa <type>ATK_TEXT</type> y especifica el objeto padre para ser <type>MYATKIMP_MYPARENTTYPE</type>.</para>
<example>
<title>Ejemplo de implementación de <function>get_type()</function></title>
<programlisting>
GType 
myatkimp_mytype_get_type (void) 
{ 
   static GType type = 0; 

   if (!type) 
   { 
      static const GTypeInfo tinfo = 
      { 
         sizeof (GailLabelClass), 
         (GBaseInitFunc) NULL,                              /* inicialización de la base */ 
         (GBaseFinalizeFunc) NULL,                          /* finalización de la base */
         (GClassInitFunc) myatkimp_mytype_class_init,       /* inicialización de la clase */ 
         (GClassFinalizeFunc) NULL,                         /* finalización de la clase */ 
         NULL,                                              /* datos de la clase */ 
         sizeof (GailLabel),                                /* tamaño de la instancia */ 
         0,                                                 /* número de reservas de memoria («preallocs») */ 
         (GInstanceInitFunc) myatkimp_mytype_instance_init, /* inicialización de la instancia */ 
         NULL                                               /* tabla de valores */ 
      }; 

      /* Configurar la estructura atk_text_info usada a continuación */ 
      static const GInterfaceInfo atk_text_info = 
      { 
         (GInterfaceInitFunc) atk_text_interface_init, 
         (GInterfaceFinalizeFunc) NULL, 
         NULL 
      }; 

      /* Establecer el tipo de nombre y especificar el tipo de padre */ 
      type = g_type_register_static (MYATKIMP_MYPARENTTYPE, 
            "MyatkimpMytype", &amp;tinfo, 0); 

      /* Esta clase implementa la interfaz ATK_TYPE_TEXT */ 
      g_type_add_interface_static (type, ATK_TYPE_TEXT, 
                                   &amp;atk_text_info); 
   } 
   return type; 
} 
</programlisting>
</example>
</section>

<section>
<title>Inicializadores de clases/instancias</title>
<para>Deberá tener creada un inicializador de clases para el <type>GObject</type> si su implementación de <type>AtkObject</type>:</para>
<orderedlist>
<listitem>
<para>Redefina cualquier llamada de función por el padre del objeto. Generalmente esto es necesario cuando un objeto necesita implementar una función como <function>atk_object_get_n_accessible_children()</function>. Es necesario si el objeto tiene hijos pero no están representados con los widgets.</para>
<para>Por ejemplo, si su implementación de ATK necesita pasar por encima del tipo <type>AtkObject</type> de la función <function>get_name()</function>, entonces las clases inicializadas podrían ser así:</para>
<example>
<title>Inicializador de clase que sobreescribe la función padre <function>get_name()</function></title>
<programlisting>
myatkimp_mytype_class_init (GailLabelClass *klass) 
{ 
  AtkObjectClass *class = ATK_OBJECT_CLASS (klass); 
  class-&gt;get_name = myatkimp_mytype_get_name; 
} 
</programlisting>
</example>
</listitem>
<listitem><para>Requere una función <function>parent-&gt;init</function>, <function>parent-&gt;notify_gtk</function>, o <function>parent-&gt;finalize</function>. Este ejemplo define las tres:</para>
<example>
<title>Inicializador de clases que define su propia función <function>init()</function>, <function>notify_gtk()</function> y <function>finalize()</function></title>
<programlisting>
static ParentObjectType *parent_class = NULL; 

myatkimp_mytype_class_init (GailLabelClass *klass) 
{ 
   ParentObjectType *parent_class = (ParentObjectType*)klass; 

   /* 
    * Es necesario almacenar en caché «parent_class» si se
    * configuran las funciones init, notify_gtk, o finalize. 
    */ 
    parent_class = g_type_class_ref (MYATKIMP_TYPE_PARENT); 

    parent_class-&gt;init = myatkimp_mytype_widget_init; 
    parent_class-&gt;notify_gtk = myatkimp_mytype_real_notify_gtk; 
    parent_class-&gt;finalize = myatkimp_mytype_finalize; 
}
</programlisting>
</example>
<orderedlist>
<listitem>
<para>parent-&gt;init</para>
<para>Se puede necesitar una función <function>parent-&gt;init()</function> si la implementación de ATK necesita hacer cualquiera de las siguientes:</para> 
<orderedlist>
<listitem>
<para>Cachear cualquier dato obtenido desde un respaldo del widget de GTK.</para>
</listitem>
<listitem>
<para>Escuche cualquier señal desde el widget GTK de respaldo.</para>
</listitem>
</orderedlist>
<para>Aquí hay un ejemplo de ambas:</para>
<example>
<title>Una función <function>init()</function> personalizada</title>
<programlisting>
void 
gail_tree_view_widget_init (MyatkimpMytype  *mytype, 
                            GtkWidget       *gtk_widget) 
{ 
   /* Asegúrese de llamar a la función de inicio de los padres */ 
   parent_class-&gt;init (widget, gtk_widget); 
   
   /* Caché un valor en la implementación de ATK */ 
   mytype-&gt;cached_value = gtk_widget_function_call(); 

   /* Esperar una señal */ 
   gtk_signal_connect (GTK_OBJECT (gtk_widget), 
                       "signal-type", 
                       GTK_SIGNAL_FUNC (_myatkimp_mytype_signal_type), 
                       NULL); 
} 
</programlisting>
</example>
<para>En este ejemplo, si la señal especificada <type>signal-type</type> se generase en el respaldo de <varname>gtk_widget</varname>, entonces se podría llamar a la función <function>_myatkimp_mytype_signal_type()</function>.</para>
</listitem>
<listitem>
<para>parent-&gt;notify_gtk</para>
<para>Si la implementación de ATK necesita escuchar cualquier notificación de propiedad en el respaldo del objeto GTK, podría ser necesaria una función <function>parent-&gt;notify_gtk()</function>. Por ejemplo:</para>
<example>
<title>Una función <function>notify_gtk()</function> personalizada</title>
<programlisting>
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-&gt;name, "property-of-interest") == 0) 
   { 
      /* Gestionar el cambio de la propiedad. */ 
   } 
   else 
   { 
      parent_class-&gt;notify_gtk (obj, pspec); 
   } 
} 
</programlisting>
</example>
</listitem>
<listitem>
<para>parent-&gt;finalize</para>
<para>Si es necesario para liberar cualquier dato cuando se destruye una instancia de <type>GObject</type>, entonces se necesita una función <function>finalize()</function> para liberar la memoria. Por ejemplo:</para>
<example>
<title>Una función <function>finalize()</function> personalizada</title>
<programlisting>
void 
myatkimp_mytype_finalize (GObject *object) 
{ 
   MyAtkimpMyType *my_type = MYATKIMP_MYTYPE (object); 

   g_object_unref (my_type-&gt;cached_value); 
   G_OBJECT_CLASS (parent_class)-&gt;finalize (object); 
} 
</programlisting>
</example>
</listitem>
</orderedlist>
</listitem>
</orderedlist>
</section>
</section>
</section>

<section id="gad-custom">
<title>Hacer accesibles componentes personalizados</title>
<para>Añadir soporte de ATK en su widget personalizado asegurará su cooperación con la infraestructura de accesibilidad. Estos son los pasos generales necesarios:</para>
<itemizedlist>
<listitem>
<para>evaluar un widget personalizado de acuerdo a las <link linkend="gad-ui-guidelines">Guías de la interfaz de usuario</link>;</para>
</listitem>
<listitem>
<para>determinar qué <ulink url="http://library.gnome.org/devel/atk/stable/atk.html">interfaces de ATK</ulink> debería implementar un widget personalizado, de acuerdo a la característica del widget establecido y la funcionalidad;</para>
</listitem>
<listitem>
<para>evaluar qué <ulink url="http://library.gnome.org/devel/atk/stable/atk.html">interfaces de ATK</ulink> pueden heredarse desde la clase del widget padre;</para>
</listitem>
<listitem>
<para>implementar las interfaces apropiadas de ATK para la clase de widget de una o dos formas:</para>
<itemizedlist>
<listitem>
<para>directamente a través del widget personalizado o</para>
</listitem>
<listitem>
<para>en un subtipo <ulink url="http://library.gnome.org/devel/atk/stable/AtkObject.html"><type>AtkObject</type></ulink> creado por una nueva subclase <ulink url="http://library.gnome.org/devel/atk/stable/AtkObjectFactory.html"><type>AtkObjectFactory</type></ulink></para>
</listitem>
</itemizedlist>
<para>Si se usa el segundo método, se debe registrar el tipo de factor apropiado con el <type>AtkObjectFactoryRegistry</type> en tiempo de ejecución.</para>
</listitem>
</itemizedlist>
<para>El <ulink url="ftp://ftp.gnome.org/pub/GNOME/sources/gail/">código fuente de GAIL</ulink> sirve como un excelente turorial para el uso avanzado de ATK.</para>
</section>

<section id="gad-ui-guidelines">
<title>Guías de interfaz de usuario para soportar accesibilidad</title>
<para>Cuando diseñe la IGU de su aplicación, existen ciertas guías simples que debería seguir para asegurarse de que puede usarse por tanta gente como sea posible, ya sea con tecnologías de asistencia o sin ellas. No sea tonto pensando que esto es sólo en caso de «hacer que su interfaz gráfica de usuario pueda usarse por personas discapacitadas», aunque, y ya que usted no debe molestarse si sabe que una persona con discapacidad nunca va a usar la aplicación. Siguiendo estas directrices mejorará la usabilidad general de su aplicación para todos los que lo usen, incluyéndole a usted.</para>

<section>
<title>General</title>
<para>Todos el mundo se siente frustrado si no puede encontrar una característica en una aplicación, o comete un error que tarda un par de minutos en recuperarse, si es posible recuperarse del todo. Si usted tiene algún tipo de discapacidad, el esfuerzo y el tiempo perdidoserá varias veces peor. Siguiendo algunas pautas básicas puede ayudar a prevenir este tipo de situaciones para todos los usuarios.</para>
<itemizedlist>
<listitem>
<para>Proporcione «Deshacer» para cada acción que cambie los datos del usuario o la configuración de la aplicación. Si es posible, proporcione más de un nivel de deshacer y rehacer, y una lista del histórico para permitir un vista previa de qué acciones se pueden deshacer.</para>
</listitem>
<listitem>
<para>Proporcione comandos para restaurar la configuración predeterminada. Si una configuración particular puede hacer la aplicación completamente inservible para un individuo, por ejemplo, haciendo que las tipografías sean muy pequeñas, sería útil proporcionar una opción para restaurar la configuración predeterminada fuera de la propia aplicación. Esto podría hacerse, por ejemplo, mediante un interruptor de línea de comandos.</para>
</listitem>
<listitem>
<para>La ayuda evita que los usuarios hagan mal las cosas. Es particularmente importante para las acciones que se puedan hacer de forma accidental (por ejemplo, las acciones del ratón) o algo que no se puede deshacer fácilmente (por ejemplo, sobrescribir un archivo). Considere usar los diálogos de confirmación o forzar al usuario para entrar en un modo particular para llevar a cabo acciones potencialmente destructivas.</para>
</listitem>
<listitem>
<para>Minimize la carga de memoria de los usuarios. Por ejemplo, deje que el usuario vea múltiples documentos al mismo tiempo, y asegurare la ayuda en línea u otras instrucciones puede permanecer visibles mientras llevan a cabo el procedimiento que se describe. Déjeles copiar toda la información mostrada, y pegarla en cualquier parte donde se puedan introducir los datos.</para>
</listitem>
<listitem>
<para>No haga que los usuarios inserten discos. Dependiendo de la discapacidad particular de un usuario, pueden encontrar difícil insertar físicamente o cambiar un disco, o pueden encontrarlo para identificar el disco correcto en el primer lugar. Si su aplicación está instalada desde el CD-ROM, proporcione una opción para copiar todos los ficheros que sean necesarios en el disco duro del usuario.</para>
</listitem>
<listitem>
<para>No coloque funciones más utilizadas muy profundas en los menús. Ya sea que usted está usando un ratón, teclado o algún otro dispositivo de entrada, es mejor evitar los elementos de menú profundamente anidados. Así como la carga de memoria sobre su localización, siempre es más difícil y cuesta mucho tiempo para acceder a él.</para>
</listitem>
<listitem>
<para>No guíe a los usuarios a través de pasos innecesarios. Por ejemplo, los asistentes son útiles para los usuarios que tienen problemas para manejar un gran número de opciones a la vez, pero otros usuarios pueden necesitar minimizar la cantidad de tiempo o las pulsaciones de teclado que utilizan. Dichos usuarios se benefician de la posibilidad de saltarse los pasos innecesarios o de ir directamente a la que necesitan. Considere la posibilidad de proporcionar un botón <guibutton>Finalizar</guibutton> en los asistentes que permitan saltar hasta el final y asumir las respuestas predeterminadas para los pasos intermedios. Si el proceso tiene muchos pasos, considere preguntar al usuario al inicio si se quiere atravesar todos los pasos, o simplemente los más comúnmente utilizados.</para>
</listitem>
</itemizedlist>
</section>

<section>
<title>Navegación por teclado</title>
<para>Una interfaz de teclado de usuario bien diseñada juega un papel clave al diseñar el software de accesibilidad. Los usuarios ciegos pueden navegar por el software más eficazmente usando el teclado, ya que con el ratón depende de la percepción visual de la posición del puntero del ratón. Además, los problemas de movilidad pueden evitar que un usuario se mueva con éxito usando el ratón, debido a las habilidades necesarias para la motricidad final de control.</para>
<para>Por lo tanto es importante hacer todas las acciones del ratón disponibles desde el teclado, e incluir el acceso al teclado para todas las barras de herramientas, menús, enlaces y botones. Cada función proporciona que su aplicación puede está disponible usando sólo el teclado. Si es necesario, su ratón se oculta mientras está utilizando su aplicación.</para>
<para>La mayoría de la funcionalidad debería ser fácil para hacerla accesible usando atajaos del teclado y aceleradores, y el conjunto de herramientas integrado en las funciones de navegación. Sin embargo, las operaciones que dependen de arrastrar y colocar, por ejemplo, puede requerir un mayor conocimiento.</para>
<itemizedlist>
<listitem>
<para>Facilite el acceso eficiente del teclado a todas las funciones de la aplicación. Algunos usuarios pueden ser incapaces de usar un ratón, y muchos «usuarios avanzados» prefieren usar el teclado de todos modos. Además, algunas tecnologías de asistencia especializadas con dispositivos de entrada pueden simular los eventos del teclado mejor que los eventos del ratón. Ya que que para algunos usuarios la escritura es difícil o incluso dolorosa, es importante proporcionar un interfaz del teclado que minimize el número de las pulsaciones requeridas para cualquier tarea.</para>
</listitem>
<listitem>
<para>Use un orden de navegación de teclado lógico. Al navegar alrededor de una ventana con la tecla <keycap>Tab</keycap>, el foco del teclado debería moverse entre los controles en un orden predecible. En configuraciones regionales occidentales, ésto normalmente es de izquierda a derecha y de arriba a abajo.</para>
</listitem>
<listitem>
<para>Garantice el orden correcto de la etiquetas para los controles que permitieron el estado depende de la casilla de verificación, botón de opción o botón de alternar el estado. Cuando un botón se selecciona, todos sus controles dependientes deben estar habilitados y todos los controles que dependan de cualquier otro botón del grupo se deben desactivar. Cuando el usuario selecciona una casilla de verificación, botón de opción o el botón de alternar que tiene controles dependientes, no da automáticamente el foco al primer control dependiente, pero en su lugar deja el foco en el botón.</para>
</listitem>
<listitem>
<para>No anule las características de accesibilidad existentes a nivel de sistema. Por ejemplo, <ulink url="http://www.rehab.uiuc.edu/accessx/overview.html">AccessX</ulink> es una extensión del servidor X que se ha apoyado desde X11R6. La característica «MouseKeys» de esta extensión permite el movimiento del ratón y similar las pulsaciones del botón utilizando el teclado. Por lo tanto, no debe añadir características a su aplicación que sólo se puede acceder pulsando las teclas en el teclado, ya que los usuarios basándose en la característica «MouseKeys» no podrán usarlas.</para>
</listitem>
<listitem>
<para>Proporcione más de un método para realizar las tareas del teclado siempre que sea posible. Algunos usuarios pueden encontrar algunas claves y combinaciones de teclas más fáciles de usar que otras.</para>
</listitem>
<listitem>
<para>Proporcione el acceso del teclado y el ratón para que funcionen a la vez donde sea posible. Algunos usuarios quizás sólo pueden usar el teclado o el ratón, pero no ambos.</para>
</listitem>
<listitem>
<para>No asigne alcanza difícil de las operaciones de teclado se realizan con frecuencia. Algunas personas sólo pueden ser capaces de usar una mano en el teclado, por lo que los accesos directos que se pueden usar fácilmente con una mano, son preferibles para operaciones comunes. En cualquier caso, tener que realizar en el teclado operaciones largas o difíciles con frecuencia puede aumentar la tensión del músculo para todos los usuarios, aumentando el riesgo de dolor o lesión.</para>
</listitem>
<listitem>
<para>No requiera el uso repetitivo de pulsaciones simultáneas. Algunos usuarios sólo son capaces de mantener presionado una tecla a la vez. Las tecnologías de apoyo, tales como «AccessX» pueden permitir a los usuarios presionar las teclas de forma secuencial y no simultáneamente, pero esto, por supuesto, significa que la operación tomará más tiempo para ellos.</para>
</listitem>
<listitem>
<para>Asegúrese de que cualquier texto que se pueda seleccionar con el ratón también se puede seleccionar con el teclado. Esta es una comodidad para todos los usuarios, pero especialmente para aquellos para quienes un control preciso del ratón es difícil.</para>
</listitem>
<listitem>
<para>Asegúrese de que los objetos que pueden ser redimensionado o movidos por arrastrar y soltar también pueden cambiar el tamaño o moverse con el teclado. Por ejemplo, los iconos y ventanas en el escritorio. Cuando la precisión del tamaño y la colocación son potencialmente importantes, por ejemplo, formas en un diagrama, considere también la posibilidad de un diálogo en el que puede escribir las coordenadas, o un medio para ajustar de objetos a una cuadrícula definida por el usuario.</para>
</listitem>
<listitem>
<para>No use las funciones generales de navegación para activar las operaciones. Por ejemplo, la navegación básica de <keycap>Tab</keycap> con el teclado en un cuadro de diálogo para activar las acciones asociadas a un control.</para>
</listitem>
<listitem>
<para>Muestre menús invocados por teclado, ventanas y sugerencias cerca del objeto que se relacionan. En GNOME 2.0, los usuarios pueden llamar a los menús emergentes con <keycombo><keycap>Mayús.</keycap><keycap>F10</keycap></keycombo>, y a la información sobre las herramientas con <keycombo><keycap>Mayús</keycap><keycap>F1</keycap></keycombo>. Sin embargo, no oculte u oscurezca completamente el objeto al que el menú o la descripción se refiere.</para>
</listitem>
</itemizedlist>
</section>

<section>
<title>Interacción del ratón</title>
<para>Recuerde que no todo el mundo puede usar un ratón con igual destreza y que algunos usuarios pueden tener dificultad viendo o siguiendo el puntero del ratón.</para>
<itemizedlist>
<listitem>
<para>No dependa de pulsaciones de los botones 2 o 3 del ratón. Aparte de ser físicamente más difíciles de pulsar, algunos dispositivos apuntadores y muchos dispositivos con tecnología de asistencia sólo soportan el botón 1. Algunas tecnologías de asistencia pueden no emular el ratón en absoluto, pero generan eventos de teclas del teclado en su lugar.</para>
</listitem>
<listitem>
<para>Permita cancelar todas las operaciones del ratón. Pulsar la tecla <keycap>Esc</keycap> debería cancelar cualquier operación en progreso, como arrastrar y soltar un fichero en un administrador de ficheros, o dibujar una forma en un programa de dibujo.</para>
</listitem>
<listitem>
<para>Proporcione realimentación visual a través de una operación de arrastrar y soltar. A medida que el ratón pasa por encima de objetivos válidos, selecciónelos y cambie el puntero del ratón. Utilice el puntero «no drop» del ratón al pasar sobre los destinos de arrastre válidos. Consulte <link linkend="gad-mouse-examples">Ejemplos de iteración del ratón</link>.</para>
</listitem>
<listitem>
<para>No deforme el puntero del ratón, ni restrinja el movimiento del ratón a la parte de la pantalla. Esto puede interferir con las ayudas técnicas, y suele ser confusa incluso para los usuarios que no dependen de la AT.</para>
</listitem>
<listitem>
<para>No haga los objetivos del ratón muy pequeños. En general, los objetivos del ratón debe ser al menos del tamaño de la «zona caliente» en todo el borde de la ventana de tamaño variable en el actual gestor de ventanas/tema; teniendo en cuenta que un usuario con motricidad disminuida o visión puede estar utilizando un gestor de ventanas con áreas más grandes de la predeterminada.</para>
</listitem>
</itemizedlist>

<section id="gad-mouse-examples">
<title>Ejemplos de interacción con el ratón</title>
<figure>
<title>Ejemplo del puntero «no-drop» desde CDE/Motif</title>
<mediaobject>
<imageobject>
<imagedata fileref="figures/nodrop.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Ejemplo de una forma «objetivo de soltado no válido» del puntero</phrase>
</textobject>
</mediaobject>
</figure>
</section>
</section>

<section>
<title>Elementos gráficos</title>
<para>Proporcione opciones para personalizar la presentación de todos los elementos importantes en su aplicación gráfica. Esto hará que sea más fácil de usar para las personas con discapacidades visuales o cognitivas.</para>
<itemizedlist>
<listitem>
<para>No programe atributos gráficos como la línea, el borde o el grosor de sombra. Estos elementos idealmente se deben leer desde el tema GTK o gestor de ventanas. Si esto no es posible, ofrezca opciones dentro de su aplicación para cambiarlos.</para>
</listitem>
<listitem>
<para>Proporcione nombres descriptivos para todos los componentes de las interfaces. La librería de GAIL proporciona descripciones accesibles de manera predeterminada para muchos widgets GTK, pero usted todavía tendrá que añadir las suyas propias en algunos casos, como para los widgets que utilizan gráficos en lugar de texto (por ejemplo, un pozo en una paleta de colores, o un icono sin etiqueta). Considere la posibilidad de reemplazar los valores predeterminados, con descripciones más útiles o específicas de la aplicación siempre que sea posible.</para>
</listitem>
<listitem>
<para>Permita elementos gráficos de varios colores (ej. iconos  de barra de herramientas) que sea vean sólo en monocromo, si es posible. Estas imágenes monocromo se deben mostrar en los colores de primer plano y de fondo del sistema, que cada usuario habrá elegido (al elegir el tema de GTK), para una legibilidad máxima.</para>
</listitem>
<listitem>
<para>Haga que los elementos interactivos de la IGU se identifiquen fácilmente. Por ejemplo, no haga que el usuario pase el ratón sobre un objeto para determinar si se es pulsable o no. Deje suficiente espacio entre los objetos y delimite claramente los bordes de los objetos. No muestre los elementos de IGU que son bonitos, pero en realidad no hacen nada, a menos que también proporcione una opción para desactivarlos.</para>
</listitem>
<listitem>
<para>Proporcione una opción para ocultar los gráficos que no transmitan información esencial. Las imágenes gráficas pueden distraer a los usuarios con algunas desórdenes cognitivos. Los iconos en el menú del pie de GNOME, por ejemplo, se pueden quitar mientras sigue dejando los menús completamente funcionales.</para>
</listitem>
</itemizedlist>
</section>

<section>
<title>Tipografías y textos</title>
<para>Incluso para un usuario con visión normal, la salida textual proporciona la mayor parte de la información y la retroalimentación en la mayoría de las aplicaciones. Por tanto, es crítico elegir la posición del texto con cuidado en la pantalla, y dejar la elección de la fuente y el tamaño para el usuario, para garantizar que las personas con visión deteriorada puede también utilizar su aplicación eficazmente.</para>
<itemizedlist>
<listitem>
<para>No programe estilos de tipografías ni tamaños. El usuario debería ser capaz de ajustar todos los tamaños y tipos de letras. Si por alguna razón no puede hacer esta funcionalidad disponible, nunca programe una tipografía con un tamaño inferior a 10 puntos.</para>
</listitem>
<listitem>
<para>Proporcione opciones para desactivar cualquier telón de fondo gráfico o «marcas de agua» detrás del texto. Tales imágenes interfieren con el contraste entre el texto y el fondo, lo que puede causar dificultad para los usuarios con impedimentos visuales.</para>
</listitem>
<listitem>
<para>La etiqueta de objetos con nombres que tienen sentido cuando se toman fuera del contexto. Los usuarios que basándose en los lectores de pantalla o tecnologías de apoyo similares no necesariamente serán capaces de comprender inmediatamente la relación entre un control y aquellos que lo rodean.</para>
</listitem>
<listitem>
<para>No use la misma etiqueta más de una vez en la misma ventana. Si utiliza la misma etiqueta en diferentes ventanas, ayudará si significa lo mismo en ambas ventanas. Además, no use etiquetas que se deletrean diferentemente, pero suenan igual, por ejemplo, «Read» y «Red», (N. del T.: «Leer» y «Rojo»		) ya que esto puede ser confuso para los usuarios dependientes de lectores de pantalla.</para>
</listitem>
<listitem>
<para>Coloque las etiquetas de manera coherente en toda la aplicación. Esto normalmente significa inmediatamente por debajo de iconos grandes, inmediatamente a la derecha de los iconos pequeños, e inmediatamente por encima o a la izquierda de otros controles. Consulte <link linkend="gad-font-examples">Ejemplos de tipografías y de texto</link>.</para>
</listitem>
<listitem>
<para>Cuando se utiliza texto estático para etiquetar un control, termine la etiqueta con dos puntos. Por ejemplo, <guilabel>Nombre del usuario:</guilabel> para marcar un campo del texto en el que el usuario debe escribir su nombre. Esto ayuda a identificarlo como una etiqueta de control, en lugar de un elemento de texto independiente.</para>
</listitem>
<listitem>
<para>Cuando usa texto estático para etiquetar un control, asegúrese de que la etiqueta precede inmediatamente ese control en el orden de pestañas. Esto asegurará que el mnemónico (carácter subrayado) que asigna a la etiqueta moverá el foco a o activará el control correcto al pulsarlo.</para>
</listitem>
<listitem>
<para>Ofrece alternativas a WYSIWYG. Algunos usuarios pueden necesitar imprimir el texto en letra pequeña, pero editarlo en una tipografía de pantalla más grande. Las alternativas posibles incluyen mostrar todo el texto en la misma tipografía y tamaño (elegido por el usuario); una opción «ajustar a la ventana» que le permite leer todo el texto en una ventana sin necesidad de desplazarse horizontalmente; una vista de una sola columna que muestra el contenido de la ventana en una sola columna, incluso si se imprimen en varias columnas; y una vista de sólo texto, donde los gráficos se muestran como marcadores de posición o descripciones de texto. Si la aplicación tiene paneles con controles secundarios, considere la posibilidad de cambiar el tamaño de los paneles junto a la ventana madre.</para>
</listitem>
</itemizedlist>

<section id="gad-font-examples">
<title>Ejemplos de tipografías y textos</title>
<figure id="label-placement-example">
<title>Ubicación correcta de etiquetas para varios elementos de la IGU</title>
<informaltable frame="all">
<tgroup cols="3" align="center">
<tbody>
<row>
<entry valign="middle"><mediaobject>
<imageobject>
<imagedata fileref="figures/label_above.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Lista de control con etiqueta arriba</phrase>
</textobject>
</mediaobject> Lista de control con etiqueta arriba</entry>
<entry valign="middle"><mediaobject>
<imageobject>
<imagedata fileref="figures/label_below.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Icono de gestor de archivos de gran tamaño con etiqueta debajo de él</phrase>
</textobject>
</mediaobject> Icono del gestor de archivos de gran tamaño con etiqueta debajo de él</entry>
<entry valign="middle"><mediaobject>
<imageobject>
<imagedata fileref="figures/label_right.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Icono pequeño de barra de herramientas con etiqueta a su derecha</phrase>
</textobject>
</mediaobject> Icono pequeño de barra de herramientas con etiqueta a su derecha</entry>
<entry valign="middle"><mediaobject>
<imageobject>
<imagedata fileref="figures/label_left.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Caja de control incrementable con etiqueta a su izquierda</phrase>
</textobject>
</mediaobject> Caja de control incrementable con etiqueta a su izquierda</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</figure>
</section>
</section>

<section>
<title>Color y contraste</title>      
<para>Una mala elección de los colores en la pantalla puede causar problemas a los usuarios daltónicos (para los que el tono es importante) o de baja visión (para quienes el brillo y el contraste es importante). Generalmente debería permitir al usuario personalizar los colores en cualquier parte de su aplicación que transmita información importante.</para>
<para>Los usuarios con impedimentos visuales pueden requerir un alto nivel de contraste entre los colores de fondo y texto. A menudo se usa un fondo negro y texto en blanco para prevenir el fondo de «sangrado» más. Estos ajustes son críticos para los usuarios con impedimentos visuales.</para>
<itemizedlist>
<listitem>
<para>No programe en el código los colores de las aplicaciones. Algunos usuarios necesitan usar determinadas combinaciones de colores y niveles de contraste para poder leer la pantalla cómodamente. Por lo tanto todos los colores principales que su aplicación de GNOME usa, se deben tomar desde el tema GTK, para que el usuario puede configurar los colores para todas sus aplicaciones a algo legible, tan solo cambiando el tema. Si por alguna razón necesita usar colores que no están disponibles en el tema, asegúrese de que se pueden personalizar en la propia aplicación.</para>
</listitem>
<listitem>
<para>No use el color como el único medio de distinguir los elementos de información. Toda esa información se debe proporcionar al menos por otro método, tales como forma, posición o descripción textual. Consulte los <link linkend="gad-color-examples">Ejemplos de color y contraste</link>.</para>
</listitem>
<listitem>
<para>Soporte todos los temas de alto contraste de GNOME. Asegúrese que cuando uno de estos temas está seleccionado, todo el texto de su aplicación aparece con los colores de primer plano y de fondo de alto contraste especificados por el tema.</para>
</listitem>
<listitem>
<para>Asegúrese de que su aplicación no depende de un tema de alto contraste en particular. Pruebe con diferentes temas de alto contraste para asegurarse de que su aplicación respeta la configuración.</para>
</listitem>
</itemizedlist>

<section id="gad-color-examples">
<title>Ejemplos de color y contraste</title>
<example>
<title>Ejemplo que ilustra el uso redundante de color</title>
<informaltable frame="all">
<tgroup cols="2">
<tbody>
<row>
<entry valign="middle">
<mediaobject>
<imageobject>
<imagedata fileref="figures/color_only.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Ejemplo que muestra cambios en el precio usando sólo colores</phrase>
</textobject>
</mediaobject>
</entry>
<entry>Esta pantalla puede causar problemas para un usuario daltónico (el daltonismo afecta a casi 1 de cada 7 hombres en algunas partes del mundo). La falta de contraste entre el texto en rojo y el fondo negro también hace que sea difícil de leer para un usuario con visión baja, incluso con un magnificador de pantalla.</entry>
</row>
<row>
<entry valign="middle">
<mediaobject>
<imageobject>
<imagedata fileref="figures/color_and_arrows.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Ejemplo que muestra cambios en el precio usando colores y flechas</phrase>
</textobject>
</mediaobject>
</entry>
<entry>Esta pantalla refuerza la codificación de los colores con flechas para indicar el movimiento de los precios, y utiliza tonos verdes y rojos más oscuros sobre un fondo más claro para proporcionar un mayor contraste. Esta no tiene por qué ser la combinación de colores predeterminada si las pruebas fueron para mostrar que es demasiado molesto para la mayoría de los usuarios, pero debería ser posible personalizarlo de esta forma, ya sea mediante un tema o a través del diálogo <guilabel>Preferencias</guilabel> de la aplicación.</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</example>
</section>
</section>

<section>
<title>Aumento</title>
<para>Muchos usuarios, incluso los que no tienen una discapacidad visual, se benefician de magnificación del texto y de los gráficos. Sin embargo, sin magnificación, un usuario con discapacidad visual no puede acceder ni utilizar el programa el absoluto.</para>
<itemizedlist>
<listitem>
<para>Proporcione al usuario la posibilidad de magnificar el área de trabajo.</para>
</listitem>
<listitem>
<para>Proporcione opciones en la aplicación para escalar el área de trabajo. Los usuarios necesitan tener una opción para magnificar el área de trabajo entre un 150% y un 400%. Verifique la aplicación para confirmar que el objeto que está viendo no se ve afectado al cambiar la configuración de la magnificación.</para>
</listitem>
</itemizedlist>
</section>

<section>
<title>Sonido</title>
<para>Las personas que tienen dificultades auditivas, así como aquellas que trabajan con el sonido del equipo apagado, estarán en desventaja si su aplicación se basa en el sonido para transmitir información. En general, asegúrese de que el usuario puede recibir la información audible de otras maneras.</para>
<itemizedlist>
<listitem>
<para>No dé por hecho que el usuario oirá la información sonora. Esto se aplica tanto a usuarios con tarjetas de sonido estropeadas como a aquellos que tienen problemas auditivos.</para>
</listitem>
<listitem>
<para>No use el sonido como la única manera de transmitir información. Dé al usuario la posibilidad de tener toda la información sonora de una manera visual. Esto implica proporcionar subtítulos o transcripciones de todos los fragmentos de sonido hablados importantes.</para>
</listitem>
<listitem>
<para>Permita a los usuarios configurar la frecuencia y el volumen de los pitidos de aviso y otros sonidos. Esto incluye poder apagar el sonido por completo.</para>
</listitem>
</itemizedlist>
</section>

<section>
<title>Animación</title>
<para>Usada con moderación, la animación puede ser útil para llamar la atención sobre información importante en su aplicación; y también puede quedar bien. Sin embargo, puede ser problemático para algunos usuarios, así que asegúrese de que se puede desactivar.</para>
<itemizedlist>
<listitem>
<para>No use elementos que parpadeen o destellen con una frecuencia mayor de 2 Hz ni inferior a 55 Hz. Esto incluye el texto y los objetos gráficos. Cualquier cosa en este rango de frecuencias puede causar problemas a los usuarios susceptibles de convulsiones por inducción visual. Tenga en cuenta que, sin embargo, no hay una frecuencia «segura». Si los destellos son esenciales, debería usar la frecuencia de parpadeo del cursor del sistema (que debería ser configurable), o permitir a los usuarios configurar la frecuencia ellos mismos.</para>
</listitem>
<listitem>
<para>No haga que destellen o parpadeen áreas grandes de la pantalla. Las áreas pequeñas son menos propensas a provocar convulsiones en quienes son susceptibles a ellas.</para>
</listitem>
<listitem>
<para>Haga todas las animaciones opcionales. La información animada debería estar disponible en al menos un formato no animado, a elección del usuario.</para>
</listitem>
</itemizedlist>
</section>

<section>
<title>Foco del teclado</title>
<para>Mostrar la posición del foco del teclado claramente en todo momento es importante, tanto para los usuarios con problemas visuales, como para «usuarios avanzados» que prefieren usar el teclado en lugar del ratón. No debería haber ninguna confusión en cuanto a qué control tiene del escritorio tiene el foco en un momento dado. Debe ser capaz de dejar el equipo con el foco en cualquier control de su aplicación, irse y llamar por teléfono a su novia o pasear al perro hasta olvidar en que widget lo dejó en. Cuando vuelva, debería ser capaz de decir exactamente en qué widget estaba.</para>
<para>Un indicador visual del foco es una representación sonora de la posición del cursor en relación con el resto de objetos del escritorio. Esto permite al usuario moverse entre los objetos de forma interactiva a medida que cambia el foco. El foco visual se debe exponer mediante programación a las tecnologías de asistencia. Tenga en cuenta que en la mayoría de los casos, esto lo maneja ATK automáticamente, sin necesidad de realizar ningún trabajo adicional. Sin embargo, tendrá que tener en cuenta este requisito al escribir sus propios widgets personalizados, por ejemplo.</para>
<itemizedlist>
<listitem>
<para>Inicie el foco en el control mas usado habitualmente. Si no hay control en una ventana considerada la «más» útil, inicie el foco en el primer control de la ventana cuando esta se abra. El foco no debería iniciarse en los botones <guilabel>Aceptar</guilabel> ni <guilabel>Cancelar</guilabel> de un diálogo, aunque sean los controles más usados habitualmente, ya que se pueden activar inmediatamente pulsando <keycap>Intro</keycap> o <keycap>Esc</keycap>.</para>
</listitem>
<listitem>
<para>Muestre claramente el foco de entrada actual todas las veces. Recuerde que los controles que incluyen un elemento deslizante, no siempre es suficiente resaltar sólo el elemento seleccionado dentro del área de desplazamiento, ya que puede no ser visible. Consulte los <link linkend="gad-focus-examples">ejemplos de foco del teclado</link>.</para>
</listitem>
<listitem>
<para>Muestre el foco de entrada sólo en la ventana activa. Oculte todos los indicadores visuales del foco principales en todas las ventanas que no tienen el foco ni la activación. Si una única ventana tiene paneles separados, sólo uno de los paneles deben tener el indicador del foco, y los indicadores del foco deben estar escondidos en el resto de paneles. Si es importante seguir mostrando qué elemento de una lista sin foco está seleccionado, por ejemplo, use un indicador de foco secundario. Consulte los <link linkend="gad-focus-examples">ejemplos de foco del teclado</link>.</para>
</listitem>
<listitem>
<para>Proporcione comentarios adecuados cuando el usuario intenta navegar más allá del final de un grupo de objetos relacionados. Al navegar por una lista, por ejemplo, pararse con comentarios sonoros es preferible a mover el foco al primer objeto en la lista. De lo contrario, los usuarios que son ciegos o con baja visión podrían no darse cuenta de que han regresado al principio. En el caso de una búsqueda de texto en un documento, puede aparecer un cuadro de diálogo para indicar que se ha alcanzado el final del documento, y le preguntará si desea reanudar la búsqueda desde el principio del documento.</para>
</listitem>
<listitem>
<para>Reproduzca la señal de alerta sonora o visual predeterminada del sistema cuando el usuario pulse una tecla inadecuada, o cuando falle una tecla de navegación para mover el foco. Por ejemplo, cuando el foco está en el primer carácter en un campo de texto y el usuario presiona la tecla izquierda de flecha, o el usuario intenta realizar una selección múltiple en un diálogo de selección única. (Tenga en cuenta que los usuarios con dificultades de audición debe ser capaz de configurar un equivalente visual de todo el sistema con la alerta sonora predeterminada.)</para>
</listitem>
</itemizedlist>

<section id="gad-focus-examples">
<title>Ejemplos de foco del teclado</title>
<example><title>Ejemplo que ilustra la necesidad de mostrar el foco con claridad</title>
<informaltable frame="all">
<tgroup cols="2">
<tbody>
<row>
<entry valign="middle">
<mediaobject>
<imageobject>
<imagedata fileref="figures/badfocus1.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>No se puede ver el elemento de esta ventana que tiene el foco porque se ha desplazado fuera de la pantalla.</phrase>
</textobject>
</mediaobject>
</entry>
<entry>Uno de los controles de esta ventana tiene el foco, pero es imposible decir cuál...</entry>
</row>
<row>
<entry valign="middle">
<mediaobject>
<imageobject>
<imagedata fileref="figures/badfocus2.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>El artículo enfocado en la lista se ha mostrado desplazando la lista</phrase>
</textobject>
</mediaobject>
</entry>
<entry>...hasta que desplaza la lista, lo que revela que uno de los elementos está actualmente seleccionado.</entry>
</row>
<row>
<entry valign="middle">
<mediaobject>
<imageobject>
<imagedata fileref="figures/goodfocus.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>El control de lista de este ejemplo tiene un borde sólido que indica el foco, si su elemento seleccionado está visible actualmente o no.</phrase>
</textobject>
</mediaobject>
</entry>
<entry>Si el control de lista tiene un borde «enfocado», es fácil decir que tiene el foco incluso cuando el elemento seleccionado actualmente no es visible.</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</example>
<example>
<title>Ejemplo que ilustra el uso de foco secundario</title>
<informaltable frame="all">
<tgroup cols="2">
<tbody>
<row>
<entry valign="middle">
<mediaobject>
<imageobject>
<imagedata fileref="figures/badfocus3.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Ventana dividida en la que ambos paneles parecen tener el foco</phrase>
</textobject>
</mediaobject>
</entry>
<entry>En este ejemplo, es imposible decir, simplemente mirando, cuál de los dos paneles tiene actualmente el foco del teclado.</entry>
</row>
<row>
<entry valign="middle">
<mediaobject>
<imageobject>
<imagedata fileref="figures/goodfocus3.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Ventana dividida en la que el resaltado secundario se usa para mostrar qué panel tiene el foco</phrase>
</textobject>
</mediaobject>
</entry>
<entry>Usando un color de selección de relieve secundario en el panel inactivo, es obvio que el control de árbol tiene el foco aquí...</entry>
</row>
<row>
<entry valign="middle">
<mediaobject>
<imageobject>
<imagedata fileref="figures/goodfocus2.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Ventana dividida en la que el resaltado secundario se usa para mostrar qué panel tiene el foco</phrase>
</textobject>
</mediaobject>
</entry>
<entry>... y que el control de lista tiene el foco aquí.</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</example>
</section>
</section>

<section>
<title>Sincronización</title>
<para>Interfaces en las aparecen o desaparecen cosas o se producen de acuerdo a un límite de tiempo codificado de manera que no se puede variar, son a menudo un obstáculo a la accesibilidad. Algunos usuarios pueden leer, escribir o reaccionar muy lentamente en comparación con otros. Si la información que requieren se oculta antes de terminar con ella, o la tapa  otro tipo de información que aparece sin que la soliciten expresamente, la aplicación será muy frustrante o imposible de usar.</para>
<itemizedlist>
<listitem>
<para>No programe los tiempos de espera ni otras características basadas ​​en el tiempo. Los ejemplos incluyen el desplazamiento automático al arrastrar un objeto hacia el borde de una ventana, manteniendo pulsado un botón de la barra de desplazamiento, o la expansión automática de un nodo del árbol cuando se arrastra un objeto sobre él y se mantiene durante un corto tiempo. Estos se deberían poder personalizar en la aplicación, en el Centro de control de GNOME o, en el peor de los casos, poder editarse manualmente desde la línea de comandos a través de un archivo de configuración o una entrada de GConf.</para>
</listitem>
<listitem>
<para>No muestre ni oculte brevemente la información basada en el movimiento del puntero del ratón. (Excepción: el sistema proporciona características tales como consejos, que el usuario puede configurar a nivel de todo el sistema). Si tiene que proporcionar estas características, haga que sean opcionales para que los usuarios puedan desactivarlas cuando se instala una utilidad para revisar la pantalla.</para>
</listitem>
</itemizedlist>
</section>

<section>
<title>Documentación</title>
<para>Las personas con discapacidades no pueden usar aplicación de manera efectiva si no tienen acceso a los manuales requeridos ni a los archivos de ayuda. Especialmente importante es la navegación con el teclado, ya que es la única manera en que muchos usuarios puede moverse por la aplicación.</para>
<itemizedlist>
<listitem>
<para>Proporcione toda la documentación en un formato accesible. HTML y texto en ASCII son formatos excelentes para las tecnologías de asistencia.</para>
</listitem>
<listitem>
<para>Proporcione descripciones de texto alternativas para todos los gráficos de la documentación.</para>
</listitem>
<listitem>
<para>Documente todas las características de accesibilidad de su aplicación. Es especialmente importante que se documenten la navegación con el teclado y los atajos. incluya una sección de accesibilidad en su documentación, donde se pueda encontrar información sobre todas las características de accesibilidad.</para>
</listitem>
</itemizedlist>
</section>
</section>
</chapter>

<chapter id="gtest" status="draft">
<title>Pruebas</title>
<para>Hay varios puntos de revisión que llevar a cabo antes de declarar una aplicación accesible. Durante el desarrollo, se pueden considerar técnicas de pruebas automatizadas. <ulink url="http://people.redhat.com/zcerza/dogtail">Dogtail</ulink>, por ejemplo, puede complementar su plan de pruebas automatizadas.</para>
<para>Esta sección describe una serie de pruebas que puede realizar manualmente en una aplicación para comprobar su accesibilidad. Superar todas las pruebas no implica necesariamente que la aplicación sea completamente accesible, pero si la aplicación falla en alguna de estas pruebas, el futuro trabajo debe ser mejorar estos aspectos de la accesibilidad.</para>

<section>
<title>Navegación por teclado</title>
<para>Se deberían probar las siguientes operaciones con el teclado. No use el ratón en ninguna parte de esta prueba.</para>
<itemizedlist>
<listitem>
<para>Usando sólo comandos del teclado, mueva el foco a través de todas las barras de menús de la aplicación.</para>
</listitem>
<listitem>
<para>Confirme que:</para>
<itemizedlist>
<listitem>
<para>Los menús sensitivos de contexto se muestran correctamente.</para>
</listitem>
<listitem>
<para>Cualquier función listada en la barra de herramientas se puede realizar usando el teclado.</para>
</listitem>
<listitem>
<para>Puede manejar todos los controles en el área de cliente de la aplicación y en los cuadros de diálogo.</para>
</listitem>
<listitem>
<para>El texto y los objetos en el área del cliente se pueden seleccionar.</para>
</listitem>
<listitem>
<para>Cualquier atajo o mejora de teclado funciona como se ha diseñado.</para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
</section>

<section>
<title>Elementos gráficos</title>
<para>Pruebe la aplicación usando un lector de pantalla y confirme que:</para>
<itemizedlist>
<listitem>
<para>Las etiquetas y el texto se leen correctamente, incluyendo los menús y las barras de heramientas.</para>
</listitem>
<listitem>
<para>La información del objeto se lee correctamente.</para>
</listitem>
</itemizedlist>
</section>

<section>
<title>Indicador visual del foco</title>
<itemizedlist>
<listitem>
<para>Verifique que cuando se mueve entre objetos el indicador visual del foco es fácil de identificar.</para>
</listitem>
<listitem>
<para>La navegación con el teclado a través del software y de los menús debería ser claramente visible cuando se mueve el foco.</para>
</listitem>
<listitem>
<para>Confirme que el lector de pantalla sigue el indicador de foco visual a medida que navega usando el teclado.</para>
</listitem>
<listitem>
<para>Ejecute un programa de magnificación de la pantalla (si está disponible) y compruebe que el magnificador puede seguir el indicador de foco visual a medida que navega usando el teclado y el ratón.</para>
</listitem>
</itemizedlist>
</section>

<section>
<title>Tipografías y textos</title>
<itemizedlist>
<listitem>
<para>Cambie la tipografía en la aplicación y confirme que los cambios se mantienen.</para>
</listitem>
<listitem>
<para>Pruebe la aplicación cambiando los colores y confirme que toda la configuración se mantiene.</para>
</listitem>
<listitem>
<para>Si la magnificación está disponible, comprobar la tipografía, color y tamaño al usar la opción de magnificación.</para>
</listitem>
</itemizedlist>
</section>

<section>
<title>Color y contraste</title>
<itemizedlist>
<listitem>
<para>Imprima capturas de pantalla en una impresora en blanco y negro y confirme que toda la información es visible.</para>
</listitem>
<listitem>
<para>Pruebe aplicaciones usando sólo los ajustes de alto contraste de blanco y negro y confirme que toda la información se transmite correctamente.</para>
</listitem>
<listitem>
<para>Compruebe que la aplicación proporciona al menos tres combinaciones de esquemas de color y que están disponibles los esquemas de alto contraste (ej. blanco sobre negro o amarillo sobre azul).</para>
</listitem>
<listitem>
<para>Active las características de contraste alto en el Centro de control de GNOME y confirmar que la aplicación respeta esos ajustes.</para>
</listitem>
<listitem>
<para>Pruebe varios temas para asegurarse de que el software funciona para todos los ajustes disponibles.</para>
</listitem>
</itemizedlist>
</section>

<section>
<title>Sonido</title>
<para>Debe existir una opción en la aplicación para mostrar visualmente las alertas de sonido.</para>
<para>Compruebe que el sonido funciona correctamente activando el sonido en el Centro de control de GNOME y realizando después las siguientes acciones:</para>
<itemizedlist>
<listitem>
<para>Realice una acción que debe generar una alerta de sonido y confirme que la aplicación funciona como se ha diseñado.</para>
</listitem>
<listitem>
<para>Compruebe que la aplicación funciona correctamente al aumentar o reducir el volumen.</para>
</listitem>
<listitem>
<para>Confirme que los mensajes de advertencia y alertas se pueden oír correctamente en un entorno de trabajo ruidoso.</para>
</listitem>
</itemizedlist>
</section>

<section>
<title>Animación</title>
<para>Compruebe que existe una opción disponible para detener la animación y que funciona como se ha diseñado.</para>
<para>Desactive la animación. Confirme que aún así se hace llegar correctamente toda la información.</para>
</section>

<section>
<title>Foco del teclado</title>
<itemizedlist>
<listitem>
<para>Compruebe todos los mensajes para confirmar que se le notifica al usuario antes de que un mensaje caduque y se da la opción de indicar que se necesita más tiempo.</para>
</listitem>
<listitem>
<para>Asegúrese de que se ha incluido una opción para ajustar el tiempo de respuesta y confirme que funciona como se ha diseñado.</para>
</listitem>
</itemizedlist>
</section>

<section>
<title>Documentación</title>
<para>Compruebe la documentación de texto ASCII con un lector de pantalla para comprobar que es limpia y precisa y las tecnologías de asistencia la pueden leer.</para>
<para>Compruebe que las aplicaciones HTML que usan un navegador web y el lector de pantalla confirman que la documentación es accesible a las tecnologías de asistencia.</para>
<para>Nota: existen guías de accesibilidad web disponibles en <ulink url="http://www.w3.org/TR/WAI-WEBCONTENT/">http://www.w3.org/TR/WAI-WEBCONTENT/</ulink>.</para>
<para>Confirme que la siguiente información se incluye en la documentación:</para>
<itemizedlist>
<listitem>
<para>Plantee si la aplicación no soporta los accesos de teclado estándar usados por el Sistema Operativo.</para>
</listitem>
<listitem>
<para>Identifique si existen comandos únicos de teclado.</para>
</listitem>
<listitem>
<para>Identifique cualquier característica única de accesibilidad.</para>
</listitem>
<listitem>
<para>Si una acción se documenta para el ratón, asegúrese de que existe una alternativa para usar el teclado.</para>
</listitem>
</itemizedlist>
</section>

<section id="gad-checklist">
<title>Lista de comprobación de la interfaz de usuario</title>
<para>Esta sección resume las guías proporcionadas en la <link linkend="gad-ui-guidelines">Guías de interfaz de usuario para soportar accesibilidad</link>. Debe referirse a esa sección de la guía para obtener información más detallada sobre cualquiera de los elementos de la lista de comprobación aquí proporcionados.</para>
<para>Al comprobar una aplicación para su accesibilidad debería ir a través de cada uno de los elementos de la lista. Notar si la aplicación pasa o falla cada comprobación o no se aplica a dicha comprobación.</para>
<table frame="all" pgwide="1">
<title>Lista de comprobación de los principios generales</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>PG</entry>
<entry>Principios generales</entry>
<entry>Pasa/Falla/No aplicable</entry>
</row>
</thead>
<tbody>
<row>
<entry>PG.1</entry>
<entry>Se puede deshacer cada acción que altera los datos del usuario o la configuración de una aplicación.</entry>
</row>
<row>
<entry>PG.2</entry>
<entry>Toda la configuración de las aplicaciones se puede restaurar a sus valores predeterminados sin que el usuario tenga que recordar cuáles eran esos valores.</entry>
</row>
<row>
<entry>PG.3</entry>
<entry>Después de la instalación, la aplicación se puede usar sin que el usuario tenga que introducir un disco o CD en ningún momento.</entry>
</row>
<row><entry>PG.4</entry>
<entry>Las funciones más frecuentemente usadas se encuentran en la parte superior de la estructura del menú.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Lista de comprobación de la navegación por teclado</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>NT</entry>
<entry>Navegación por teclado</entry>
<entry>Pasa/Falla/No aplicable</entry>
</row>
</thead>
<tbody>
<row>
<entry>NT.1</entry>
<entry>Se proporciona acceso eficiente al teclado para todas las características de la aplicación.</entry>
</row>
<row>
<entry>NT.2</entry>
<entry>Todas las ventanas tienen un orden lógico de navegación por teclado.</entry>
</row>
<row><entry>NT.3</entry>
<entry>Se usa el orden correcto de tabulación para los controles cuyos estados activados dependen de cajas de verificación, botones de radio o botones de conmutación.</entry>
</row>
<row><entry>NT.4</entry>
<entry>El acceso a las funciones específicas de la aplicación a través del teclado no anulan las características de accesibilidad del sistema.</entry>
</row>
<row><entry>NT.5</entry>
<entry>La aplicación proporciona más de un método para realizar tareas con el teclado, siempre que sea posible.</entry>
</row>
<row><entry>NT.6</entry>
<entry>Existen combinaciones de teclas alternativas siempre que sea posible.</entry>
</row>
<row><entry>NT.7</entry>
<entry>No existen combinaciones incómodas de alcanzar para operaciones de teclado realizadas frecuentemente.</entry>
</row>
<row><entry>NT.8</entry>
<entry>La aplicación no usa pulsaciones de teclado simultáneas y/o repetitivas.</entry>
</row>
<row><entry>NT.9</entry>
<entry>La aplicación proporciona equivalentes de teclado para todas las funciones del ratón.</entry>
</row>
<row><entry>NT.10</entry>
<entry>Cualquier texto u objeto que se puede seleccionar con el ratón también se puede seleccionar sólo con el teclado.</entry>
</row>
<row><entry>NT.11</entry>
<entry>Cualquier objeto que se puede redimensionar o mover con el ratón también se puede redimensionar y mover sólo con el teclado.</entry>
</row>
<row><entry>NT.12</entry>
<entry>La aplicación no usa funciones de navegación generales para disparar operaciones.</entry>
</row>
<row><entry>NT.13</entry>
<entry>Todos los menús, ventanas y consejos invocados con el teclado aparecen junto al objeto al que están relacionados.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Lista de comprobación de la interacción con el ratón</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>IR</entry>
<entry>Interacción del ratón</entry>
<entry>Pasa/Falla/No aplicable</entry>
</row>
</thead>
<tbody>
<row><entry>IR.1</entry>
<entry>Ninguna operación depende de la entrada de los botones del ratón <mousebutton>derecha</mousebutton> o <mousebutton>medio</mousebutton>.</entry>
</row>
<row><entry>IR.2</entry>
<entry>Todas las operaciones con el ratón se pueden cancelar antes de que se completen.</entry>
</row>
<row><entry>IR.3</entry>
<entry>Se proporciona contexto visual a en todas las operaciones de arrastrar y soltar</entry>
</row>
<row><entry>IR.4</entry>
<entry>El puntero del ratón nunca se ajusta bajo el control de la aplicación, o la aplicación restringe su movimiento se restringe a parte de la pantalla.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Lista de comprobación de los elementos gráficos</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>EG</entry>
<entry>Elementos gráficos</entry>
<entry>Pasa/Falla/No aplicable</entry>
</row>
</thead>
<tbody>
<row><entry>EG.1</entry>
<entry>No existen atributos gráficos incrustados e inmutables («hard-coded») tales como el grosor de las líneas, bordes o sombras.</entry>
</row>
<row><entry>EG.2</entry>
<entry>Todos los elementos gráficos multicolor se pueden mostrar en monocromo, siempre que sea posible.</entry>
</row>
<row><entry>EG.3</entry>
<entry>Todos los elementos interactivos del IGU son fácilmente distinguibles desde elementos del IGU estáticos.</entry>
</row>
<row><entry>EG.4</entry>
<entry>Se proporciona una opción para ocultar los gráficos no esenciales.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Lista de comprobación de las tipografías y del texto</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>TT</entry>
<entry>Tipografías y textos</entry>
<entry>Pasa/Falla/No aplicable</entry>
</row>
</thead>
<tbody>
<row><entry>TT.1</entry>
<entry>No hay estilos o tamaños incrustados e inmutables («hard-coded»)</entry>
</row>
<row><entry>TT.2</entry>
<entry>Se proporciona una opción para desactivar los fondos gráficos detrás del texto.</entry>
</row>
<row><entry>TT.3</entry>
<entry>Todas las etiquetas deben tener nombres que tengan sentido al sacarlas de contexto.</entry>
</row>
<row><entry>TT.4</entry>
<entry>No se usa más de una vez el mismo nombre de etiqueta en la misma ventana.</entry>
</row>
<row><entry>TT.5</entry>
<entry>La posición de las etiquetas es consistente en toda la aplicación.</entry>
</row>
<row><entry>TT.6</entry>
<entry>Todas las etiquetas de texto estático que identifican otros controles terminan con dos puntos (:).</entry>
</row>
<row><entry>TT.7</entry>
<entry>Las etiquetas de texto estático que identifican otros controles preceden inmediatamente a esos controles en el orden de las pestañas.</entry>
</row>
<row><entry>TT.8</entry>
<entry>Se proporciona una alternativa a «WYSIWYG» (lo que se ve es lo que se obtiene). Por ejemplo, la capacidad de especificar una pantalla diferente o tipografías de impresión diferentes en un editor de textos.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Lista de comprobación del color y contraste</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>CC</entry>
<entry>Color y contraste</entry>
<entry>Pasa/Falla/No aplicable</entry>
</row>
</thead>
<tbody>
<row><entry>CC.1</entry>
<entry>Los colores de la aplicación no están incrustados ni son inmutables («hard-coded»), sino que se dibujan desde el tema actual del escritorio o desde un ajuste de la aplicación.</entry>
</row>
<row><entry>CC.2</entry>
<entry>El color sólo se usa como mejora y no como el único medio de comunicar información u acciones.</entry>
</row>
<row>
<entry>CC.3</entry>
<entry>La aplicación soporta todos los temas y ajustes de los temas de alto contraste.</entry>
</row>
<row><entry>CC.4</entry>
<entry>El software no depende de ningún tema de alto contraste o ajuste en particular.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Lista de comprobación de la magnificación</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>MG</entry>
<entry>Aumento</entry>
<entry>Pasa/Falla/No aplicable</entry>
</row>
</thead>
<tbody>
<row><entry>MG.1</entry>
<entry>La aplicación proporciona la capacidad de magnificar el área de trabajo.</entry>
</row>
<row><entry>MG.2</entry>
<entry>La aplicación proporciona la opción de escalar el área de trabajo.</entry>
</row>
<row><entry>MG.3</entry>
<entry>La funcionalidad de la aplicación no se ve afectada por cambiar la magnificación o los ajustes de escala.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Lista de comprobación del sonido</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>SO</entry>
<entry>Sonido</entry>
<entry>Pasa/Falla/No aplicable</entry>
</row>
</thead>
<tbody>
<row><entry>SO.1</entry>
<entry>El sonido no se usa como el único medio de comunicación de cualquier elemento de información.</entry>
</row>
<row><entry>SO.2</entry>
<entry>El usuario puede configurar la frecuencia y volumen de todos los sonidos y pitidos de advertencia.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Lista de comprobación de animaciones</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>AN</entry>
<entry>Animación</entry>
<entry>Pasa/Falla/No aplicable</entry>
</row>
</thead>
<tbody>
<row><entry>AN.1</entry>
<entry>No existe ningún elemento que destelle o parpadee con una frecuencia mayor de 2Hz o menor de 55Hz.</entry>
</row>
<row><entry>AN.2</entry>
<entry>Cualquier destello o parpadeo está confinado en pequeñas áreas de la pantalla.</entry>
</row>
<row><entry>AN.3</entry>
<entry>Si se usa una animación existe una opción disponible para desactivarla antes de que se muestre por primera vez.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Lista de comprobación del foco del teclado</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>FT</entry>
<entry>Foco del teclado</entry>
<entry>Pasa/Falla/No aplicable</entry>
</row>
</thead>
<tbody>
<row><entry>FT.1</entry>
<entry>Al abrir una ventana el foco está en el control más usado.</entry>
</row>
<row><entry>FT.2</entry>
<entry>La posición del foco de entrada está claramente mostrada en todo momento.</entry>
</row>
<row><entry>FT.3</entry>
<entry>El foco de entrada se muestra exactamente en una ventana en todo momento.</entry>
</row>
<row><entry>FT.4</entry>
<entry>Se proporciona el contexto sonoro o visual apropiado cuando el usuario intenta navegar más allá del límite de un grupo de objetos relacionados.</entry>
</row>
<row><entry>FT.5</entry>
<entry>La señal de advertencia sonora o visual predeterminada se reproduce cuando el usuario pulsa una tecla inapropiada.</entry>
</row>
<row><entry>FT.6</entry>
<entry>Existe suficiente información sonora para el foco visual tal que el usuario puede intuir qué hacer a continuación.</entry>
</row>
<row><entry>FT.7</entry>
<entry>Al usar tecnologías de asistencia, tales como el lector de pantalla o un dispositivo braille, el programa actual indica la posición y contenido del indicador visual del foco.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Lista de comprobación de los tiempos</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>TM</entry>
<entry>Sincronización</entry>
<entry>Pasa/Falla/No aplicable</entry>
</row>
</thead>
<tbody>
<row><entry>TM.1</entry>
<entry>En la aplicación no existen tiempos de expiración invariables en el código o características basadas en tiempo.</entry>
</row>
<row><entry>TM.2</entry>
<entry>El mostrado u ocultación de información importante no se dispara exclusivamente por el movimiento del puntero del ratón.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Lista de comprobación de la documentación</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>DC</entry>
<entry>Documentación</entry>
<entry>Pasa/Falla/No aplicable</entry>
</row>
</thead>
<tbody>
<row><entry>DC.1</entry>
<entry>Toda la documentación está en un formato accesible, con descripciones textuales alternativas proporcionadas para todas las figuras y diagramas.</entry>
</row>
<row><entry>DC.2</entry>
<entry>La documentación incluye una sección que cubre las características de accesibilidad de la aplicación.</entry>
</row>
</tbody>
</tgroup>
</table>
</section>

<section>
<title>GOK (Teclado en pantalla de GNOME)</title>
<para>Su aplicación debería poder usarse a través de <application>gok</application>; las entradas de teclado debería generarlas <application>gok</application> completamente, no el teclado. El objetivo aquí sería trabajar con su aplicación y el escritorio, en general, asegurándose que se puede escribir cualquier carácter de entrada con el teclado en pantalla.</para>
<para>La aplicación <application>gok</application> viene con el Escritorio GNOME, así que debería estar presente. Consulte el <ulink url="http://www.gok.ca">sitio oficial de gok</ulink> para obtener la documentación completa.</para>
<para>Siga estos pasos para comprobar el correcto funcionamiento de <application>gok</application> con su aplicación:</para>
<procedure>
<step>
<para>Inicie sesión en el Escritorio GNOME</para>
</step>
<step>
<para>Ejecute <application>gok</application></para>
</step>
<step>
<para>Inicie su aplicación</para>
</step>
<step>
<para>Proporcione entrada a su aplicación con un dispositivo apuntador (ej. un ratón o seguidor de mirada) y <application>gok</application>.</para>
</step>
<step>
<para>Trabaje usando las características de autocompletado y predicción de palabras de <application>gok</application>.</para>
</step>
<step>
<para>Compruebe que <application>gok</application> activa y desactiva los botones de los <guibutton>Menús</guibutton> y <guibutton>Barras de herramientas</guibutton> basadas en la clase de aplicación invocada; por ejemplo, los botones de los <guibutton>Menús</guibutton> y <guibutton>Barras de Herramientas</guibutton> están desactivados para el «capplet» «Propiedades de las tipografías», pero los mismos botones están activados para la aplicación <application>gedit</application>.</para>
</step>
<step>
<para>Compruebe que el teclado en pantalla <application>gok</application> proporciona el botón <guibutton>Redactar</guibutton> y que se puede usar para escribir cualquier texto para la aplicación seleccionada; ejecute <application>gedit</application>, pulse en el área de texto y después pulse el botón <guibutton>Redactar</guibutton> de <application>gok</application>. Seleccione las teclas necesarias en el teclado en pantalla. Los caracteres deberían aparecer en el área de texto de <application>gedit</application>.</para>
</step>
<step>
<para>Compruebe que el botón del <guibutton>Lanzador</guibutton> permite usar el lanzador de cualquiera de las aplicaciones <application>Terminal</application>, <application>Navegador web</application> o <application>Editor de textos</application>.</para>
</step>
<step>
<para>Compruebe que el botón <guibutton>Activar</guibutton> permite al usuario activar cualquiera de las ventanas de las aplicaciones actualmente en ejecución en el escritorio del usuario, incluyendo los paneles de GNOME y el escritorio GNOME.</para>
</step>
<step>
<para>Compruebe que el botón <guibutton>Menús</guibutton> lista todos los menús disponibles en la aplicación actual. Compruebe que al pulsar en el botón de un menú se muestran el submenú y los elementos de menú que contiene el submenú. Finalmente, compruebe que al pulsar en un elemento de menú se activa el elemento del menú. Por ejemplo, pulse en la aplicación <application>Visor de ayuda</application> y pulse el botón <guibutton>Menús</guibutton>. Ahora, la ventana de <application>GOK</application> muestra los botones <guibutton>Archivo</guibutton>, <guibutton>Ir</guibutton> y <guibutton>Ayuda</guibutton> (los menús de <application>Visor de ayuda</application>). Pulse en el botón <guibutton>Archivo</guibutton> y se mostrarán los botones <guibutton>Ventana nueva</guibutton> and <guibutton>Cerrar ventana</guibutton> (elementos del menú).</para>
</step>
<step>
<para>Compruebe que las listas de botones <guibutton>Barras de herramientas</guibutton> listan todos los botones disponibles en la barra de herramientas de la aplicación. Por ejemplo, pulse en la aplicación del <application>Examinador de la ayuda</application> y después pulse en el botón  <guibutton>Barras de herramientas</guibutton>. Ahora la ventana de <application>GOK</application> muestra los botones <guibutton>Atrás</guibutton>, <guibutton>Adelante</guibutton> e <guibutton>Inicio</guibutton>.</para>
</step>
<step>
<para>Verifique que el botón <guibutton>Extractor IU</guibutton> muestra todos los objetos de botones para la ventana de la aplicación seleccionada. Por ejemplo, abra la miniaplicación «Propiedades de la tipografía» y pulse el botón <guibutton>Extractor IU</guibutton> en la ventana de <application>GOK</application>. La ventana de <application>GOK</application> debería mostrar los botones de la miniaplicación: <guibutton>Sans</guibutton>, <guibutton>Sans-serif</guibutton>, <guibutton>Cerrar</guibutton> y <guibutton>Ayuda</guibutton>.</para>
</step>
</procedure>
</section>

<section>
<title>Accerciser</title>
<screenshot>
<mediaobject>
<imageobject>
<imagedata fileref="figures/at-arch.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Accerciser y la arquitectura de accesibilidad de GNOM</phrase>
</textobject>
</mediaobject>
</screenshot>

<para><application>Accerciser</application> es un explorador interactivo de accesibilidad desarrollado en Python para el Escritorio de GNOME. Usa AT-SPI para inspeccionar y controlar widgets, permitiéndole comprobar si una aplicación está proporcionando información correcta a las tecnologías de asistencia y pruebas automáticas de trabajo. <application>Accerciser</application> tiene un entorno de trabajo de complementos simple que puede usar para crear vistas personalizadas de la información de accesibilidad. Se puede obtener la documentación completa en el <ulink url="http://library.gnome.org/devel/accerciser/stable">Manual oficial de Accerciser</ulink>. Para ver una demostración de <application>Accerciser</application> y <application>PyATSPI</application> (acceso al entorno del envoltorio de Python y uso de AT-SPI), consulte <ulink url="http://live.gnome.org/Accessibility/PythonPoweredAccessibility">este artículo</ulink>. Para una excelente visión general por el autor, consulte el artículo titulado <ulink url="http://www.linuxjournal.com/article/9991">Make Your Application Accessible with Accerciser</ulink>.</para>
<note>
<para><application>Accerciser</application> ha reemplazado la anterior herramienta <application>at-poke</application>.</para>
</note>
</section>

</chapter>

</book>
