GTK 4.0

2020 年是非常漫长的一年。有什么比发布一个主要版本更好的方式来结束它呢!今天,我们发布了 GTK 4.0。

GTK 4.0 是一个由一小群专注的开发人员辛勤工作的成果。我们将单独发布一篇帖子来回顾统计数据,但简短的总结是,自 2016 年 11 月发布 3.89.1 版本以来,我们添加了超过 18000 次提交,并进行了 20 多个开发版本。

祝贺并感谢所有参与这项工作的人,特别是 Benjamin、Emmanuele、Timm、Carlos、Jonas 和 Christian!

新特性

不可能在一篇文章中总结 4 年的开发工作。过去一年,我们已经撰写了关于此版本中许多新事物的详细文章:数据传输事件控制器布局管理器渲染节点媒体播放可缩放列表着色器辅助功能。以下是一些亮点,以视觉形式呈现

媒体播放

拖放

布局管理器和变换

可缩放列表和网格

着色器

旧特性

GTK 4 现在已经稳定,我们认为它已经可以投入使用。这并不意味着 GTK 3 已经过时——我们将在可预见的未来继续支持和更新它(最新的 3.24.24 版本几天前悄悄发布了)。然而,这意味着 GTK 2 已经走到了生命的尽头。我们将在未来几天发布最后一个 2.x 版本,我们鼓励所有人将他们的 GTK 2 应用程序移植到 GTK 3 或 4。

如何获取

源代码 tar 包可在通常的位置获得。二进制包应该很快会在主要发行版中出现。

GNOME 40 版本将会有许多应用程序移植到 GTK 4。如果您想立即尝试 GTK 4.0,可以使用 gtk4-demogtk4-widget-factory 的 nightly flatpak 构建。

$ flatpak install https://nightly.gnome.org/repo/appstream/org.gtk.Demo4.flatpakref
$ flatpak run org.gtk.Demo4

如果您迫不及待地想将您的应用程序移植到 GTK 4,我们的迁移指南可在此处找到,作为文档的一部分。

如何支持 GTK

如果没有许多志愿者贡献错误报告、补丁、翻译或想法,GTK 就无法开发出来。感谢你们所有人。我们也非常感谢 GNOME 基金会为 GTK 提供开发资源、基础设施和差旅援助。

向 GNOME 基金会捐款是支持未来 GTK 开发的好方法。

接下来会发生什么

我们非常感谢所有早期测试人员为我们提供的错误报告和反馈,这使得此版本更加出色。但是我们完全预计会很快发布 4.0.1 版本,以修复只有在 .0 版本发布后才会暴露出来的疏忽和陷阱。

既然我们已经有了 4.0 版本,我们需要将库生态系统引入进来,以便应用程序可以使用它。vte、webkit 和 gtksourceview 是最值得注意的,倾向于与 GTK 一起使用的库。我们预计这些库的 GTK 4 移植版本很快就会推出。

如果出现更严重的问题,我们将在 GNOME 40 发布时发布 4.2 版本,否则我们可能会等到夏天再发布。

GTK 4 之后的未来将会怎样还有待观察。我们有一些有趣的东西正在筹备中,但我们也想听取应用程序开发人员希望在 GTK 中看到哪些功能。请告诉我们!

庆祝

我们将于本周五举办一个(在线)聚会来庆祝 4.0 版本的发布。欢迎随时光临!

GTK 3.99.2

GTK 3.99.2 版本延续了 3.99.1 中的主题:API 清理、新的和改进的演示、更好的文档。您可以在此处查看详细信息。

关于文档主题的一点说明是,我们依赖于一些未发布的 gtk-doc 功能。因此,我们现在将 gtk-doc 作为 gtk 发布 tar 包中的一个子项目。如果您是发行商,请不要惊讶,构建 GTK 现在会安装 gtk-doc 工具。

