Rxvt の Xft フォント仕様: クライアント側フォントですか、それともサーバー側フォントですか?

Rxvt の Xft フォント仕様: クライアント側フォントですか、それともサーバー側フォントですか?

ヘッドレス Gentoo ボックスがあり、その上で X アプリを実行し、その表示を Windows PC 上で実行されている Cygwin Xorg サーバーに転送したいと考えています。

動作しますが、この場合、X アプリで使用するフォントをいくつか指定した場合、実際にどのフォントが使用されるのかわかりません。Gentoo ボックス (X アプリが実行されている場所) のフォントでしょうか。それとも、Cygwin にインストールされているフォント (X アプリが表示されている場所) でしょうか。

たとえば、DejaVu Sans Monourxvt でフォントを使用したいのですが、~/.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同じです (以下の 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

答え1

フォントを表示するための従来のX11インターフェースでは、クライアントはXサーバーに「この文字列をこのフォントで表示してください」というメッセージを送信します。つまり、フォントはXサーバー上にあります。Xサーバーはフォントをローカルまたは外部から読み込みます。X フォント サーバー(xfs など)。フォント サーバーは、ディスク領域がほとんどないかまったくないディスプレイで主に役立ちますが、これはニッチな使用例になっています。Rxvt は、X11 フォント文字列 (プレフィックス付きx:またはプレフィックスなし) を指定すると、従来のインターフェイスを使用します。

従来のX11インターフェースはビットマップフォントに限定されています。最近のシステムでは、クライアント側でテキストをレンダリングし、その結果のビットマップをサーバーに送信する方法を使用する傾向があります。接頭辞を使用するとxft:、URxvtはxftフォント レンダリング インターフェイス。レンダリングは、クライアント マシンにロードされたフォントからクライアント側で実行されます。

xrdb -queryを実行して、どのリソースがロードされているかを確認します。appres URxvtと を実行してappres urxvt、どのリソースが適用されるかを確認します (インスタンスのリソースは、urxvtクラス のリソースよりも優先されますURxvt)。フォント設定が使用されない理由の 1 つは、他の設定 (おそらくURxvt.fontまたはurxvt*font) が設定を上書きしていることです。

URxvt が Xft サポートなしでコンパイルされた可能性があります (これはコンパイル時のオプションです)。実行して、リソースがリストされているurxvt --help 2>&1 | grep buffered:かどうかを確認しますbuffered。リソースは、Xft サポートが存在する場合にのみ存在します。Xft サポートがない場合、urxvt はリソースの値をfnX フォント文字列として解釈しますが、これは有効ではありません。

答え2

xorg-xfd パッケージをインストールすることで問題を解決しました。Gilles が投稿した回答を読んで、自分のパッケージをリストすることにしました。libxft はインストールされましたが、rxvt-unicode パッケージをビルドするときに動作しません。そこで、Xorg が使用するオプションの依存関係を Xft に割り当ててリストしました。Xfd は、X11 コア プロトコルまたは libxft を使用してすべてのフォントを表示する役割を担っています。

関連情報