重要新闻

对于即将到来的 GTK 4.6,我们对尺寸调整的基础设施进行了全面改进,以使小部件的贴合度更高,并确保我们的尺寸调整基础设施真正按照其声明的方式工作。

halign/valign

当使用 GtkWidget::halignGtkWidget::valign 属性时,GTK 4.4 会查看小部件的默认大小,然后相应地放置小部件。当其中一个值设置为填充时,这会留下很多额外的空间。在 GTK 4.6 中,GTK 将测量相对于填充维度的另一维度的尺寸。这使得小部件更薄,但避免了额外的空间。

A centered label with empty space in GTK 4.4
在 GTK 4.4 中,一个带有空白空间的居中文本标签

A centered label with no extra space in GTK 4.6
在 GTK 4.6 中,一个没有额外空间的居中文本标签

如果您喜欢旧的行为怎么办?

如果您在任何一个方向上都不使用填充,则行为将与以前相同。因此,更新另一个维度以使其不使用默认填充,您应该会恢复旧的行为。

GtkBox

GtkBox 已经学会了根据需要向小部件分配大小。在 GTK 4.4 中,大小始终在具有相同默认大小的子项之间平均分配。GTK 4.6 将查询子项的实际大小,以决定将多少额外大小分配给哪个子项。

您可以在示例中看到这一点,其中框被赋予了足够容纳 3、4、5 或 6 行文本的空间。

在 GTK 4.4 中,一个左对齐的框
在 GTK 4.6 中,一个左对齐的框

GtkLabel

如您在上面看到的,GtkLabel 还学会了正确地换行到任何给定的行数。这使得标签比以前占用更少的宽度,因此当它们可以换行时,它们不再占用空白空间。

xalign 和 halign

值得指出的是,在许多情况下,应用程序使用了 GtkWidget::halign = GTK_HALIGN_START;,而它们应该使用 GtkLabel::xalign = 0.0;。前者将小部件尽可能地向左对齐,而后者将分配空间内的文本向左对齐。因此,如果您的窗口小部件突然看起来粘在左边缘,您可能需要考虑一下。

GtkWindow

GtkWindow 已经学会了如何根据纵横比调整最小尺寸。因此,您现在可以随意调整窗口大小,它们永远不会变得太小,但它们始终会变得尽可能小,无论您想使它们扁平而宽,还是纤细而高。

一个新的警告

在进行这项工作时,我们发现一些小部件不符合测量要求,并添加了一个新的警告。因此,如果您看到类似的内容
Gtk-CRITICAL **: 00:48:33.319: gtk_widget_measure: assertion 'for_size >= minimum opposite size' failed: 23 >= 42
这意味着您有一个小部件报告的大小 -1 的最小尺寸大于它报告的不同大小的最小尺寸,这绝对不应该发生。您可以使用 GTK_DEBUG=size-request 并重定向到一个文件以查找有问题的窗口小部件。我们还添加了代码来解决任何警告问题,但无论如何都应该修复它。毕竟,如果小部件报告的大小错误,则很可能是它做错了什么。

GTK 4.0

2020 年是非常漫长的一年。有什么比发布一个主要版本更好的方式来结束它呢! 今天,我们发布了 GTK 4.0。

GTK 4.0 是一小群敬业的开发人员辛勤工作的成果。我们将单独发帖回顾统计数据,但简短的总结是,自 2016 年 11 月的 3.89.1 版本以来,我们添加了超过 18000 次提交,并发布了超过 20 个开发版本。

祝贺并衷心感谢每一位参与此项工作的人,特别是 Benjamin、Emmanuele、Timm、Carlos、Jonas 和 Christian!

新增功能

不可能在一篇文章中总结 4 年的开发。在过去的一年中,我们撰写了关于此版本中许多新功能的详细文章:数据传输事件控制器布局管理器渲染节点媒体播放可缩放列表着色器可访问性。以下是一些视觉形式的亮点

