为 GTK 5 做准备 [src]

GTK 5 将成为 GTK 的一个重要新版本,在 APIABI 方面与 GTK 4.x 产生重大差异。GTK 5 尚未面世,因此我们无法完全确定从 GTK 4 迁移到 GTK 5 将涉及哪些内容。但是,我们已经可以就可能的变更提供一些初步提示,以及如何在使用 GTK 4 的代码中为这些变更做好准备。

不要使用已弃用的符号

和以前一样,在下一个主要版本的 GTK 中将要被废弃的函数和类型在 GTK 4 中都将被标记为弃用状态。

弃用 API 的使用是为你的代码做好准备以迎接下一个主要版本的 GTK 的最重要的步骤。弃用说明中经常会包含有关替代 API 的提示,以帮助你完成 此操作。

有时,了解有关较大 API 变更的动机和目标的一些背景信息是有帮助的。

单元格渲染器将被淘汰

单元格渲染器在 GTK 2 中引入,用于支持“大数据”UI,尤其是树视图的渲染。这些年来,越来越多的“数据类”窗口小部件开始使用它们,单元格渲染器已经发展成一个阴暗的替代渲染基础设施,它复制了窗口小部件的功能,同时复制代码并添加了自己的 错误处理方式。

GTK 4 中,已出现 GtkTreeViewGtkIconViewGtkComboBox 的替代窗口小部件:GtkListViewGtkColumnViewGtkGridViewGtkDropDown。对于 GTK 5,我们将采取下一步措施,移除所有基于单元格渲染器的 窗口小部件。

主题化渲染 API 将被淘汰

用于主题组件的旧版 GTK 2 时代渲染 API(如 gtk_render_frame()gtk_render_check())甚至在较新的 GTK 3 中也未被 GTK 本身使用过,但是它们被保留下来是为了让“外部绘图”用户受益,即希望自己的控件看起来像 GTK 而无需使用 窗口小部件的应用程序。

支持这一功能越来越妨碍了 GTK CSS 软件的快速和正确的运行。一个值得注意的问题是,临时样式更改(使用 gtk_style_context_save())会导致动画中断。因此,这些 API 将在 GTK 5 中被淘汰,以及它们更现代的 GtkSnapshot 形式,例如 gtk_snapshot_render_background()gtk_snapshot_render_focus()

使用 CSS 样式渲染窗口小部件部件的最佳方法是使用子窗口小部件。例如,要显示一段文本,并根据当前 CSS 样式显示字体、效果和阴影,请使用 GtkLabel

如果你需要适合于当前(深色或浅色)主题的自定义绘图,例如用于渲染图形,你仍然可以使用 gtk_widget_get_color() 获取当前样式的前景色。

本地样式表即将淘汰

GTKCSS 实现级联部分由于存在本地样式表(即使用 gtk_style_context_add_provider() 添加的样式表)而变得复杂。此外,本地样式表还有些令人费解,原因在于它们不适用于微件的整个子树,而只适用于添加样式表的微件。

GTK 5 将不再提供此功能。建议使用全局样式表(即 gtk_style_context_add_provider_for_display())并依靠样式类来确保你的 CSS 只在你希望的位置应用。

非标准 CSS 扩展功能将要移除

GTKCSS 机制在颜色方面有一些扩展功能是非标准的:带 `define` 颜色和颜色函数的命名颜色:`lighter()、darker()、shade()、alpha()、mix()`。

GTK 现在实现了 CSS 规范中的等效功能。

`define` 颜色功能将要移除

`define` 颜色应该被 :root 范围内的自定义属性所代替。

不要

@define-color fg_color #2e3436

...

box {
  color: @fg_color;
}

:root {
  --fg-color: #2e3436;
}

...

box {
  color: var(--fg-color);
}

有关自定义 CSS 属性和变量的详细信息,请参阅 CSS 级联变量自定义属性 规范。

颜色表达式功能将要移除

所有的颜色函数都可以替换成 calc()color-mix() 的组合。

lighter(c)darker(c) 分别只是 shade(c, 1.3)shade(c, 0.7),因此可以像以下示例中的 shade 一样进行处理。

替换

a {
  color: mix(red, green, 0.8);
}

b {
  color: alpha(green, 0.6);
}

c {
  color: shade(red, 1.3);
}

d {
  color: shade(red, 0.7);
}

a {
  color: color-mix(in srgb, red, green 80%);
}

b {
  color: rgb(from green, r g b / calc(alpha * 0.6));
}

c {
  color: hsl(from red, h calc(s * 1.3) calc(l * 1.3));
}

d {
  color: hsl(from red, h calc(s * 0.7) calc(l * 0.7));
}

可以以各种方式进行这些替换。

注意,GTK 过去曾在 SRGBHSL 色彩空间计算 mix()shade() 值,但改为使用 OKLAB 可能会有稍微更好的结果。

有关 color-mix() 的详细信息,请参阅 CSS 颜色 规范。

选取器接口功能将要移除

GtkColorChooserGtkFontChooserGtkFileChooserGtkAppChooser 接口及其作为对话框、按钮和微件的实现正在逐步淘汰。它们将由一组新的异步 API 所取代,这些 API 将更方便使用语言绑定,特别是对于具有像 Promise 这样的概念的语言。新 API 包括 GtkColorDialogGtkFontDialogGtkFileDialog,还有一些“按钮”微件的等效项:GtkColorDialogButtonGtkFontDialogButton

GtkMessageDialog 功能将要移除

与选取器接口类似,GtkMessageDialog 已被一个新的异步 API 所取代,该 API 更方便使用,特别是对于语言绑定。新 APIGtkAlertDialog

GtkDialog 功能将要移除

在移除 gtk_dialog_run() 之后,GtkDialog 的实用性大大降低,并且其 API 比较奇怪和陈旧。因此,我们决定舍弃它。建议的替代方案是,只创建你自己的窗口并在需要时添加按钮,这些按钮可以添加在标题栏或其他地方。

GtkInfoBar 功能将要移除

GtkInfoBar 有一个对话框 API,随着对话框的逐步淘汰,现在到了对其进行弃用的时刻。如果你需要此类微件,那么使用带有标签和按钮的 GtkRevealer 创建一个微件相对较简单。

其他库,例如 libadwaita,也可能提供替代方案。

gtk_show_uri 正在被替换

您应使用 GtkUriLauncherGtkFileLauncher,而不是 gtk_show_uri()

GtkStatusbar 即将不复存在

这是一个老式窗口小组件,由于它不再具有窗口的调整大小句柄,因此不再执行很多操作。

GtkLockButton 和 GtkVolumeButton 即将不复存在

这些是非常专业的小组件,应该更好地与它们所用的应用程序一起使用。

窗口小组件大小 API 更改

函数 gtk_widget_get_allocated_width()gtk_widget_get_allocated_height() 即将不复存在。在大多数情况下,gtk_widget_get_width()gtk_widget_get_height() 是合适的替换。请注意语义稍有不同:旧函数返回 CSS 边框区域的大小,而新函数返回窗口小组件内容区域的大小。在出现此差异的地方,您可以改用 gtk_widget_compute_bounds (widget, widget, &bounds)

函数 gtk_widget_get_allocation() 也即将不复存在。它没有直接的替换,但前面提到的替换也可以用于它。

函数 gtk_widget_get_allocated_baseline() 已重命名为 gtk_widget_get_baseline()

停止使用 GdkPixbuf

GTK 正放弃使用 GdkPixbuf 作为传输图像数据的首要 API,并支持 GdkTexture。接受或返回 GdkPixbuf 的 API 正被使用 GdkTextureGdkPaintable 对象的等效 API 替换。