2

我正在使用 X11 库。是否可以获得系统颜色?我的意思是从当前用户主题,如面部、突出显示颜色等。我不能使用 GTK 和 QT 库。是否存在通过某些环境变量或 freedesktop 获取颜色的方法?

问候

4

1 回答 1

6

为一些严重的痛苦、困惑和愤怒做好准备。一切都可能如此简单,不是 Qt 和 GTK+/GNOME 都是 NIH 综合征的严重病例。

在 X11 中有一个称为X 资源数据库的系统,它实际上是一个键 → 值存储,其中键和值都是字符串并包含在根窗口的属性中。您可以使用该xrdb工具访问它。任何表现良好的 X11 程序都使用此X 资源数据库来调整其外观以适应用户设置。

传统的 X11 工具包 Motif、Tk、Athena、Xaw3 等都符合这一点。一切都很好。而且因为设置了一组简单、明确的模式匹配规则,几乎每个方面和每个小部件都可以通过这种方式进行主题化。

当 GTK+ 和 Qt 诞生时,它们也坚持使用 Xrdb。但很快 GTK+ 和 Qt 开发人员说“这不是我们的设计,我们按照自己的方式做”,所以 GTK+ 和 Qt 从用户主目录中的点文件中检索他们的设置。出于兼容性原因,也尊重一些,但不是全部,并且每个版本都有一组不同的 Xrdb 密钥。

当然桌面库应该协同工作,因此诞生了很多设置管理系统:Elektra、gconf、dconf、uconf,特别是针对 X11 Xsettings。gconf, dconf, uconf 当然不使用 X11 协议,而是使用专有的 IPC 或 DBus。DBus 本身是有缺陷的。

然而,Xsettings 是一个充满矛盾的规范,几乎没有 Xrdb 那样好用。Xsettings 存在的主要“原因”是,以便可以通知客户端更改,因为所有设置都由 Xsettings 守护程序管理,而不是根窗口上的属性,通知屏幕上的所有客户端更改。并且如果守护进程死亡,事情将恢复到默认状态,因为客户端应该注册当 Xsettings 守护进程的 InputOnly 属性持有者窗口消失时发出的事件。我对 Xsetting wahrrrgarrrbl只有一个词。

Xsettings 的创建者显然从未想过更改窗口的属性会自行创建一个 X 事件,它允许客户端监听设置更改。此外,仅了解设置更改是没有意义的,因为这要求所有客户端跟踪其本地设置状态,即使它们的某些内部设置仅间接依赖于某些设置。解析整个 Xrdb 更容易,更不容易出错,并且仅处理更改设置的子集的理论开销节省与设置不会一直更改形成鲜明对比。


它在我的一个很长的 TODO 列表中,将 Qt 和 GTK+ 从整个 gconf、dconf、uconf、Xsettings 及其专有的配置点文件中剥离出来,并让它们使用 Xrdb,仅此而已。

于 2013-04-29T19:12:53.027 回答