如果您关注 GTK 的 git 仓库,您可能已经注意到最近几周发生了一些变化。
我们有一个目录 gtk/deprecations,它用于存放实现已弃用 API 的源文件,这些 API 将在下一个主要版本中被删除。在 4.0 版本中,我们清空了这个目录,此后它一直是空的。但最近,它又开始积累文件了。
这是一个很好的机会来提醒大家我们在 GTK 中如何使用弃用。但首先,让我们看看细节。
细节,第一部分:单元格渲染器
在 GTK 4 中,我们引入了一个新的基于列表模型的列表和网格部件系列:GtkListView、GtkColumnView、GtkGridView。还有一个使用列表模型的新组合框实现,称为 GtkDropDown。总而言之,这些旨在提供 GTK 3 中可以使用单元格渲染器完成的所有操作的替代方案。
最终目标是删除单元格渲染器,因为它们是一个独立的渲染和布局系统,它往往会干扰 GTK 的 CSS 和布局机制,并使一切变得更加复杂。
但我们并没有完全在 4.0 版本中完成,主要是因为我们仍然在 GTK 本身中大量使用了树视图。首先也是最重要的,文件选择器。由于文件选择器将在 4.10 中移植为使用 GtkColumnView,现在是弃用单元格渲染器机制和所有使用它们的部件的合适时机。
这是一大段代码,超过 75,000 行。
细节,第二部分:对话框
在 GTK 4 中,我们放弃了 gtk_main() 和 gtk_dialog_run(),因为最好避免递归主循环。同样,我们没有完成,无法删除 GtkDialog 本身,因为它被用作我们所有复杂对话框的基类。
GTK 4.10 为我们的“选择器”对话框引入了替换 API。新的 API 遵循 gio 异步模式。这是一个例子
GtkFileDialog * gtk_file_dialog_new (void); void gtk_file_dialog_open (GtkFileDialog *self, GtkWindow *parent, GFile *current_file, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); GFile * gtk_file_dialog_open_finish (GtkFileDialog *self, GAsyncResult *result, GError **error);
这在 C 语言中可能看起来有点笨拙,但它可以很好地转换为具有 Promise 和异常概念的语言
try { const file = await dialog.open(parent, ...); ... } catch (e) { ... };
要了解有关新 API 的更多信息,您可以查看它们的在线文档:GtkColorDialog、GtkFontDialog、GtkFileDialog、GtkAlertDialog。
有了这些替代方案,我们可以弃用选择器接口、它们的部件实现以及它们的基类 GtkDialog。
无需惊慌
GTK 中的弃用是对下一个将出现重大 API 兼容性破坏的主要版本更改的早期展望。但最终的 GTK 5 发布还很遥远。我们甚至还没有制定计划。
绝对没有必要急于进行“弃用清理”。您只需要在想要移植到 GTK 5 时删除所有对弃用的使用——而 GTK 5 尚不存在。
不过,您仍然可以做一些事情。我们在 4.10 中引入弃用是为了给我们的用户时间来适应,并为我们的想法提供反馈。如果您想这样做,您可以在 gitlab 中提交问题,在 discourse 中开始讨论,或者在 matrix 上找到我们。
与此同时…
弃用警告可能很烦人,但幸运的是,有简单的方法可以将其关闭。对于偶尔调用已弃用函数的情况,最好将其包装在 G_GNUC_BEGIN/END_IGNORE_DEPRECATIONS 中
G_GNUC_BEGIN_IGNORE_DEPRECATIONS gtk_dialog_add_button (dialog, "Apply", GTK_RESPONSE_APPLY); G_GNUC_END_IGNORE_DEPRECATIONS
如果您确定永远不想看到任何弃用警告,您也可以只将 -Wno-deprecated-declarations 传递给 gcc。