![如何获取终端中当前字体的尺寸?](https://linux22.com/image/201679/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E7%BB%88%E7%AB%AF%E4%B8%AD%E5%BD%93%E5%89%8D%E5%AD%97%E4%BD%93%E7%9A%84%E5%B0%BA%E5%AF%B8%EF%BC%9F.png)
我正在开发一个 ncurses 应用程序,该应用程序使用字母字符创建一些非常块状的图形。我希望能够检测字体字形的尺寸(特别是长宽比),以便我可以通过更改渲染图形的方式来纠正它(使得正方形始终看起来像正方形)。
我能够使用
void getmaxyx(WINDOW *win, int y, int x);
ncurses 中的函数可以获取屏幕/窗口的大小,但是由于许多窗口可以自由调整大小,因此它并不可靠。是否有类似的函数(或外部机制)用于检索字体尺寸?
答案1
与xterm
或兼容且提供的字体操作转义序列尚未禁用:
$ xtermcontrol --get-font
DejaVu Sans Mono
这会发送<ESC>]50;?<ESC>\
转义序列,终端会回复<ESC>]50;font-name<ESC>\
。看参考。
因此,您还可以使用zsh
以下方式查询它:
$ IFS=$';\e' read -rsd'\' -t0.2 $'font?\e]50;?\e\\' font font rest
$ typeset font
font='DejaVu Sans Mono'
allowFontOps
不过,通常默认情况下禁用。您可以将*allowFontOps: true
资源设置为启用它们,或者最好将其禁用,但设置*disallowedFontOps: SetFont
为允许GetFont
但不允许SetFont
。
对于尺寸,设置:
*disallowedWindowOps: 1,2,3,4,5,6,7,8,9,11,13,19,20,21,GetSelection,SetSelection,SetWinLines,SetXprop
资源,即不允许除 和 之外的所有资源GetWinSizeChars
,GetWinSizePixels
然后是zsh
:
$ IFS=';t' read -rsdt -t0.2 $'x?\e[18t' cy cx rest
$ IFS=';t' read -rsdt -t0.2 $'x?\e[14t' y x rest
$ echo ${x}x${y} ${cx}x${cy}
1916x1012 147x38
\e[18t
请求以单元格数量和像素数为单位的窗口大小,\e[14t
以便您可以通过以下方式获取单元格的大小:
$ printf '%gx%g\n' '1.*x/cx' '1.*y/cy'
13x26
答案2
来自阳光明媚的雅典,你好。不幸的是,像 font_size 或各种字体或类似的东西,不幸的是与加载硬件的图形驱动程序并将其应用为图形环境有关,只有当您使用来自 Linux 的图形环境而不是来自 Linux 的图形环境时才会加载它。在任何情况下,控制台(仅限字母数字模式)或使用 CTRL+T 在 Windows 会话期间启用终端。使用不同字体大小的唯一可能性是通过 ncurses,但根据 POSIX 标准,这是不可能的。如果您想在任何情况下应用不同的字体大小,有很多环境,例如加工java支持,这会给你一个解决方案。来自雅典的问候 Kostas Vergidis