我的 dmenu 无法检测 noto color emoji 字体。它可以检测其他字体,但检测不到这个字体。如何解决这个问题?
➜ fc-list | grep -i "notocoloremoji"
/usr/share/fonts/truetype/noto/NotoColorEmoji.ttf: Noto Color Emoji:style=Regular
➜ dmenu -fn "Noto Color Emoji"
no fonts could be loaded.
答案1
一些 suckless 工具(例如dmenu
)st
使用一个名为的库libxft
来处理字体渲染。此库有一个错误,导致它无法渲染彩色字体。幸好这个bug其实已经修复了,但不知何故尚未合并到上游。因此,要使彩色字体正常工作,您需要安装此修补版本libxft
,然后删除手动禁用彩色字体的检查dmenu
(由于此错误)。我已在下面写下了执行此操作的手动步骤,但作为更简单的解决方案,您只需安装此 fork 即可dmenu
为您完成此操作:https://github.com/valeriangalliat/dmenumoji
手动步骤
在 arch linux 上,你可以用这个包安装一个修补版本libxft
(替换旧版本):库xft-bgra. 在其他发行版中,您需要下载 libxft 的源代码,应用补丁,然后手动编译安装修补版本的libxft。
获得修补后的库后,您需要编辑 dmenu 的源代码以删除禁用(以前损坏的)彩色字体的代码。此检查位于顶部附近drw.c
,如下所示:
/* Do not allow using color fonts. This is a workaround for a BadLength
* error from Xft with color glyphs. Modelled on the Xterm workaround. See
* https://bugzilla.redhat.com/show_bug.cgi?id=1498269
* https://lists.suckless.org/dev/1701/30932.html
* https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916349
* and lots more all over the internet.
*/
FcBool iscol;
if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) {
XftFontClose(drw->dpy, xfont);
return NULL;
}
删除这段代码并重新编译 dmenu 您将能够使用彩色字体!这是一篇博客文章。