上周 GTK 3.99.3 版本 的重大新闻是,我们为新的可访问性实现提供了第一个重要的后端。因此,现在是深入了解 GTK 4 中可访问性的好时机。
概述
让我们先快速回顾一下可访问性在 Linux 上的工作原理。其中的参与者是应用程序和辅助技术 (AT),例如屏幕阅读器(例如,Orca)、放大镜等。
AT 的目的通常是为用户提供根据其需求量身定制的与应用程序交互的替代方式(例如,放大的视图、大声朗读的文本或语音命令)。为此,AT 需要大量有关应用程序 UI 的详细信息,而这正是可访问性堆栈发挥作用的地方——它是应用程序(或其工具包)和 AT 之间的连接层。
应用程序和 AT 在可访问性总线上相互通信,这是 D-Bus 会话总线的一个单独实例,使用 AT-SPI 项目描述的接口。应用程序的 UI 元素在总线上表示为对象,这些对象实现了一些抽象的接口,例如 Text 或 Value。应用程序发出信号来传达 UI 中的更改,而 AT 可以调用对象上的方法来获取信息或进行更改(例如,更改 Value 接口的当前值以移动它所代表的 GtkScale)。
发生了什么变化
在 GTK 2 和 3 中,这是以一种笨拙的间接方式完成的:GTK 小部件具有辅助可访问对象,这些对象是 ATK 接口的实现(转换 1:GTK ➙ ATK)。然后,这些对象被转换为 AT-SPI 对象(转换 2:ATK ➙ AT-SPI),这些对象通过 at-spi2-atk 中的适配器代码在可访问性总线上表示。另一方面,AT 然后使用 pyatspi 将 AT-SPI 接口转换为 Python 对象(转换 3:AT-SPI ➙ Python)。
这个多步骤过程效率低下、有损且难以维护;它需要在至少三个组件上实现相同的功能,并且导致记录的 AT-SPI 方法和属性与实际通过可访问性总线发送的方法和属性之间存在差异。
在 GTK 4 中,我们通过删除 ATK 和 at-spi2-atk 来简化应用程序端。现在,小部件实现了一个 GtkAccessible 接口,该接口允许它们设置许多角色、状态、属性和关系,这些角色、状态、属性和关系或多或少地直接取自 W3C 发布的 WAI-ARIA 规范。然后,GTK 可访问性 API 的 AT-SPI 后端 采用这些受 ARIA 启发的属性(以及小部件本身的知识),并将小部件表示为可访问性总线上的对象,为它们实现相关的 AT-SPI 接口。
这是一种更直接的方法,与 Qt 和 Web 浏览器已经做的相匹配。
应用程序 API
以下是您在应用程序中使用 GTK 4 时最有可能遇到的可访问性 API 的重点
设置可访问角色。 角色是对小部件语义的描述,AT 将使用它来决定应该向其用户呈现什么样的行为。设置角色是一次性操作,这意味着它必须在小部件创建时完成,无论是在 class_init
中,还是在实例初始化期间
gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_BUTTON);
更新小部件的可访问状态或属性。 每当小部件的可访问表示发生更改时,都应执行此操作
gtk_accessible_update_property (GTK_ACCESSIBLE (widget), GTK_ACCESSIBLE_PROPERTY_VALUE_MIN, minimum, GTK_ACCESSIBLE_PROPERTY_VALUE_NOW, value, GTK_ACCESSIBLE_PROPERTY_VALUE_MAX, maximum, -1);
GTK 参考文档提供了可访问性 API 的概述,其中包括针对应用程序开发人员和小部件编写者的指导。
接下来是什么?
对于 GTK 4.0,我们将重点放在完成 AT-SPI 后端。但是,通过新的 API 和后端分离,我们有了一条明确的道路,可以为其他平台制作可访问性后端,这是我们希望在后续 GTK 4 版本中研究的内容。
在 Linux 上,我们希望与其他利益相关者合作,对 AT-SPI 接口进行现代化改造,以最终克服在某些地方仍然可见的 CORBA 遗留问题。其中的一部分是将从可访问性总线转向应用程序和 AT 之间的对等连接;这将增强可访问性堆栈的安全性,并填补 Flatpak 等技术使用的沙箱中的漏洞。
未来,我们希望引入一些工具来确保应用程序开发人员意识到缺少可访问性注释,例如为 UI 中的图标和图像提供标签属性或标签引用的关系;或者确保每个 UI 元素都在可访问树中得到正确表示。我们已经为 GtkAccessible 接口提供了一个测试后端,该后端可用于编写单元测试并验证是否在必要时更新了角色和属性。