Skip to content

plan9portでHiDPIを扱う

This content is a draft and will not be included in production builds.

plan9portのfont環境変数はカンマ区切りで複数のフォントを設定できる(font(7))。書式はlodpifont,hidpifontとなっていて、HiDPI Displayの場合は後者が使われるらしい。カンマを省略するとlodpifont,2*lodpifontに一致する。 https://9fans.github.io/plan9port/man/man7/font.html

なんだけど、HiDPIフォントが使われている気がしない。

libdraw/mc.c:getwidthで幅を設定しているところ、acmeの場合と9termの場合でなにか処理がある。acmeの場合は /acme/(winid)/ctl からフォントの名前を読む、9termの場合は$fontから読む。ところでacmeは$fontを参照しない。-fと-Fで設定したものがctlにあらわれる。

hidpiまたはlodpiどちらのフォントを使うかは、libdraw:mc.c:getwidthまたはlibdraw:openfont.c:openfontで決定する。openfontの場合はd->dpi >= DefaultDPI*3/2がその式で、2022年時点では

enum {
DefaultDPI = 133,
};

なので199.5となっている。また、d->dpiはlibdraw/init.c:getimage0で、

d->dpi = 100
if(flushimage(d, 0) >= 0 && _displayrddraw(d, info, 12) == 12)
d->dpi = atoi(info);

getimage0 は、libdraw/init.c:getinitdraw…_initdisplayまたはgetwindowから呼ばれる。 _displayrddrawはTrddraw命令を発行する。コマンドを組み立てているのはlibdraw/drawfcall.c:convW2Mか。

msg[0..3]: len = 4+1+1+4
msg[4]: tag
msg[5]: type = Trddraw
msg[6..9]: len = m->count

chattydrawclientを1にするとdraw protocolのデバッグログが流れるが、これを使っているのはtcolorsしかない。dpiを探しているのは、最初のほうにあるこれかな

Terminal window
$ tcolors -D
...
<- tag=0 Trddraw 12
-> tag=1 Rrddraw 12 202020202020202031393220
...