布鲁塞尔 GTK 黑客马拉松报告

感谢 GNOME 基金会,多位 GTK 开发人员能够在 FOSDEM 之后在布鲁塞尔会面,参加我们 年度黑客马拉松之一。

黑客马拉松的主要议题是:

  • 回顾过去 6-12 个月内已合并到 master 分支的工作,以便每个人都了解最新情况
  • 讨论仍在单独分支中的功能,评估其完成状态,并找出障碍
  • 找出 GTK 4.0 首个版本的障碍

黑客马拉松使我们能够以高带宽进行此类讨论,而在线交流渠道无法达到这种效果,因此它们对项目非常重要。

您可以在 wiki 上查看完整议程,我们将确保撰写关于其中最大项目的文章。

讨论的最大项目包括引入新的列表模型和列表/网格视图小部件;统一的按键处理 API;将布局管理策略与容器分离,并引入约束布局管理;合并来自 libhandy 的小部件的可能性,以允许编写对外形尺寸变化有响应的应用程序;切换到纯声明式菜单描述 API,并删除公共菜单小部件;向 GtkWidget 添加 2D 和 3D 变换;实现应用程序可以使用的动画 API。

  • 列表模型和列表/网格小部件 — 我们真的希望弃用 GtkTreeViewGtkIconView,但现有的替代品 GtkListBoxGtkFlowBox 在缩放至非常庞大和动态的数据集时性能不足。我们需要更好的数据存储类型,这些类型可以组合以执行诸如映射、过滤和排序之类的操作,但也可以避免在调整小部件大小和绘制小部件时遍历所有元素。Benjamin Otte 已经将 各种模型添加到 GTK,并且正在开发可以有效显示其内容的列表和小网格视图小部件。Benjamin 和其他 GNOME 应用程序开发人员正在识别各种利益相关者,以便专门举办一次黑客马拉松,以收集更多需求并获得有关新 API 的反馈。
  • 统一的按键处理 API — 既然我们已将所有指针和触摸输入处理从事件转移到手势,我们希望对按键处理(如按键绑定、助记符和加速器)执行相同的操作。总体设计基于触发操作,并允许自省 GTK 检查器当前可用的所有“快捷方式”,以方便调试。已经有一个开发分支可用。
  • 布局管理器 — 在 GTK 3 中,布局由容器对其子项强制执行;我们希望能够将其与小部件分离,并将其移至单独的委托对象层次结构中。布局管理器使我们能够降低编写新小部件的复杂性;它们将布局代码保留在单独的、不可导出的类型中;并且它们使我们能够简化工具包内部结构,以至于我们甚至可能在将来使 GtkWidget 成为可实例化的类型。布局管理器是将基于约束的布局管理添加到 GTK 的第一步,它无需嵌套框来创建复杂的 UI。已经有一个开发分支可用。有关约束布局的更多信息,您可以查看用于 GTK 3 的 Emeus 实验库
  • 合并来自 libhandy 的小部件 — Adrien Plazas 概述libhandy 当前提供的功能,以及未来直接从 GTK4 获得哪些功能会很有用。我们讨论了反应式布局,以及使用百分比表示大小的能力,以及可能使用约束来获得类似结果。
  • 声明式菜单 — 多年来,GTK 已经迭代了不同的菜单 API;从从小部件构建菜单,到 GtkUIManager,到 GtkBuilder,再到 GMenu;我们还转向声明弹出菜单的行为,以便让窗口系统更准确地显示它们,而无需暴露全局坐标。存在大量重叠,但没有明确的赢家,主要是因为我们仍然允许使用小部件来构建应用程序菜单和上下文菜单。完全切换到声明式菜单,添加新的 API 以使其更具表达性,并使 GtkMenu 及其朋友成为工具包的私有实现,这将使我们能够获得诸如能够检查所有菜单(即使在进程外);由插件系统可操作的菜单,而无需创建小部件并跟踪它们;避免定位错误。wiki 上有一个完整的草案提案,并且 Matthias Clasen 正在开发分支中将上下文菜单切换到 GMenu
  • 小部件转换 — 遗憾的是,Timm Bädert 无法参加黑客马拉松,但我们一直在审查他的 开发分支,该分支将 2D 和 3D 转换添加到 GTK 小部件,我们对此感到非常兴奋。
  • 动画 — 我们希望为 GTK4 实现的最后一件事是 GTK 小部件的动画框架,以替换当前的通用“帧刻度回调”。它的模型是 Clutter 显式动画 API,它又是基于 Core Animation 和 CSS3 过渡。这项工作仍处于设计阶段,但您可以期待它的开发分支很快就会出现。

除了主要议题之外,我们还讨论了各种较小的议题:

  • 提高性能和内存使用率;我们希望在帧时钟阶段暴露 SysProf 计数器,以便我们能够轻松识别问题。
  • 改进测试套件,尤其是在报告失败时;目前,我们必须查看 CI 失败日志,但我们希望使用 GitLab CI 基础结构发布正确的报告
  • 将子属性替换为辅助对象上的真实 GObject 属性,特别是对于布局管理器;这将使文档、自省和用法更清晰。
  • 完成拖放重构,以获得更现代化的 API。
  • 为“类似窗口”的对象(如窗口、对话框、弹出框、菜单/弹出窗口)添加顶级接口,这对于建立通用行为,以及消除 GtkWindow 中的 hack 和复杂性很有用。

最后,是的:我们确实从 GTK 中删除了“加号”。;-)