GTK 黑客节 2020 — 路线图和可访问性

在 1 月 28 日至 1 月 31 日之间,GTK 团队在布鲁塞尔举办了第三届黑客节

黑客节的主要议题

  • GTK4 下一个开发快照的时间表
  • 阻碍 GTK 4.0 发布的功能缺失
  • 工具包中可访问性支持的当前状态

前两个议题占据了黑客节前两天的大部分时间;您可以阅读GTK 3.98 发布公告,了解自 3.96 版本发布以来的过去 300 天里我们一直在做的事情。缺失的功能有

  • 键盘快捷键的事件控制器
  • Wayland 上可移动的弹出窗口
  • 行回收列表和网格视图
  • 动画 API

所有这些都在主题分支中进行开发。键盘快捷键分支最近已重新构建,并且正在进行文档编写和清理;可移动的弹出窗口也在经过几次迭代后进行审查。最后剩下的两个分支相当大,需要进行更多的迭代才能正确处理——其中动画 API 目前主要是一个原型。

黑客节的最后一个议题是最大的,也是早就应该进行的讨论。

GTK 的可访问性支持由 Sun 可访问性团队作为 GTK 2.0 版本的一部分添加;它依赖于 ATK(辅助工具包)提供的抽象数据类型,这些数据类型然后在 GtkWidgetAccessibleGtkEntryAccessible 等 GTK 类中具体实现。每个小部件都有一个与其关联的“可访问”对象,该对象要么由 GTK 自动创建,要么在子类化 GTK 小部件时由应用程序代码提供。非小部件类型也可以具有与其关联的可访问对象——最值得注意的是树视图和组合框的单元格渲染器集。在这一切之下,是 AT-SPI,这是一个由 AT(辅助技术,如屏幕阅读器)使用的协议,用于使用应用程序提供的数据。通常,AT 将使用诸如 libatspi 之类的库来处理协议本身。

现有堆栈的主要问题是

  • ATK 的存在导致了大量的间接性;任何新功能或错误修复都需要在 ATK 内部定义,然后实现到 GTK 和 libatspi 中
  • ATK 是在非常不同的环境中编写的,虽然它已经进行了一些弃用,但它在其假设(如全局坐标空间)和设计中显示出了它的年代
  • AT 要求和 GUI 测试要求之间存在一定的重叠,最终在 API 设计中产生摩擦
  • 自从 Sun 可访问性团队解散后,堆栈就陷入了失修状态;大多数正在进行的工作仍然主要发生在 AT 领域(如 Orca)和 Web 浏览器中
  • 整个堆栈是在 CORBA 还很流行的时代编写的,然后及时移植到 GNOME3 的 DBus;但是,该协议效率不高,需要进行大量的往返才能移动少量数据,而不是进行批量操作和通知

最后一点也是为什么我们需要一个单独的可访问性总线,以避免垃圾邮件会话总线,并在启用可访问性支持后使一切都变慢的原因。单独的总线意味着我们需要在任何沙盒中戳一个额外的漏洞,并且仍然允许连接到可访问性总线的任何东西潜在地窥探每个应用程序中发生的事情。

最后,GTK 仅支持 Linux 上的可访问性;不支持 macOS 或 Windows,这意味着用 GTK 编写并移植到其他平台的应用程序在这些平台上对 AT 不可访问。由于我们在 API 中公开了 ATK,因此在其他平台上添加对可访问性功能的支持将需要桥接 ATK,从而产生更大的复杂性。

由于我们希望在 GTK4 中重新设计和更新可访问性功能,我们需要了解可访问性堆栈现有使用者的要求,以及我们需要针对哪种用例。为此,我们邀请了致力于开发基于自由和开源软件的可访问解决方案的公司 Hypra 来帮助我们。

Hypra 开发人员熟悉 GNOME,并且一直在从事 Linux 可访问性堆栈的工作。他们的客户涵盖了广泛的可访问性用户,因此他们最能描述日常实际使用的 AT 类型。

从工具包到合成器,堆栈的不同层必须提供各种各样的工具和功能;应用程序开发人员还必须能够访问必要的工具来为 AT 提供适当的支持,因为他们比工具包更清楚他们的应用程序应该是什么样子和行为。

经过两天的时间,我们制定了一个前进的计划

  • 从堆栈中删除 ATK,并让 GTK 直接使用 AT-SPI 协议;这类似于 Qt 从工具包方面所做的事情,并且使扩展和验证最终的协议更改变得更容易
  • 清理 AT-SPI 协议本身,在需要时更新它,以便更有效地使用 DBus
  • 删除全局可访问性总线,并让 AT 与每个应用程序协商点对点连接
  • 让 AT 要求合成器收集全局状态(如键盘快捷键),而不是与应用程序对话,然后应用程序必须要求窗口系统(如果可能),否则在无法访问时返回无效数据
  • 将 GUI 测试与可访问性分离
  • 为应用程序开发人员编写小部件和应用程序创作指南,并提供可作为构建和 CI 过程一部分使用的验证工具,以检查 UI 元素是否具有正确的可访问描述和链接