这个快照中的重大新闻是我们在更多地展示新的基于 GL 的渲染堆栈的能力方面所做的工作。

热身:Shadertoy

gtk4-demo 现在包含一个 Shadertoy 演示。

该演示使用 GtkGLArea 小部件运行与 shadertoy.com 上找到的 GLSL 代码片段兼容的片段。如果您将它们粘贴到此演示的编辑器中,那么在那里找到的许多示例将起作用。

这很有趣,但有些局限性。GLSL 被限制在其“沙箱”中,即 GtkGLArea 小部件,它使用 GL API 来编译和使用着色器。

作为一流对象的着色器

这不是我们第一次尝试制作类似于 Shadertoy 的东西。当我们第一次研究它时,我们认为我们会制作一个应用程序可以使用的着色器抽象。当我们发现要使其在不同的渲染器和后端上工作需要我们编写自己的着色器编译器时,我们将其放在了一边——工作量太大了。

但在我们成功制作 Shadertoy 之后,我们重新审视了将着色器作为一流对象的想法,目标更加适度:我们使用 GLSL,并且不尝试使着色器与 OpenGL 渲染器之外的任何东西一起工作。

在 3.99.2 中,我们现在有了

有了这些组件,我们制作了一个演示,展示了着色器的各种用途。它可能有点过载,并且某些效果有点过分,但这表明了一个重点:您可以在小部件中使用着色器。

 

我们尚未完成的工作是添加内置着色器支持的小部件。该演示展示了一些可能的候选者

着色器可绘制对象。正如您可能回忆的那样,GdkPaintable 是任何可以“绘制”的东西的非常灵活的接口。着色器当然符合条件。gtk-demo 中的 GskShaderPaintable 使用没有输入纹理的着色器来仅生成像素,然后我们将其添加到 GtkPicture 小部件中,使其出现在小部件树中。

着色器容器。这是一个非常简单的容器,可以使用着色器在子小部件的顶部绘制效果。它适用于采用单个输入纹理(用于子小部件)的着色器。

着色器堆栈。这是一个类似堆栈的容器,显示许多子小部件之一,并且在可见子小部件发生更改时使用着色器进行过渡。它适用于需要两个输入纹理(用于旧的和新的活动子小部件)的着色器。

值得庆幸的是,在 GTK 4 中制作自定义小部件比以前容易得多,因此渲染节点 API 应该足以让您开始进行一些有趣的实验。当然,您可以将 gtk4-demo 代码作为起点。

您可以调试它

除了小部件之外,着色器支持是完全集成的。GTK 检查器可以像处理任何其他渲染节点一样处理着色器节点,您可以序列化它们,例如,在 gtk4-node-editor 中加载生成的文件

如果您需要查看 GTK 发送到着色器编译器的输入,设置环境变量

GDK_DEBUG=shaders

可能会有所帮助。

接下来是什么?

在此 GL 冒险之后,我们现在将专注于实现更多新的辅助功能基础设施。

GTK 3.99.1

自我们发布 GTK 3.99 以来已经一个月了,现在是时候发布另一个快照了。这是:https://download.gnome.org/sources/gtk/3.99/gtk-3.99.1.tar.xz

此快照侧重于改进和完成。

零散之处

我们已经解决了 API 中的许多零散之处。

最明显的更改可能是按钮类层次结构的简化。GtkCheckButton 不再从 GtkToggleButton 派生,它们现在是两个独立的窗口小部件,并且它们都可以分组为互斥的(也称为“单选组”)。在这种新的设置中,实际上不再需要 GtkRadioButton,因此它被删除了。

我们新的列表小部件(GtkListView 和 GtkGridView)的 API 也进行了一些小的调整。我们现在明确要求模型属于 GtkSelectionModel 类型,以明确小部件处理选择。并且我们摆脱了额外的“with_factory”构造函数,只在 new() 中使用可为空的工厂参数,剩下

