sflock
中。 sflock
使用XLoadQueryFont()
加载字体,但由于某种原因我尝试加载的字体不起作用。
我编写了一个小测试程序,它只是尝试加载字体然后退出。程序如下所示。它可以在我的机器上成功加载任何 TTF 字体(到目前为止我已经尝试过),但我尝试过的 OTF 根本不起作用。 OTF 字体由
XListFonts()
显示,因此 X 确实找到了它们,但无法加载它们。有没有办法将 OTF 字体加载到 X11 中,还是必须使用 pango 或类似的?
#include <X11/Xlib.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
if (argc != 2) {
fprintf(stderr,"Missing argument.\n");
return 1;
}
Display *dsp = XOpenDisplay(0);
XFontStruct *font = XLoadQueryFont(dsp, argv[1]);
if (font == NULL) {
printf("font not found.\n");
} else {
printf("font found.\n");
XFreeFont(dsp, font);
}
XCloseDisplay(dsp);
return 0;
}
我刚刚在尝试使用新的 CommitMono OpenType 字体时遇到了类似的问题。我通过 Macos 桌面上的 XQuartz 运行 X11 服务器,并从各种其他服务器等(包括 Emacs)运行 X11 客户端。当 OTF 文件安装在 macos 上但未安装在客户端计算机上时,我看到了相同的效果,例如在 Emacs 中,可以“列出”字体,但不能“打开”或加载字体。当 Emacs 在 X11 服务器系统上运行时,即直接在 XQuartz 中的我的 macos 桌面上运行时,它可以在 CommitMono 中正确显示文本。
我能够使用安装在桌面上的 CommitMono 转换后的 TTF 文件来从另一个系统运行 Emacs 并在 CommitMono 中显示文本,但由于行间距过大,所以很难看(因为 CommitMono TTF 文件目前是自动转换的)无需微调)。
我认为这里的错误是 Xft(X FreeType 库)不完全/正确支持仅远程服务器的 OpenType 字体。只有 TrueType (TTF) 字体(可能还有“Type 1”可缩放字体)只能作为“核心 X11 字体”安装在 X11 服务器上。在幕后使用的 FontConfig 代码最终也会在 X11 客户端应用程序中运行,因此对于 OpenType 字体,似乎需要在客户端系统上安装 OTF 文件!即使是最新的 X11 “X11 中的字体” 文档(请参阅“故障排除”部分)也没有记录此 bug,而是实际上声称 OpenType 字体支持应该已经通过标准
freetype
模块内置到所有 X11 服务器中就像 TrueType 支持一样。
解决方案是在 X11 客户端系统上安装 OTF 文件,例如在
$HOME/.fonts/
(然后运行 fc-cache
)。现在,在安装了 OTF 文件的远程客户端系统上运行的 Emacs 能够使用 X11 服务器系统上的 OTF 变体在 CommitMono 中显示文本。