web-dev-qa-db-ja.com

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

ヘッドレスのGentooボックスがあり、その上でXアプリを実行したいのですが、WindowsPCで実行されているCygwinXorgサーバーにディスプレイを転送します。

動作しますが、この場合、Xアプリで使用するフォントを指定した場合、実際に使用されるフォントはどれですか? Gentooボックス(Xアプリが実行されている場所)にあるもの?または、Cygwin(Xアプリが表示されている場所)にインストールされているものですか?

たとえば、urxvtでフォントDejaVu Sans Monoを使用したい場合、Gentooボックスの~/.Xresourcesは次のようになります。

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
4
murphytalk

フォントを表示するための従来のX11インターフェイスでは、クライアントはXサーバーにメッセージを送信して、実際には「この文字列をこのフォントで表示する」と伝えます。したがって、フォントはXサーバー上に存在します。 Xサーバーは、ローカルまたは Xフォントサーバー (xfsなど)からフォントをロードします。フォントサーバーは、ディスク容量がないかほとんどないディスプレイに主に役立ちます。これはニッチなユースケースになっています。 X11フォント文字列(プレフィックスx:付きまたはプレフィックスなし)を指定した場合、Rxvtは従来のインターフェイスを使用します。

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

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

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

アプリは、実際に実行されている場所ではなく、Xサーバー上で(使用可能な)フォントを使用します。

0
Laszlo Valko

Xorg-xfdパッケージのインストールの問題を解決しました。 Gillesが投稿した回答を読み、パッケージを一覧表示することにしました。 libxftがインストールされましたが、rxvt-unicodeパッケージをビルドすると機能しません。そこで、Xftに割り当てられたXorgによって使用されるオプションの依存関係をリストしました。 Xfdは、X11コアプロトコルを使用してすべてのフォントを表示する責任がありますOR libxftを使用します。

0