GtkWidget * gtk_list_view_new (GtkSelectionModel  *model,
                               GtkListItemFactory *factory);

作为更多 API 清理,我们删除了所有 CSS 样式类的定义——我们小部件支持的样式类在其文档中定义,而这些额外的定义实际上没有明确定义或有用。

我们的主题现在是将 GtkFrame 部件绘制的框架的边角变圆。这需要我们让框架裁剪它们的子项——这实际上不是 API 的更改,但这种行为的改变值得一提。

更多演示

过去一个月,我们在 gtk4-demo 上投入了大量精力。

我们已经使源代码高亮显示现代化。我们现在使用 highlight 命令行实用程序。除此之外,这允许我们对 xml 和 css 进行语法高亮显示,以及支持深色主题。

Highlighting XML in a dark theme
高亮显示

演示列表具有更好的筛选功能和更好的外观。新外观是 Adwaita 现在支持的几个预定义的列表样式之一:富列表、导航侧边栏和数据表。

 

Rich List list style
富列表
Navigation Sidebar list style
导航侧边栏
Data Table list style
数据表

我们从 gtk4-demo 中删除了一些过时的演示,并改进了许多现有的演示。这是我们拖放演示现在的样子

Drag-and-Drop demo
拖放演示

还添加了一些新的演示。这是布局管理器和转换的新演示

性能和其他错误

许多错误已被修复;感谢我们热心的测试人员和错误报告者。

我们最近终于追踪到的一个长期存在的问题导致我们的 GL 渲染器在存在非平凡的投影变换时裁剪错误。现在已经纠正了这个问题(结果可以在上面的转换演示中看到)。

作为之前提到的高亮改进的一部分,gtk_text_view_buffer_insert_markup() 的速度快了许多。这种改进的实现仅仅是因为 highlight 实用程序可以生成 Pango 标记。感谢实现这一点的人!

我们解决的另一个性能问题是在具有许多字体的系统上加载字体选择器对话框的时间。我们现在正在增量填充字体列表。除了此更改之外,该调查还导致 fontconfig 和 Pango 的性能改进,这将使这些库的任何用户受益。

我可以开始移植了吗?

答案是:可以!

现在是查看 GTK4、开始移植你的应用程序并向我们提供有关我们的 API、新旧 API 的反馈的好时机。我们也渴望看到你有哪些使用 GTK4 的意想不到的方式的想法——我们上面展示的一些演示也许可以给你一些启发。

接下来是什么?

我们希望尽快为新的辅助功能接口提供 at-spi 后端;它应该包含在下一个 GTK 快照中。

GTK 3.99

本周,我们发布了 GTK 3.99,这只能意味着一件事:GTK4 真的越来越近了!

早在 2 月,当 3.98 发布时,我们概述了在进行功能完整的 3.99 发布之前我们希望完成的功能。这是列表

  • 键盘快捷键的事件控制器
  • 可移动的弹出框
  • 行回收列表和网格视图
  • 改进的辅助功能基础设施
  • 动画 API
我们做得怎么样?

我们已将动画 API 从我们的 4.0 阻止程序列表中删除,因为它需要更广泛的内部重组,我们无法及时完成它。但是所有其他功能都已添加到各种 3.98.x 快照中,辅助功能基础设施是最近才加入的最后一个。

一些功能已经在这里介绍过了,例如可移动的弹出框可缩放列表。其他功能希望在将来在这里进行详细审查。在此之前,如果你对新的辅助功能基础设施感到好奇,可以查看 Emmanuele 在 GUADEC 的演讲

还有什么新功能?

我想强调的一个领域是,在新可缩放列表基础设施的完善方面所做的工作量。我们的过滤器和排序模型现在会增量地执行其工作,因此当在后台过滤或排序大型列表时,UI 可以保持响应。

一个新的 macOS GDK 后端已合并。它仍然有一些粗糙的角落,我们希望在现在到 4.0 版本之间进行平滑处理。

