为 GTK 5 做准备 [src]
GTK 5 将成为 GTK 的一个重要新版本,在 API 和 ABI 方面与 GTK 4.x 产生重大差异。GTK 5 尚未面世,因此我们无法完全确定从 GTK 4 迁移到 GTK 5 将涉及哪些内容。但是,我们已经可以就可能的变更提供一些初步提示,以及如何在使用 GTK 4 的代码中为这些变更做好准备。
不要使用已弃用的符号
和以前一样,在下一个主要版本的 GTK 中将要被废弃的函数和类型在 GTK 4 中都将被标记为弃用状态。
弃用 API 的使用是为你的代码做好准备以迎接下一个主要版本的 GTK 的最重要的步骤。弃用说明中经常会包含有关替代 API 的提示,以帮助你完成 此操作。
有时,了解有关较大 API 变更的动机和目标的一些背景信息是有帮助的。
单元格渲染器将被淘汰
单元格渲染器在 GTK 2 中引入,用于支持“大数据”UI,尤其是树视图的渲染。这些年来,越来越多的“数据类”窗口小部件开始使用它们,单元格渲染器已经发展成一个阴暗的替代渲染基础设施,它复制了窗口小部件的功能,同时复制代码并添加了自己的 错误处理方式。
在 GTK 4 中,已出现 GtkTreeView
、GtkIconView
和 GtkComboBox
的替代窗口小部件:GtkListView
、GtkColumnView
、GtkGridView
和 GtkDropDown
。对于 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()
获取当前样式的前景色。
本地样式表即将淘汰
GTK 的 CSS 实现级联部分由于存在本地样式表(即使用 gtk_style_context_add_provider()
添加的样式表)而变得复杂。此外,本地样式表还有些令人费解,原因在于它们不适用于微件的整个子树,而只适用于添加样式表的微件。
GTK 5 将不再提供此功能。建议使用全局样式表(即 gtk_style_context_add_provider_for_display()
)并依靠样式类来确保你的 CSS 只在你希望的位置应用。
非标准 CSS 扩展功能将要移除
GTK 的 CSS 机制在颜色方面有一些扩展功能是非标准的:带 `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 过去曾在 SRGB 和 HSL 色彩空间计算 mix()
和 shade()
值,但改为使用 OKLAB 可能会有稍微更好的结果。
有关 color-mix() 的详细信息,请参阅 CSS 颜色 规范。
选取器接口功能将要移除
GtkColorChooser
、GtkFontChooser
、GtkFileChooser
和 GtkAppChooser
接口及其作为对话框、按钮和微件的实现正在逐步淘汰。它们将由一组新的异步 API 所取代,这些 API 将更方便使用语言绑定,特别是对于具有像 Promise 这样的概念的语言。新 API 包括 GtkColorDialog
、GtkFontDialog
和 GtkFileDialog
,还有一些“按钮”微件的等效项:GtkColorDialogButton
、GtkFontDialogButton
。
GtkMessageDialog 功能将要移除
与选取器接口类似,GtkMessageDialog
已被一个新的异步 API 所取代,该 API 更方便使用,特别是对于语言绑定。新 API 是 GtkAlertDialog
。
GtkDialog 功能将要移除
在移除 gtk_dialog_run()
之后,GtkDialog
的实用性大大降低,并且其 API 比较奇怪和陈旧。因此,我们决定舍弃它。建议的替代方案是,只创建你自己的窗口并在需要时添加按钮,这些按钮可以添加在标题栏或其他地方。
GtkInfoBar 功能将要移除
GtkInfoBar
有一个对话框 API,随着对话框的逐步淘汰,现在到了对其进行弃用的时刻。如果你需要此类微件,那么使用带有标签和按钮的 GtkRevealer
创建一个微件相对较简单。
其他库,例如 libadwaita,也可能提供替代方案。
gtk_show_uri 正在被替换
您应使用 GtkUriLauncher
或 GtkFileLauncher
,而不是 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 正被使用 GdkTexture
或 GdkPaintable
对象的等效 API 替换。