媒体播放

拖放

布局管理器和转换

可缩放列表和网格

着色器

什么是旧的

GTK 4 现在是稳定的,我们认为它已准备好被使用。但这并不意味着 GTK 3 已经消亡 - 我们将在可预见的未来继续支持和更新它(最新版本 3.24.24 在几天前悄悄发布)。但这确实意味着 GTK 2 已经走到生命的尽头。我们将在未来几天发布最终的 2.x 版本,我们鼓励大家将其 GTK 2 应用程序移植到 GTK 3 或 4。

如何获取

源代码 tarball 可在通常的 位置找到。二进制软件包应很快出现在主要发行版中。

GNOME 40 版本将有许多应用程序移植到 GTK 4。如果您想立即尝试 GTK 4.0,您可以使用 gtk4-demogtk4-widget-factory 的每日 flatpak 构建版本

$ flatpak install https://nightly.gnome.org/repo/appstream/org.gtk.Demo4.flatpakref
$ flatpak run org.gtk.Demo4

如果您迫切希望将您的应用程序移植到 GTK 4,我们的迁移指南可在 可用文档中找到。

如何支持 GTK

如果没有许多志愿者贡献错误报告、补丁、翻译或想法,GTK 将无法开发。感谢你们所有人。我们还要感谢 GNOME 基金会为 GTK 提供开发资源、基础设施和旅行援助。

向 GNOME 基金会捐款是支持未来 GTK 开发的好方法。

接下来会发生什么

我们非常感谢所有早期测试人员向我们提供的错误报告和反馈,这使得此版本更加完善。但是我们完全期望会有快速的 4.0.1 版本来修复在 .0 版本发布后才会暴露出来的疏忽和陷阱。

既然我们有了 4.0 版本,我们需要将库生态系统引入进来,以使应用程序能够使用它。vte、webkit 和 gtksourceview 是最常与 GTK 一起使用的最著名的库。我们预计这些库的 GTK 4 移植版本将很快可用。

如果出现更严重的问题,我们将在 GNOME 40 的时候发布 4.2 版本,否则我们可能会等到夏天再发布。

GTK 4 之后未来会带来什么还有待观察。我们有一些有趣的东西正在开发中,但我们也想听听应用程序开发人员希望在 GTK 中看到哪些功能。告诉我们!

庆祝活动

我们将于本周五举办(在线)聚会来庆祝 4.0 版本的发布。随时光临!

列表中的拖放

我最近有机会通过拖放 (DND) 实现 GtkListBox 的重新排序。这并不是那么复杂。由于我没有看到拖放操作在列表框中被大量使用,因此这里快速总结一下使基本功能正常工作所需的内容。

设置拖动源

有两种方法可以将 GTK+ 小部件设为拖动源(即单击和拖动将启动 DND 操作的位置)。您可以通过调用 gtk_drag_begin() 动态决定启动拖动。但我们在这里采用更简单的方法:我们只是静态地声明我们的列表行应该是拖动源,并让 GTK+ 处理所有细节

handle = gtk_event_box_new ();
gtk_container_add (GTK_CONTAINER (handle),
        gtk_image_new_from_icon_name ("open-menu-symbolic", 1));
gtk_drag_source_set (handle,
        GDK_BUTTON1_MASK, entries, 1, GDK_ACTION_MOVE);

请注意,我选择在此处创建一个可见的拖动手柄,而不是允许在行的任何位置开始拖动。它看起来像这样

这些条目告诉 GTK+ 我们希望通过此源中的拖动提供哪些数据。在我们的例子中,我们不会提供像 text/plain 这样的标准 mime 类型,而是自行创建我们自己的私有类型,并且还会提示 GTK+ 我们不想支持拖动到其他应用程序

static GtkTargetEntry entries[] = {
   { "GTK_LIST_BOX_ROW", GTK_TARGET_SAME_APP, 0 }
};