并且修复了许多小的回归,从微调按钮大小到树视图单元格编辑到自动滚动到 Inspector 导航到稍微渲染错误的阴影。

我可以开始移植了吗?

GTK 3.99 是首次查看移植应用程序的完美时机。

我们非常感谢那些勇敢地使用 3.96 或 3.98 快照进行试用移植并向我们提供宝贵反馈的早期采用者。由于进行了如此多的更改,我们不可避免地在 API 中犯了错误,并且在我们仍然可以解决问题时获得该反馈将对我们非常有帮助。告诉我们你遗忘在文档中、缺少示例或迁移指南中的空白,我们也非常感谢。

我们知道,由于对 GTK 3 的间接依赖,一些移植工作将被迫停止。例如,如果你正在使用 webkit webview 或 GtkSourceView 或 vte,你可能会发现很难尝试使用 GTK 4。

值得庆幸的是,某些库的移植工作已经顺利进行。其他库,例如libgweather将需要一些工作来将其核心功能与 GTK 3 依赖项分离。

我可以提供帮助吗?

如上一节所述,欢迎并感谢你对新 API、文档和移植指南的任何反馈。

我们还可以在许多其他领域使用帮助。如果你熟悉 OS X API,你可以在完成 macOS 后端方面做出真正的改变。

我们还开始集成基于 ANGLE 的 GL 渲染器,但是我们的着色器需要使用 EGL 才能工作,然后我们才能利用它。如果你能在这方面提供帮助,我们将非常感谢。

接下来是什么?

我们致力于在年底之前发布 GTK 4。从现在到那时,我们正在对辅助功能后端进行更多工作,改进 macOS 后端,编写文档和示例。

GTK 3.98.2

当我们发布 3.98.0 时,我们承诺在剩余的 GTK 4 功能发布时提供更频繁的快照。几周后,我们在这里,并且 3.98.1 和 3.98.2 快照已经悄悄发布。

那么,有什么新功能?

功能

仍有一些工作要做,但已经加入了一些更大的功能。

第一个是我们已经完成了将 GtkPopover 重新实现为 xdg-popup surface 的工作,并将 GdkSurface API 分为单独的GdkToplevelGdkPopup接口(还有一个 GdkDragSurface 接口),它们反映了 surface 的不同角色

  • 顶层是用户放置的独立窗口,可以最大化、全屏等。
  • 弹出窗口相对于父 surface 定位,并且通常会捕获输入,例如,当用于菜单时。

在 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 的工作,请访问这里

GTK 3.98

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

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

性能

GL 渲染器已经看到了一系列优化和性能改进。

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

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

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

DND

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

GDK

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

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

Grab 不再作为 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

 

 

GTK 3.96.0

本周,我们发布了 GTK 3.96.0。同样,自上次发布以来已经有一段时间了,因此值得总结一下此版本中的新功能。这里的内容实在太多,无法全部涵盖,因此本文仅突出显示最重要的更改。

此版本是我们迈向 GTK 4 的又一个里程碑。尽管还有一些未完成的事情,但此版本更接近我们希望在 GTK 4 中实现的目标。

GSK

GSK 已经看到了一些错误修复和新测试,这些测试使用新的调试工具 gtk4-node-editor 更容易完成。它可以加载和显示序列化的渲染节点树(例如从 GTK 检查器保存的渲染节点树),并比较不同渲染器的输出。

3D 转换支持已达到我们可以进行动画过渡(如下面的立方体旋转)的水平。

GDK

转向受 Wayland 启发的 API 的趋势仍在继续,更多仅限 X11 的 api 被移动到 X11 后端或直接删除。子曲面和全局坐标的使用已大大减少,但这项工作仍未完成。

拖放的重构也已继续,引入了 GdkDragGdkDrop 对象。此重构的 GTK 部分仍未完成。

