充分利用 X 资源

作者:Preston Brown

您是否曾经想过,为什么有些人的 xclock 和 xterm 启动时总是使用与枯燥的黑白不同的颜色?您是否希望那些 Athena 3-D 部件(在《Linux Journal》第 15 期中讨论过)看起来更像它们应该模仿的 Motif 部件?通过一种名为 X 资源的魔法,您可以实现这一切以及更多。

资源乍一看可能令人困惑和复杂,就像只有心怀恶意程序员才会强加给不知情的用户的东西。诚然,资源与 X 编程紧密相关,这就是为什么它们看起来如此神秘。然而,通过一点练习,您可以自定义应用程序以适应您的个人偏好,并永远告别“原味 X”。

X 资源有什么用?

颜色已经提到过了,但如果仅仅将资源视为简单的颜色控制机制,那就错了。不喜欢应用程序对字体的选择?更改它们。想要更改光标的显示方式?您也可以做到。

资源甚至可以用于修改应用程序的整个行为,从按钮和下拉菜单的外观和标签,到这些项目在程序中调用的实际功能。例如,如果您认为按钮上的“Quit”标签太平淡,您可以轻松地替换为“Kill”,甚至更具想象力的内容。

资源文件

X 资源存储在多个位置。应用程序通常有一组默认资源,这些资源存储在 /usr/lib/X11/app-defaults 目录中的文件中。例如,您会在该目录中找到 xterm 和 xload 的资源文件。请注意,这些文件通常将前两个字母大写,即 XTerm 和 XLoad。虽然这只是事实上的标准,但它与应用程序类名有关,我们稍后会介绍。

除了这些特定于应用程序的文件之外,还有两个其他文件可以存储资源。如果您在主目录中有一个名为 .Xdefaults 的文件,则当您的 X 会话启动时(通过 xdm 或 startx),它将被加载,替换可能已定义的任何系统范围的资源(存储在 /usr/lib/X11/Xdefaults 中)。第二个文件 .Xresources 不会替换系统默认值,而是与它们合并。因此,您可能希望使用此文件来存储您自己的资源,而不是 .Xdefaults。

指定资源

资源以下列格式之一指定

name*variable: valuename.variable.variable: value

资源区分大小写,您应确保在冒号后、指定值之前至少有一个空格或制表符。列出的第一个格式使用 * 分隔符(称为松散绑定),用于指示名称为 name 且变量为 variable 的程序的所有资源都将获取值 value。例如,资源

Xedit*font: 7x14

将导致 xedit 对所有内容(包括主窗口和菜单)使用 7x14 固定字体。(我们将在本文后面看到如何查找资源名称——现在请相信它们。)但是,如果您只想更改程序特定区域中的字体怎么办?在这种情况下,将使用 . 表示法(称为紧密绑定)。此表示法允许您比松散绑定更具体

Xedit.Paned.Label.font: fixed

将使 xedit 中的两个标签使用固定字体。但是,默认字体(由第一个资源设置的 7x14)将在其他任何地方使用。请注意,尽管第一个资源适用于 Xedit 程序中的 每个 字体资源,包括这两个标签,但第二个资源用于这些标签,因为它更 具体。更具体的资源始终优先于不太具体的资源使用。

资源以及它们修改的 部件 具有分层性质。“什么是部件?”您可能会问。部件是 X 程序的基本构建块或对象。一些大家熟悉的部件示例:滚动条、文本输入字段、按钮和复选框。在上面的资源中,Label 部件是 Paned 部件的“子部件”,而 Paned 部件又是 Xedit 的“子部件”。当下面介绍 editres 程序时,这将变得更加清晰。

在我们继续之前,还有一点需要注意:必须区分特定类的类和 实例。在上面的资源中,Label 指定部件类 Label 的任何实例。有两个匹配规范,其名称分别为 bc_labellabelWindow。根据定义,所有 都以大写字母开头;Label 是类,而 bc_labellabelWindow(以小写字母开头)是该类的实例。

您可以指定实例以及类,以便仅影响一个特定部件;您可以添加以下资源

Xedit.paned.bc_label.font: 7x14

这将把两个 Label 部件之一的字体设置回 7x14——它比之前的资源更具体。

通常,为整个部件类设置资源比为单个实例设置资源更方便,因为您通常希望使整个应用程序看起来一致。

查看、更改和加载资源

您已被多次告知添加或修改资源。这是如何完成的?X 发行版提供了多个程序,您可以使用它们来添加、修改和查看资源。最简单的方法(但可能也是最困难的方法)是在程序启动时将资源指定为程序的参数。大多数行为良好的 X 程序都接受 xrm 命令行选项来添加或修改单个资源。格式如下所示

-xrm "resource"

至少可以说,在命令行上指定资源可能会变得很乏味。X 提供了更复杂的机制来修改和检查资源。其中最简单的是 xrdb。Xrdb 是一个命令行实用程序,可以加载、查询和合并资源。以下是一些常见的命令行选项

  • -load filenamefilename 中包含的资源加载到资源数据库中。如果文件中指定了新值,则用新值替换数据库中当前的任何资源。

  • -merge filename 执行方式与 load 选项非常相似,但仅加载那些尚未修改的资源。文件中遇到的资源数据库中当前存在的任何内容都不会被加载。

  • -query 显示当前正在使用的资源数据库。仅显示已修改的资源。如果显示所有资源(包括默认值),那么您可能会获得比您预期的更多的信息。

