X11

Rxvt 中的 Xft 字型規範:它是客戶端字型還是伺服器端字型?

  • January 17, 2014

我有一個無頭 Gentoo 盒子,想在上面執行 X 應用程序,但將顯示轉發到在我的 Windows PC 上執行的 Cygwin Xorg 伺服器。

它可以工作,但我不確定在這種情況下,如果我在 X 應用程序中指定要使用的一些字型,實際會使用哪種字型?Gentoo 盒子上的那個(執行 X 應用程序的地方)?還是安裝在我的 Cygwin 中的那個(顯示 X 應用程序的地方)?

例如我想DejaVu Sans Mono在 urxvt 中使用字型,我~/.Xresources在 Gentoo 盒子上的樣子是這樣的:

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 -queryappres URxvt相同的(只有下面的 2 行):

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

顯示字型的傳統 X11 界面讓客戶端向 X 伺服器發送一條消息,實際上是“以這種字型顯示這個字元串”。所以字型存在於 X 伺服器上。X 伺服器在本地或從X 字型伺服器(例如 xfs)載入字型。字型伺服器主要用於沒有或很少磁碟空間的顯示器;這已成為一個利基案例。如果您指定 X11 字型字元串(帶前綴x:或不帶前綴),則 Rxvt 使用傳統界面。

傳統的 X11 界面僅限於點陣圖字型。現代系統傾向於使用在客戶端呈現文本並將生成的點陣圖發送到伺服器的方法。使用 prefixxft:時,URxvt 使用xft字型渲染界面。渲染是在客戶端執行的,從客戶端機器上傳入的字型。

執行xrdb -query以檢查載入了哪些資源。執行appres URxvtappres urxvt查看應用了哪些資源(實例urxvt的資源優先於類的資源URxvt)。可以解釋未使用您的字型設置的一件事是,如果某些其他設置(可能 forURxvt.fonturxvt*font)覆蓋了您的設置。

您的 URxvt 可能是在沒有 Xft 支持的情況下編譯的(這是一個編譯時選項)。執行urxvt --help 2>&1 | grep buffered:以查看是否buffered列出了資源——它僅在存在 Xft 支持時出現。如果沒有 Xft 支持,urxvt 會將fn資源的值解釋為無效的 X 字型字元串。

引用自:https://unix.stackexchange.com/questions/93388