事件已简化,现在仅用于输入。其他事件已替换为 GdkSurface 上的信号和属性。详细来说,expose 事件已替换为 ::render 信号,configure 事件已替换为 ::size-changed 信号。Map 事件已替换为 :mapped 属性,gdk_event_handler_set() 已替换为 ::event 信号。

Wayland 后端已获得对 GtkSettings 的设置门户的支持,并使用 text-input-unstable-v3 协议来支持其输入法。

GTK

窗口部件

自定义窗口部件的一大变化是引入了 GtkLayoutManager,这是一个新的委托对象,负责大小分配。布局管理器可以选择使用布局子项来保存布局属性。这取代了诸如 GtkBoxGtkGrid 之类的 GTK 容器中的布局相关子属性。

有许多布局管理器可用

  • GtkBinLayout,用于简单的单子容器
  • GtkBoxLayout,用于线性排列的子项
  • GtkGridLayout,用于在网格中排列的子项
  • GtkFixedLayout,用于自由定位和转换的子项
  • GtkCustomLayout,作为将传统的 measuresize_allocate vfuncs 快速转换为布局管理器的方法

未来将出现更多布局管理器实现。最突出的是,基于约束的布局管理器正在开发中。

GtkAssistantGtkStackGtkNotebook 具有公
对其子项可访问的页面对象。这些页面对象
也通过列表模型公开。这些容器的非布局相关子属性已转换为这些页面对象上的常规属性。

由于所有现有的子属性都已转换为常规属性,移动到布局属性或移动到此类页面对象,因此已从 GtkContainer 中删除对子属性的支持。

核心的 GtkEntry 功能已被移至新的 GtkText 部件中,该部件还实现了扩展的 GtkEditable 接口。GTK 中所有现有的 entry 子类都已转换为包装 GtkText 部件的 GtkEditable 实现。这也包括一个新的 GtkPasswordEntry

其他更改

GTK 部件可以使用投影线性
变换来变换它们的子部件。此功能在 CSS 中可用,并且可以作为
GskTransform 参数传递给 gtk_widget_allocateGtkFixed
第一个公开此功能的容器。有关更多示例,
请参阅 GtkRevealer 的摇摆过渡,GtkStack 的旋转过渡,
或 gtk4-demo 中的固定布局示例。

引入了许多列表模型,用于内部使用
和作为公共 API:GtkMapListModelGtkSliceListModelGtkSortListModelGtkSelectionModelGtkSingleSelection。当我们引入基于列表模型的 GtkListView 时,这些将得到更广泛的应用。

GtkBuilder 可以内联指定对象值属性,而不是通过 ID 引用它们,并且 gtk4-builder-tool 的 simplify 命令已获得一个选项,可自动将 GTK 3 UI 定义文件转换为 GTK 4。

即将推出

有关 GTK 4 仍在开发中的更多信息,请在 Discourse、IRC 上找到我们,或查看此处

GLib 2.58 的新闻

