在linux终端获取光标位置和终端大小

时间:2012-03-21 07:11:31

标签: c++ linux terminal

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

由于其他原因,目前无法选择转换为ncurses。

2 个答案:

答案 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,因此最简单的方法是不依赖于能够查询光标位置,而是以绝对方式执行初始终端寻址,将光标准确放置在您想要的位置。

相关问题