GTK 4 是一项历时多年的巨大开发项目,始于 2016 年 10 月,于 2020 年 12 月结束。现在 4.0 版本终于发布了,是时候回顾一下这四年里数百位贡献者所完成的惊人工作量了。
早在 2016 年,我们对时间表确实有点乐观,认为我们能够在三年内,即 2019 年底发布 4.0 版本。计划首先改变 GTK 的渲染管道,将其移动到一个可以提交到 GPU 的保留操作图中,而不是我们自工具包诞生之初就有的立即模式渲染,这种渲染模式经历了两个主要的 API 周期——首先是抽象 Xlib 绘图命令,然后是转移到 Cairo 操作。当然,我们也知道我们想要改进其他子系统,比如输入和窗口系统 API,使其摆脱 X11 的影响,并朝着更符合 Wayland(以及其他窗口系统)要求的方向设计。最终,我们得到的是对工具包内部的深度重新设计,以及一种新的编程模型,该模型倾向于通过辅助对象进行更多委托,减少泄漏的抽象和深层的类型层次结构;此外,我们还精简了暴露的内部结构,以确保工具包及其使用的应用程序在未来更易于维护。不利的一面是,GTK 不再是一个“元工具包”,其内部状态可以从外部进行调整,同时期望在多个版本中工作;从长远来看,考虑到可用的资源,这种方法是不可持续的,并且使我们无法优化或改进 GTK 的内部结构,损害了每个用户。
我们不期望下一个主要的开发周期花费这么长时间,但正如他们所说:任何作战计划都无法确定地延伸到与主要敌对力量的首次接触之后。不过,重要的是,我们仍然看到了改进的潜力;虽然我们想庆祝 GTK4 的发布以及为之做出贡献的每个人,但我们也想传达 2016 年概述的计划 仍然非常有效。我们已经在我们的 GitLab 项目页面上开始 收集 GTK5 开发周期的项目,并计划与各利益相关者就未来的工作方向进行更多讨论。
一些统计数据
从 2016 年 10 月 5 日的提交 4cce6104 开始
- 总提交数: 16852
- 开发人员: 256
- 雇主: 10
- 添加的行数:1053492,删除的行数:1053542 (差异:-50)
最有趣的是,尽管付出了如此多的努力,我们最终从现有代码库中删除了总共 50 行代码,其中包括测试和文档。
按年份细分
年份 | 开发人员 | 提交数 | 添加的行数 | 删除的行数 | 差异 |
2016 | 50 | 1422 | 64014 | 152103 | -88089 |
2017 | 84 | 3446 | 186024 | 166198 | 19826 |
2018 | 111 | 2332 | 129726 | 140526 | -10800 |
2019 | 85 | 3244 | 200476 | 207623 | -7147 |
2020 | 109 | 6384 | 470907 | 386761 | 84206 |
我们在 2016 年只有几个月的时间,10 月到 12 月之间最大的工作是删除已弃用的 API,以及进行各种更改以应对从 GTK3 到 GTK4 的重命名。尽管如此,GSK 最初在 11 月/12 月落地。11 月 21 日,发布了 GTK 3.89.1,这是新 GTK 4 API 的第一个开发快照。
在 2017 年,GSK 对其 API 进行了多次迭代:添加了新的渲染节点来实现 CSS 绘图基元,并将小部件从旧的 Cairo 渲染基元转移到 GtkSnapshot
API。此外,还引入了新的剪贴板 API,采用基于流的实现。3 月 31 日,发布了 GTK 3.90.0,随后于 10 月发布了 3.92.0。
在 2018 年,情况似乎有所放缓,但主要是因为我们迁移到了 GitLab。突然间,我们可以访问 CI 管道和合并请求,并且我们对我们的开发流程越来越有信心;许多工作发生在开发分支中,特别是大型重构,例如将 GdkWindow
重命名为 GdkSurface
;转移到 GtkGesture
对象并删除每个小部件的事件信号;或者使叶类不可派生。GTK 3.94.0 于 6 月发布。
在 2019 年,开发步伐再次加快
- 小部件转换
- 布局管理器
- 约束布局
- 不再有
GtkMenu
GtkBuilder
的作用域对象GtkText
小部件GtkNative
和GtkRoot
接口- 每个小部件的操作
- 简化的
GdkSurface
子类型
此外,当然,渲染管道中还有许多性能和功能改进。GTK 3.96.0 于 5 月发布。
最后,我们来到了 2020 年
- 基于事件控制器的新拖放 API
- GDK 中新的 macOS 后端,取代了旧的 Quartz 后端
- 新的辅助功能 API,放弃了 ATK
- 不再有
GtkContainer
- 不再有
GtkRadioButton
- 简化的
GdkDevice
API - 新的键盘快捷键 API
- 新的表达式和过滤器模型
- 新的基于模型的列表和树形小部件
GTK 3.98.0 于 2 月发布;最后,3.99.0 于 7 月发布,作为 GTK 4.0 的第一个真正的测试版。
开发人员

