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 来在内存分配上添加引用计数语义的方法,该 API 允许您分配没有引用计数字段的结构,并自动将引用计数语义添加到它们中
  • 弃用 – 在最近的这个开发周期中,一些软弃用已变为真正的弃用
      • 在我们引入实例私有数据宏五年后,g_type_class_add_private() 最终被弃用,五年;如果您仍在类初始化中使用该函数,请切换到 G_DEFINE_TYPE_WITH_PRIVATEG_ADD_PRIVATE
      • g_main_context_wait() 已正式弃用,但您应该已经看到了有关其使用的运行时警告
      • GLib 提供的 GTest harness gtester 已弃用;如果您使用的是 Autotools,则应使用TAPAutomake 附带的 harness

在这个过去的周期中,感谢 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+ – 36

在过去的一周中,GTK+ 的 master 分支有 22 次提交,添加了 1165 行,删除了 904 行。

计划和状态
  • GTK+ 路线图可在 wiki 上找到
值得注意的更改

在 master 分支上

  • Robert Ancell 更新了图标浏览器实用程序,以改进加载图标失败时的错误消息
  • Matthias Clasen 改进了新添加的 GtkCenterBox 小部件;您可以在“容器秘密”系列文章中关注他的工作
修复的错误
  • 783552 – 翻译解释
  • 759308 – 打印对话框中的即时应用(副本数量)
  • 783445 – gtk_widget_insert_after/before() 的不完整文档
参与其中

有兴趣参与 GTK+ 的工作吗?请查看新手的错误列表,并加入 irc.gnome.org 上的 IRC 频道 #gtk+。

本周 GTK+ – 35

在过去的一周中,GTK+ 的 master 分支有 33 次提交,添加了 5011 行,删除了 8140 行。

计划和状态
  • GTK+ 路线图可在 wiki 上找到
  • Patrick Griffis 正在尝试功能分支,以弃用并删除 gtk_dialog_run();请参阅此评论,了解嵌套主循环在 UI 线程、IPC 线程和 I/O 线程方面的缺陷
  • Matthias Clasen 正在尝试在图标浏览器中重用 libdazzle 中的模糊搜索
值得注意的更改

在 master 分支上

  • Matthias Clasen 添加了将图标名称复制到剪贴板的功能到图标浏览器实用程序
  • Matthias 还公开了 GtkCenterBox 小部件;此小部件取代了 GtkBox 的等效功能,以拥有一个居中的小部件
  • Olivier Fourdan 修复了 Wayland 后端中的各种错误,并将修复程序移植到 gtk-3-22 稳定分支
  • Chun-wei Fan 推出了各种修复程序,以确保 GTK+ 继续在 Windows 上使用 MSVC 构建
  • Emmanuele Bassi 修改了 Meson 构建,以确保在安装了 sassc 时,在构建 GTK+ 时重新生成所有基于 SASS 的主题;Lapo Calamandrei 删除了 Ruby/Sass 的 Gem 文件,因此 GTK+ 切换到 sassc 作为首选的 SASS 编译器
修复的错误
  • 770513 – 全屏模式下的主工具栏有圆角,导致下方视频像素渗色
  • 783347 – gtkfilechoosernativewin32:修复对非 ASCII 路径的支持
  • 781945 – 当顶级窗口的 set_transient_for 设置为另一个顶级窗口时,在 Wayland 上拖动窗口会导致 SIGSEGV
  • 782283 – Wayland:当工具提示可见时,关闭菜单会导致崩溃
  • 781285 – Wayland 下的按键重复取消应取决于重复的是哪个按键
  • 783397 – 移除 gtktextdisplay.c 中未使用的代码
参与其中

有兴趣参与 GTK+ 的工作吗?请查看新手的错误列表,并加入 irc.gnome.org 上的 IRC 频道 #gtk+。

本周 GTK+ – 34

在 GNOME 3.24 发布后经过相当长的休息时间,我们终于回来了。抱歉让大家久等了!

在上周,GTK+ 的主分支提交了 103 次,新增了 2355 行代码,删除了 5482 行代码。

计划和状态
  • GTK+ 路线图可在维基上查看。
  • Matthias Clasen 发布了 GTK+ 3.91.0,这是开发周期中的第一个快照,它将最终发布 3.92 版本。这仍然是迈向 API 稳定版本 4.0 的开发周期的一部分。
  • Timm Bäder 正在开发他的 drawing 分支,该分支旨在用真正的窗口小部件替换所有内部使用的 CSS 小工具。有关更多信息,请参阅本博客上的这篇文章
