首先需要注意的是,
Xft.dpi
资源的值不一定准确,这取决于系统和/或用户登录脚本是否正确设置它。
另外,重要的是要记住,
Xft.dpi
资源旨在由
Xft库使用,而不是任意寻找屏幕分辨率的程序。
可以通过以下方式设置
Xft.dpi
资源。此示例仅处理具有单个屏幕的显示器,并注意它使用
xdpyinfo
。这也显示了它可能不是精确的,但可以四舍五入。最后,此示例显示如何计算水平和垂直分辨率,但
Xft实际上只需要水平分辨率。
SCREENDPI=$(xdpyinfo | sed -n 's/^[ ]*resolution:[ ]*\([^ ][^ ]*\) .*$/\1/p;//q')
SCREENDPI_X=$(expr "$SCREENDPI" : '\([0-9]*\)x')
SCREENDPI_Y=$(expr "$SCREENDPI" : '[0-9]*x\([0-9]*\)')
if expr \( $SCREENDPI_X / 100 = 1 \) \& \( $SCREENDPI_X % 100 \<= 10 \) >/dev/null; then
FontXDPI=100
fi
if expr \( $SCREENDPI_Y / 100 = 1 \) \& \( $SCREENDPI_Y % 100 \<= 10 \) >/dev/null; then
FontYDPI=100
fi
echo "Xft.dpi: ${FontYDPI}" | xrdb -merge
我真希望知道为什么Xft不至少尝试自己查找屏幕分辨率,而是一直依赖于其“dpi”资源的设置。但我发现当前实现仅使用资源设置,因此像上面那样设置资源始终是必要的(而且还必须确保X服务器本身已正确配置了正确的物理屏幕尺寸)。
从C程序中,您只需要执行xdpyinfo本身所做的操作并跳过有关Xft资源的所有废话。以下是xdpyinfo代码的释义:
Display *dpy;
dpy = XOpenDisplay(displayname);
for (scr = 0; scr < ScreenCount(dpy); scr++) {
int xres, yres;
xres = ((((double) DisplayWidth(dpy, scr)) * 25.4) /
((double) DisplayWidthMM(dpy, scr))) + 0.5;
yres = ((((double) DisplayHeight(dpy, scr)) * 25.4) /
((double) DisplayHeightMM(dpy, scr))) + 0.5;
}
XCloseDisplay(dpy);
请注意,如果你因为某种奇怪的原因要缩放整个显示器(例如使用
xrandr
),那么你应该希望字体与其他所有内容等比例缩放。仅仅为了缩放字体而全屏缩放只是一个可怕的错误操作,尤其是因为对于大多数事情而言,更简单的方法是告诉应用程序使用正确缩放的字体,这些字体将以恒定的屏幕点大小显示(这正是
Xft 使用“dpi”资源来实现的)。我猜测Ubuntu会做一些愚蠢的事情来改变屏幕分辨率,例如使用
xrandr
来扩大图标和其他屏幕小部件的视觉大小,而无需让应用程序知道屏幕大小和分辨率,然后它必须通过重写
Xft.dpi
资源来欺骗
Xft。
请注意,如果避免全屏缩放,则不使用
Xft 的应用程序仍可以通过正确请求正确缩放的字体来获得正确的字体缩放,即使使用位图字体也可以通过在字体规范中使用屏幕的实际分辨率将其缩放到正确的物理屏幕尺寸。例如,从上面的 shell 片段继续:
DecentDeciPt="80"
DecentPt="8"
export DecentDeciPt DecentPt
DefaultFontSpec='-*-liberation mono-medium-r-*-*-*-${DecentDeciPt}-${FontXDPI}-${FontYDPI}-m-*-iso10646-1'
export DefaultFontSpec
DefaultFTFontSpec="-*-*-medium-r-*-*-*-*-0-0-m-*-iso10646-1"
DefaultFTFontSpecL1="-*-*-medium-r-*-*-*-*-0-0-m-*-iso8859-1"
export DefaultFTFontSpec DefaultFTFontSpecL1
eval echo "*font: ${DefaultFontSpec}" | xrdb -merge
最后,这里有一个启动 xterm
的示例(该终端已编译为使用Xft),使用上述设置(即Xft.dpi
资源和上面的shell变量)在屏幕上显示物理大小为10.0点的文本:
xterm -fs 10 -fa $DefaultFTFontSpec