按提交数排名前 20 位
Matthias Clasen | 6519 | (38.7%) | |
Timm Bäder | 3229 | (19.2%) | |
Benjamin Otte | 2596 | (15.4%) | |
Emmanuele Bassi | 1094 | (6.0%) | |
Carlos Garnacho | 494 | (2.9%) | |
Daniel Boles | 383 | (2.3%) | |
Alexander Larsson | 313 | (1.9%) | |
Jonas Ådahl | 167 | (1.0%) | |
Chun-wei Fan | 162 | (1.0%) | |
Christian Hergert | 158 | (0.9%) | |
Jakub Steiner | 134 | (0.8%) | |
Piotr Drąg | 132 | (0.8%) | |
Руслан Ижбулатов | 120 | (0.7%) | |
Alexander Mikhaylenko | 93 | (0.6%) | |
Rico Tzschichholz | 78 | (0.5%) | |
nana-4 | 66 | (0.4%) | |
Christoph Reiter | 62 | (0.4%) | |
Tim-Philipp Müller | 60 | (0.4%) | |
Mohammed Sadiq | 57 | (0.3%) | |
Olivier Fourdan | 42 | (0.2%) |
按更改数排名前 20 位
Matthias Clasen | 620248 | (36.8%) | |
Benjamin Otte | 466996 | (27.7%) | |
Timm Bäder | 187516 | (11.1%) | |
Emmanuele Bassi | 165354 | (9.8%) | |
Alexander Larsson | 53065 | (3.1%) | |
Carlos Garnacho | 27227 | (1.6%) | |
Christian Hergert | 26964 | (1.6%) | |
Руслан Ижбулатов | 21760 | (1.3%) | |
Jakub Steiner | 18388 | (1.1%) | |
Jonas Ådahl | 12824 | (0.8%) | |
Chun-wei Fan | 12518 | (0.7%) | |
Daniel Boles | 12371 | (0.7%) | |
Lapo Calamandrei | 9995 | (0.6%) | |
Christoph Reiter | 8391 | (0.5%) | |
Alexander Mikhaylenko | 4936 | (0.3%) | |
Tim-Philipp Müller | 3932 | (0.2%) | |
Rico Tzschichholz | 3108 | (0.2%) | |
William Hua | 2900 | (0.2%) | |
Jason Francis | 1908 | (0.1%) | |
Peter Bloomfield | 1727 | (0.1%) |
和往常一样,无论是在提交数量还是代码更改方面,Matthias 都超过了其他所有贡献者。
雇主
按提交数
红帽 | 13706 | (81.3%) |
(未知) | 1185 | (7.0%) |
GNOME 基金会 | 1095 | (6.5%) |
GNOME | 571 | (3.4%) |
Purism | 93 | (0.6%) |
Canonical | 84 | (0.5%) |
Centricular | 75 | (0.4%) |
Endless | 20 | (0.1%) |
Collabora | 14 | (0.1%) |
英特尔 | 6 | (0.0%) |
Novell | 3 | (0.0%) |
按更改数
红帽 | 1415771 | (84.0%) |
GNOME 基金会 | 165355 | (9.8%) |
(未知) | 58220 | (3.5%) |
GNOME | 33442 | (2.0%) |
Purism | 4936 | (0.3%) |
Centricular | 4205 | (0.2%) |
Canonical | 3347 | (0.2%) |
Novell | 336 | (0.0%) |
英特尔 | 222 | (0.0%) |
Collabora | 208 | (0.0%) |
Endless | 121 | (0.0%) |
按贡献者
(未知) | 199 | (72.4%) |
GNOME | 32 | (11.6%) |
红帽 | 22 | (8.0%) |
Endless | 6 | (2.2%) |
Collabora | 4 | (1.5%) |
Centricular | 3 | (1.1%) |
Novell | 3 | (1.1%) |
GNOME 基金会 | 2 | (0.7%) |
Canonical | 2 | (0.7%) |
英特尔 | 1 | (0.4%) |
Purism | 1 | (0.4%) |
虽然红帽员工贡献了最多的更改,但我们仍然有大量来自社区的贡献者——既使用他们的 GNOME 电子邮件地址,也使用他们的工作地址,即使是在个人层面上做出贡献时也是如此。我们还有来自 GNOME 和整个自由软件生态系统中各家公司的多位贡献者,这表明该项目周围有一个健康的社区。
与 GTK3 比较数字 比较棘手
- GTK 2 → 3 的开发阶段只花费了一年左右的时间,而不是四年
- 我们仍然在使用旧的 GNOME 基础设施,这意味着更少、更大的补丁,以及以 Bugzilla 的形式提高了贡献的门槛
尽管如此,与 2011 年相比,贡献者的数量增加了一倍以上,其中非附属贡献者的数量几乎增加了三倍。
¹ – GNOME 基金会的付费员工。
² – 使用 gnome.org 电子邮件地址且就业状况不明的贡献者。