值得注意的更改

在 master 分支上

  • Carlos Garnacho 合并了他的 event-delivery 分支,该分支将事件处理从 GDK 窗口层次结构移动到 GTK 窗口小部件层次结构;这是朝着删除顶级窗口之外的所有 GdkWindow 实例迈出的第一步,最终将改进输入处理。
修复的错误
  • 745289 – wayland:不要在连接错误时使用 g_error()
参与其中

有兴趣参与 GTK+ 的工作吗?请查看新手的错误列表,并加入 irc.gnome.org 上的 IRC 频道 #gtk+。

GTK+ 4.0 中的窗口小部件层次结构

今天我们将邀请客座作者 Timm Bäder,Corebird 的维护者和 GTK+ 的贡献者,谈谈 GTK+ 4.0 中编写复合窗口小部件的更改。

(注意:这里的一些信息基于尚未合并到主分支的分支,但我相信它们将在不久的将来合并)

在 GTK+3 中,只有 GtkContainer 子类可以拥有子窗口小部件。对于我们所知的“公共”容器子项来说,这很有意义,例如 GtkBox — 即开发人员可以任意添加、删除和重新排序子窗口小部件,而容器只需进行布局即可。

但是,GTK+3 中还有一些更复杂的窗口小部件不继承自 GtkContainer,例如 GtkSpinButtonGtkSwitch。这些从来没有真正的 GtkWidget 子项。例如,考虑 GtkSpinButton 中的两个可点击区域。我在这里没有称它们为“按钮”是有原因的,因为在 GTK+3 中,它们不是实际的 GtkButton 实例,因为 GtkSpinButton 不是 GtkContainer。相反,GtkSpinButton 必须解决这个问题,并为向上/向下区域创建两个 GdkWindow,然后在其中渲染两个图标;关心悬停和 CSS 状态;各种按钮的向上/向下事件;以及 GdkWindow 的生命周期等。为了解决 GtkContainer 的要求,我们在 GTK+3 中引入了小工具 (GtkCssGadget)。在样式方面,小工具对应于一个 CSS 框,因此代表 CSS 树中的一个节点。在窗口小部件方面,它们被用于使非容器窗口小部件拥有“类似窗口小部件”、可使用 CSS 设置样式的子项。

GtkWidget 的更改

当然,在 GTK+4 中,需要进行大量的更改才能支持这些用例。我不会在这里列出所有更改(特别是那些更难看的更改,例如焦点处理),但我认为其中大多数对于应用程序开发人员和自定义窗口小部件作者来说都非常有趣和重要。总的来说,我们正在努力摆脱特殊情况,并通过尽可能重复使用窗口小部件来采用更通用的方式。因此,窗口小部件应该使用 GtkLabel,而不是使用 PangoLayout 来显示文本。如果你有一个具有按钮式语义的可点击区域,请尝试使用 GtkButton。如果你想在水平或垂直方向上布局窗口小部件,请使用 GtkBox。这样,我们就有一个窗口小部件树,输入和渲染都可以在其上操作。在实践中,这主要意味着摆脱窗口小部件内部使用的所有小工具,以及独立的 GtkCssNode 实例。

迭代子窗口小部件

在 GTK+3 中,每个容器都必须实现 GtkContainer::forall,并且可以使用 gtk_container_foreach()gtk_container_forall() 轻松地迭代所有子窗口小部件,而在 GTK+4 中,每个 GtkWidget 都可以拥有子窗口小部件,因此每个窗口小部件都可能有一个我们需要绘制、测量、调整大小等的子项列表。在窗口小部件层次结构中,可以通过以下方式访问这些子项和兄弟窗口小部件
  • gtk_widget_get_first_child()
  • gtk_widget_get_last_child()
  • gtk_widget_get_prev_sibling()
  • gtk_widget_get_next_sibling()
因此,迭代给定 GtkWidget 的子窗口小部件的最简单方法是(在 C 中)
GtkWidget *widget;
GtkWidget *child;
for (child = gtk_widget_get_first_child (widget);
     child != NULL;
     child = gtk_widget_get_next_sibling (child))
  {
    /* Do stuff with @child */
    g_assert (gtk_widget_get_parent (child) == widget);
  }

向非容器父项添加窗口小部件

