---
title: 第 6 章 X Window 系统
part: 部分 I. 起步
prev: books/handbook/ports
next: books/handbook/partii
showBookMenu: true
weight: 8
params:
  path: "/books/handbook/x11/"
---

[[x11]]
= X Window 系统
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 6
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/handbook/x11/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

[[x11-synopsis]]
== 概述

FreeBSD 使用 X11 来为用户提供功能强大的图形用户界面。 X11 是一种可以免费使用的 X 视窗系统， 其实现包括 Xorg FreeBSD 中默认使用并受官方支持的 X11 实现即是 Xorg， 它是由 X.Org 基金会开发的 X11 服务， 采用与 FreeBSD 类似的授权。 此外， 也有一些用于 FreeBSD 的商业 X 服务器。

欲了解 X11 所支持的显示卡等硬件， 请访问 http://www.x.org/[Xorg] 网站。

在阅读完这一章后，您将会了解：

* X 视窗系统的不同组件，它们是如何协同工作的。
* 如何安装和配置 X11。
* 如何安装和使用不同的窗口管理器。
* 如何在 X11 中使用 TrueType(R) 字体。
* 如何为您的系统设置图形登录 (XDM)。

在阅读这一章之前，您应该：

* 知道如何安装额外的第三方应用程序(crossref:ports[ports,安装应用程序: Packages 和 Ports])。 

[[x-understanding]]
== 理解 X

对于那些熟悉其他图形环境，比如 Microsoft(R) Windows(R) 或者 Mac OS(R) 的用户来说，第一次使用 X 可能会感觉很惊讶。

通常您并不需要深入了解各种 X 组件的作用以及它们之间的相互影响， 不过， 了解一些关于它们的基础知识， 有助于更好地利用 X 的强大功能。

=== 为什么要使用 X?

X 不是第一个为 UNIX(R) 而开发的视窗系统， 但它是最流行的。 X 的原始开发团队在开发 X 之前就已经在另外一个视窗系统上工作了。 那个系统的名字叫做 "W" (就是 "Window")。X 只是罗马字母中 W 后面 的一个。

X 可以被叫做 "X", "X Window 系统", "X11", 等等。把 X11 称做 "X Windows" 可能会冒犯某些人； 查看 man:X[7] 可以了解更多的信息。

=== X 客户机/服务器模型

X 一开始就是针对网络而设计的，所以 采用了 "client-server" 模型。在 X 模型中， "X server" 运行在有键盘，显示器，鼠标的计算机上。 服务器用来管理显示信息，处理来自键盘和鼠标的输入信息， 并与其他输入输出设备交互 (比如作为输入设备的 "tablet"， 或者作为输出设备的投影仪)。 每一个 X 应用程序 (比如 XTerm, 或者 man:getenv[3]) 就是一个 "客户程序 (client)"。 客户程序给服务器发送信息，如 "请在这些坐标上画一个窗口"， 而服务器则返回处理信息， 如 "用户刚刚点击了 OK 按钮"。

如果您家或办公环境中只有一台使用 FreeBSD 的计算机， 就只能在同一台计算机上运行 X server 和 X client 了。 然而， 如果您有很多运行 FreeBSD 的机器， 您可以在您的桌面计算机上运行 X server， 而在比较高档的服务器上运行 X 应用程序。 在这样的环境中， X server 和 X client 之间的通信就可以通过网络来进行。

这可能会让一些人感到困惑， 因为 X 的术语和他们料想的有些不同。 他们以为 "X server" 是运行在功能强大的大型机上的，而 "X client" 是运行在他们桌面上的计算机上的。

记住，X server 是有键盘和显示器的那台计算机，而 X client 是那些显示窗口的程序。

Client 和 server 不一定都要运行在同一种操作系统上， 它们甚至无需在同一种类型的计算机上运行。 在 Microsoft(R) Windows(R) 或 Apple 公司的 Mac OS(R) 上运行 X server 也是可以的， 在它们上面也有很多免费的和商业化的应用程序。

=== 窗口管理器

X 的设计哲学很像 UNIX(R) 的设计哲学， "tools, not policy"。这就意味着 X 不会试图去规定任务应该如何 去完成，而是，只给用户提供一些工具，至于决定如何使用这些工具是用户自己的 事情。

这套哲学扩展了 X，它不会规定窗口在屏幕上应该是什么样子，要如何移动鼠标， 应该用什么键来切换窗体 (比如， kbd:[Alt+Tab]按键，在 Microsoft(R) Windows(R) 环境中的作用), 每个窗口的工具条应该 看起来像什么，他们是否应该有关闭按钮等等。

实际上，X 行使了一种叫做 "窗口管理器"的应用程序的职责。有很多这样的程序可用： AfterStep, Blackbox, ctwm, Enlightenment, fvwm, Sawfish, twm, Window Maker，等等。每一个窗口管理器 都提供了不同的界面和观感；其中一些还支持 "虚拟桌面"；有一些允许您可以定制一些键来管理您的桌面； 一些有"开始" 按钮，或者其他类似的设计；一些是 "可定制主题的(themeable)"， 通过安装新的主题， 可以完全改变外观。 这些以及很多其他的窗口管理器， 都可以在 Ports Collection 的 [.filename]#x11-wm# 分类目录里找到。

另外，KDE 和 GNOME 桌面环境都有他们自己的窗口管理器 与桌面集成。

每个窗口管理器也有不同的配置机制；有些需要手工来写配置文件， 而另外一些则可以使用 GUI 工具来完成大部分的配置任务， 举例而言， (Sawfish) 就使用 Lisp 语言书写配置文件。

[NOTE]
.焦点策略
====
窗口管理器的另一个特性是鼠标的 "focus policy"。 每个窗口系统都需要有一个选择窗口的方法来接受键盘的输入信息，以及当前 哪个窗口处于可用状态。

您通常比较熟悉的是一个叫做 "click-to-focus" 的焦点策略。 这是 Microsoft(R) Windows(R) 使用的典型焦点策略，也就是您在一个窗口上点击 一下鼠标，这个窗口就处于当前可用的状态。