这里有一个小问题,您设置为拖动源的小部件必须具有 GdkWindow。GtkButton 或 GtkEventBox(如本示例中所示)都可以工作。GTK4 将提供一个不同的 API 来创建拖动源,该 API 避免了对窗口的需求。

有了这段代码,您已经可以拖动您的行,但是到目前为止,没有地方可以放置它们。让我们来修复它。

接受放置

与拖动形成对比,我们创建了一个可见的拖动手柄来向用户提示支持拖放,我们只想接受列表中的任何位置的放置。最简单的方法是只将每一行都设为放置目标(即可能接受放置的位置)。

gtk_drag_dest_set (row,
        GTK_DEST_DEFAULT_ALL, entries, 1, GDK_ACTION_MOVE);

这些条目与我们上面讨论的相同。GTK_DEST_DEFAULT_ALL 告诉 GTK+ 为我们处理 DND 操作的所有方面,因此我们可以使此示例保持简单。

现在我们可以开始在句柄上拖动,并将其放到其他行上。但是之后什么也不会发生。我们需要做一些额外的工作才能实现重新排序。接下来我们来做这件事。

传输数据

拖放通常用于在应用程序之间传输数据。GTK+为此使用一个名为 GtkSelectionData 的数据持有者对象。要发送和接收数据,我们需要连接到源端和目标端的信号。

g_signal_connect (handle, "drag-data-get",
        G_CALLBACK (drag_data_get), NULL);
g_signal_connect (row, "drag-data-received",
        G_CALLBACK (drag_data_received), NULL);

在源端,当 GTK+ 需要数据以将其发送到放置目标时,会发出 drag-data-get 信号。在我们的例子中,该函数只是将指向源小部件的指针放入选择数据中。

gtk_selection_data_set (selection_data,
        gdk_atom_intern_static_string ("GTK_LIST_BOX_ROW"),
        32,
        (const guchar *)&widget,
        sizeof (gpointer));

在目标端,当 GTK+ 将接收到的数据传递给应用程序时,会在放置目标上发出 drag-data-received 信号。在我们的例子中,我们将从选择数据中取出指针,并重新排列该行。

handle = *(gpointer*)gtk_selection_data_get_data (selection_data);
source = gtk_widget_get_ancestor (handle, GTK_TYPE_LIST_BOX_ROW);

if (source == target)
  return;

source_list = gtk_widget_get_parent (source);
target_list = gtk_widget_get_parent (target);
position = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (target));

g_object_ref (source);
gtk_container_remove (GTK_CONTAINER (source_list), source);
gtk_list_box_insert (GTK_LIST_BOX (target_list), source, position);
g_object_unref (source);

这里唯一的技巧是,我们需要在将小部件从其父容器中删除之前获取对该小部件的引用,以防止它被最终确定。

这样,我们就有了可重新排序的行了。耶!

最后一步,让我们让它看起来更好看。

一个漂亮的拖动图标

到目前为止,在拖动过程中,您只会看到光标,这没什么帮助,也不是很漂亮。预期的行为是拖动该行的可视化表示。

为了实现这一点,我们连接到拖动源上的 drag-begin 信号

g_signal_connect (handle, "drag-begin",
        G_CALLBACK (drag_begin), NULL);

...并做一些额外的工作来创建一个漂亮的“拖动图标”

row = gtk_widget_get_ancestor (widget, GTK_TYPE_LIST_BOX_ROW);
gtk_widget_get_allocation (row, &alloc);
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
                                      alloc.width, alloc.height);
cr = cairo_create (surface);
gtk_widget_draw (row, cr);

gtk_drag_set_icon_surface (context, surface);

cairo_destroy (cr);
cairo_surface_destroy (surface);

这看起来比实际复杂 - 我们正在创建一个大小合适的 Cairo Surface,将行小部件渲染到其中(信号是在句柄上发出的,因此我们必须找到作为祖先的行)。

