列表中的拖放

我最近有机会通过拖放(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 来创建拖动源,从而避免对窗口的需求。

有了这段代码,您已经可以拖动行了,但到目前为止,还没有地方可以放置它们。让我们解决这个问题。

接受放置

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

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 表面,将行小部件渲染到其中(该信号在手柄上发出,因此我们必须找到作为祖先的行)。

不幸的是,这仍然没有产生完美的结果,因为列表框行通常不渲染背景或框架。为了解决这个问题,我们可以暂时向该行的样式上下文添加一个自定义样式类,并使用一些自定义 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")

作为额外的改进,我们可以在表面上设置一个偏移量,以防止在拖动开始时出现视觉上的“跳跃”,方法是将此代码放在 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+ 检查器

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

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

序言

由于检查器是一种调试工具,因此默认情况下禁用它。要开始使用检查器,您首先必须启用它。您可以使用 DConf 编辑器轻松完成此操作

Enabling the Gtk+ Inspector with DConf Editor
使用 DConf 编辑器启用 GTK+ 检查器

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

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

完成!检查器现在已启用!

打开检查器

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

GNOME Calendar
GNOME 日历应用程序

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

检查器将打开,您将看到以下窗口

Inspector on Calendar
GNOME 日历上的检查器窗口

这就是您要做的全部事情。现在让我们探索检查器必须提供的各种功能。

探索检查器

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

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

让我们剖析 GTK+ 检查器的主窗口

Inspector window
主检查器窗口

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

检查窗口小部件

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

Selecting widgets
使用检查器选择窗口小部件

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

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

现在您已经了解如何检查 GTK+ 应用程序,请试用并探索有多少应用程序是组织起来的。更改窗口小部件的属性并查看会发生什么。在大多数情况下,这是安全的,不会破坏您的 GNOME 会话或冻结您的计算机!

编辑 CSS

检查器对于设计人员来说也是一个强大的工具。它拥有的最强大的功能之一是实时 CSS 编辑器。让我们从转到 CSS 选项卡开始

CSS Editor
检查器 CSS 编辑器视图

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

window stack {
    background-color: orange;
}

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

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

别担心!GTK+ 检查器允许您在对象 > CSS 节点选项卡上轻松检查 CSS 层次结构。

CSS Nodes
CSS 节点选项卡

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

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

Zooming widget using Magnifier
使用放大镜标签缩放小部件

感觉不错?加入 -design 并与社区分享您超棒的 CSS 代码片段!

总结

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

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

有用的链接

本周 GTK+ – 33

过去两周,我们接连举办了 DevConfFOSDEM,因此开发速度有所放缓。现在我们接近 GNOME 3.24 发布,预计开发速度会再次加快。

在过去的这两周里,GTK+ 的主分支增加了 34 次提交,添加了 20973 行代码,删除了 21593 行代码。

计划和状态
  • GTK+ 的路线图可在 wiki 上查看。
值得注意的更改

在主分支上

  • Timm Bäder 删除了 gtk_widget_class_list_style_properties(),这是为了继续弃用 GtkWidget 中的样式属性,并将其替换为 CSS 属性
  • Timm 还将一些仅由 GtkToggleButton 子类使用的状态移到了这些类型中
  • William Hua 改进了 Mir GDK 后端,使其能够正确放置菜单
修复的错误
  • 777547 关闭最后一个标签后,Notebook 箭头图标颜色错误
  • 773686 启动时,软件在仪表盘中显示错误的图标、名称和菜单
  • 775864 getting-started: 拼写错误 tie->the
  • 778009 菜单在 Fedora 中绘制在菜单栏的顶部
参与其中

有兴趣参与 GTK+ 的开发吗?查看新手错误列表并加入 irc.gnome.org 上的 IRC 频道 #gtk+。

本周 GTK+ – 32

在过去的这一周里,GTK+ 的主分支增加了 106 次提交,添加了 7340 行代码,删除了 12138 行代码。

计划和状态
  • Matthias Clasen 发布了 GTK+ 3.89.3
  • GTK+ 的路线图可在 wiki 上查看。
值得注意的更改

在主分支上

  • Benjamin Otte 简化了 Vulkan 渲染器的剪切着色器
  • Benjamin 还从 CSS 解析器中删除了“假设没有尺寸的数字是像素”的回退代码
  • Daniel Boles 对 GtkMenuGtkComboBoxGtkScale 小部件进行了各种修复
  • Daniel 还简化了 GtkComboBox 的内部结构,并将大部分内部小部件移至 GtkBuilder UI 文件
  • Matthias Clasen 从 GTK+ 初始化函数中删除了命令行参数处理;gtk_init() 现在不接受任何参数。此外,gdk_init() 已被删除,因为 GDK 不再是一个单独的共享库。编写 GTK+ 应用程序的推荐方法仍然是使用 GtkApplication,它处理库初始化和主循环
  • Timm Bäder 合并了他的分支,该分支使 GtkWidget 默认可见,除了 GtkWindowGtkPopover 类;Timm 还从 API 中删除了 gtk_widget_show_all(),因为它不再有用
  • Timm 修改了 GtkShortcutsShortcutGtkFileChooserButtonGtkFontButton,使其直接继承自 GtkWidget,利用了基类 GtkWidget 中的新场景图 API

在 gtk-3-22 稳定分支上

  • Ruslan Izhbulatov 修复了 GDK 的 Windows 后端,以确保它与远程显示器一起工作
修复的错误
  • 777527 GDK W32:通过 RDP 工作时,GTK 应用程序中出现不可见的下拉菜单
  • 770112 文档中描述的 <alt>左快捷键在 Wayland 上不起作用
  • 776225 [wayland] 下拉菜单放置在屏幕上的某个位置
  • 777363 [PATCH] wayland:避免不必要的 g_list_length 调用
参与其中

有兴趣参与 GTK+ 的开发吗?查看新手错误列表并加入 irc.gnome.org 上的 IRC 频道 #gtk+。

本周 GTK+ – 31

在过去的这一周里,GTK+ 的主分支增加了 52 次提交,添加了 10254 行代码,删除了 9466 行代码。

计划和状态
  • Alex Larsson 正在开发两个单独的分支,以优化在构建 GSK 渲染树时的内存分配和碎片,在分析树构建代码之后
  • Timm Bäder 正在开发一个主题分支,将小部件切换为默认可见
  • GTK+ 的路线图可在 wiki 上查看。
值得注意的更改

在主分支上

  • Rui Matos 在 Wayland 后端添加了对 gtk-enable-primary-paste 设置键的支持;这需要较新版本的 gsettings-desktop-schemas
  • Matthias Clasen 和 Alex Larsson 重构了一些 GSK、GtkWidget 和 CSS 内部结构,以避免在分析渲染代码后出现过多的类型转换和类型检查
  • Matthias 在 GtkAboutDialog 小部件中添加了一个“系统”选项卡,用于自由格式的系统相关信息
  • Matthias 还更新了 -gtk-icon-filter 的移植文档
  • Benjamin Otte 更改了 X11 后端,使其始终无条件调用 XInitThreads(),以便安全地使用 Vulkan 渲染 API;这应该是安全的,但鼓励进行测试
  • Benjamin 更新了 GtkSnapshot API,以确保仅在快照完成后才提供渲染节点
  • Benjamin 还修复了 CSS 图像的处理,这些图像没有明确的大小,但应根据其纵横比进行缩放
  • Timm Bäder 向 GtkInfoBar 小部件添加了一个 revealed 属性,并移植了 GtkActionBar 代码以使用它

在 gtk-3-22 稳定分支上

  • Ruslan Izhbulatov 致力于修复 Windows 下的各种键盘处理问题,包括与 AeroSnap 的交互;Ruslan 还修复了错误 165385,该错误将在 10 天后满 12 年
  • Carlos Garnacho 更改了 Wayland 后端中的 EGL 处理,以禁用交换间隔,因为合成器负责计时渲染
  • Matthias Clasen 弃用了已从开发分支中删除的额外 API
修复的错误
  • 776031 W32:Win键+向下键最小化最大化的窗口,而不是还原它
  • 165385 Win32 键盘处理仍然不完整
  • 769835 在 Wayland 上,如果包含 GtkGLArea 的应用程序不在当前工作区上,则停止响应
  • 774726 GtkTreeView dnd:自 3.20 起,gtk_drag_finish 在重新排序时删除行
  • 769214 Pause 键的 keyval 字段未正确填充
  • 776485 GDK W32:无法通过系统菜单还原最大化的窗口
  • 776604 关于对话框:添加一个“系统”选项卡
  • 775846 gdk/wayland:添加对 gtk-enable-primary-paste gsetting 的支持
参与其中

有兴趣参与 GTK+ 的开发吗?查看新手错误列表并加入 irc.gnome.org 上的 IRC 频道 #gtk+。

本周 GTK+ – 30

在过去的一周里,GTK+ 的主分支有 81 次提交,增加了 12205 行代码,删除了 12625 行代码。

计划和状态
  • 在年末休息之后,欢迎回到 GTK+ 每周动态。
  • GTK+ 的路线图可在 wiki 上查看。
值得注意的更改

在主分支上

  • Timm Bädert 合并了将部件场景图直接移入 GtkWidget 类的工作;这允许部件拥有内部子项,而无需继承 GtkContainer
  • Timm 还致力于将当前使用内部 CSS 小工具 API 的部件(如 GtkSwitch)移植为复合部件。
  • Benjamin Otte 和 Georges Basile Stavracas Neto 一直在努力使 Vulkan GSK 渲染器在 Wayland 上工作。
  • Benjamin 还致力于提高 Vulkan 渲染器的效率。
  • William Hua 在改进 GDK 的 Mir 后端,使其支持剪贴板功能。

在 gtk-3-22 稳定分支上

  • Matthias Clasen 发布了 GTK+ 3.22.6。
修复的错误
  • 776627 更正 PostScript 大小写
  • 776868 改进 GtkEntry:attributes 的文档
  • 776560 icon-browser:窗口以非常窄的尺寸打开,只显示一列图标
  • 775732 mir:缺少剪贴板支持
  • 776736 构建:修复 Vulkan 检测
  • 776807 当通过选项组初始化 GTK 时,GtkInspector 不会显示
参与其中

有兴趣参与 GTK+ 的开发吗?查看新手错误列表并加入 irc.gnome.org 上的 IRC 频道 #gtk+。

GTK+ 每周动态 – 29

在过去的一周里,GTK+ 的主分支有 20 次提交,增加了 883 行代码,删除了 2740 行代码。

计划和状态
  • Alex Larsson 致力于简化 GdkWindow,移除了原生和外来的子窗口;长期计划是只为顶层窗口提供原生窗口系统表面。
  • Alex 还发送了 对 gtk-devel-list 的评论,评论了 Benjamin 的 wip/otte/rendernode 分支,其中包含关于 GSK 渲染 API 未来工作的想法。
  • Chun-wei Fan 更新了 Windows 后端,以确保它继续在主分支上构建和工作。
  • Benjamin Otte 在更多 GtkWidget 子类中实现了 snapshot() 虚函数。
  • GTK+ 的路线图可在 wiki 上查看。
值得注意的更改

在主分支上

  • Olivier Fourdan 更新了 Wayland 后端,以确保在需要时在子表面上更新空的输入形状;这允许其他工具包(如 Clutter)使用 GDK 子表面 API。
  • Alex Larsson 从 GDK API 中移除了 gdk_window_reparent(),因为它未使用,并且允许实现仅具有顶层 GDK 窗口的目标。
  • Benjamin Otte 从 GdkCellView 中移除了用于修改其背景的临时代码,因为单元视图可以使用 CSS 来实现相同(或更好)的结果。
  • Benjamin 还从 GtkFrame CSS 节点中移除了 border 节点,因为它执行了额外的即时模式裁剪,这使得渲染更加复杂。

在 gtk-3-22 稳定分支上

  • Emmanuele 为在使用缺少 GL_EXT_framebuffer_blit 扩展的 OpenGL ES 2.0 实现时,修复了 GL 渲染问题。
修复的错误
  • 776132 说明 gdk_window_create_similar_image_surface 和 cairo_surface_create_similar_image 之间的区别
  • 774534 [wayland] 如果没有 begin_paint()/end_paint(),则不会应用输入形状和不透明区域
参与其中

有兴趣参与 GTK+ 的开发吗?查看新手错误列表并加入 irc.gnome.org 上的 IRC 频道 #gtk+。

GTK+ 每周动态 – 28

在过去的一周里,GTK+ 的主分支有 103 次提交,增加了 5986 行代码,删除了 1896 行代码。

计划和状态
  • Benjamin Otte 正在进行 GSK 渲染节点 API 的 重构
  • Emmanuele Bassi 致力于一个 特定于 3.x 的分支,该分支允许 GDK 在 X11 平台上使用 EGL 而不是 GLX。
  • GTK+ 的路线图可在 wiki 上查看。
值得注意的更改

在主分支上

  • Benjamin 合并了 GSK 的 Vulkan 渲染器,作为 GL 和 Cairo 渲染器的比较点。Vulkan 渲染器添加了对工作 Vulkan 实现以及 glslc 的新的可选依赖项。
  • Vulkan 渲染器还导致了 GDK 内部 GL 绘图代码的大量重构,但这不应在 API 中引起任何用户可见的更改。
  • Benjamin 还按照 CSS 2.1 规范实现了对 CSS border-spacing 属性的支持。

在 gtk-3-22 稳定分支上

  • Matthias 发布了 GTK+ 3.22.5。
修复的错误
  • 775651 GdkX11-4.0.gir、GdkWin32-4.0.gir 和 Gsk-4.0.gir 在 Gdk-4.0.gir 准备好之前生成
参与其中

有兴趣参与 GTK+ 的开发吗?查看新手错误列表并加入 irc.gnome.org 上的 IRC 频道 #gtk+。

GTK+ 每周动态 – 27

在过去的一周里,GTK+ 的主分支有 65 次提交,增加了 1780 行代码,删除了 2429 行代码。

计划和状态
  • GTK+ 黑客马拉松 计划于 2017 年 3 月举行;主要主题是提高性能,尤其是在渲染方面。
  • Benjamin Otte 正在重做 GSK 的 GL 渲染器,以确保它与 GDK 渲染良好集成。
  • 此外,Benjamin 还在开发用于 GSK 的基于 Vulkan 的实验性渲染器。
  • Timm Bäder 正在更改 GtkWidget 和 GtkContainer API,以将这两个类合并到一个场景图中。
  • GTK+ 的路线图可在 wiki 上查看。
值得注意的更改

在主分支上

  • Matthias Clasen 更改了 GTK,使其在 X11 和 Wayland 下失去显示连接时干净地退出;此更改也已反向移植到稳定的 gtk-3-22 分支。
  • Timm Bäder 清理了各种部件,以便在测量其子项大小时始终使用 gtk_widget_measure()
  • Daniel Boles 修复了 GtkComboBox 中的一个错误,该错误导致基于 Debian 的发行版中应用了下游补丁时出现警告;有关更多信息,请参见 错误 771242;此更改也已反向移植到稳定的 gtk-3-22 分支。

在 gtk-3-22 稳定分支上

  • Lapo Calamandrei 反向移植了 GtkProgressbar 主题修复,以正确识别空状态和完整状态。
修复的错误
  • 774915 [Wayland]:销毁子表面的父项会导致 _gdk_window_destroy_hierarchy:断言失败
  • 771242 3.21:为某些类型的 GtkComboBox 打开菜单会导致 Gdk-CRITICAL 断言 ‘GDK_IS_WINDOW (window)’ 失败
  • 775410 gsk/Makefile.am 在链接 libgsk-4.la 之前运行 g-ir-scanner
  • 775319 [Wayland]:gdk_window_get_toplevel() 无法返回子表面的顶层窗口
  • 775316 gtk_drag_source_set_icon_pixbuf 错误地引用了接收到的 pixbuf 一次
  • 775212 GtkScaleButton 未解除它引用的所有 GtkAdjustment 的引用
  • 775525 gtk_flow_box_get_child_at_index 不应因无效索引而崩溃
参与其中

有兴趣参与 GTK+ 的开发吗?查看新手错误列表并加入 irc.gnome.org 上的 IRC 频道 #gtk+。

本周 GTK+ – 26

在过去的一周里,GTK+ 的 master 分支有 40 次提交,新增了 1551 行代码,删除了 1998 行代码。

计划和状态
  • Matthias Clasen 发布了第一个 GTK+ 3.89 开发快照
  • GTK+ 的路线图可在 wiki 上查看。
值得注意的更改

在主分支上

  • Andrew Chadwick 提交了一系列关于 Windows 上图形平板支持的修复
  • Benjamin Otte 删除了 gtk_cairo_should_draw_window() 工具函数;该函数是为了在 3.x API 中保持兼容性而引入的,但现在已经不再需要了
  • Benjamin 还删除了 gdk_window_process_updates()gdk_window_process_all_updates();GDK 早已切换到帧时钟;此外,只有顶层 GdkWindow 可以用作渲染表面
  • Lapo Calamandrei 使用最近一轮针对进度条和渐变的 CSS 改进更新了高对比度和 Adwaita 主题
修复的错误
  • 774114 即使仅更改窗口内容,也会重新绘制窗口阴影
  • 774695 GtkProgressbar 需要 full 和 empty 类
  • 774265 wintab 设备没有倾斜功能
  • 774699 [wintab,潜在的段错误]:列表迭代回归导致查找期间忽略奇数索引设备,例如,不提供压力感应
  • 775038 构建:将 wayland 添加到 GSK 的依赖项中
  • 774917 [wayland] 子表面需要相对于其父表面放置
  • 774893 启动 GtkInspector 时,应用程序字体大小缩放被限制为 1.00
  • 774939 GtkLabelAccessible:在设置父对象之前初始化链接
  • 774760 inspector:确保控制器是 GtkGesture
  • 774686 GtkMenu 不会 unref 它创建的所有 GtkCheckMenuItem
  • 774743 GtkNotebook 不会 unref 它创建的所有 GtkBuiltinIcon
  • 774790 GtkTextHandle 不会 unref 它引用的所有 GtkAdjustment
参与其中

有兴趣参与 GTK+ 的开发吗?查看新手错误列表并加入 irc.gnome.org 上的 IRC 频道 #gtk+。