X 不支持一些特殊的焦点策略。确切地说，窗口管理器控制着在什么时候哪个窗口 拥有焦点。不同的窗口管理器支持不同的焦点方案。它们都支持点击即获得焦点， 而且它们中的大多数都支持好几种方案。

最流行的焦点策略：

focus-follows-mouse::
鼠标指示器下面的窗口就是获得焦点的窗口。 这个窗口不一定位于其他所有窗口之上。 通过将鼠标移到另一个窗口就可以改变焦点， 而不需要在它上面点击。 

sloppy-focus::
这种方式是对 focus-follows-mouse 策略的一个小小扩展。对于 focus-follows-mouse， 如果您把鼠标移到了根窗口（或桌面背景）上， 则所有的其它窗口都会失去焦点， 而相关的全部键盘输入也会丢失。 如果选择了 sloppy-focus， 则只有当指针进入新窗口时， 窗口焦点才会发生变化， 而当退出当前窗口时是不会变化的。 

click-to-focus::
当前窗口由鼠标点击来选择。窗口被"突出显示" ， 出现在所有其他窗口的前面。即使指针被移向了另一个窗口，所有的键盘输入 仍会被这个窗口接收。 

许多窗口管理器支持其他的策略，与这些相比又有些变化。您可以看具体 窗口管理器的文档。 
====

=== 窗口部件

提供工具而非策略的 X 方法使得在每个应用程序屏幕上看到的窗口部件得到了 大大的扩展。

"Widget" 只是针对用户接口中所有列举项目的一个术语，它 可以用某种方法来点击或操作；如按钮，复选框，单选按钮，图标，列表框等等。 Microsoft(R) Windows(R) 把这些叫做"控件"。

Microsoft(R) Windows(R) 和苹果公司的 Mac OS(R) 都有一个严格的窗口部件策略。 应用程序开发者被建议确保他们的应用程序共享一个普通的所见即所得的用户界面。 对于 X，它并不要求一个特殊的图形风格或一套相结合的窗口部件集。

这样的结果是您不能期望 X 应用程序只拥有一个普通的所见即所得的界面。 有很多的流行的窗口部件集设置，包括来自于 MIT 的 Athena， Motif(R) (模仿 Microsoft(R) Windows(R) 的窗口风格， 所有部件都具有斜边和3种灰色度)， OpenLook， 等等。

如今， 绝大多数比较新的 X 应用程序采用一组新式的窗口设计， 这包括 KDE 所使用的 Qt， 以及 GNOME 所使用的 GTK+。 在这样一种窗口系统下，UNIX(R) 桌面的一些所见即所得特性作了一些收敛， 以使初学者感到更容易一些。

[[x-install]]
== 安装 X11

Xorg 是 FreeBSD 上的默认 X11 实现。 Xorg 是由 X.Org 基金会发行的开放源代码 X Window 系统实现中的 X 服务。 Xorg 基于 XFree86(TM) 4.4RC2 和 X11R6.6 的代码。 从 FreeBSD Ports 套件可以安装 Xorg 的 7.7 版本。

如果需要从 Ports Collection 编译和安装 Xorg：

[source,shell]
....
# cd /usr/ports/x11/xorg
# make install clean
....

[NOTE]
====
要完整地编译 Xorg 则需要至少 4 GB 的剩余磁盘空间。
====

另外 X11 也可以直接从 package 来安装。 我们提供了可以与 man:pkg_add[1] 工具配合使用的 X11 安装包。 如果从远程下载和安装， 在使用 man:pkg_add[1] 时请不要指定版本号。 man:pkg_add[1] 会自动地下载最新版本的安装包。

想要从 package 安装 Xorg， 简单地输入下面的命令：

[source,shell]
....
# pkg_add -r xorg
....

[NOTE]
====
上面的例子介绍了如何安装完整的 X11 软件包， 包括服务器端，客户端，字体等等。 此外， 也有一些单独的 X11 的 ports 和 packages.

另外， 如果需要最小化的 X11 软件， 您也可以安装 package:x11/xorg-minimal[]。
====

这一章余下的部分将会讲解如何配置 X11, 以及如何设置一个高效的桌面环境。

[[x-config]]
== 配置 X11

=== 开始之前

在配置 X11 之前， 您需要了解所安装的系统的下列信息：

* 显示器规格
* 显示卡的芯片类型
* 显示卡的显存容量

显示器的规格被 X11 用来决定显示的分辨率和刷新率。 这些规格通常可以从显示器所带的文档中， 以及制造商的网站找到。 需要知道两个数字范围： 垂直刷新率和水平刷新率。

显示卡的芯片类型将决定 X11 使用什么模块来驱动图形硬件。 尽管系统能自动检测出绝大多数的硬件， 但事先了解在自动检测出错的时候还是很有用处的。

显示卡的显存大小决定了系统支持的分辨率和颜色深度。 了解这些限制非常重要。

=== 配置 X11

对于 Xorg 7.3 这个版本， 可以不需要任何的配置文件就能运行，在提示符下键如下命令：

[source,shell]
....
% startx
....

从 Xorg 7.4 开始， 可以使用 HAL 自动检测键盘和鼠标。Ports package:sysutils/hal[] 和 package:devel/dbus[] 将被作为 package:x11/xorg[] 所依赖的包安装进系统。 并且需要在 [.filename]#/etc/rc.conf# 文件中启用：

[.programlisting]
....
hald_enable="YES"
dbus_enable="YES"
....

在更深入的配置 Xorg 以前， 需要运行这些服务 (手工启动或者重启机器)。

自动配置对于某些硬件可能不起作用或者无法做到期望的配置。 在这种情况下就有必要做一些手工配置。

[NOTE]
====
诸如 GNOME， KDE 或 Xfce 之类的桌面环境， 大多都提供了一些允许用户非常易用的工具， 来设置像分辨率这样的显示参数。 所以如果你觉得默认的配置并不适合， 而且你打算安装一个这样的桌面环境， 那么就请继续完成桌面环境的安装， 并使用适合的显示设置工具。
====

