标准输入和输出连接到实现ANSI转义序列的终端,但其尺寸未知。
我需要知道终端的大小,以便于在其上绘制全屏文本UI。我怎样才能获得尺寸?
正确的大小未加载到环境变量中。我不能使用TIOCGETS;调用将返回成功,但值不正确 - 内核也不知道大小。
搜索stackoverflow有很多很多答案,但它们都依赖于操作系统提供单向或反向的答案;但这次不是真的。
我能找到的最好的线索是返回当前光标位置的DSR命令;但是没有向下/右命令的转变。
答案 0 :(得分:8)
resize
程序通过将光标移动到非常大的列和行来完成此操作;终端尽可能地移动,例如,
CUP 999 999
然后resize
询问光标 的位置:
DSR 6
终端回复实际的光标位置(即光标位置报告CPR
),resize
知道终端的大小:光标在右下角。
这一切都是使用标准(ECMA-48 / VT100)转义序列完成的。在XTerm Control Sequences(应该适用于“ANSI”终端)
CSI Ps n Device Status Report (DSR).
Ps = 6 -> Report Cursor Position (CPR) [row;column].
Result is CSI r ; c R