不幸的是,这还不能产生完美的结果,因为列表框行通常不渲染背景或框架。为了解决这个问题,我们可以临时向该行的样式上下文添加一个自定义样式类,并使用一些自定义 CSS 来确保我们得到背景和框架

context = gtk_widget_get_style_context (row);
gtk_style_context_add_class (context, "drag-icon");
gtk_widget_draw (row, cr);
gtk_style_context_remove_class (context, "drag-icon")

作为额外的改进,我们可以在 Surface 上设置一个偏移量,以防止在拖动开始时出现视觉“跳跃”,方法是在 gtk_drag_set_icon_surface() 调用之前放置此代码

gtk_widget_translate_coordinates (widget, row, 0, 0, &x, &y);
cairo_surface_set_device_offset (surface, -x, -y);


瞧!

后续步骤

本文仅展示了通过拖放进行行重新排序的最简单设置。可以进行许多改进,有些很容易,有些则不太容易。

一个明显的增强功能是允许在同一应用程序中的不同列表之间拖动。这只是在 drag_data_received() 调用中小心处理列表小部件的问题,而我在此处展示的代码应该已经适用于此。

另一个改进是根据哪个边缘更近,将该行放置在目标行的前面或后面。与此一起,您可能希望修改放置目标的高亮显示,以指示将发生放置的边缘。这可以通过不同的方式完成,但所有这些都需要监听 drag-motion 事件并处理事件坐标,这并不是我想在这里深入讨论的内容。

最后,在拖动过程中滚动列表。这对于长列表很重要,如果您想将一行从顶部拖到底部 - 如果列表不滚动,您必须以页面增量来执行此操作,这太麻烦了。实现此目的最简单的方法可能是将放置目标移动到列表小部件本身,而不是单个行。

参考

GTK+ Inspector

许多 GTK+ 用户和开发人员已经听说过 GTK+ Inspector,这是一种用于检查、修改和理解 GTK+ 应用程序的工具。Inspector 非常强大,它允许主题设计人员动态测试 CSS 更改并放大窗口小部件以查看最小的细节,允许开发人员检查应用程序窗口小部件及其属性,并允许用户玩(并最终破坏)应用程序。

在本文中,我们将探索 GTK+ Inspector 并展示您可以使用它做什么。

序言

由于 Inspector 是一个调试工具,因此默认情况下处于禁用状态。要开始使用 Inspector,您必须首先启用它。您可以使用 DConf Editor 轻松完成此操作

Enabling the Gtk+ Inspector with DConf Editor
使用 DConf Editor 启用 GTK+ Inspector

或者,您可以使用终端启用它。为此,请运行以下命令

$ gsettings set org.gtk.Settings.Debug enable-inspector-keybinding true

完成!Inspector 现在已启用!

打开 Inspector

现在 Inspector 已启用,您需要运行它。Inspector 始终与应用程序关联。让我们以 GNOME Calendar 为例

GNOME Calendar
GNOME Calendar 应用程序

有多种方法可以调出 Inspector。您可以在使用应用程序时打开它,方法是键入 <Ctrl> + <Shift> + D(或 <Ctrl> + <Shift> + I 以自动选择鼠标指针下的窗口小部件)。或者,您可以从终端使用环境变量 GTK_DEBUG=interactive 启动应用程序。

Inspector 将打开,您将看到以下窗口

Inspector on Calendar
GNOME Calendar 上的 Inspector 窗口

这就是您必须做的全部工作。现在让我们探索 Inspector 提供的各种功能。

探索 Inspector

起初,大量的按钮和选项卡可能会让那些不精通应用程序检查艺术的人感到困惑。选项卡的快速说明,按顺序

  • 对象:公开应用程序的窗口小部件,并允许编辑属性并查看有关每个窗口小部件的详细信息。在下面解释。
  • 统计信息:显示应用程序的杂项统计信息。您需要使用 GOBJECT_DEBUG=instance-count 运行应用程序。
  • 资源:显示嵌入在应用程序二进制文件中的各种资源,例如自定义图标或 GtkBuilder 文件等。
  • CSS:允许实时测试 CSS。在下面解释。
  • 视觉:控制应用程序的一些视觉方面,例如文本方向、深色/浅色变体、主题、缩放比例等。
  • 常规:显示有关 GTK+ 应用程序(及其正在运行的会话)的杂项信息。