配置 X11 需要一些步骤。 第一步是以超级用户的身份建立初始的配置文件：

[source,shell]
....
# Xorg -configure
....

这会在 [.filename]#/root# 中生成一个叫做 [.filename]#xorg.conf.new# 的配置文件 (无论您使用 man:su[1] 或直接登录， 都会改变默认的 `$HOME` 目录变量)。 X11 程序将尝试探测系统中的图形硬件，并将探测到的硬件信息写入配置文件， 以便加载正确的驱动程序。

下一步是测试现存的配置文件， 以确认 Xorg 能够同系统上的图形设备正常工作。 对于 Xorg 7.3 或者之前的版本， 键入：

[source,shell]
....
# Xorg -config xorg.conf.new
....

从 Xorg 7.4 和更高的版本开始， 这个测试将显示出一个黑色的屏幕，对于判断 X11 是否能正常工作会造成一些困扰。 可以通过 `retro` 选项使用旧的模式：

[source,shell]
....
# Xorg -config xorg.conf.new -retro
....

如果看到黑灰的格子以及 X 型鼠标指针， 就表示配置成功了。 要退出测试， 需要同时按下 kbd:[Ctrl+Alt+Fn] 来切换到用于启动 X 的虚拟控制台 (kbd:[F1] 表示第一个虚拟控制台) 之后按 kbd:[Ctrl+C]。

[NOTE]
====
在Xorg 7.3 以及更早期的版本中， 应使用 kbd:[Ctrl+Alt+Backspace] 组合键来强制退出 Xorg。 如果需要在 7.4 和之后的版本中启用这个组合键， 可以在任意 X 终端模拟器中输入下面的命令：

[source,shell]
....
% setxkbmap -option terminate:ctrl_alt_bksp
....

或者为 hald 创建一个叫作 [.filename]#x11-input.fdi# 的键盘配置文件并保存至 [.filename]#/usr/local/etc/hal/fdi/policy# 目录。 这个文件需包含以下这些：

[.programlisting]
....
<?xml version="1.0" encoding="utf-8"?>
<deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.keyboard">
	  <merge key="input.x11_options.XkbOptions" type="string">terminate:ctrl_alt_bksp</merge>
    </match>
  </device>
</deviceinfo>
....

你可能需要重启你的机器来使得 hald 重新读取这个文件。

此外， 还需要在 [.filename]#xorg.conf.new# 中的 `ServerLayout` 或 `ServerFlags` 小节中添加：

[.programlisting]
....
Option	"DontZap"	"off"
....

====

如果鼠标无法正常工作， 在继续深入之前需要先配置它。 参阅 FreeBSD 安装一章中的 crossref:install[mouse,配置鼠标]。 另外， 从 7.4 版本开始， [.filename]#xorg.conf# 中的 `InputDevice` 部分将被忽略， 这有助于自动检测硬件设备。 可以在这个文件中的 `ServerLayout` 或者 `ServerFlags` 加入以下选项使用旧的模式：

[.programlisting]
....
Option "AutoAddDevices" "false"
....

输入设备连同其他需要的选项 (比如， 键盘布局切换) 就可以像在之前的版本中的那样配置了。

[NOTE]
====
正如前面所提到的， 自版本 7.4 开始 hald 守护进程默认自动检测你的键盘。 可能检测出你的键盘布局或型号有差异， 在桌面环境中， 比如 GNOME， KDE 或者 Xfce 提供了工具来配置键盘。 另一方面， 也可在 man:setxkbmap[1] 工具的帮助下或者通过 hald 的配置文件来直接设置键盘的属性。

举例来说， 如果某人想要使用一个 PC 102 键法语布局的键盘， 我们就需要为 hald 创建一个配置文件， 叫作 [.filename]#x11-input.fdi# 并保存入 [.filename]#/usr/local/etc/hal/fdi/policy# 目录。 这个文件需要包含如下这些：

[.programlisting]
....
<?xml version="1.0" encoding="utf-8"?>
<deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.keyboard">
	  <merge key="input.x11_options.XkbModel" type="string">pc102</merge>
	  <merge key="input.x11_options.XkbLayout" type="string">fr</merge>
    </match>
  </device>
</deviceinfo>
....

如果这个文件已经存在， 只要把键盘配置相关的部分拷贝加入即可。

你需要重启你的机器使 hald 读入此文件。

也可以在 X 模拟终端或一个脚本中使用以下的命令达到相同的效果:

[source,shell]
....
% setxkbmap -model pc102 -layout fr
....

[.filename]#/usr/local/shared/X11/xkb/rules/base.lst# 列出了各种不同的键盘， 布局和可用的选项。
====

接下来是调整 [.filename]#xorg.conf.new# 配置文件并作测试。 用文本编辑器如 man:emacs[1] 或 man:ee[1] 打开这个文件。 要做的第一件事是为当前系统的显示器设置刷新率。 这些值包括垂直和水平的同步频率。 把它们加到 [.filename]#xorg.conf.new# 的 `"Monitor"` 小节中：

[.programlisting]
....
Section "Monitor"
        Identifier   "Monitor0"
        VendorName   "Monitor Vendor"
        ModelName    "Monitor Model"
        HorizSync    30-107
        VertRefresh  48-120
EndSection
....

在配置文件中也有可能没有 `HorizSync` 和 `VertRefresh`。 如果是这样的话， 就只能手动添加， 并在 `HorizSync` 和 `VertRefresh` 后面设置合适的数值了。 在上面的例子中， 给出了相应的显示器的参数。

X 能够使用显示器所支持的 DPMS (能源之星) 功能。 man:xset[1] 程序可以控制超时时间， 并强制待机、挂起或关机。 如果希望启用显示器的 DPMS 功能， 则需要把下面的设置添加到 monitor 节中：

[.programlisting]
....

        Option       "DPMS"
....

关闭 [.filename]#xorg.conf.new# 之前还应该选择默认的分辨率和色深。 这是在 `"Screen"` 小节中定义的：

[.programlisting]
....
Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        DefaultDepth 24
        SubSection "Display"
                Viewport  0 0
                Depth     24
                Modes     "1024x768"
        EndSubSection
