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 上的信号和属性替换。具体来说,暴露事件已被 ::render 信号替换,配置事件已被 ::size-changed 信号替换。映射事件已被 :mapped 属性替换,gdk_event_handler_set() 已被 ::event 信号替换。

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

GTK

部件

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

有许多布局管理器可用

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

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

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

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

核心 GtkEntry 功能已移动到新的 GtkText 部件中,该部件还实现了扩展的 GtkEditable 接口。GTK 中所有现有的条目子类都已转换为包装 GtkText 部件的 GtkEditable 实现。这还包括新的 GtkPasswordEntry

其他更改

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

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

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

即将推出

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