在我的基于控制台的Linux C ++应用程序中,我想获得终端的大小(行+列)和当前光标位置。对于后者,我想我可以使用ANSI代码,但我不确定如何正确解析它。另外,我不知道如何获得窗口的大小?
由于其他原因,目前无法选择转换为ncurses。
答案 0 :(得分:2)
获取大小的旧方法是使用libtermcap的termcap。新的是terminfo(+ lib)。 我建议使用一个抽象这个(和所有其他终端相关的东西)的库,并使用像(n)curses这样的终端输出库。
此外,它还适用于其他Unix系统。
答案 1 :(得分:1)
要获取尺寸,正确的方法是拨打TIOCGWINSZ
ioctl()
。我的代码中的一个例子:
struct winsize ws = { 0, 0, 0, 0 };
if(ioctl(tt->outfd, TIOCGWINSZ, &ws) == -1)
return;
/* ws.ws_row and ws.ws_col now give the size */
您最初会想要这样做,然后在收到SIGWINCH
信号后再次这样做,该信号会通知WINdow CHange。
至于获得光标位置,这有点困难。有些终端允许通过DSR 6(设备状态报告)查询它
$ echo -ne "\e[6n"; cat -v
^[[62;1R
来自DSR的回复来自CSI R,这里告诉我(第1行)第62行,第1列。
但是,由于并非所有终端都支持DSR 6,因此最简单的方法是不依赖于能够查询光标位置,而是以绝对方式执行初始终端寻址,将光标准确放置在您想要的位置。