Rxvt 中的 Xft 字体规范:它是客户端字体还是服务器端字体?

Rxvt 中的 Xft 字体规范:它是客户端字体还是服务器端字体?

我有一个无头 Gentoo 盒子,想在上面运行 X 应用程序,但将显示转发到在我的 Windows PC 上运行的 Cygwin Xorg 服务器。

它可以工作,但我不确定在这种情况下,如果我指定了一些要在 X 应用程序中使用的字体,实际会使用哪种字体? Gentoo 盒子(运行 X 应用程序的地方)上的那个?或者我的 Cygwin 中安装的那个(显示 X 应用程序的地方)?

例如我想DejaVu Sans Mono在 urxvt 中使用字体,我的~/.XresourcesGentoo 盒子看起来像这样:

URxvt*font: xft:DejaVu Sans Mono:size=12

我在 Gentoo 盒子上安装并启用了字体。以下是输出eselect fontconfig list

  [1]   10-autohint.conf
  [2]   10-no-sub-pixel.conf
  [3]   10-scale-bitmap-fonts.conf *
  [4]   10-sub-pixel-bgr.conf
  [5]   10-sub-pixel-rgb.conf
  [6]   10-sub-pixel-vbgr.conf
  [7]   10-sub-pixel-vrgb.conf
  [8]   10-unhinted.conf
  [9]   11-lcdfilter-default.conf
  [10]  11-lcdfilter-legacy.conf
  [11]  11-lcdfilter-light.conf
  [12]  20-unhint-small-dejavu-sans.conf
  [13]  20-unhint-small-dejavu-sans-mono.conf
  [14]  20-unhint-small-dejavu-serif.conf
  [15]  20-unhint-small-vera.conf *
  [16]  25-unhint-nonlatin.conf
  [17]  30-metric-aliases.conf *
  [18]  30-urw-aliases.conf *
  [19]  40-nonlatin.conf *
  [20]  45-latin.conf *
  [21]  49-sansserif.conf *
  [22]  50-user.conf *
  [23]  51-local.conf *
  [24]  57-dejavu-sans.conf
  [25]  57-dejavu-sans-mono.conf *

然后在 Gentoo 盒子上运行 xrdb 以启用资源(这让我相信将使用 Gentoo 盒子上的字体):

xrdb ~/.Xresources

当我启动 urxvt 时,它抱怨:

urxvt:无法加载基本字体集,请使用 -fn 指定有效的字体集,中止。

xdb -query和的输出appres URxvt相同(仅下面两行):

URxvt*font:     xft:DejaVu Sans Mono:size=12
URxvt*scrollBar:        false

我认为字体安装没有问题,输出fc-list|grep "DejaVu Sans Mono"

/usr/share/fonts/dejavu/DejaVuSansMono-BoldOblique.ttf: DejaVu Sans Mono:style=Bold Oblique
/usr/share/fonts/dejavu/DejaVuSansMono.ttf: DejaVu Sans Mono:style=Book
/usr/share/fonts/dejavu/DejaVuSansMono-Bold.ttf: DejaVu Sans Mono:style=Bold
/usr/share/fonts/dejavu/DejaVuSansMono-Oblique.ttf: DejaVu Sans Mono:style=Oblique

的输出strace urxvt相当长,以下是似乎与 中指定的字体有关的部分~/.Xresources

poll([{fd=6, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=6, revents=POLLOUT}])
writev(6, [{"1\1\t\0\240\17\34\0", 8}, {"xft:DejaVu Sans Mono:size=12", 28}, {"", 0}], 3) = 36
poll([{fd=6, events=POLLIN}], 1, -1)    = 1 ([{fd=6, revents=POLLIN}])
recv(6, "\1\0=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 4096, 0) = 32
recv(6, 0x817b310, 4096, 0)             = -1 EAGAIN (Resource temporarily unavailable)
recv(6, 0x817b310, 4096, 0)             = -1 EAGAIN (Resource temporarily unavailable)
write(1, "urxvt: ", 7urxvt: )                  = 7
write(1, "unable to load base fontset, ple"..., 77unable to load base fontset, please specify a valid one using -fn, aborting.
) = 77

答案1

显示字体的传统 X11 界面让客户端向 X 服务器发送一条消息,实际上是“以这种字体显示此字符串”。所以该字体位于 X 服务器上。 X 服务器在本地或从外部加载字体X字体服务器(例如 xfs)。字体服务器主要适用于没有磁盘空间或磁盘空间很小的显示器;这已经成为一个利基用例。如果您指定 X11 字体字符串(带前缀x:或不带前缀),Rxvt 将使用传统界面。

传统的 X11 界面仅限于位图字体。现代系统倾向于使用在客户端渲染文本并将生成的位图发送到服务器的方法。当您使用前缀 时xft:,URxvt 使用xft字体渲染接口。渲染是在客户端根据客户端计算机上加载的字体执行的。

运行xrdb -query以检查加载了哪些资源。运行appres URxvtappres urxvt查看应用了哪些资源(实例的资源urxvt优先于类的资源URxvt)。可能解释您的字体设置未被使用的一件事是,如果某些其他设置(可能是URxvt.fonturxvt*font)覆盖了您的字体设置。

您的 URxvt 可能是在没有 Xft 支持的情况下编译的(这是一个编译时选项)。运行urxvt --help 2>&1 | grep buffered:以查看buffered资源是否已列出 - 仅当存在 Xft 支持时才会出现。如果没有 Xft 支持,urxvt 会将资源的值解释fn为 X 字体字符串,这是无效的。

答案2

我解决了安装 xorg-xfd 包的问题。我阅读了吉尔斯发布的答案,并决定列出我的包裹。当我构建 rxvt-unicode 包时,libxft 已安装但不起作用。因此,我列出了 Xorg 使用的分配给 Xft 的可选依赖项。 Xfd 负责使用 X11 核心协议或使用 libxft 显示所有字体。

相关内容