代码之家  ›  专栏  ›  技术社区  ›  cjs

相同配置的urxvt在不同的X服务器上具有不同的宽度/字体呈现

  •  0
  • cjs  · 技术社区  · 7 年前

    我有两个不同的桌面主机通过它们的DisplayPort输出连接到同一4K监视器上的两个DisplayPort输入:

    • ,这是一款采用赛扬N3350处理器内置Intel HD Graphics 500的小型PC。(据我所知,我在另一个地方也有一个类似的系统,它配备了奔腾N4200处理器和Intel 505图形处理器,在4K时的功能完全相同。)
    • ,一个相当普通的旧ATX系统,带有Intel i5-3450 CPU和一个ATI Radeon 7870图形卡

    这两个系统都运行着最新的Debian9,配置与我所能管理的完全相同。特别地:

    • 两个系统上的X服务器DPI都是96,用 grep DPI /var/log/Xorg.0.log xdpyinfo | grep dots
    • 两个系统上的Xft DPI都是120,用 xrdb -query | grep dpi
    • 两者都配置有 xrdb -cpp cpp -merge $HOME/.Xresources 从一个相同的文件,我已经确认了 xrdb -query 在两者上产生相同的输出。我也有完全相同的一组源代码Pro字体加载到 ~/.fonts

    在其中一个上,我可以启动一个80列的xterm,配置为 XTerm*VT100*font: -misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso10646-1 它们看起来一模一样,宽484像素。如果使用 ssh -X

    然而, urxvt 取决于我使用的X服务器。我已将font X资源配置为:

    Rxvt.font:  xft:Source Code Pro:size=9,xft:Source Han Sans,xft:DejaVu Serif:size=8,xft:DejaVu Sans Mono:size=8
    

    超声心动图 田园诗般的 的X服务器,在本地或在另一台主机上启动 ,当垂直最大化时,80列终端为644像素宽,106列高。但是,当我开始显示 的X服务器(同样在本地或与使用 ),80列 超声心动图 为726像素宽,但在垂直最大化时仍有106列高。

    是什么原因 超声心动图 对数的 再宽一点,我怎么才能把它和 田园诗般的 即使你不知道,调试提示也会很感激。我很乐意编写与X11服务器对话的程序(更喜欢Python或类似的,而不是C或类似的),并允许我使用类似的呈现 超声心动图 是想看看问题是否可以通过这种方式找到,你是否对我应该调用什么样的api以及我应该寻找什么样的结果有具体的建议。

    xft: 字体是由X客户端呈现的,对吗?如果这是正确的,这似乎是一个很大的提示,即X11服务器中的某些设置正在更改 上的客户端 主机正在呈现字体,这取决于它正在与哪个X11服务器通信。

    xfce4-terminal 问询处

    我试着启动一个 xfce4终端 超声心动图 使用于 . 这似乎表明这与 超声心动图 Xft 库(如果 xfce4终端 不用,我很确定 是的),而不是自由类型?

    编辑: xtrace

    我从 X跑道 (谢谢你的建议, @Uli Schlachter !) 这至少让我更详细地看到了问题所在。即使只是跑步 xtrace urxvt -e true 产生几百千字节的输出,所以很明显我不打算在这里全部包括,但这里有一些关键位。下面是会话的差异 田园诗般的 田园诗般的 对数的 田园诗般的 运行 在这两种情况下,但首先显示在自身上,然后远程显示在 对数的

    在第156行 CreateWindow

    -000:<:005e: 48: Request(1): CreateWindow depth=0x18 window=0x03200009 parent=0x000000e7 x=0 y=0 width=644 height=904 border-width=0 class=InputOutput(0x0001) visual=0x00000021 value-list={background-pixel=0x00ffffe0 border-pixel=0x00ffffe0 override-redirect=false(0x00) colormap=0x00000020}
    +000:<:005e: 48: Request(1): CreateWindow depth=0x18 window=0x05400009 parent=0x000004bb x=0 y=0 width=724 height=904 border-width=0 class=InputOutput(0x0001) visual=0x00000021 value-list={background-pixel=0x00ffffe0 border-pixel=0x00ffffe0 override-redirect=false(0x00) colormap=0x00000020}
    

    从每一行的第138行开始,我看到这个diff(第二行被截断以保持正常),这似乎证实了 width=7 与。 width=9 对于正在创建的字形,这是一个字符宽度问题。

    -000:<:004c: 12: RENDER-Request(139,17): CreateGlyphSet gsid=0x03200008 format=0x00000024
    -000:<:004d:108: RENDER-Request(139,20): AddGlyphs glyphset=0x03200008 glyphids=0x0000036d; glyphs={width=7 height=10 x=-1 y=10 xOff=9 yOff=0}; data=0x00,0x3e,...
    +000:<:004c: 12: RENDER-Request(139,17): CreateGlyphSet gsid=0x05400008 format=0x00000026
    +000:<:004d:388: RENDER-Request(139,20): AddGlyphs glyphset=0x05400008 glyphids=0x0000036d; glyphs={width=9 height=10 x=0 y=10 xOff=9 yOff=0}; data=0x00,0x00,...
    

    (对于其他字符,此操作将继续,宽度为8对10、9对11等)

    所以不管是什么原因造成的,都是在138号线之前。在这之前,大多数diff似乎都是用于对象的ID号的变化,所以要找出真正的diff是什么有点痛苦。

    对数的 (使用离散Radeon图形卡的)返回 许多

    {id=0x00000021 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},
    {id=0x00000022 class=DirectColor(0x05) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},
    

    之后的列表似乎主要是重复的,只是在 对数的 侧面。

    Reply to QueryPictFormats :其中 screens=... depths=... visuals={...} 对数的 侧面。

    但在最后,还有一个更显著的区别:

    -subpixels=Unknown(0x0);
    +subpixels=HorizontalRGB(0x1);
    

    QueryFont 对于fixed,它返回一些不同的数据,看起来只是IDs,而且似乎只用于创建一个游标,因为它在那之后立即关闭。接下来,它看起来几乎是一样的(同样,模id,除非我漏掉了什么),直到第139行。

    编辑:FontConfig调试

    我也试过检查 FC_DEBUG 针对每个服务器 FC_DEBUG=8191 urxvt -e true 2>outputfile . 我确认这样做的宽度确实还是不同的。在8.5 MB的输出中对两个输出文件进行区分只会产生以下差异的三个实例( - 是田园诗 , 对数的 ):

    -   rgba: 0(i)(s)
    +   rgba: 1(i)(s)
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   cjs    7 年前

    问题是Xft/FreeType的子像素渲染,与其他一些设置一样,它可以对所渲染字体的宽度产生显著的影响,而不会改变字体的高度。

    FontConfig调试表明子像素呈现设置不同。在X资源中显式设置此选项将使两个系统工作相同:

    • Xft.rgba: rgb 将使两个系统在两个X11服务器上都呈现更宽的字体(当其中一个呈现到 对数的
    • Xft.rgba: none 将使两个系统在两个X11服务器上都呈现较窄的字体(当其中一个呈现到 田园诗般的 没有这套)。

    因此,添加 Xft.rgba:无 ~/.Xresources 解决了这个问题。

    虽然这个答案是目前公认的,因为它解决了问题,我很高兴改变接受另一个答案,提供了一个更深入的解释,到底发生了什么。

    推荐文章