我正在使用X11 lib。是否有可能获得系统颜色?我的意思是从当前的用户主题,如脸,突出颜色等。我不能使用GTK和QT库。是否存在通过某些环境变量或freedesktop获取颜色的任何方式?
此致
答案 0 :(得分:6)
准备一些严重的痛苦,困惑和愤怒。可能一切都那么简单,不是Qt和GTK + / GNOME严重的NIH综合症病例。
在X11中有一个名为 X resources database 的系统,它实际上是一个 key→value 存储,其中key和value都是字符串并包含在root的属性中窗口。您可以使用xrdb
工具访问它。任何表现良好的X11程序都使用此 X资源数据库将其外观调整为用户设置。
传统的X11工具包,Motif,Tk,Athena,Xaw3等都符合这一要求。一切都很顺利。而且因为设置了一套简单,毫不含糊的模式匹配规则,几乎每个方面和每个小部件都可以通过这种方式主题化。
当GTK +和Qt诞生时,他们也坚持使用Xrdb。但很快GTK +和Qt开发人员说“这不是我们的设计,我们按照自己的方式行事”,因此GTK +和Qt从用户家庭目录中的dotfiles中检索他们的设置。出于兼容性的原因,也要尊重一些,但不是全部,并且每个版本都有一组不同的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列表,剥离整个gconf,dconf,uconf,Xsettings及其专有的配置dotfile混乱的Qt和GTK +,并使它们使用Xrdb而不是别的。