GTK+(3 和 4)中的每个窗口小部件都保存指向其父窗口小部件的指针。可以使用 gtk_widget_set_parent() 设置此父项,并且所有 GtkContainer::add 实现最终都必须使用此函数来设置给定子窗口小部件的父项。

在 GTK+4 中,gtk_widget_set_parent() 仍然有效,并将窗口小部件添加到父项的子窗口小部件列表的末尾。但是,我们显然也希望管理子窗口小部件的顺序,以及在列表中添加新子项的位置,因此我们有

  • gtk_widget_insert_before()
  • gtk_widget_insert_after()
在父项列表中已有的子窗口小部件之前或之后添加新的子窗口小部件。这些还可以通过传递一个已经设置了给定父项的子项来重新排序子窗口小部件。
由于 GTK+ 中的许多窗口小部件当前都使用 XML 形式的复合窗口小部件模板,因此 GtkWidget 现在还具有自己的 GtkBuildable::add_child() 实现来支持此用例。例如,GtkFileChooserWidget 就使用了此实现,它几乎完全在 XML 中定义。

窗口小部件 CSS 名称

由于我们经常需要为任意窗口小部件使用任意 CSS 节点名称,因此 GtkWidget 现在具有一个仅构造属性,名为 GtkWidget:css-name,如果指定了该属性,则该属性将用作 CSS 节点名称。如果未指定该属性,则将使用传递给窗口小部件的 gtk_widget_class_set_css_name() 调用的名称。如果未使用上述 2 个中的任何一个,则 CSS 节点将简单地称为“widget”。

已转换的窗口小部件示例

当前主分支(以及侧分支)中已经有一些小部件从使用各种 GtkCssGadgetGdkWindowPangoLayout 转换为使用实际的小部件。最终目标当然是尽可能重用小部件,从而减少代码量和维护负担。

GtkSwitch

在 GTK+3 中,GtkSwitchGtkWidget 的直接子类(好耶!),它使用一个 GdkWindow 进行输入(点击开关将启用/禁用它),一个 GtkCssGadget 用于小部件本身,两个 PangoLayout 用于显示 ON/OFF 文本,以及另一个 GtkCssGadget 用于滑块。
在 GTK+ 主分支中,开关仍然有其小部件级别的 GtkCssGadget,因此它支持 min-width/min-height CSS 属性和 CSS 外边距,但滑块 gadget 已被 GtkButton 替换,并且两个 PangoLayoutGtkLabel 替换。这样,我们可以在 gtkswitch.c 中节省大约 300 行代码。理论上,我们还拥有更多功能,例如可以使用 GtkLabel 支持的有限的 text-decoration CSS 属性,但我只是怀疑这是否非常有用。

GtkSpinButton

如前所述,GtkSpinButton 可以很容易地使用实际的 GtkButton 作为向上/向下区域,并且它在 GTK+ 主分支中这样做(在某个时候将成为 GTK+4)。这消除了 gtkspinbutton.c 中的另外 300 行代码。通过使用 GtkButton,旧的图标辅助 gadget 也变成了实际的 GtkImage 实例。不幸的是,我们必须在这里自己实现一些 GtkGesture 的魔力,因为 GtkSpinButton 还支持对其按钮进行鼠标中键和右键单击,而 GtkButton::clicked 仅对单个主鼠标按钮单击做出反应。

GtkLevelBar

GtkLevelBar 管理一组块并为它们分配不同的样式类。在 GTK+3 中,这些块都是 GtkCssGadget 实例。它们都是“哑的”,因为它们不做任何特殊的事情 —— 它们只是 CSS 盒子而已。这就是为什么将其转换为对所有块使用 GtkWidget 没有获得太多文件大小的减少的原因。

 

GtkProgressBar

GtkProgressBar 使用 gadget 来表示槽和进度节点。它还使用 PangoLayout 来显示百分比或用户给定的字符串。

在主分支中,槽和进度都是小部件,并且 PangoLayout 当然是一个 GtkLabel。不必监听 GtkWidget::style-changed(这对于小部件是自动完成的),也不必自己绘制 PangoLayout(现在由 GtkLabel 处理),这样可以节省大约 200 行代码,这还是很不错的。

 

GtkExpander

