我正在使用 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)之外不支持任何内容。