让我们剖析 GTK+ Inspector 的主窗口

Inspector window
Inspector 主窗口

Inspector 的这 4 个带注释的部分是最常用的。主题设计人员会希望检查 (3) 和 (4),而开发人员通常使用 (1) 和 (2)。

检查窗口小部件

对于开发人员来说,Inspector 通过允许您更改屏幕上任何窗口小部件的属性来显示其用途。让我们首先单击第一个按钮并使用鼠标光标选择一个窗口小部件

Selecting widgets
使用 Inspector 选择窗口小部件

现在,您可以通过浏览“对象”>“属性”选项卡轻松更改该窗口小部件的属性。您可以更改例如窗口小部件的可见性、标签的文本等等!

Editing a widget property
编辑窗口小部件属性

既然您知道如何检查 GTK+ 应用程序,请随意尝试并探索有多少应用程序被组织起来。更改窗口小部件的属性并查看会发生什么。大多数情况下,这是安全的,不会破坏您的 GNOME 会话或使您的计算机死机!

编辑 CSS

Inspector 也是设计师的强大工具。它拥有的最强大的功能之一是实时 CSS 编辑器。让我们首先转到 CSS 选项卡

CSS Editor
Inspector CSS 编辑器视图

让我们来玩玩 CSS!粘贴以下 CSS 代码并查看会发生什么

window stack {
    background-color: orange;
}

哇!窗口变得异形了!该 CSS 代码更改了 GtkWindow 内任何 GtkStack 窗口小部件的背景颜色。如果您想了解有关 CSS 选择器以及 GTK+ 如何使用 CSS 进行主题设置的更多信息,请查看本文末尾的一些有用链接。

谨慎的读者可能会问:CSS 元素的层次结构是什么?如何查看哪些 CSS 元素可用?

不用担心!GTK+ Inspector 允许您轻松地在“对象”>“CSS 节点”选项卡中检查 CSS 层次结构。

CSS Nodes
CSS 节点选项卡

GTK+ 窗口小部件具有文档化的 CSS 名称。您可以浏览 GTK+ 文档,查看窗口小部件是如何组织的,以及如何使用 CSS 来控制窗口小部件的各个方面。

不确定您的 CSS 更改是否完美?让我们放大窗口小部件,以确保我们不会遗漏任何细节

Zooming widget using Magnifier
使用 Magnifier 选项卡缩放窗口小部件

看起来不错?加入 -design 并与社区分享您的精彩 CSS 片段!

总结

虽然本文探讨了 GTK+ Inspector 的一些最大方面,但这绝不是 Inspector 所有功能的详尽列表。但是,在阅读本文之后,您应该可以自行打开 Inspector 并探索其更多强大的功能。

疑问?评论?建议?请您过来留言,加入 GNOME IRC 网络中的 #gtk+ 频道,让我们知道您的想法!

有用的链接

相对窗口定位的未来

随着新兴的 显示 服务器 技术的发展,工具包有时需要调整它们实现其所提供功能的方式。其中一项需要调整的功能是如何让 GTK+ 定位弹出窗口,例如菜单、弹出框和工具提示,以便它们放置在显示器的工作区域内。

在过去,当 GTK+ 想要定位一个菜单时,它会首先查找菜单的父窗口的全局位置。然后它会查找所有连接的显示器的工作区域。有了给定的工作区域、父窗口的全局位置以及相对于父窗口的菜单的预期位置,GTK+ 会使用一个巧妙的算法来计算一个合理的菜单放置位置,以便它对用户可见。例如,如果“文件”菜单没有足够的空间在父菜单项下方弹出,那么 GTK+ 会将其重新定位到父菜单项上方。

