GTK+ 中的光标

历史

传统上,光标在 Linux 中一直是一团糟。

X11 光标字体 从远古时代流传下来,给我们带来了诸如 gumby () 或 trek () 之类的瑰宝。不幸的是,这种情况通过 GdkCursorType 枚举和 gdk_cursor_new() 函数被冻结到了 GDK api 中。

后来,出现了 Xcursor 库。它发明了自己的图像格式来存储光标,并为我们带来了光标主题,但并没有回答“我的光标主题应该提供哪些光标?”这个问题。

由于没有官方推荐的光标名称列表,光标主题经常会提供在野外发现的所有光标名称变体。例如,这里是 oxygen 光标主题中包含的光标列表。如果您感到好奇,此列表中的十六进制字符串是 Xcursor 的一个巧妙技巧,用于在核心 X11 应用程序下改装主题光标,这些应用程序使用上面提到的光标字体的光标。

CSS 来救援

大约一年前,我们决定最终改进 GTK+ 光标的故事。值得庆幸的是,CSS3 规范包含一个相当不错的 光标名称列表,可以合理地预期在各个平台上可用。

标准光标由于 GdkCursorType 枚举包含太多无意义的东西且不易扩展,我们决定使 gdk_cursor_new_from_name() 成为获取光标的推荐 API。此函数的文档现在列出了 CSS 光标名称(请点击上面的链接查看),并且各个 GDK 后端中的光标处理代码会尽力为所有这些名称提供有意义的光标。

在某些平台(例如使用随机光标主题的 X11)上,如果主题中不存在某个光标,我们可能不得不回退到默认的箭头光标。作为光标代码的全面改进的一部分,Windows 后端增加了对光标主题的支持。

GTK+ 本身现在完全使用 gdk_cursor_new_from_name() 以及标准光标名称。gtk3-demo 包含一个演示,显示所有标准光标并让您尝试它们。上面的屏幕截图显示了它。

此处描述的更改已进入 GTK+ 3.18,该版本大约在 9 个月前发布。

您在应用程序中应该做什么

很可能,您无需做任何事情!GTK+ 小部件自行使用合适的光标,您无需任何额外的工作即可从中受益。

如果您的应用程序出于任何原因正在创建自己的光标,则应仔细检查上面显示的某个标准光标是否适合您。使用标准光标可确保无论您的应用程序在哪个平台上运行以及用户选择了哪个光标主题,您都将获得合适的光标。

请使用 gdk_cursor_new_from_name() 生成您的主题光标,因为这现在是此任务的首选 API。

本周 GTK+ – 1

2016 年 5 月 9 日 – 2016 年 5 月 15 日这一周 GTK+ 的情况

在过去的一周中,GTK+ 进行了 51 次提交,添加了 5375 行代码,删除了 4970 行代码。

计划和状态

随着我们完成 路线图 中的项目,3.22 开发周期正在加速进行。

值得注意的更改
  • Olivier Fourdan 修复了 GtkMenu 中的滚动事件处理,以确保它在 X11 和 Wayland 上对于平滑和离散滚动行为保持一致。
  • 现在,感谢 Georges Basile Stavracas Neto,使用 GVFS 中支持的方案列表来填充连接到服务器帮助弹出窗口中可用的协议列表。
  • Benjamin Otte 推送了一个提交,该提交允许 GtkWidget 在未实现的小部件上发出 style-updated 信号,而不是延迟到实现时发出;原来的行为是避免在构造过程中出现过多无效的旧优化结果,但是样式系统多年来有所改进。
  • Timm Bäder 推送了针对各种小部件(如 GtkListBoxGtkStackGtkToolbar)的各种清理提交。
已修复的错误
  • 错误 766166 gtk.css 中的按键绑定被忽略
  • 错误 766207 修复在 C99 之前的编译器上的构建
  • 错误 765939 [Wayland] 在使用触摸板的 GtkMenu 中滚动非常缓慢
  • 错误 756570 gtkplacesview 不再提供关于地址格式的指导
  • 错误 766120 Scale draw_value() 对齐方式从中心/右(H/V)更改为左对齐,导致明显的视觉倒退
  • 错误 766233 当服务器不支持 XI2 时崩溃
  • 错误 766175 引号的翻译可能会被 GTK 侧边栏误解
  • 错误 765700 GtkPaned 使用会导致“代码如何知道要分配的大小?”
  • 错误 682080 Gtk:ERROR:gtktoolbar.c:2271:logical_to_physical: 断言失败: (logical == 0)
  • 错误 766458 widget: 修复 GtkLabelAccessible NULL 链接。
参与其中

有兴趣在 GTK+ 上工作?请查看 新手错误 列表,并加入 irc.gnome.org 上的 IRC 频道 #gtk+。

本周 GTK – 0

为了改善 GTK 团队和 GNOME 平台其余部分以及应用程序开发人员之间的沟通,我们将开始编写关于 GTK 和核心 GNOME 平台的其余部分每周发生的情况的状态报告。

这些报告很大程度上受到了 Servo 团队 编写的报告的启发。

您可以期待每周一在此博客上发布一篇文章;我们将关注值得注意的更改;新的贡献者;新功能或弃用;以及预定的活动。

如果您有疑问,请像往常一样将它们发送到 GTK 开发邮件列表

祝你玩得开心!

你好,世界!(重演)

大家好,欢迎回到 GTK+ 开发博客。

在 3.0 版本发布后,我们已经有一段时间忽略了这个博客,但是我们认为有一个地方可以谈论 GTK+(以及核心 GNOME 平台的其余部分)、它的变化以及它的发展方向是很重要的。

