在我的控制台的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,所以最简单的办法就是不用查询光标位置,而是绝对地执行初始终端寻址,把光标放在你想要的地方。