【问题标题】:Getting cursor position and terminal size in linux terminal在linux终端中获取光标位置和终端大小
【发布时间】:2012-04-05 16:53:00
【问题描述】:

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

由于其他原因,目前无法切换到 ncurses。

【问题讨论】:

标签: c++ linux terminal


【解决方案1】:

获取大小的旧方法是使用 libtermcap 的 termcap。新的是 terminfo (+lib)。 我建议使用一个将这个(以及所有其他与终端相关的东西)抽象出来的库,并使用一个终端输出库,如 (n)curses。

这也适用于其他 Unix 系统。

【讨论】:

    【解决方案2】:

    要获取大小,正确的方法是调用TIOCGWINSZioctl()。我的代码中的一个示例:

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

    【讨论】:

    • 写入终端的文件描述符;可能是标准输出
    猜你喜欢
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多