在我的基于控制台的Linux C ++应用程序中,我想获取终端的大小(行+列)和当前光标位置。对于后者,我认为可以使用ANSI代码,但我不确定如何正确解析它。此外,我不知道如何获取窗口的大小?由于其他原因,目前切换到ncurses不可行。
获取终端大小的旧方法是使用libtermcap的termcap。新方法是使用terminfo (+lib)。
我建议使用一个库来抽象这个(以及所有其他终端相关的东西),并使用类似(n)curses的终端输出库。
这样做还可以在其他Unix系统上工作。
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
信号后再次进行设置,该信号通知窗口发生了变化。
至于获取光标位置,这有点困难。一些终端允许通过 DSR 6(设备状态报告)查询它。
$ echo -ne "\e[6n"; cat -v
^[[62;1R
DSR 的回复以 CSI R 的形式出现,这里告诉我是第 62 行(从 1 开始计数)第一列。
然而,并非所有终端都支持 DSR 6,因此最好不要依赖于查询光标位置的能力,而是采用绝对方式进行初始终端寻址,在需要的确切位置放置光标。