今年九月,GLib 将发布 2.58 版本。在过去的两个开发周期中,发生了一些变化,最值得注意的是 Meson 构建的改进,这反过来又提高了 GLib 在 Windows、macOS 和 Android 等平台上的可移植性。现在是时候评估 GLib 的当前状态,并重点介绍一些将影响基于 GLib 的代码的更改。

  • Meson – 得益于 Nirbheek Chauhan 和 Xavier Claessens 的持续工作,Meson 构建一直在不断改进,以至于我们可以开始将其切换为默认构建系统。计划是(正如在邮件列表中概述的那样)使用 Meson 发布 GLib 2.58,同时在树中保留 Autotools 构建并在发布存档中提供;然后,我们将在下一个开发周期中删除 Autotools 构建,并在不使用 Autotools 支持的情况下发布 GLib 2.60。我们非常欢迎 Linux 发行商开始在其构建器中测试 Meson 构建;我们一直在将 Meson 构建作为我们的CI过程的一部分运行,但更多的曝光会发现我们错过的最终回归;此外,如果使用 GCC/Clang/MSVC 以外的不同工具链的人们开始尝试 Meson 构建并报告错误,那将是太棒了。与此同时,如果您在 macOS 和 Windows 上使用 GLib,我们已经建议您切换到 Meson 来构建 GLib,因为它比 Autotools 更容易且更好地与这些平台集成
  • 可靠性和可移植性 – GLib 与 GNOME 的其余部分一起切换到了 GitLab,这意味着能够在GNOME Continuous构建之外运行持续集成。现在,我们针对每次提交和合并请求,在多个工具链、多个构建系统和多个平台上运行CI,这大大降低了构建损坏的可能性。我们还提高了测试套件中的代码覆盖率。当然,我们可以做得更好;例如,我们没有CImacOS 和 Solaris 系列操作系统的运行器,并且非常感谢 *BSD 系列的更多运行器。如果您有备用机器和一些带宽可以捐赠,我们已经发出了求助呼吁
  • 在 *BSD 上进行文件监视 – 关于 *BSD 系列,Martin Pieuchot 和 Ting-Wei Lan 对 GIO 中用于文件监视的 kqueue 后端进行了全面改造;新代码更简单、更健壮,并且通过了所有测试
  • 使用 posix_spawn() 进行高效的进程启动 — 感谢 Daniel Drake,如果平台的 C 库支持,GLib 现在可以在特定情况下使用 posix_spawn();与手动调用 fork() + exec() 相比,这允许在内核中命中快速路径;当在内存受限的平台上运行时,这些快速路径尤其有益
  • 引用计数类型和分配 — GLib 在其许多类型中使用引用计数作为内存管理和垃圾回收机制,但缺乏公共 API 来允许其他人在其自己的数据结构中实现相同的语义;这导致了大量的复制粘贴和重新实现,并且通常会导致饱和度和线程安全方面出现未定义的行为。GLib 2.58 具有 grefcountgatomicrefcount 类型及其 API,以减少此重复。此外,借鉴 Rust 等其他语言,GLib 提供了一种在内存分配上添加引用计数语义的方法,通过添加一个低级 API,允许您分配没有引用计数字段的结构,并自动向其添加引用计数语义
  • 弃用 – 在最近的这个开发周期中,一些软弃用已成为真正的弃用
      • 在引入实例私有数据宏五年后g_type_class_add_private() 最终被弃用;如果您仍在类初始化中使用该函数,请切换到 G_DEFINE_TYPE_WITH_PRIVATEG_ADD_PRIVATE
      • g_main_context_wait() 已正式弃用,但您应该已经看到了有关其使用的运行时警告
      • 由 GLib 提供的 GTest 测试框架 gtester 已被弃用;如果您正在使用 Autotools,则应使用TAP随 Automake 提供的测试框架

