当我们发布 3.98.0 版本时,我们承诺会更频繁地发布快照,因为剩下的 GTK 4 功能正在陆续实现。几周后的现在,3.98.1 和 3.98.2 快照已经悄然发布。
那么,有哪些新内容呢?
特性
还有一些工作要做,但一些更大的功能已经完成。
首先,我们已经完成了 GtkPopovers 作为 xdg-popup 界面的重新实现,并将 GdkSurface API 分割成独立的 GdkToplevel 和 GdkPopup 接口(还有一个 GdkDragSurface 接口),它们反映了界面的不同角色
- 顶层窗口是由用户放置的独立窗口,可以最大化、全屏等。
- 弹出窗口是相对于父界面定位的,并且经常会捕获输入,例如用于菜单时。
在 GTK 中,弹出框已经失去了它们的 :relative-to 属性,因为它们现在像任何其他窗口小部件一样是常规层次结构的一部分,并且 GtkWindow 已经失去了它的 :window-type 属性,因为所有 GTK_WINDOW_POPUP 的实例都已转换为弹出框,而窗口仅用于合适的顶层窗口。
另一个主要特性是新的键盘快捷键基础设施。过去,GTK 有大量的 API 来实现按键绑定、助记符和加速键。在 GTK 4 中,所有这些都由事件控制器处理。GtkShortcutController 比典型的事件控制器要复杂一些,因为它使用统一的 API 处理所有不同类型的快捷键。
幸运的是,大部分复杂性都被隐藏了。对于窗口小部件的实现者来说,重要的 API 是 gtk_widget_class_add_shortcut() 的变体,用于添加按键绑定。对于应用程序,助记符和全局加速键(使用 gtk_application_set_accels_for_action())的工作方式与以前相同。此外,还可以在 ui 文件中创建快捷键控制器和快捷键。
一组较小的特性已经以一些 GtkTextTag 属性的形式实现,这些属性公开了新的pango 功能,例如上划线、空格的可见渲染以及对断字的控制。现在可以通过标签在 GtkTextView 中控制这些功能。在条目中,它们已经可以通过直接添加 pango 属性来控制。
完成
当我在写关于 3.98 的内容时,我说拖放重构已经完成。事实证明这并不完全正确,此后又进行了一轮 DND 工作。这些更改是根据开发人员对拖放 API 的反馈而进行的。用户测试万岁!
我们引入了独立的 GtkDropTarget 和 GtkDropTargetAsync 事件控制器,前者被简化以避免所有异步 API,这使得处理本地情况非常容易。
我们还清理了 DND 实现的内部结构,将 DND 事件分组为事件序列,以与处理普通运动事件相同的方式处理它们,并引入了 GtkDropControllerMotion,这是一种事件控制器,旨在处理 DND 操作期间的选项卡切换等问题。
最后,我们可以删除 X11 风格的属性和选择 API 的残余部分;GtkSelectionData 和 GdkAtom 已经消失了。
清理和修复
与往常一样,发生了大量的较小的清理和修复。
最大规模的清理发生在文件选择器中,其中许多边缘有用的 API(额外的窗口小部件、覆盖确认、:local-only、GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER 等)已被删除。为了弥补这一点,本机文件选择器的门户实现现在支持选择文件夹。
另一个大的清理是 GdkEvent 现在是一个不可变的盒装类型。这主要是一个内部清理;对应用程序级 API 的影响很小,因为事件控制器在很大程度上取代了直接的事件处理。
其中一个新的事件控制器是 GdkEventControllerFocus,它是从键盘事件控制器中分离出来的,仅用于提供焦点处理。
GtkMenuButton 在从 GtkButton 子类转变为普通窗口小部件时失去了拥有助记符的能力。此功能已恢复,并添加了 :use-underline 属性。
GTK 中包含的 HighContrast 和 HighContrastInverse 主题现在派生自 Adwaita,以大大减轻维护负担并提高质量。现在在 gtk4-widget-factory 中尝试这些主题更容易了,因为我们添加了一个样式菜单。
新的 HighContrast 主题也已向后移植到 GTK 3。
接下来是什么
我们将继续发布快照,并希望获得更多关于上述新 API 和功能的开发人员反馈。
以下是我们希望在 GTK 4 之前整合的内容
- 行回收列表和网格视图
- 改进的辅助功能基础设施
- 动画 API
如果您想关注 GTK 4 的工作,请转到这里。