这两个文件似乎具有相同的功能。如果有的话,它们之间有什么区别?
答案1
~/.Xdefaults
是存储 X 资源的较旧方法。每次启动 Xlib 程序时都会重新读取此文件。如果通过网络使用 X11,则该文件必须与程序位于同一文件系统上。
~/.Xresources
较新。它被加载xrdb
到 X11 根窗口的属性中RESOURCE_MANAGER
。每当任何程序查找资源时,它都会从 RESOURCE_MANAGER 中读取,而不会触及任何文件。
如果 RESOURCE_MANAGER 属性不存在,Xlib 会回到每次程序启动时读取 ~/.Xdefaults 的旧方法。但请注意,如果 ~/.Xresources 存在,大多数发行版都会自动加载它,这意味着该属性将始终存在,因此即使您自己从未运行过 xrdb,~/.Xdefaults 也始终会被忽略。
(您可以使用xprop -root
来查看 X 根窗口的属性。)
新方法的优点是,只需调用一次 xrdb 即可,资源将可供在此显示器上运行的任何程序使用,无论是本地还是远程。(名称~/.Xresources
只是一种惯例——您可以使用 xrdb 加载任何文件,甚至 ~/.Xdefaults
。)
Xlib 编程手册 P.441:
在 X11R2 之前,X 资源设置是从用户主目录中的 .Xdefaults 文件读取的,并且可以选择在运行 X 客户端的任何机器上读取,因此很难维护多个文件。
后来,xrdb 程序被设计成将 .Xresources 中的用户资源设置存储到当前 X 服务器上根窗口的 XA_RESOURCE_MANAGER 属性中,这样连接到同一服务器的所有客户端都可以访问它们。如果用户没有调用 xrdb 来设置该属性,则读取 .Xdefaults。
(注意:XA_RESOURCE_MANAGER 是一个引用内置原子的 Xlib C 宏,但该原子的实际名称(对于 XInternAtom)只是 RESOURCE_MANAGER。)
维基百科:
[...] X 资源存储在两个标准位置,取决于它们是适用于所有屏幕还是适用于特定屏幕:
- 屏幕 0 的根窗口的 RESOURCE_MANAGER 属性
- 任意屏幕的根窗口的 SCREEN_RESOURCES 属性
其他文件
事情还没有完全结束。
- 还有
$XENVIRONMENT
变量,默认为~/.Xdefaults-hostname
如果没有设置。这将由程序直接读取,类似于 .Xdefaults 本身,但总是无论 RESOURCE_MANAGER 是否存在,都可以读取。您可以使用文件来保留某些特定于机器的设置,同时将其用于全局设置。.Xdefaults-hostname
xrdb
下面列出的第 4 项和第 5 项似乎都仅由纯 Xlib 程序使用 - 而不是 GTK 3 或其他工具包。
第四个位置是环境变量指向的目录
$XAPPLRESDIR
。(奇怪的是,如果未设置变量,$HOME
则使用默认值。)当启动程序时,它会查找以下任何文件是否存在(文件名与程序的类名相同):$XAPPLRESDIR/$LC_CTYPE/XTerm
$XAPPLRESDIR/language/XTerm
$XAPPLRESDIR/XTerm
(通过剥离除第一个部分以外的所有部分
language
得出$LC_CTYPE
;例如,en_US.utf-8
→en
。)这第五位置是系统范围的“app-defaults”目录。同样,如果 app-defaults 目录中有以程序命名的文件,则会在程序启动时检查这些目录。例如,XTerm(在 Arch Linux 上)使用:
/etc/X11/$LC_CTYPE/app-defaults/XTerm
/etc/X11/language/app-defaults/XTerm
/etc/X11/app-defaults/XTerm
/usr/share/X11/$LC_CTYPE/app-defaults/XTerm
/usr/share/X11/language/app-defaults/XTerm
/usr/share/X11/app-defaults/XTerm
app-defaults 文件通常
/usr/share
与程序本身一起安装到;管理员覆盖将转到/etc
。
上面提到的所有内容在 X.org 工具包文档中都有详细记录 – 文章X 工具包内部函数 - C 语言接口, 部分加载资源数据库。
不幸的是,我找不到任何描述 X 资源的最新用户指南,主要是因为它们在 2012 年已经不相关了。但对于历史(阅读:非常过时)信息,你可以阅读X Window 系统 X11 R3 和 R4 用户指南第 9 节:设置资源(从第 181 页开始)。