GTK 4.2.0

GTK 4.2.0 现在可以在通常的地点下载。

此版本是应用程序开发人员将其项目移植到 GTK4 的第一轮反馈的结果,因此它主要包括错误修复和 API 改进——但我们也添加了新功能,例如新的 GL 渲染器;工具包如何处理组合键和死键序列的各种改进;在 Windows 和 macOS 上编译 GTK 的构建系统改进;以及一个全新的 API 参考,该参考从语言绑定也使用的相同内省数据生成。

有关更多信息,您可以查看之前关于 4.1 开发周期的博文

NGL 渲染器

感谢 Christian Hergert 的辛勤工作,NGL 渲染器现在是 Linux、Windows 和 macOS 的默认渲染器。我们收到了来自使用 Lima 等驱动程序的移动平台用户的非常积极的反馈,他们在每秒帧数以及功耗和 CPU 使用率方面都有了显着的改进;后两者也将对台式机和笔记本电脑用户产生积极影响。NGL 渲染器才刚刚开始:新的代码库将使我们能够在未来进行更多的改进。

目前,我们保留了旧的 GL 渲染器;您可以在您的环境中使用 export GSK_RENDERER=gl 来返回到 4.0 GL 渲染器——但如果您需要这样做,请务必提交问题,以便我们有机会修复 NGL 渲染器。

输入

Matthias 写了一篇关于处理组合键和死键输入序列的整篇博文,所以你可以直接阅读它。死键处理已经进行了几次迭代,以处理输入堆栈较低层中引入的古怪之处和解决方法。

在某些键盘布局中,死音符重音与撇号的处理存在一个已知问题,目前仍在调查中。如果您发现键盘输入的其他问题,尤其是在组合键序列或死键方面,请提交问题

可移植性

GTK 的目标之一是拥有一个“交钥匙”构建系统,该系统能够从 Git 存储库的克隆版本到工具包的完全可部署安装,而无需手动完成所有依赖项,或使用奇怪的装置。您可以在这篇来自 Collabora 的朋友的文章中看到它在 Windows 上如何使用本机工具工作。

此外,我们现在确保您可以将 GTK 用作 Meson 子项目;这意味着您可以将 GTK 及其所有依赖项构建为您自己的应用程序构建环境的一部分,并且您可以轻松地收集所有构建工件,以便您使用您选择的工具链将它们与您的应用程序一起分发。

文档

对于 GTK 的新手来说,最臭名昭著的问题之一就是文档。不熟悉我们 API 的应用程序开发人员通常发现在我们的文档中很难找到信息;此外,API 参考的样式和结构已经很久没有更新了。为了改善第一印象和我们文档的使用,GTK 已切换到新的文档生成器,称为 gi-docgen。这个新工具为 API 参考添加了新功能,例如在文档中客户端搜索术语;以及一些不错的小可用性改进,例如

  • 代码片段和示例的“复制到剪贴板”按钮
  • 每个类的祖先和接口的可视层次结构
  • 类中继承的属性、信号和方法的列表
  • 响应式设计,使在小屏幕上使用 API 参考更容易

API 只有在允许开发人员以最符合习惯的方式使用它时才算好。GTK 不仅有 C API,还通过 GObject-Introspection 公开了一个用于语言绑定使用的整个 API。新文档使用相同的数据,这不仅使我们能够将构建时间缩短一半,而且还从源代码中的注释生成常见的文档位,使 API 参考更加一致和可靠;最后,C API 参考与语言绑定作者在使用内省数据时看到的内容相匹配,这意味着我们将在引入新 API 时收紧工具包和绑定开发人员之间的反馈循环。

Pango 和 GdkPixbuf 也已切换到 gi-docgen,这使我们能够通过我们的 CI 管道为各种依赖项构建 API 参考,并将其发布到一个全新的网站:docs.gtk.org。您始终可以在那里找到最新版本的 GTK 文档。

零星杂项

当然,除了这些可见的变化之外,我们还有一些较小的变化

  • 从用于渲染我们内容的 GLSL 着色器到按需创建而不是预先创建的可访问性对象,整体性能得到了提高
  • 当使用更新版本的 Cairo 和适当的 API 时,文本的子像素定位
  • 表情符号选择器的响应式布局
  • 改进了弹出窗口小部件中阴影的渲染
  • 微调按钮中的本地化数字
  • 改进了对 Wayland 输入法协议的支持
  • 提高了文本视图小部件的滚动性能

数字

GTK 4.2 是四个月开发的成果,由 54 位开发人员进行了 1268 次单独的更改;总共添加了 73950 行,删除了 60717 行。