在此过去的周期中,感谢 Philip Withnall 的不懈努力,GLib 中有很多贡献;他在审查补丁、分类错误以及实施项目开发过程中的变更方面发挥了重要作用。切换到 GitLab 也改进了贡献流程,更多开发人员打开了合并请求

  • 2.54.0..c182cd68:来自 143 位开发人员的 968 个变更集,高于 2.53 开发周期中的 412 个变更集和 68 位开发人员
  • 总共添加了 31851 行代码,删除了 27976 行代码(增量:+3875
变更集最多的开发人员
Philip Withnall 303 31.3%
Xavier Claessens 79 8.2%
Emmanuele Bassi 69 7.1%
Christoph Reiter 42 4.3%
Ting-Wei Lan 21 2.2%
Chun-wei Fan 21 2.2%
Nirbheek Chauhan 21 2.2%
Ondrej Holy 20 2.1%
Руслан Ижбулатов 20 2.1%
Mikhail Zabaluev 20 2.1%
Simon McVittie 15 1.5%
Matthias Clasen 14 1.4%
Christian Hergert 13 1.3%
Iñigo Martínez 12 1.2%
Bastien Nocera 10 1.0%
Rafal Luzynski 9 0.9%
Michael Catanzaro 9 0.9%
Will Thompson 8 0.8%
Allison Lortie 8 0.8%
Daniel Boles 8 0.8%

请务必使用 GLib 2.57.2 测试您的代码,这是迈向 2.58.0 稳定版本的下一个开发快照。

GTK+ 3.94

今天,我们发布了 GTK+ 3.94.0。同样,自上次发布以来已经有一段时间了,因此值得总结一下此版本中的新功能。这里的内容实在太多了,无法全部涵盖,因此这篇文章只会重点介绍最重要的更改。

此版本是我们迈向 GTK+ 4 的又一个里程碑。虽然仍有一些未完成的事项,但此版本更接近我们希望通过 GTK+ 4 实现的目标。

GSK

Broadway 后端现在具有 GskRenderer,因此 Broadway 的未来看起来会更好。

我们引入了一种新的渲染节点类型 GskOffsetNode,它是简化的 GskTransformNode,并且负责在我们上下移动渲染节点树时平移内容。通过此更改,我们现在能够缓存多个帧的部件渲染节点,并在必要时重新定位它们。

我们还引入了 GskDebugNodes,它接管了节点名称,并允许我们简化一些用于创建渲染节点的 GTK+ API。

当回退到 cairo 进行渲染时,我们现在使用记录表面而不是图像表面,因此我们可以在不同的比例下重播渲染。

一个重要的新操作是 gsk_render_node_diff,用于比较两个渲染节点树(有关详细信息,请参阅下文)。

GDK

遵循将 GDK API 与 Wayland 而不是 X 对齐的总体趋势,GdkWindow 已重命名为 GdkSurface。

GdkTexture API 得到了改进,新增了 GdkMemoryTexture 和 GdkGLTexture 子类,并引入了一个强大的新抽象GdkPaintable

GdkPaintable 表示一个对象,该对象可以在任何大小的任何位置进行绘制,而无需任何布局。这受到其他地方类似概念的启发,例如 ClutterContent、HTML/CSS Paint Sources 或 SVG Paint Servers。为了展示这个概念的力量,在 gtk4-demo 中添加了一些新的演示

DND 代码继续进行重大重构。它现在使用 3.93 中为剪贴板处理引入的相同内容提供程序基础结构,并且它为 DND 操作的源端和目标端提供了单独的对象。这里将会有更多的更改。

GTK

部件

GTK+ 增加了对显示视频的支持,包括 GtkVideo 和 GtkMediaControls 部件,并且还有一个新的 GtkPicture 部件,用于将图像查看功能从 GtkImage 中分离出来(GtkImage 实际上是用于图标的)。

GtkFontChooser 允许调整 OpenType 功能和字体变体,用于输入彩色 Emoji 的 Ctrl-Shift-e 快捷键已被补全功能取代,该补全功能可以通过 GtkEntry::enable-emoji-completion 属性启用。

输入

GtkWidget 中特定事件的信号正在继续消失。目前只剩下 ::event,但它也将被移除。取而代之的是,我们正在使用事件控制器,并且添加了几个新的事件控制器来覆盖所有需要的事件。

  • GtkEventControllerMotion
  • GtkEventControllerKey
  • GtkGestureStylus

为了使这种过渡更容易,现在可以在 ui 文件中创建事件控制器。

Wayland 有其自己的平台输入法,基于 Wayland 文本协议。

绘图

::draw 信号已被移除,所有部件都必须实现 ::snapshot。它们现在可以创建自己的 GtkSnapshot 实例进行中间渲染。裁剪不再在 GTK+ 级别应用——如果需要,部件可以自由地在其分配区域之外进行绘制。

部件失效机制已经改变,现在的工作方式是通过丢弃失效部件的缓存渲染节点,并重新创建渲染节点树的缺失部分。

为了找到需要重绘的区域,GTK+ 会比较前一帧和当前帧的渲染节点树,并应用一些启发式方法来防止矩形的数量增长过大。

GTK+ 检查器允许您跟踪失效情况,您可以在这里看到它的运行情况。

其他更改

GTK+ 不再支持通用的可加载模块。输入法、打印后端和媒体后端已转换为 GIOModules 和扩展点。

平台 IM 模块(即 Windows、Wayland、Broadway IM 上下文)始终包含在内,并且将在其平台上默认启用。

GDK 中的 Vulkan 支持现在可以使用 GDK_VULKAN_DEVICE 环境变量指定的特定设备。使用 GDK_VULKAN_DEVICE=list 查看所有可用设备。

尝试一下

使用 GTK+ 3.94.0,应该可以开始移植应用程序了。文档中有一个初始移植指南。

GTK+ 3.92

昨天,我们发布了 GTK+ 3.92.1,重庆市。由于距离上一个 3.91 版本已经有一段时间了,这里简要介绍一下主要变化。

此版本是我们迈向 GTK+ 4 的又一个里程碑。尽管还有很多工作要做,但此版本可以让您初步了解我们希望在 GTK+ 4 中实现的一些目标。

GSK

自上次发布以来,大部分工作都投入到了 GSK 中。 Vulkan 渲染器现在接近完成,就避免使用 cairo 回退而言。唯一缺少的部分是模糊阴影(诚然,这是一个重要的部分)。

自 3.91.2 版本以来向前迈出的重要一步是,我们不再对所有文本使用 cairo 回退。相反,文本(在标签和条目中,遗憾的是在文本视图中还没有)被转换为文本节点。每个文本节点都包含一个 PangoGlyphString 和一个 PangoFont。Vulkan 渲染器使用字形缓存来避免为每一帧重新渲染字形。

Vulkan 渲染器的内部逻辑已经过重新设计,使用纹理而不是 cairo 表面来获得中间结果,从而避免更多 cairo 回退。

在 Vulkan 渲染器中获得支持的其他节点类型包括模糊、重复节点、混合模式和交叉淡入淡出。在某些情况下,我们使用的着色器是非常简单的实现。非常欢迎大家帮助改进它们!

作为我们可以使用渲染节点的第一个示例,我们为 GtkOverlay 实现了一个“模糊下方”功能。它的工作原理是将叠加层的“主子项”捕获为渲染节点,然后重复使用多次,使用正确的裁剪,有时还会使用模糊节点。

检查器

为了帮助您探索 GSK,检查器现在显示 Vulkan 信息,并且记录器显示更多关于渲染节点的信息。

输入

在输入方面,事件获得了访问器,我们不再直接访问它们的字段。这是一个中间步骤,清理事件仍然在进行中。我们已将传统的部件事件信号(例如 ::key-press-event)移动到事件控制器,并且 GTK+ 中的大多数部件都已停止完全使用它们。

构建系统

我们已切换为完全使用 Meson 进行 GTK+ 构建,并且 3.92.1 版本是第一个使用 Meson 的 dist 支持完成的版本。为了发布此版本,我们还必须将文档、测试套件和已安装的测试移植为使用 Meson。

仍然存在一些粗糙的边缘(我们并没有 100% 正确地获取所有依赖项),但总的来说,Meson 对我们来说效果很好。

其余部分

当然,每个人都喜欢 Emoji,并且在 GTK+ 3.22 中提供的相同彩色 Emoji 支持在此版本中也可用。除此之外,CSS 中的字体支持有所改进,增加了对 CSS3 font-variant 属性的支持。

当然,这依赖于具有相应功能的字体。

尝试一下

使用 GTK+ 3.92.1,您应该可以轻松地亲自尝试这些功能。

如果您一直想参与 GTK+ 开发但从未找到合适的机会,那么现在是参与的好时机!