popup-flip

由于 各种 原因,在这些新的显示服务器技术中,客户端中已经移除了“全局窗口位置”的概念,这意味着我们不能再在 GTK+ 中使用我们巧妙的算法了。

但是,我们仍然希望我们的菜单、工具提示、弹出框等对期望与之交互的用户完全可见,那么如何在不知道我们的窗口位置的情况下确保这一点呢?

为了在 GTK+ 中解决这个问题,我们必须解决许多问题。

  • 定位逻辑需要移动到 GDK,同时仍然允许 GTK+ 影响菜单定位的行为,如果最初预期的位置最终在工作区域之外。
  • 不同的 GDK 后端可能会以不同的方式 处理
  • 某些类型的窗口需要知道它最终所在的位置,以便它们可以调整自身的绘制方式。
  • 一些窗口只是想尽可能地占用空间(例如,一个选项太多的菜单不应该比屏幕高)。

去年,William Hua 和我开始工作,将 GTK+ 带入无全局位置菜单窗口的美好未来。在提出一系列实现此目的的补丁后,关于这种 API 实际应该是什么样子的讨论开始了。在 200-300 条评论后,我们决定我们应该面对面讨论这个问题。

参加在多伦多举行的 GTK2016

在黑客马拉松上,我们有机会坐在白板前,讨论不同的用例、需要解决的问题、后端如何工作,最终我们提出了一个 API。

william-draws-whiteboard(照片来源:Allison Lortie)

我们提出的 API 如下所示

从 GDK 方面,我们引入了一个新的函数(到目前为止没有任何 API 稳定性承诺;它目前仅供 GTK+ 使用)gdk_window_move_to_rect (),它接受一组参数,描述应用程序希望如何相对于某些父曲面放置其窗口。它接受:

  • 一个瞬态窗口

要相对于其放置的父窗口,父窗口上的一个锚点矩形。弹出窗口或菜单通常希望相对于父窗口上的一个矩形放置,例如右键单击上下文菜单应从单击时指针所在像素的某个方向展开,或者文件菜单应放置在父窗口上的文件菜单项矩形的下方或上方。

  • 一个矩形锚点重力

不同的弹出菜单可能希望在特定方向打开。例如,垂直菜单可能希望向右打开,而水平菜单可能希望向下打开。

  • 一个窗口锚点重力

不同的弹出菜单可能希望以不同的方式与父锚点矩形的锚点矩形对齐。例如,虽然组合框可能希望在特定方向展开,但它希望覆盖它展开的矩形。

  • 一个锚点提示

不同的弹出菜单希望以不同的方式调整其位置;有些希望从父锚点矩形向不同方向展开,有些希望只是滑动到可见位置,有些希望调整大小,而有些希望将三者结合起来。

  • 一个矩形锚点偏移

偏移只是一个简单的微调因子,用于弹出菜单相对于锚点偏移其位置的常见用例。

通过让 GTK+ 提出对其菜单的定位方式的声明性描述,我们允许 GDK 根据显示服务器系统的设计方式以不同的方式实现实际定位。在 Mir 上,将创建一个 MirSurfaceSpec,而在 Wayland 上,将创建一个 xdg_positioner 对象。在 X11、Windows 和 Mac OS X 上,后端可以使用可用的全局位置以及显示器工作区域,并像以前一样计算最佳位置。

然而,应用程序开发人员尚不应直接使用此 API。通常需要的是创建一个菜单、弹出框、组合框,为此,我们引入了一组参数和辅助函数,使这非常方便。该 API 由一些新属性组成:

  • GtkMenu:anchor-hints – 定位策略。
  • GtkMenu:rect-anchor-dx – 用于移动窗口的水平偏移量。
  • GtkMenu:rect-anchor-dy – 用于移动窗口的垂直偏移量。
  • GtkMenu:menu-type-hint – 窗口类型 – 这仍然是必需的,以便 X11 后端可以通知窗口管理器正在映射的弹出窗口的类型。

