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

5
在我的基于控制台的Linux C ++应用程序中,我想获取终端的大小(行+列)和当前光标位置。对于后者,我认为可以使用ANSI代码,但我不确定如何正确解析它。此外,我不知道如何获取窗口的大小?由于其他原因,目前切换到ncurses不可行。

你看过这个解决方案吗?https://dev59.com/x3NA5IYBdhLWcg3wS7sm#1022961 还有这个 https://dev59.com/x3NA5IYBdhLWcg3wS7sm#1023006。它们很好地解决了终端行和列的问题。 - JWL
2个回答

2

获取终端大小的旧方法是使用libtermcap的termcap。新方法是使用terminfo (+lib)。

我建议使用一个库来抽象这个(以及所有其他终端相关的东西),并使用类似(n)curses的终端输出库。

这样做还可以在其他Unix系统上工作。


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 信号后再次进行设置,该信号通知窗口发生了变化。

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

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

DSR 的回复以 CSI R 的形式出现,这里告诉我是第 62 行(从 1 开始计数)第一列。

然而,并非所有终端都支持 DSR 6,因此最好不要依赖于查询光标位置的能力,而是采用绝对方式进行初始终端寻址,在需要的确切位置放置光标。


写入终端的文件描述符;可能是STDOUT。 - LeoNerd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接