我选择的主题如何传达给 gtk?

我选择的主题如何传达给 gtk?

相关Gtk+ 默认主题保存在哪里

我正在使用 Mate 桌面。我看到我的外观设置保存在 gsettings 中:

$ gsettings get org.mate.interface gtk-theme
'TraditionalOk'
$ gsettings get org.mate.interface font-name
'Ubuntu 11'
$ gsettings get org.mate.font-rendering dpi 
173.0

如果我编写一个简单的 gtk hello-world 程序,并且只将其与 libgtk 链接,而不使用 mate 或 gnome 或桌面库,它就可以正常工作。它会显示所选的外观。我很确定“org.mate.interface”没有硬编码到 libgtk 中。而且我假设“gsettings”也没有硬编码到 libgtk 中。那么它如何获取我的配置?环境变量、dotfile、X 服务器属性,还是什么?

答案1

并且我认为“gsettings”没有被硬编码到libgtk中。

这是一个错误的假设,因为 GSettings大多数 GNOME 程序的主要配置存储,实际上用于在 Wayland 下检索 GTK 3 中的主题名称。具体来说,gdkdisplay-wayland在架构gtk-theme中使用org.gnome.desktop.interface

然而,在 X11 上,GTK 使用XSETTINGS 协议其中单独的 DE 特定守护进程从其需要的地方获取各种设置,并使用 X11 的选择机制以标准格式重新发布它们。

在启动时,每个客户端应该通过调用 XGetSelectionOwner() 对 _XSETTINGS_S[N] 选择来识别设置窗口,并通过调用 XSelectInput() 并使用 StructureNotifyMask|PropertyChangeMask 掩码来选择在设置窗口上进行通知。

[…] 然后,客户端可以继续从设置窗口读取 _XSETTINGS_SETTINGS 属性的内容,并根据本文档“_XSETTINGS_SETTINGS 格式”部分中的信息进行解释

由于您使用的是 MATE,它mate-settings-daemon是 XSETTINGS 提供程序。它org.mate.interface从 GSettings 读取并通过 XSETTINGS 重新发布值Net/ThemeName,GTK 最终可以在其中检索它。

使用 XSETTINGS 协议使得后端变得无关紧要——例如,旧版 GNOME 和 MATE 使用 GConf,而 Xfce 使用 XfConf,并且有一个独立的设定它使用文本文件。(另一方面,如您所见,该协议特定于 X11,不能在 Wayland 中使用。)

设定该软件包还附带一个dump_xsettings工具,可以从当前正在运行的提供商那里转储数据。

请注意,并非所有桌面环境都运行 XSETTINGS 提供程序。例如,使用 LXDElxappearance只需编辑配置文件:~/.gtkrc-2.0对于 GTK 2,以及~/.config/gtk-3.0/settings.ini对于 GTK 3。这些是总是读取,但以最低优先级使用 – GSettings 或 XSETTINGS 指定的参数始终获胜。

概括:

  • GTK 3 支持 $GTK_THEME暂时地覆盖主题。
  • 在 Wayland 中,GTK 3 从 GSettings 读取主题名称,并以配置文件作为后备。
  • 在 X11 中,GTK 2/3 从 XSETTINGS 守护进程检索主题名称,并以配置文件作为后备。
  • GTK 1 除了基于文件的配置(gtkrc)之外不支持任何内容。

相关内容