X 发行版附带的另一个非常有用的程序是 editres。Editres 可用于交互式修改特定程序的资源。启动 editres 后,下拉“Commands”菜单,选择“Get Widget Tree”,然后单击要检查或修改的应用程序。现在您应该看到类似于图 1 中所示的内容(图中显示的实际层次结构是针对 xedit 的)。请注意,它看起来不会完全像图 1,因为我已经修改了 editres 的资源。

Getting the Most Out of X Resources

图 1. editres,一个交互式 X 资源编辑器

所有部件都以树状结构排列,父部件在左侧,子部件向右延伸。线条将子部件连接到父部件。如果部件树大于窗口本身,您可以使用 editres 左上角的框来移动显示。

使用“Tree”菜单,您可以在类名和实例名之间切换,并选择特定的部件。如果要修改某个特定部件的资源,请用鼠标左键单击一次以选择它,然后从“Commands”菜单中选择“Show Resource Box”。将显示一个弹出框,其中包含所选部件的所有可用资源,如图 2 所示。在资源框中,用鼠标选择一个资源,然后在下面的文本字段中输入该资源的值。这可能是查找资源名称和试验将其设置为不同值的最简单方法。

Getting the Most Out of X Resources

图 2. editres 的屏幕截图,显示资源显示屏幕

您还可以通过调整弹出窗口顶部突出显示的字段来使资源字符串更松散或更紧密地绑定。当您准备好查看更改结果时,按下窗口底部的“Apply”按钮。

有关 editres 的更多详细帮助,请参阅 editres 手册页。

一些示例

如果没有关于如何使用 X 资源的详细示例,那么关于 X 资源的文章就不完整。为此,我们将看看一个简单的 X 客户端——xclock——然后看看整个部件集——Athena 部件(它是任何 X11 发行版的标准部分)。

让我们尝试对 xclock 做几件事。您可以使用 editres 进行这些更改,以便您可以交互式地查看它们,或者您可以将它们添加到您的 .Xresources 文件中,您需要使用 xrdb 合并该文件。请记住,每当您更改资源数据库时,受影响的客户端都需要重新启动,以便更改生效。如果您认为时钟的正常黑白方案太单调,请考虑以下内容

*xclock.foreground: steelblue*xclock.hands:      steelblue
*xclock.background: ivory

这应该为您提供一些入门的想法。为了更广泛地改变外观,请尝试

*xclock.analog: 0

这将使时钟以数字方式显示。将此资源的值指定为 1 将其重置为正常的模拟显示。

让我们更进一步。在 1995 年 7 月的《Linux Journal》中,介绍了 Xaw3D 部件。这些部件的目的是使默认的 Athena 部件具有更立体的外观和感觉。但是,由于没有默认资源,程序仍然可能看起来黯淡无光。这是因为没有为部件指定默认颜色,因此不显式更改这些资源的程序将以黑白色显示它们,并带有难看的抖动阴影。有关示例,请参见图 3。

Getting the Most Out of X Resources

图 3. “原味” xmailtool

使 Xaw3D 部件看起来更像流行的 Motif 部件的一组资源出现在清单 1 中。

清单 1

! Good Xaw3d Defaults*customization:           -color
*shadowWidth:             3
*Form.background:         gray75
*MenuButton.background:   gray75
*SimpleMenu.background:   gray70
*TransientShell*Dialog.background: gray70
*Command.background:      gray75
*Label.background:        gray75
*ScrollbarBackground:     grey39
*Scrollbar*background:    gray75
*Scrollbar*width:         15
*Scrollbar*height:        15
*Scrollbar*shadowWidth:   2
*Scrollbar*cursorName:    top_left_arrow
*Scrollbar*pushThumb:     false
*shapeStyle:              Rectangle
*beNiceToColormap:        False
*SmeBSB*shadowWidth:      3
*highlightThickness:      0
*topShadowContrast:       40
*bottomShadowContrast:    60
! fix up a few of the default X clients who
! now look silly
*xclock*shadowWidth:      0
*xload*shadowWidth:       0
*xcalc*shadowWidth:       0

第一个资源告诉所有程序颜色可用并且应该使用。然后,所有 Athena 部件的阴影宽度设置为 3(看起来像 Motif)。然后为大多数常用部件(按钮、滚动条等)选择默认颜色,并设置阴影对比度级别。最后,一些 X 客户端上的阴影有点过分,因此这些客户端的 shadowWidth 减小为 0。图 4 显示了程序在进行这些修改后,外观现在变得更加美观。

Getting the Most Out of X Resources

图 4. 资源更改后的 xmailtool

这应该能让您入门。X 资源是 X 程序总体上最重要的方面之一,因此对它们的基本理解至关重要——不仅对于使用和自定义 X 程序,而且对于编写它们也是如此。您现在应该能够发现隐藏在您自己喜欢的程序背后的资源,现在您最好将本文中的技术应用于您自己选择的不同程序。当您在摆弄 X 资源时,请记住这一点:X 可能不像 MS Windows 那样易于配置,但它功能强大得多。

尽情享受吧!

Preston Brown 是康涅狄格州纽黑文市耶鲁大学计算机科学专业的大二学生。他在 1992 年末通过最早的 TAMU 版本发现了 Linux。您可以通过电子邮件 preston.brown@yale.edu 与他联系。

加载 Disqus 评论