EndSection
....

`DefaultDepth` 关键字描述了要运行的默认色深。 这可以通过 man:Xorg[1] 的 `-depth` 命令行开关来替代配置文件中的设置。 `Modes` 关键字描述了给定颜色深度下屏幕的分辨率。 需要说明的是， 目标系统的图形硬件只支持由 VESA 定义的标准模式。 前面的例子中， 默认色深是使用 24位色。 在采用这个色深时， 允许的分辨率是 1024x768。

最后就是将配置文件存盘， 并使用前面介绍的测试模式测试一下。

[NOTE]
====
在发现并解决问题的过程中， 包含了与 X11 服务器相关的各个设备的信息的 X11 日志文件会为您发现和排除问题有所帮助。 Xorg 日志的文件名是 [.filename]#/var/log/Xorg.0.log# 这样的格式。 实际的日志文件名可能是 [.filename]#Xorg.0.log# 到 [.filename]#Xorg.8.log# 等等。
====

如果一切准备妥当， 就可以把配置文件放到公共的目录中了。 您可以在 man:Xorg[1] 里面找到具体位置。 这个位置通常是 [.filename]#/etc/X11/xorg.conf# 或 [.filename]#/usr/local/etc/X11/xorg.conf#。

[source,shell]
....
# cp xorg.conf.new /etc/X11/xorg.conf
....

现在已经完成了 X11 的配置全过程。 Xorg 可以通过 man:startx[1] 工具来启动。 除此之外， X11 服务器也可以用 man:xdm[1] 来启动。

=== 高级配置主题

==== 配置 Intel(R) i810 显示芯片组

配置Intel i810芯片组的显示卡需要有针对 X11 的能够用来驱动显示卡的 [.filename]#agpgart# AGP程序接口。 请参见 man:agp[4] 驱动程序的联机手册了解更多细节。

这也适用于其他的图形卡硬件配置。 注意如果系统没有将 man:agp[4] 驱动程序编译进内核，尝试用 man:kldload[8] 加载模块是无效的。 这个驱动程序必须编译进内核或者使用 [.filename]#/boot/loader.conf# 在启动时加载进入内核。

==== 添加宽屏平板显示器

这一节假定您了解一些关于高级配置的知识。 如果使用前面的标准配置工具不能产生可用的配置， 则在日志文件中提供的信息应该足以修正配置使其正确工作。 如果需要的话， 您应使用一个文本编辑器来完成这项工作。

目前的宽屏 (WSXGA、 WSXGA+、 WUXGA、 WXGA、 WXGA+， 等等) 支持 16:10 和 10:9 或一些支持不大好的显示比例。 常见的一些 16:10 比例的分辨率包括：

* 2560x1600
* 1920x1200
* 1680x1050
* 1440x900
* 1280x800

有时， 也可以简单地把这些分辨率作为 `Section "Screen"` 中的 `Mode` 来进行配置， 类似下面这样：

[.programlisting]
....
Section "Screen"
Identifier "Screen0"
Device     "Card0"
Monitor    "Monitor0"
DefaultDepth 24
SubSection "Display"
	Viewport  0 0
	Depth     24
	Modes     "1680x1050"
EndSubSection
EndSection
....

Xorg 能够自动地通过 I2C/DDC 信息来自动获取宽屏显示器的分辨率信息， 并处理显示器支持的频率和分辨率。

如果驱动程序没有对应的 `ModeLines`， 就需要给 Xorg 一些提示了。 使用 [.filename]#/var/log/Xorg.0.log# 能够提取足够的信息， 就可以写一个可用的 `ModeLine` 了。 这类信息如下所示：

[.programlisting]
....
(II) MGA(0): Supported additional Video Mode:
(II) MGA(0): clock: 146.2 MHz   Image Size:  433 x 271 mm
(II) MGA(0): h_active: 1680  h_sync: 1784  h_sync_end 1960 h_blank_end 2240 h_border: 0
(II) MGA(0): v_active: 1050  v_sync: 1053  v_sync_end 1059 v_blanking: 1089 v_border: 0
(II) MGA(0): Ranges: V min: 48  V max: 85 Hz, H min: 30  H max: 94 kHz, PixClock max 170 MHz
....

这些信息称做 EDID 信息。 从中建立 `ModeLine` 只是把这些数据重新排列顺序而已：

[.programlisting]
....
ModeLine <name> <clock> <4 horiz. timings> <4 vert. timings>
....

如此， 本例中的 `Section "Monitor"` 中的 `ModeLine` 应类似下面的形式：

[.programlisting]
....
Section "Monitor"
Identifier      "Monitor1"
VendorName      "Bigname"
ModelName       "BestModel"
ModeLine        "1680x1050" 146.2 1680 1784 1960 2240 1050 1053 1059 1089
Option          "DPMS"
EndSection
....

经过简单的编辑步骤之后， X 就可以在您的宽屏显示器上启动了。

[[x-fonts]]
== 在 X11 中使用字体

[[type1]]
=== Type1 字体

X11 使用的默认字体不是很理想。 大型的字体显得参差不齐，看起来很不专业， 并且， 在 man:getenv[3] 中， 小字体简直无法看清。 有好几种免费、 高质量的字体可以很方便地用在 X11 中。 例如，URW字体集合 (package:x11-fonts/urwfonts[]) 就包括了高质量的 标准 type1 字体 (Times Roman(TM), Helvetica(TM)、 Palatino(TM) 和其他一些)。 在 Freefont 集合中 (package:x11-fonts/freefonts[]) 也包括更多的字体， 但它们中的绝大部分使用在图形软件中，如 Gimp，在屏幕字体中使用并不完美。另外， 只要花很少的功夫，可以将 XFree86(TM) 配置成能使用 TrueType(R) 字体：请参见后面的 <<truetype,TrueType(R) 字体一节>>。

如果希望使用 Ports Collection 来安装上面的 Type1 字体， 只需运行下面的命令：

[source,shell]
....
# cd /usr/ports/x11-fonts/urwfonts
# make install clean
....