GtkExpander 比它看起来更复杂。在 GTK+3 中,它由 2 个 GtkBoxGadget(类似于 GtkBox,但不是小部件……)、一个用于标题小部件左侧箭头的 gadget、标题小部件和实际内容小部件组成。在主分支中,这是使用实际的 GtkBox 和一个 GtkIcon(一个内部小部件)作为箭头来完成的。我不确定这是否是表达 GtkExpander 功能的最佳方式,例如,我们也可以对箭头+标题小部件组合使用 GtkButton
由于 GtkBoxGadget 几乎已经是完美的 GtkBox 克隆,因此这里的代码节省并不那么有趣,但是不必再次监听 GtkWidget::direction-changed 可以节省大约 30 行代码。

意外的 GtkBox 和 GtkButton 子类

GTK+3 包含许多从其他小部件继承的小部件,其唯一目的是看起来和表现得像它们。这里的问题是,这些小部件还继承了父类的所有 API,而这很少是需要的。
对于 GtkBox,GTK+3 中的几乎所有子类都是“意外的”,因为实际上将它们用作 GtkBox 没有任何意义,而且人们通常不会这样做,但是它们必须是 GtkBox 子类才能满足 GTK+ 的 GtkContainer 要求。这种小部件的一个示例是 GtkFileChooserWidget。这已经是存在过的最复杂的小部件之一,但是您是否曾经考虑过使用 gtk_container_add()gtk_box_pack_{start,end}() 来向其中添加小部件?这没有多大意义。它是一个封闭的实体,具有自己的 API。因此,在 GTK+4 中,它将是一个直接的 GtkWidget 子类,其中包含一个 GtkBox。也许不是。这只是您不必关心的实现细节。(顺便说一句:GtkFileChooserButton 在 GTK+3 中是一个 GtkBox
同样适用于 GtkButton。在 GTK+3 中,GtkButton 有许多子类继承了所有 GtkButton API,但实际上不支持它。如果从 GtkLinkButton 中删除子小部件会发生什么?如果您设置 GtkFontButtonGtkButton:label 属性会发生什么?同样,这些都是封闭的实体,它们具有自己的 API 来设置和获取各种数据,并根据它们更改行为和/或外观,但这并不意味着它们支持所有 GtkButton/GtkContainer 的恶作剧。

通用重构规则和未来

对于这项重构工作,我们尝试保持 CSS 节点结构与 GTK+3 中的结构相同,即我们尝试不破坏我们当前在 testsuite/css/nodes.c 中拥有的 CSS 节点测试。
GTK+ 中一些更复杂的小部件仍然严重依赖 gadget,将它们移植为仅使用实际小部件将需要大量工作。GtkRange 从历史上看是 GTK+ 中最复杂的非容器小部件之一。它既用于滚动条又用于刻度,因此将其移植到小部件可能首先需要进行另一轮重构。
另一个有趣的例子是 GtkNotebook,它结合了 gadget 和小部件的使用。在这里,例如,我们可以使用真正的 GtkStack 来在页面之间切换,并轻松支持页面切换过渡。
当然,另一个令人兴奋的未来展望是 Carlos 的 wip/carlosg/event-delivery 分支,它消除了大量的 GdkWindow 实例,并使小部件输入比以往任何时候都更容易。

本周 GTK+ – 33

在过去的两个星期里,我们连续举办了 DevConfFOSDEM,因此开发速度有所放缓。现在我们已经接近 GNOME 3.24 发布版,预计它将再次加快速度。

在过去的这两周里,GTK+ 的 master 分支有 34 次提交,增加了 20973 行代码,删除了 21593 行代码。

计划和状态
  • GTK+ 路线图可在维基上查看。
值得注意的更改

在 master 分支上

  • Timm Bäder 移除了 gtk_widget_class_list_style_properties(),这是为了继续弃用 GtkWidget 内部的样式属性,并用 CSS 属性替换它们。
  • Timm 还将一些仅由 GtkToggleButton 子类使用的状态移到了这些类型中。
  • William Hua 改进了 Mir GDK 后端,以实现菜单的正确定位。
修复的错误
  • 777547 关闭最后一个标签后,Notebook 的箭头图标颜色错误
  • 773686 软件启动时在 Dash 中显示错误的图标、名称和菜单
  • 775864 getting-started:拼写错误 tie->the
  • 778009 菜单在 Fedora 中绘制在菜单栏之上
参与其中

有兴趣参与 GTK+ 的工作吗?请查看新手的错误列表,并加入 irc.gnome.org 上的 IRC 频道 #gtk+。

GTK+ 本周进展 - 32

在过去的一周里,GTK+ 的 master 分支有 106 次提交,增加了 7340 行代码,删除了 12138 行代码。

计划和状态
  • Matthias Clasen 发布了 GTK+ 3.89.3
  • GTK+ 路线图可在维基上查看。
值得注意的更改

在 master 分支上

  • Benjamin Otte 简化了 Vulkan 渲染器的剪切着色器。
  • Benjamin 还从 CSS 解析器中删除了“假设没有尺寸的数字是像素”的后备代码。
  • Daniel Boles 对 GtkMenuGtkComboBoxGtkScale 小部件进行了各种修复。
  • Daniel 还简化了 GtkComboBox 的内部结构,并将大部分内部小部件移动到了 GtkBuilder UI 文件中。
  • Matthias Clasen 从 GTK+ 初始化函数中移除了命令行参数处理;gtk_init() 现在不接受任何参数。此外,gdk_init() 也被删除,因为 GDK 不再是一个单独的共享库。编写 GTK+ 应用程序的推荐方法仍然是使用 GtkApplication,它处理库初始化和主循环。
  • Timm Bäder 合并了他的分支,该分支使 GtkWidget 默认可见,但 GtkWindowGtkPopover 类除外;Timm 还从 API 中删除了 gtk_widget_show_all(),因为它不再有用。
  • Timm 修改了 GtkShortcutsShortcutGtkFileChooserButtonGtkFontButton,使其直接继承自 GtkWidget,利用了基类 GtkWidget 中的新场景图 API。

在 gtk-3-22 稳定分支上

  • Ruslan Izhbulatov 修复了 GDK 的 Windows 后端,以确保它与远程显示一起工作。
修复的错误
  • 777527 GDK W32:通过 RDP 工作时,GTK 应用程序中出现不可见的下拉菜单
  • 770112 文档中记录的 <alt>left 快捷键在 Wayland 上不起作用
  • 776225 [wayland] 下拉菜单放置在屏幕上的某个位置
  • 777363 [PATCH] wayland:避免不必要的 g_list_length 调用
参与其中

有兴趣参与 GTK+ 的工作吗?请查看新手的错误列表,并加入 irc.gnome.org 上的 IRC 频道 #gtk+。

GTK+ 本周进展 - 31

在过去的一周里,GTK+ 的 master 分支有 52 次提交,增加了 10254 行代码,删除了 9466 行代码。

计划和状态
  • Alex Larsson 正在研究两个独立的分支,以优化构建 GSK 渲染树时的内存分配和碎片化,这是在分析树构建代码后进行的。
  • Timm Bäder 正在研究一个主题分支,以将小部件切换为默认可见。
  • GTK+ 路线图可在维基上查看。
值得注意的更改

在 master 分支上

  • Rui Matos 在 Wayland 后端中为 gtk-enable-primary-paste 设置键添加了支持;这需要较新版本的 gsettings-desktop-schemas。
  • Matthias Clasen 和 Alex Larsson 重构了一些 GSK、GtkWidget 和 CSS 内部结构,以避免在分析渲染代码后出现过多的类型转换和类型检查。
  • Matthias 为 GtkAboutDialog 小部件添加了一个“系统”选项卡,用于自由形式的系统相关信息。
  • Matthias 还更新了 -gtk-icon-filter 的移植文档。
  • Benjamin Otte 更改了 X11 后端,使其始终无条件地调用 XInitThreads(),以便安全地使用 Vulkan 渲染 API;这应该是安全的,但鼓励进行测试。
  • Benjamin 更新了 GtkSnapshot API,以确保仅在快照完成后才提供渲染节点。
  • Benjamin 还修复了处理没有明确大小但应根据其纵横比缩放的 CSS 图像的问题。
  • Timm Bäder 为 GtkInfoBar 小部件添加了一个 revealed 属性,并将 GtkActionBar 代码移植为使用它。

在 gtk-3-22 稳定分支上

  • Ruslan Izhbulatov 致力于修复 Windows 下的各种键盘处理问题,包括与 AeroSnap 的交互;Ruslan 还修复了 bug 165385,这个 bug 将在 10 天后满 12 岁。
  • Carlos Garnacho 更改了 Wayland 后端的 EGL 处理,以禁用交换间隔,因为合成器负责计时渲染。
  • Matthias Clasen 弃用了已从开发分支中删除的其他 API。
修复的错误
  • 776031 W32:Win键+向下键最小化最大化的窗口,而不是恢复它
  • 165385 Win32 键盘处理仍然不完整
  • 769835 在 Wayland 上,如果包含 GtkGLArea 的应用程序不在当前工作区,则停止响应
  • 774726 GtkTreeView dnd:gtk_drag_finish 从 3.20 开始重新排序时删除行
  • 769214 Pause 键的 keyval 字段未正确填充
  • 776485 GDK W32:无法通过系统菜单恢复最大化的窗口
  • 776604 关于对话框:添加一个“系统”选项卡
  • 775846 gdk/wayland:为 gtk-enable-primary-paste gsetting 添加支持
参与其中

有兴趣参与 GTK+ 的工作吗?请查看新手的错误列表,并加入 irc.gnome.org 上的 IRC 频道 #gtk+。

GTK+ 本周进展 - 30

在过去的一周里,GTK+ 的 master 分支有 81 次提交,增加了 12205 行代码,删除了 12625 行代码。

计划和状态
  • 在年末休息之后,欢迎回到 GTK+ 本周进展。
  • GTK+ 路线图可在维基上查看。
值得注意的更改

在 master 分支上

  • Timm Bädert 合并了他的工作,将小部件的场景图直接移动到 GtkWidget 类中;这允许小部件拥有内部子项,而不必继承 GtkContainer
  • Timm 还致力于将当前使用内部 CSS 小工具 API 的小部件移植为复合小部件,例如 GtkSwitch
  • Benjamin Otte 和 Georges Basile Stavracas Neto 一直在努力使 Vulkan GSK 渲染器在 Wayland 上工作。
  • Benjamin 还致力于提高 Vulkan 渲染器的效率。
  • William Hua 致力于改进 GDK 的 Mir 后端,使其支持剪贴板。

在 gtk-3-22 稳定分支上

  • Matthias Clasen 发布了 GTK+ 3.22.6
修复的错误
  • 776627 更正 PostScript 大写
  • 776868 改进 GtkEntry:attributes 的文档
  • 776560 icon-browser:窗口以非常窄的尺寸打开,仅显示 1 列图标
  • 775732 mir:缺少剪贴板支持
  • 776736 build:修复 vulkan 检测
  • 776807 当通过选项组初始化 Gtk 时,GtkInspector 不会显示
参与其中

有兴趣参与 GTK+ 的工作吗?请查看新手的错误列表,并加入 irc.gnome.org 上的 IRC 频道 #gtk+。

GTK+ 本周进展 - 29

在过去的一周里,GTK+ 的 master 分支有 20 次提交,增加了 883 行代码,删除了 2740 行代码。

计划和状态
  • Alex Larsson 致力于简化 GdkWindow,删除了本机和外部子窗口;长期计划是仅对顶级窗口使用本机窗口系统表面。
  • Alex 还发送了一份在 gtk-devel-list 上的评论,评论了 Benjamin 的 wip/otte/rendernode 分支,其中包含关于 GSK 渲染 API 未来工作的想法。
  • Chun-wei Fan 更新了 Windows 后端,以确保它在 master 分支上继续构建和工作。
  • Benjamin Otte 在更多的 GtkWidget 子类中实现了 snapshot() 虚函数。
  • GTK+ 路线图可在维基上查看。
值得注意的更改

在 master 分支上

  • Olivier Fourdan 更新了 Wayland 后端,以确保在需要时,子表面的空输入形状得到更新;这允许其他工具包(如 Clutter)使用 GDK 子表面 API。
  • Alex Larsson 从 GDK API 中移除了 gdk_window_reparent(),因为它未被使用,并且符合仅拥有顶层 GDK 窗口的目标。
  • Benjamin Otte 从 GdkCellView 中移除了用于修改其背景的临时代码,因为单元格视图可以使用 CSS 来实现相同(或更好)的结果。
  • Benjamin 还从 GtkFrame CSS 节点中移除了 border 节点,因为它执行了额外的立即模式剪裁,从而使渲染复杂化。

在 gtk-3-22 稳定分支上

  • Emmanuele 推送了在使用缺少 GL_EXT_framebuffer_blit 扩展的 OpenGL ES 2.0 实现的 GtkGLArea 时,对 GL 渲染的修复。
修复的错误
  • 776132 提及 gdk_window_create_similar_image_surface 和 cairo_surface_create_similar_image 之间的区别
  • 774534 [wayland] 如果没有 begin_paint()/end_paint(),则不会应用输入形状和不透明区域
参与其中

有兴趣参与 GTK+ 的工作吗?请查看新手的错误列表,并加入 irc.gnome.org 上的 IRC 频道 #gtk+。