更改集最多的开发人员
Matthias Clasen 843 66.5%
Emmanuele Bassi 124 9.8%
Timm Bäder 87 6.9%
Christian Hergert 33 2.6%
Jakub Steiner 24 1.9%
Benjamin Otte 21 1.7%
Chun-wei Fan 15 1.2%
Alexander Mikhaylenko 14 1.1%
Fabio Lagalla 10 0.8%
Bilal Elmoussaoui 8 0.6%
Carlos Garnacho 6 0.5%
Ignacio Casal Quinteiro 6 0.5%
Michael Catanzaro 6 0.5%
Emmanuel Gil Peyrot 5 0.4%
Xavier Claessens 4 0.3%
David Lechner 4 0.3%
Jan Alexander Steffens (heftig) 4 0.3%
Kalev Lember 3 0.2%
wisp3rwind 3 0.2%
Mohammed Sadiq 2 0.2%
更改行数最多的开发人员
Matthias Clasen 38475 42.6%
Emmanuele Bassi 15997 17.7%
Christian Hergert 13913 15.4%
Kalev Lember 9202 10.2%
Timm Bäder 5890 6.5%
Jakub Steiner 2397 2.7%
Benjamin Otte 902 1.0%
Chun-wei Fan 783 0.9%
Ignacio Casal Quinteiro 717 0.8%
Fabio Lagalla 292 0.3%
Marek Kasik 267 0.3%
Alexander Mikhaylenko 254 0.3%
Emmanuel Gil Peyrot 232 0.3%
Simon McVittie 214 0.2%
Jan Tojnar 83 0.1%
wisp3rwind 74 0.1%
Jan Alexander Steffens (heftig) 65 0.1%
Carlos Garnacho 62 0.1%
Michael Catanzaro 61 0.1%
Ungedummt 60 0.1%
删除行数最多的开发人员
Emmanuele Bassi 8408 13.8%
Jakub Steiner 1890 3.1%
Timm Bäder 493 0.8%
Simon McVittie 203 0.3%
Emmanuel Gil Peyrot 146 0.2%
Chun-wei Fan 43 0.1%
Jan Tojnar 26 0.0%
Alexander Mikhaylenko 25 0.0%
Jonas Ådahl 17 0.0%
Luca Bacci 13 0.0%
Robert Mader 4 0.0%
Chris Mayo 3 0.0%
Bartłomiej Piotrowski 2 0.0%
Marc-André Lureau 2 0.0%
Jan Alexander Steffens (heftig) 1 0.0%
Tom Schoonjans 1 0.0%

重新审视输入

我上次的更新谈到了 GTK 输入法中组合键序列的更好视觉反馈。当时我没有明确提到死键,但从历史上看,X11 对待死键和组合键序列的方式完全相同。

死键是某些键盘布局的一项功能,您可以在其中按下一个键,该键本身不会产生字符,但会修改您键入的下一个键。通常,这用于可以与不同基本字符组合的重音符号。例如,键入 <dead_acute> <a> 以生成 á 或 <dead_acute> <o> 以生成 ó。

传统上,死键是真正死的 – 在最终结果出现之前,您不会得到任何视觉反馈。通过上次更新中描述的改进,我们现在会显示输入死键时的状态

这是一个很好的改进。但事实证明,并非所有人都感到满意。

组合键序列和死键的共享处理有一些含义:一种是输入一个不存在的序列,例如 <dead_grave> <x> 将会发出哔声,并且没有输出。这对于您使用组合键显式启动的组合键序列是可以接受的,但如果您可能打算输入 `x,则不太好。

决定使用组合键序列作为死键的人们预见到了偶尔需要实际输入间距重音的需求,并添加了诸如 <dead_grave> <space><dead_grave> <dead_grave> 之类的序列以产生单个 ` 字符。

虽然这是一个不错的想法,但仍然很不方便,因为您需要键入 <dead_grave> 六次才能生成 `‍`‍`,例如,在 markdown 中输入代码示例。

在考虑了一段时间并比较了其他系统的工作方式之后,我们进行了两项更改,希望这能使死键像键盘上的任何其他键一样方便使用。

  • <dead key> <key> 序列与我们的组合键序列不匹配时,提交各个键
  • <dead key> 跟随另一个 <dead key> 时,提交第一个键,并将第二个键视为新组合键序列的开始

总之,这使得键入 <dead_acute> <a> 生成 á,键入 <dead_grave> <x> 生成 `x,并且您只需要键入 <dead_grave> 三次即可输入 `‍`‍`:

好多了!