关于弃用

如果您关注 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 中可能看起来有点笨拙,但它可以很好地转换为具有 promises 和 exceptions 概念的语言

try {
  const file = await dialog.open(parent, ...);
  
  ...
} catch (e) {
  ...
};

要了解有关新 API 的更多信息,您可以查看它们的在线文档:GtkColorDialogGtkFontDialogGtkFileDialogGtkAlertDialog

有了这些替代方案,我们可以弃用选择器接口、它们的窗口小部件实现以及它们的基类 GtkDialog。

无需惊慌

GTK 中的弃用是对将在下一个破坏 API 兼容性的主要版本中出现更改的早期展望。但最终的 GTK 5 版本仍然遥遥无期。我们甚至还没有为此制定计划。

绝对没有必要急于进行“弃用清理”。您只需要在想要移植到 GTK 5 时删除所有弃用用法——而 GTK 5 尚不存在。

不过,您仍然可以做一些事情。我们正在 4.10 中引入弃用,作为一种让用户有时间适应并为我们的想法提供反馈的方式。如果您想这样做,您可以在 gitlab 中提交 issue,在 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。