以及一些更多函数:

  • gtk_menu_popup_at_rect () – 给定设置的参数,相对于父窗口上的给定矩形弹出菜单。
  • gtk_menu_popup_at_widget () – 给定设置的参数,相对于父窗口上的给定小部件弹出菜单。
  • gtk_menu_popup_at_pointer () – 给定设置的参数,相对于用户刚刚单击的位置弹出菜单。

使用这些函数,自定义小部件的开发人员现在可以以可移植的方式定位弹出菜单。到目前为止,GTK+ 自己的弹出菜单已经移植到使用这些新函数。Mir 后端中已经有一个基本的概念验证,并且 Wayland 实现正在进行中。

前往 错误,查看有关如何在未来放置菜单的所有详细信息。

gnome-sponsored-badge-shadow

控制 GtkScrolledWindow 中的内容大小

GtkScrolledWindow 小部件是 Gtk+ 应用程序开发人员的老朋友;它的目的是允许通过使用滚动条将大的小部件放入小的空间中。

GtkScrolledWindow Example
正在运行的垂直 GtkScrolledWindow

自 Gtk+ 3.0 以来,GtkScrolledWindow 能够通过 GtkScrolledWindow:min-content-widthGtkScrolledWindow:min-content-height 属性及其相关函数来设置最小内容大小(宽度和高度)。

从下一个稳定版本开始,Gtk+ 还将提供这些属性的最大大小对应项。

它们是做什么的?

顾名思义,最小大小属性定义了可滚动区域将具有的最小大小,无论是宽度还是高度,即使其子项没有完全填充可用空间。

scrolledwindow min-content-height
即使子小部件没有填充可用空间,也会分配滚动窗口。

另一方面,最大内容大小定义了可滚动区域在内容开始滚动之前允许增长多少。

让我们看看它的实际效果

scroll animation
演示最小和最大内容大小的示例。滚动窗口永远不会小于 110 像素,并且永远不会高于 250 像素。
在哪里以及如何使用它们

每当您想限制可滚动区域的大小时,您都希望使用新的属性。例如,GtkPopover 总是将其子小部件缩小到其最小大小。以下部分举例说明如何使内容最大增长到 300 像素,包括宽度和高度:

<template>
  <object class="GtkPopover">
    <child>
      <object class="GtkScrolledWindow">
        <property name="visible">True</property>
        <property name="max-content-width">300</property>
        <property name="max-content-height">300</property>
      </object>
    </child>
  </object>
</template>

或者,如果您想以编程方式实现相同的功能,则可以调用 gtk_scrolled_window_set_max_content_width()gtk_scrolled_window_set_max_content_height()

GTK+ 3.0 发布

GTK+ 3.0 是 GTK+ 的一个主要新版本,包含太多更改,无法在此处一一列出。

主要亮点包括:

  • 全部采用 Cairo 绘图。GDK 不再封装过时的 X11 绘图 API;我们已经彻底放弃了它,现在完全依赖 Cairo 来满足我们所有的绘图需求。这也使我们能够删除一些其他以 X11 为中心的概念,如 GCs、颜色映射和像素映射。
  • 现代输入设备处理。GDK 中的输入设备处理长期以来一直是一个被忽视的领域。这种情况已经改变;在 3.0 版本中,GTK+ 进入了现代 XI2 世界,完全支持多个指针、键盘和其他小工具。
  • 一个新的主题 API,它采用熟悉 CSS 语法进行主题配置以及其他改进,如动画状态转换。
  • 更灵活的几何管理,支持高度适应宽度,适用于小部件和单元格渲染器。
  • GDK 的多后端支持。在 GTK+ 2.x 中,您必须重新编译您的应用程序才能使其与不同的 GDK 后端一起工作。在 GTK+ 3 中,多个 GDK 后端可以构建到单个库中,并在运行时选择。
  • 简单的应用程序支持。随着 GIO 中 D-Bus 支持的集成,我们最终可以添加一个 GtkApplication 类,该类处理编写应用程序的许多平台集成方面,例如跟踪打开的窗口、确保唯一性、导出操作等。
  • 当然,还有一些新的小部件,例如开关和应用程序选择器。