展望未来,我们不会将此博客用于公告 — 不过如果您需要公告,您可以简单地订阅 gnome-announcement 邮件列表。相反,我们将利用此空间来展示 GTK+ 中正在发生的事情;讨论路线图;突出一些新功能,或许还有一些不太知名的旧功能。

请继续关注,并且像往常一样:玩得开心!

全新设计的 gtk.org 现在已启动并运行!

最初,https://gtk.org.cn 的网站计划与 GTK+ 3.0 的发布同时更新,但出现了一些挫折,并且需要更多审查。最后,感谢 Devin Samarin 的大力帮助以及 GTK+ 社区的评论,它已启动并运行。

我们计划改进网站上的更多内容,例如围绕 GTK+ 的业务支持,这在当前的网站上不是很明显。作为新网站更新的一部分,我们现在列出了该工具包的更多最近确定的维护人员(在 开发 页面上可见)。

GTK+ 3.0 发布

GTK+ 3.0 是 GTK+ 的一个重大新版本,包含了太多变化,无法在此一一列出。

主要亮点包括

  • 全面采用 Cairo 绘图。GDK 不再封装过时的 X11 绘图 API;我们已经彻底摆脱了它,现在完全依赖 cairo 来满足所有的绘图需求。这也使我们能够删除其他一些以 X11 为中心的概念,例如 GC、颜色映射和像素映射。
  • 现代输入设备处理。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.20 发布

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

值得注意的变化

  • GtkSpinner、GtkCellRendererSpinner – 一个新的小部件,用于渲染“微调器”动画以指示正在进行的活动。相应的单元格渲染器在树状视图内渲染相同的动画
  • GtkOffscreenWindow – 一个新的顶级容器小部件,用于管理子小部件的屏幕外渲染
  • GtkNotebook – 您现在可以在未被选项卡占用的空间中显示“操作小部件”。此功能也可在 GtkBuilder 中通过“action-start”和“action-end”子类型使用。
  • 文件选择器 – GtkFileSystemModel 已重新实现,以实现重大加速和简化。
  • 键盘处理 – 内置输入法理解的组合序列已与 X.org 同步,并且额外的序列已合理化
  • 助记符下划线 – 现在可以选择隐藏,直到按下 Alt 键,可以使用 gtk-auto-mnemonics 设置将其打开
  • 键盘加速器 – Super、Meta 和 Hyper 修饰符的工作更加可靠
  • GDK – 有一个新的函数可以在多显示器设置中获取“主”显示器:gdk_screen_get_primary_monitory。
  • gdk-pixbuf – png 和 tiff 图像中嵌入的颜色配置文件可以存储和检索。已添加对 QTIF 图像格式的支持
  • Win32 – XP 主题已被禁用,因为它们不起作用
  • OS X – GTK+ 使用标准的 Mac 键盘快捷键(Cmd-X/Cmd-C 而不是 Ctrl-X/Ctrl-C 等)。多显示器设置的处理已大大改进
  • 内省支持 – 内省数据现在包含在 GTK+ 本身中。因此,已添加对 gobject-introspection 的依赖

GLib 2.24.0 发布

GLib 2.22 是一个稳定版本,在 GLib 2.20 的基础上增加了功能上的增量改进,同时保持了二进制和源代码兼容性。主要变化包括

  • g_thread_init() 的要求已略微放宽,它可以被多次调用,并且不必是第一次调用。GObject 现在链接到 GThread,并且在调用 g_type_init() 时会自动启用线程。修复了 GObject 中 boxed 类型的线程安全问题。-pthread 标志已添加到所有 gmodule .pc 文件中,因为如果程序未使用线程支持编译,则通常不允许加载链接到 libpthread 的模块。
  • GType 现在有一个 G_DEFINE_INTERFACE 便利宏
  • GIO 支持 GIO 模块的延迟加载,并且有一个新的 gio-querymodule 实用程序与之一起使用。打包人员需要适应这一点。
  • GIO 使用 splice(2) 在文件描述符之间传输数据,而无需额外的副本。
  • 已添加 GVariant 变体数据类型。

GTK+ 2.18 稳定版本发布

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

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

GtkBuilder

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

GtkLabel
GtkLabel 可以显示嵌入的 URL,很像 SexyUrlLabe

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.02.17.12.17.22.17.32.17.42.17.52.17.62.17.82.17.92.17.102.17.11

GLib 2.22 稳定版发布

GLib 2.22 是一个稳定版本,它在 GLib 2.20 的基础上增加了功能上的增量改进,同时保持了二进制和源代码的兼容性。

主要新功能包括:

  • GArray、GPtrArray、GByteArray、GTree 和 GMappedFile 可以进行引用计数。
  • 可以强制 GLib 重新加载 XDG 用户目录映射。
  • GLib 主循环支持每个线程的默认上下文。
  • GIO 现在为 IP 地址和 UNIX 域套接字地址提供类型和方法。
  • GResolver 为解析主机名、反向查找 IP 地址和解析 SRV 记录提供异步和可取消的 API。
  • GIO 中增加了对网络 IO 的支持,包括低级套接字 API 和用于网络连接和服务的高级 API。
  • GIOStream 及其子类已获得对读写访问的支持。
  • GIO 支持启动和停止驱动器,可用于连接外部硬盘盒、磁盘阵列、iSCSI 设备等。
  • GIO 支持在卸载和弹出操作期间进行用户交互。
  • GIO 可以存储和检索每个文件的元数据。

有关更多详细信息和已修复的错误列表,请参阅 2.21.x 开发版本的公告:2.21.02.21.12.21.22.21.32.21.42.21.52.21.6