freefont 或其他的字库和上面所说的大体类似。 为了让 X 服务器能够检测到这些字体， 需要在 X 服务器的配置文件 ([.filename]#/etc/X11/xorg.conf#) 中增加下面的配置：

[.programlisting]
....
FontPath "/usr/local/lib/X11/fonts/URW/"
....

或者，也可以在命令行运行：

[source,shell]
....
% xset fp+ /usr/local/lib/X11/fonts/URW
% xset fp rehash
....

这样会起作用，但是当 X 会话结束后就会丢失， 除非它被添加到启动文件 ([.filename]#~/.xinitrc# 中， 针对一个寻常的 `startx` 会话，或者当您通过一个类似 XDM 的图形登录管理器登录时添加到 [.filename]#~/.xsession# 中)。 第三种方法是使用新的 [.filename]##/usr/local/etc/fonts/local.conf## 文件： 查看 <<antialias,anti-aliasing>> 章节。 

[[truetype]]
=== TrueType(R) 字体

Xorg 已经内建了对 TrueType(R) 字体的支持。有两个不同的模块能够启用这个功能。 在这个例子中使用 freetype 这个模块，因为它与其他的字体描绘后端 是兼容的。要启用 freetype 模块，只需要将下面这行添加到 [.filename]#/etc/X11/xorg.conf# 文件的 `"Module"` 部分。

[.programlisting]
....
Load "freetype"
....

现在，为 TrueType(R) 字体创建一个目录 (比如， [.filename]#/usr/local/lib/X11/fonts/TrueType#) 然后把所有的 TrueType(R) 字体复制到这个目录。记住您不能直接从 Macintosh(R) 计算机中提取 TrueType(R) 字体； 能被 X11 使用的必须是 UNIX(R)/MS-DOS(R)/Windows(R) 格式的。 一旦您已经将这些文件复制到了这个目录， 就可以用 ttmkfdir 来创建 [.filename]#fonts.dir# 文件， 以便让X字体引擎知道您已经安装了这些新文件。 `ttmkfdir` 可以在 FreeBSD Ports 套件中的 package:x11-fonts/ttmkfdir[] 中找到。

[source,shell]
....
# cd /usr/local/lib/X11/fonts/TrueType
# ttmkfdir -o fonts.dir
....

现在把 TrueType(R) 字体目录添加到字体路径中。 这和上面 <<type1,Type1>> 字体的步骤是一样的， 那就是，使用

[source,shell]
....
% xset fp+ /usr/local/lib/X11/fonts/TrueType
% xset fp rehash
....

或者把 `FontPath` 这行加到 [.filename]#xorg.conf# 文件中。

就是这样。现在 man:getenv[3], Gimp, StarOffice(TM) 和其他所有的 X 应用程序 应该可以认出安装的 TrueType(R) 字体。一些很小的字体(如在 Web 页面上高分辨率显示的文本) 和一些很大的字体(在 StarOffice(TM) 下) 现在看起来已经很好了。 

[[antialias]]
=== Anti-Aliased 字体

对于所有支持 Xft 的应用程序， 所有放到 X11 [.filename]#/usr/local/lib/X11/fonts/# 和 [.filename]#~/.fonts/# 中的字体都自动地被加入反走样支持。 绝大多数较新的程序都提供了 Xft 支持， 包括 KDE、 GNOME 以及 Firefox。

要控制哪些字体是 anti-aliased，或者配置 anti-aliased 特性， 创建(或者编辑，如果文件已经存在的话)文件 [.filename]#/usr/local/etc/fonts/local.conf#。Xft 字体系统的几个 高级特性都可以使用这个文件来调节； 这一部分只描述几种最简单的情况。要了解更多的细节，请查看 man:fonts-conf[5].

这个文件一定是 XML 格式的。注意确保所有的标签都完全的关闭掉。 这个文件以一个很普通的 XML 头开始， 后跟一个 DOCTYPE 定义， 接下来是 `<fontconfig>` 标签：

[.programlisting]
....

      <?xml version="1.0"?>
      <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
      <fontconfig>
....

像前面所做的那样，在 [.filename]#/usr/local/lib/X11/fonts/# 和 [.filename]#~/.fonts/# 目录下的所有字体已经可以被支持 Xft 的 应用程序使用了。如果您想添加这两个目录以外的其他路径， 简单的添加下面这行到 [.filename]##/usr/local/etc/fonts/local.conf##文件中：

[.programlisting]
....
<dir>/path/to/my/fonts</dir>
....

添加了新的字体，尤其是添加了新的字体目录后， 您应该运行下面的命令重建字体缓存：

[source,shell]
....
# fc-cache -f
....

Anti-aliasing 会让字体边缘有些模糊，这样增加了非常小的文本的可读性， 并从大文本字体中删除 "锯齿"。 但如果使用普通的文本， 则可能引起眼疲劳。 要禁止 14磅 以下字体的反走样， 需要增加如下配置：

[.programlisting]
....
        <match target="font">
            <test name="size" compare="less">
                <double>14</double>
            </test>
            <edit name="antialias" mode="assign">
                <bool>false</bool>
            </edit>
        </match>
        <match target="font">
            <test name="pixelsize" compare="less" qual="any">
                <double>14</double>
            </test>
            <edit mode="assign" name="antialias">
                <bool>false</bool>
            </edit>
        </match>
....

用 anti-aliasing 来间隔一些等宽字体也是不适当的。 这似乎是 KDE 的一个问题。 要修复这个问题需要确保每个字体之间的间距保持在100。 加入下面这些行：

[.programlisting]
....
       <match target="pattern" name="family">
           <test qual="any" name="family">
               <string>fixed</string>
           </test>
           <edit name="family" mode="assign">
               <string>mono</string>
           </edit>
        </match>
        <match target="pattern" name="family">
            <test qual="any" name="family">
                <string>console</string>
            </test>
            <edit name="family" mode="assign">
                <string>mono</string>
            </edit>
        </match>
....

(这里把其他普通的修复的字体作为 `"mono"`)，然后加入：

[.programlisting]
....
         <match target="pattern" name="family">
             <test qual="any" name="family">
                 <string>mono</string>
             </test>
             <edit name="spacing" mode="assign">
                 <int>100</int>
             </edit>
         </match>
....

某些字体，比如 Helvetica，当 anti-aliased 的时候可能存在问题。 通常的表现为字体本身似乎被垂直的切成两半。 糟糕的时候，还可能导致应用程序崩溃。 为了避免这样的现象，考虑添加下面几行到 [.filename]##local.conf##文件里面：

[.programlisting]
....
         <match target="pattern" name="family">
             <test qual="any" name="family">
                 <string>Helvetica</string>
             </test>
             <edit name="family" mode="assign">
                 <string>sans-serif</string>
             </edit>
         </match>
....

一旦您完成对 [.filename]#local.conf# 文件的编辑，确保您使用了 `</fontconfig>` 标签来结束文件。 不这样做将会导致您的更改被忽略。

最后，用户可以通过他们个人的 [.filename]#.fonts.conf# 文件来添加自己的设定。 要完成此项工作， 用户只需简单地创建 [.filename]#~/.fonts.conf# 并添加相关配置。 此文件也必须是 XML 格式的。

最后：对于LCD屏幕， 可能希望使用子像素的取样。 简单而言， 这是通过分别控制 (水平方向分开的) 红、绿、蓝 像素， 来改善水平分辨率； 这样做的效果一般会非常明显。 要启用它， 只需在 [.filename]#local.conf# 文件的某个地方加入：

[.programlisting]
....

         <match target="font">
             <test qual="all" name="rgba">
                 <const>unknown</const>
             </test>
             <edit name="rgba" mode="assign">
                 <const>rgb</const>
             </edit>
         </match>
....

[NOTE]
====
随您显示器的种类不同， 可能需要把 `rgb` 改为 `bgr`、 `vrgb` 或 `vbgr`： 试验一下看看那个更好。
====

[[x-xdm]]
== X 显示管理器

=== 概要

X 显示管理器(XDM) 是一个X视窗系统用于进行登录会话管理的可选项。 这个可以应用于多种情况下，包括小 "X Terminals"， 桌面，大网络显示服务器。既然 X 视窗系统不受网络和协议的限制， 那对于通过网络连接起来的运行 X 客户端和服务器端的不同机器， 就会有很多的可配置项。 XDM 提供了一个选择要连接到哪个显示服务器的图形接口， 只要键入如登录用户名和密码这样的验证信息。

您也可以把 XDM 想象成与 man:getty[8] 工具一样(see crossref:serialcomms[term-config,配置] for details)。为用户提供了同样功能。它可以完成系统的登录任务， 然后为用户运行一个会话管理器 (通常是一个 X 视窗管理器)。接下来 XDM 就等待这个程序退出，发出信号用户已经登录完成，应当退出屏幕。 这时， XDM 就可以为下一个登录用户显示登录和可选择屏幕。

=== 使用 XDM

如果希望使用 XDM 来启动， 首先需要安装 package:x11/xdm[] port (在较新版本的 Xorg 中它并不是默认安装的)。 XDM 服务程序位于 [.filename]#/usr/local/bin/xdm#。 任何时候都可以 `root` 用户的身份来运行它， 以令其管理本地系统的 X 显示。 如果希望让 XDM 在系统每次启动过程中自动运行， 比较方便的做法是把它写到 [.filename]#/etc/ttys# 的配置中。 有关这个文件的具体格式和使用方法请参阅 crossref:serialcomms[term-etcttys,添加一个记录到/etc/ttys]。 在默认的 [.filename]#/etc/ttys# 文件中已经包含了在虚拟终端上运行 XDM 服务的示范配置：

[source,shell]
....
ttyv8   "/usr/local/bin/xdm -nodaemon"  xterm   off secure
....

默认情况下，这个记录是关闭的，要启用它， 您需要把第5部分的 `off` 改为 `on` 然后按照 crossref:serialcomms[term-hup,重新读取/etc/ttys来强制init] 的指导 重新启动 man:init[8]。第一部分，这个程序将管理的终端名称是 `ttyv8`。这意味着 XDM 将运行在第9个虚拟终端上。

=== 配置 XDM

XDM 的配置目录是在 [.filename]##/usr/local/lib/X11/xdm##中。在这个目录中， 您会看到几个用来改变 XDM 行为和外观的文件。您会找到这些文件：

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| 文件
| 描述

|[.filename]#Xaccess#
|客户端授权规则。

|[.filename]#Xresources#
|默认的X资源值。

|[.filename]#Xservers#
|远程和本地显示管理列表。

|[.filename]#Xsession#
|用于登录的默认的会话脚本。

|[.filename]#Xsetup_#*
|登录之前用于加载应用程序的脚本。

|[.filename]#xdm-config#
|运行在这台机器上的所有显示的全局配置。

|[.filename]#xdm-errors#
|服务器程序产生的错误。

|[.filename]#xdm-pid#
|当前运行的 XDM 的进程 ID。
|===

当 XDM 运行时， 在这个目录中有几个脚本和程序可以用来设置桌面。 这些文件中的每一个的用法都将被简要地描述。 这些文件的更详细的语法和用法在 man:xdm[1] 中将有详细描述。

默认的配置是一个矩形的登录窗口，上面有机器的名称， "Login:" 和 "Password:"。如果您想设计您自己个性化的 XDM 屏幕，这是一个很好的起点。

==== Xaccess

用以连接由 XDM 所控制的显示设备的协议， 叫做 X 显示管理器连接协议 (XDMCP)。 这个文件是一组用以控制来自远程计算机的 XDMCP 连接的规则。 除非您修改 [.filename]#xdm-config# 使其接受远程连接， 否则其内容将被忽略。 默认情况下， 它不允许来自任何客户端的连接。

==== Xresources

这是一个默认的用来显示选项和登录屏幕的应用程序文件。 您可以在这个文件中对登录程序的外观进行定制。 其格式与 X11 文档中描述的默认应用程序文件是一样的。

==== Xservers

这是一个选择者应当提供的作为可选的远程显示列表。 

==== Xsession

这是一个用户登录后针对 XDM 的默认会话脚本。通常，在 [.filename]#~/.xsession# 中每个用户将有一个可定制的会话脚本。

==== Xsetup_*

在显示选择者或登录接口之前，这些将被自动运行。 这是一个每个显示都要用到的脚本，叫做 [.filename]#Xsetup_#， 后面会跟一个本地显示的数字(比如 [.filename]#Xsetup_0#)。典型的，这些脚本将在后台 (如 `xconsole`)运行一个或两个程序。

==== xdm-config

此文件以应用程序默认值的形式， 提供了在安装时所使用的普适的显示设置。

==== xdm-errors

这个文件包含了 XDM 正设法运行的的 X 服务器 的输出。 如果 XDM 正设法运行的显示由于某种原因被挂起， 那这是一个寻找错误信息的好地方。 这些信息会在每一个会话的基础上被写到用户的 [.filename]#~/.xsession-errors# 文件中。

=== 运行一个网络显示服务器

对于其他客户端来说， 如果希望它们能连接到显示服务器，您就必须编辑访问控制规则， 并启用连接侦听。 默认情况下， 这些都预设为比较保守的值。 要让 XDM 能侦听连接， 首先要在 [.filename]#xdm-config# 文件中注释掉一行：

[source,shell]
....
! SECURITY: do not listen for XDMCP or Chooser requests ! Comment out this line if you want to manage X terminals with xdm
DisplayManager.requestPort:     0
....

然后重新启动XDM。 记住默认应用程序文件的注释以"!" 字母开始，不是"\#"。 您需要设置严格的访问控制 - 看看在 [.filename]##Xaccess## 文件中的实例， 并参考 man:xdm[1] 的联机手册， 以了解进一步的细节。

=== 替换 XDM

有几个替换默认 XDM程序的方案。 其中之一是 上一节已经描述过的kdm (与 KDE捆绑在一起)。 kdm 提供了许多视觉上的改进和局部的修饰， 同样能让用户在启动时能选择他们喜欢的窗口管理器。

[[x11-wm]]
== 桌面环境

这节描述了 FreeBSD 上用于 X 的不同桌面环境。 "桌面环境" 可能仅仅是一个简单的窗口管理器， 也可能是一个像 KDE 或者 GNOME这样的完整桌面应用程序套件。 

[[x11-wm-gnome]]
=== GNOME

[[x11-wm-gnome-about]]
==== 有关 GNOME

GNOME 是一个用户界面友好的桌面环境， 能够使用户很容易地使用和配置他们的计算机。 GNOME 包括一个面板(用来启动应用程序和显示状态)， 一个桌面(存放数据和应用程序的地方)， 一套标准的桌面工具和应用程序， 和一套与其他人相互协同工作的协议集。 其他操作系统的用户在使用 GNOME提供的强大的图形驱动环境时会觉得很好。 更多的关于 FreeBSD 上 GNOME 的信息 可以在 http://www.FreeBSD.org/gnome[FreeBSD GNOME Project] 的网站上找到。 此外， 这个网站也提供了相当详尽的关于安装、 配置和管理 GNOME 的常见问题解答 (FAQ)。

[[x11-wm-gnome-install]]
==== 安装 GNOME

这个软件可以很容易地通过预编译包或 Ports 套件来安装：

要从网络安装GNOME， 只要键入：

[source,shell]
....
# pkg_add -r gnome2
....

从源代码编译GNOME，可以使用 ports树：

[source,shell]
....
# cd /usr/ports/x11/gnome2
# make install clean
....

GNOME 需要挂载 [.filename]#/proc# 文件系统才能正常运作。添加如下

[.programlisting]
....
proc           /proc       procfs  rw  0   0
....

到 [.filename]#/etc/fstab# 以便在系统启动时自动挂载 man:procfs[5]。

一旦装好了 GNOME， 就必须告诉 X server 启动 GNOME 而不是默认的窗口管理器。

最简单的启动 GNOME 的方法是使用 GDM， GNOME 显示管理器。 随 GNOME 桌面一同安装的 GDM 尽管默认是禁用的。 可以在 [.filename]#/etc/rc.conf# 中加入以下这行启用：

[.programlisting]
....
gdm_enable="YES"
....

这样在你重启机器的时候， GDM 将自动运行。

通常我们希望在 GDM 启动时， 同时启用所有的 GNOME 服务， 可以将如下这行加入 [.filename]#/etc/rc.conf#：

[.programlisting]
....
gnome_enable="YES"
....

GNOME 也可以通过适当地配置名为 [.filename]#.xinitrc# 的文件来启动。 如果已经有了自定义的 [.filename]#.xinitrc#， 将启动当前窗口管理器的那一行改为启动 /usr/local/bin/gnome-session 就可以了。 如果还没有， 那么只需简单地：

[source,shell]
....
% echo "/usr/local/bin/gnome-session" > ~/.xinitrc
....

接下来输入 `startx`， GNOME 桌面环境就启动了。

[NOTE]
====
如果之前使用了一些旧式的显示管理器， 例如 XDM， 则这样做是没用的。 此时应建立一个可执行的 [.filename]#.xsession# 文件， 其中包含同样的命令。 要完成这项工作， 需要用 /usr/local/bin/gnome-session 取代现有的窗口管理器： 
====

[source,shell]
....
% echo "#!/bin/sh" > ~/.xsession
% echo "/usr/local/bin/gnome-session" >> ~/.xsession
% chmod +x ~/.xsession
....

还有一种做法， 是配置显示管理器， 以便在登录时提示您选择窗口管理器； 在 <<x11-wm-kde-details,KDE 细节>> 环节中介绍了关于如何为 kdm （KDE 的显示管理器）进行这样的配置。

[[x11-wm-kde]]
=== KDE

[[x11-wm-kde-about]]
==== 有关 KDE

KDE 是一个容易使用的现代桌面环境。 KDE 有很多很好的特性：

* 一个美丽的现代的桌面。
* 一个集合了完美网络环境的桌面。
* 一个集成的帮助系统，能够方便、高效地帮助您使用 KDE 桌面和它的应用程序。
* 所有的KDE应用程序具有一致的所见即所得界面。
* 标准的菜单和工具栏，键盘布局，颜色配置等。
* 国际化：KDE 可以使用超过40种语言。
* 集中化、 统一的对话框驱动的桌面配置
* 许多有用的 KDE应用程序。

KDE 附带了一个名为 Konqueror 的 web 浏览器， 它是其他运行于 UNIX(R) 系统上的 web 浏览器的一个强大的竞争对手。 要了解关于 KDE 的更多详情， 可以访问 http://www.kde.org/[KDE 网站]。 与 FreeBSD 相关的 KDE 信息和资源， 可以在 http://freebsd.kde.org/[FreeBSD 上的 KDE 团队] 的网站找到。

FreeBSD 上提供了两种版本的 KDE。 版本 3 已经推出了很长时间， 十分成熟。 而版本 4， 也就是下一代版本， 也可以通过 Ports 套件来安装。 这两种版本甚至能够并存。

[[x11-wm-kde-install]]
==== 安装 KDE

与 GNOME 和其他桌面环境类似， 这个软件可以很容易地通过预编译包或 Ports 套件来安装：

要从网络安装 KDE3 只需要：

[source,shell]
....
# pkg_add -r kde
....

要从网络安装 KDE4 则需要：

[source,shell]
....
# pkg_add -r kde4
....

man:pkg_add[1] 就会自动的下载最新版本的应用程序。

要从源代码编译 KDE3， 可以使用 ports 树：

[source,shell]
....
# cd /usr/ports/x11/kde3
# make install clean
....

而从 ports 提供的源代码编译 KDE4， 对应的操作则是：

[source,shell]
....
# cd /usr/ports/x11/kde4
# make install clean
....

安装好 KDE 之后， 还需要告诉X server 启动这个应用程序来代替默认的窗口管理器。 这可以通过编辑 [.filename]#.xinitrc# 文件来完成：

对于 KDE3：

[source,shell]
....
% echo "exec startkde" > ~/.xinitrc
....

对于 KDE4：

[source,shell]
....
% echo "exec /usr/local/kde4/bin/startkde" > ~/.xinitrc
....

现在，无论您什么时候用 ``startx``进入 X 视窗系统， KDE 就将成为您的桌面环境。

如果使用一个像 XDM这样的显示管理器， 那配置文件可能有点不同。需要编辑一个 [.filename]#.xsession# 文件，有关 kdm 的用法会在这章的后面介绍。

[[x11-wm-kde-details]]
=== 有关 KDE 的更多细节

现在 KDE 已经被安装在系统中了。 通过帮助页面或点击多个菜单可以发现很多东西。 Windows(R) 或 Mac(R) 用户会有回到家的感觉。

有关 KDE 的最好的参考资料是 它的在线文档。KDE 拥有它自己的 web 浏览器 Konqueror， 还有很多其他的应用程序和丰富文档。 这节的余下部分将讨论一些很难用走马观花的方法来学习的技术项目。

[[x11-wm-kde-kdm]]
==== KDE 显示管理器

如果在同一系统上有多个用户， 则管理员通常会希望使用图形化的登录界面。 前面已经提到， 使用 <<x-xdm,XDM>> 可以完成这项工作。 不过， KDE 本身也提供了另一个选择， 即 kdm， 它的外观更富吸引力， 而且提供了更多的登录选项。 值得一提的是， 用户还能通过菜单很容易地选择希望使用的桌面环境 (KDE、 GNOME 或其它)。

要启用 kdm， 需要根据 KDE 的版本修改不同的配置文件。

对于 KDE3， [.filename]#/etc/ttys# 中的 `ttyv8` 项需被改写成如下的形式：

[.programlisting]
....
ttyv8 "/usr/local/bin/kdm -nodaemon" xterm on secure
....

对于 KDE4， 你需要将如下这行加入 [.filename]#/etc/rc.conf#：

[.programlisting]
....
local_startup="${local_startup} /usr/local/kde4/etc/rc.d"
kdm4_enable="YES"
....

[[x11-wm-xfce]]
=== Xfce

[[x11-wm-xfce-about]]
==== 有关Xfce

Xfce是以被GNOME 使用的 GTK+ 工具包为基础的桌面环境， 但是更加轻巧，适合于那些需要一个易于使用和配置并且简单而高效的桌面的人。 看起来，它非常像使用在商业UNIX(R)系统上的 CDE环境。 Xfce的主要特性有下面这些：

* 一个简单，易于使用的桌面。
* 完全通过鼠标的拖动和按键来控制等。
* 与CDE 相似的主面板，菜单，applets和应用launchers。
* 集成的窗口管理器，文件管理器，声音管理器， GNOME 应用模块等等。
* 可配置界面的主题。(因为它使用GTK+)
* 快速，轻便，高效：对于比较老的/旧的机器或带有很少内存的机器仍然很理想。

更多有关Xfce 的信息可以参考link:http://www.xfce.org/[Xfce 网站]。

[[x11-wm-xfce-install]]
==== 安装Xfce

有一个二进制的Xfce 软件包存在(在写作的时候)。要安装的话，执行下面的命令：

[source,shell]
....
# pkg_add -r xfce4
....

另外， 也可以使用 Ports Collection 从源代码联编：

[source,shell]
....
# cd /usr/ports/x11-wm/xfce4
# make install clean
....

现在，要告诉X服务器在下次X启动时执行 Xfce。 只要执行下面的命令：

[source,shell]
....
% echo "/usr/local/bin/startxfce4" > ~/.xinitrc
....

接下来就是启动 X， Xfce将成为您的桌面。 与以前一样，如果使用像 [.filename]#XDM# 这样的显示管理器，需要创建一个 [.filename]##.xsession##文件，就像有关 <<x11-wm-gnome,GNOME>> 的那节描述的， 使用[.filename]##/usr/local/bin/startxfce4## 命令，或者，配置显示管理器允许在启动时选择一个桌面， 就像有关<<x11-wm-kde-kdm,kdm>>的那节描述的。
