在linuxterminal中获取光标位置和terminal大小

在我的控制台的Linux C ++应用程序中,我想获取terminal(行+列)的大小和当前的光标位置。 对于后者,我想我可以使用ANSI代码,但我不知道如何正确parsing它。 另外我不明白如何获得窗口的大小?

由于其他原因,切换到ncurses目前不是一个选项。

获取大小的旧方法是使用libtermcap的termcap。 新是terminfo(+ lib)。 我建议使用一个抽象这个(和所有其他终端相关的东西),并使用终端输出库像(诅咒)的库。

这也将在其他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信号,通知WINdow CHange后再次。

至于获取光标位置,这有点困难。 有些终端允许通过DSR 6(设备状态报告)查询它

 $ echo -ne "\e[6n"; cat -v ^[[62;1R 

DSR的回复是CSI R,这里告诉我(第一行)第62行第一列。

但是,由于不是所有的终端都支持DSR 6,所以最简单的办法就是不用查询光标位置,而是绝对地执行初始终端寻址,把光标放在你想要的地方。