本周 GTK+ – 11

上周,GTK+ 的主分支有 22 次提交,添加了 6199 行代码,删除了 1763 行代码。

计划和状态
  • Matthias Clasen 发布了 GTK+ 3.21.4 和 GLib 2.49.4,这两个新的开发者快照。
值得注意的更改
  • William Hua 开始合并 菜单和弹出窗口的相对定位的补丁到主分支。
  • Lapo Calamandrei 对 Adwaita 中 GtkCalendar 的样式进行了小的视觉刷新。
  • Carlos Garnacho 更新了 GDK,以使用 Wayland 图形平板输入协议的 2.0 版本。
  • Matthias Clasen 更新了 GTK+,以选择使用 GLib 提供的新的结构化日志 API。

 

修复的错误

  • 769003 Adwaita:GtkCalendar 对年份中的周使用了令人困惑的样式
  • 756579 GTK 应该让 GDK 定位菜单
参与其中

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

本周 GTK+ – 10

上周,GTK+ 的主分支有 16 次提交,添加了 2500 行代码,删除了 2092 行代码。

计划和状态
  • Jonas Ådahl 和 William Hua 正在开发 功能分支,该分支为定位弹出窗口和菜单提供了一个新的声明式 API;您可以在上周五发布的博客文章以及 bug 756579 中阅读相关内容。
值得注意的更改
  • Matthias Clasen 合并了 Philip Withnall 编写的补丁,该补丁在 GLib 中实现了一个结构化日志 API。这项工作仍在进行中。
修复的错误
  • 768657 places-view:修复没有挂载或卷的位置的打开操作
  • 768659 gtk/gtkfilechoosernativeportal.c:不要使用 g_autoptr()
  • 768756 GtkFileChooserNativePortal 使用了不正确的响应 ID
参与其中

有兴趣参与 GTK+ 的开发吗?查看新手错误列表,并加入 irc.gnome.org 上的 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 实现。

转到 bug 以查看有关将来如何放置菜单的所有详细信息。

gnome-sponsored-badge-shadow

GTK+ 本周动态 – 9

在上周,GTK+ 的主分支有 26 次提交,增加了 2416 行代码,删除了 180 行代码。

计划和状态
  • Emmanuele Bassi 正在开发他的 GSK 渲染分支,Alex Larsson 给出了初步审查。Emmanuele 还写了一篇关于他的 GSK 工作的博文
  • 关于发布策略的讨论仍在 gtk-devel-list 上进行;仍然欢迎提出意见。
  • William Hua 一直在基于新的、支持 Wayland 和 Mir 的弹出窗口定位 API 重新构建他的分支,该 API 取代了通过全局坐标进行的定位。
值得注意的更改
  • Matthias Clasen 在 GLib 和 GTK+ 中都实现了用于协商访问沙箱外部资源的“门户”实现。您可以在他的博客上阅读更多相关内容。
修复的错误
  • 768485 将窗口关闭空闲的优先级更改为 G_PRIORITY_DEFAULT
  • 768499 gtk+ 的门户支持
  • 768546 GtkTextView 的 “move-viewport” 信号的文档错误
参与进来

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

GTK+ 本周动态 – 8

在上周,GTK+ 的主分支有 23 次提交,增加了 1154 行代码,删除了 121 行代码。

计划和状态
  • Matthias 继续开发GLibGTK+ 的门户分支。
  • Emmanuele 继续在gsk-renderer分支上使 gsk 渲染小部件。
  • Philip Withnall 正在开发一个补丁系列,以使 GLib 支持将结构化日志记录到 systemd 日志这里
值得注意的更改
  • Carlos Garnacho 提高了 Wayland 剪贴板处理与传统 X 客户端的兼容性。
  • Matthias 使在打印对话框中隐藏预览按钮成为可能。
  • Eric Koegel 为 GtkApplication 添加了对 Xfce 会话管理器的支持
  • Georges Basile Stavracas Neto 为 GTK+ CSS 机制添加了对 background-blend-mode 的支持。
  • 在 GLib 中,Matthias添加了一个新的 gio 实用程序,它将各种 gvfs 命令行工具的功能组合成一个。
修复的错误
  • Bug 767965改进启发式方法以检测远程文件系统
  • Bug 768184headerbar:如果标题小部件被隐藏,则不抛出警告
  • Bug 768082从 Wayland 复制到 NEdit 不起作用
  • Bug 768177 PRIMARY 请求超时后,CLIPBOARD 目标请求超时
  • Bug 768142 Makefile.example 中 $(LIBS) 和 $(OBJS) 的顺序不正确导致 “undefined reference”
  • Bug 693203GtkApplication 不支持 Xfce 会话管理器
  • Bug 768305Gtk+ 应该支持 background-blend-mode
参与进来

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