有关说明和路线图的更多信息,请访问 wiki,我们还安排了今年夏天的额外检查点会议。

还有很多工作要做,但是现在我们对这种重新设计的范围和可交付成果有了更清晰的了解。如果您想帮助事情更快发生,请随时加入这项工作;您也可以向 GNOME 基金会捐款。

GTK 团队感谢 GNOME 基金会赞助场地和与会者,并感谢 Hypra 的朋友们参加黑客节,解释用例和可访问性堆栈的当前状态,以及在开发方面提供帮助。

GTK 3.98

几天前,我发布了 GTK 3.98 的 tarball。这是迈向 GTK 4 的又一步。它有点落后于计划,并且没有完全包含我们想要包含的所有内容,但是它更接近于我们想要在 GTK 4 中发布的内容。

自 3.96 快照以来已经过去了近 9 个月,因此有很多新事物值得关注。太多了,无法全部涵盖,但以下是一些亮点

性能

GL 渲染器已经看到了稳定的优化和性能改进流。

在去年西海岸黑客节之后,通过缓存可见范围的渲染节点,极大地提高了 GtkTextView 的滚动性能。在同一个黑客节上,文本插入符号的闪烁被更改为平滑动画,这与性能无关,但看起来很酷。

自新年以来,一个重点是提高 CSS 机制的性能。CSS 值实现已优化为尽可能避免计算值。CSS 查找现在使用布隆过滤器。并且用于图标加载的 IO 已移至线程。

最近的大部分工作是通过性能黑客节之后添加的 sysprof 分析支持实现的,并且最近已对其进行增强以报告更多信息。要使用它,只需在环境中以 GTK_TRACE=1 启动 GTK 应用程序,然后使用 sysprof 加载生成的 syscap 文件。

DND

DND 重构已完成。DND 的 GTK API 已转换为事件控制器:GtkDragSourceGtkDropTarget。已经为 DND 和剪贴板添加了通过文件传输门户进行文件传输的支持。数据传输的底层新基础设施已在之前进行了详细介绍。

GDK

GDK 向 Wayland 概念的迁移正在继续。此清理尚未 100% 完成。

子曲面已被删除。GDK 现在仅支持顶层和弹出曲面。客户端窗口实现也已被删除。全局位置和相关 API(如 gdk_surface_move())不再可用。

抓取不再作为 API 公开。作为替代,可以将弹出曲面配置为在外部单击时隐藏。

构建 X11 后端时,XI2 现在是强制性的,并且为了支持 IBus,已删除了对 xim 输入法的支持。

Wayland 后端不再依赖 libwayland-cursor 来加载光标主题,而是按需加载单个光标。

GTK 删除

许多类已被明确设置为不可子类化,并且通过使小部件尽可能直接从 GtkWidget 派生,简化了小部件层次结构。

GtkMenu、GtkMenuBar、GtkToolbar 和相关类已被删除。它们正在被 GMenu 和基于弹出窗口的变体所取代。弹出菜单现在可以执行传统的嵌套菜单,还可以显示加速器。

上下文菜单不再使用 ::populate-popup 信号创建,而是使用菜单模型和操作。通过诸如 gtk_widget_class_install_action() 之类的 API,在 class_init 中创建这些操作变得更加容易。

GtkGestureMultiPress 已重命名为 GtkGestureClick,以使其更清楚此事件控制器的用途。

GTK 添加

我们不仅仅删除了东西。还添加了一些新东西。

为具有自己曲面的小部件引入了 GtkNative 接口。它已从 GtkRoot 接口中分离出来,后者专门用于没有父级的顶层小部件。

添加了基于约束的布局管理器。很高兴看到人们尝试一下。如果您这样做,请给我们反馈。

GtkTextView 和其他文本小部件增加了一个简单的撤消堆栈,可以与 Ctrl-Z 一起使用。

表情符号选择器小部件已公开。

未来展望

在 3.98 之后,我计划进行更频繁的快照,因为剩余的未完成项目正在落地。你问,这些项目是什么?

以下是我们仍然希望在 GTK 4 之前整合的项目

– 键盘快捷键的事件控制器
– 可移动的弹出窗口
– 行回收列表和网格视图
– 改进的可访问性基础设施
– 动画 API