GTK+ 是数百名贡献者的工作成果,人数太多,无法在此一一列出。但我想花时间感谢一些做出重大贡献的人:

  • Carlos Garnacho (Lanedo),他在 XI2 支持和新主题系统方面的工作
  • Benjamin Otte (Red Hat),他在 GDK 和 Cairo 绘图方面的工作
  • Tristan Van Berkom (Openismus),他在几何管理方面的工作
  • Colin Walters (Red Hat),他在 GtkApplication 方面的工作
  • Ryan Lortie (Codethink),他在 dconf、GSettings 和 GtkApplication 方面的工作
  • Javier Jardón,他在不懈的代码、构建和文档清理方面的工作

GTK+ 2.18 稳定版发布

GTK+ 2.18 添加了新功能,同时保持了与 GTK+ 2.16 的源代码和二进制兼容性。GTK+ 2.18 中新功能和改进的亮点是:

GtkInfoBar
一个新的小部件,用于在内容窗格内显示瞬态“消息区域”。该 API 与 GtkDialog 类似,并支持针对不同消息类型(警告、错误等)进行主题设置。

GtkBuilder

  • 可以在构建器标记中指定刻度标记
  • 可以在构建器标记中添加 GtkAssistant 操作小部件

GtkLabel
GtkLabel 可以显示嵌入式 URL,就像 SexyUrlLabel 一样

GtkEntry
GtkEntry 已被重构为遵循模型-视图模式,其中 GtkEntryBuffer 作为模型。此方法的一个预期用例是支持密码条目的“安全内存”

文件选择器

  • 默认情况下隐藏备份文件
  • GTK+ 记住文件列表的排序状态
  • 默认显示文件大小
  • 可以使用 ::create-folders 属性禁用“创建文件夹”按钮

打印支持

  • GTK+ 支持针对 CUPS 服务器的身份验证
  • 已添加 PAPI 打印系统的后端
  • 文件和 lpr 后端可以每张纸打印多页
  • 文件后端可以生成 svg 文件
  • 除了通常的页面范围外,GTK+ 还支持打印应用程序定义的“选择”
  • 打印对话框可以选择性地包含页面设置控件,从而避免在许多情况下需要单独的页面设置对话框

主题支持

  • 主题可以使用 ::invisible-char 样式属性设置不可见条目中使用的项目符号字符
  • 文件选择器可以为 xdg 用户目录显示不同的图标。图标名称为 folder-documents、folder-download、folder-music、folder-pictures、folder-publicshare、folder-templates 和 folder-video
  • GtkInfoBar 使用符号颜色来根据消息类型设置其背景色的主题。颜色名称为 info_fg_color、info_bg_color、warning_fg_color”、warning_bg_color 等。

GDK 更改
GDK 已被重写为使用“客户端窗口”。这意味着 GDK 维护其自己的窗口层次结构,并且仅在必要或明确请求时才使用 X 窗口。此更改的一些好处是:

  • 减少闪烁
  • 能够对小部件进行转换和动画渲染
  • 更容易嵌入 GTK+ 小部件,例如嵌入到 Clutter 场景图中
  • 有关客户端窗口的简单示例,请参见 gdk-demo。有关移动到客户端窗口时可能出现的问题的信息,请参见 文档

有关更多详细信息和已修复错误的列表,请参见
2.17.x 开发版本的公告:2.17.0, 2.17.1, 2.17.2, 2.17.3, 2.17.4, 2.17.5, 2.17.6, 2.17.8, 2.17.9, 2.17.10, 2.17.11