【问题标题】:Getch() behavior when terminal is resized? (ncurses)调整终端大小时的 Getch() 行为? (诅咒)
【发布时间】:2020-10-02 19:51:01
【问题描述】:

当我调整终端大小时,getch 返回 410。为什么 getch 将调整大小解释为输入?什么是410?是特殊符号吗?

代码:

#include <curses.h>

int main() {
    initscr(); cbreak(); noecho();
    int x = getch();
    printw("%d", x);
    getch();
    endwin();

    return 0;
}

但是当我使用超时时,我会得到 ERR(即 -1)。为什么在使用超时时调整大小会导致错误?

代码:

#include <curses.h>

int main() {
    initscr(); cbreak(); noecho(); timeout(10000);
    int x = getch();
    printw("%d", x);
    getch();
    endwin();

    return 0;

}

【问题讨论】:

    标签: c++ ncurses


    【解决方案1】:
    /* curses.h */
    #define KEY_RESIZE  0632        /* Terminal resize event */
    

    410 = 0632(八进制)。

    至于你的第二个问题,当我在我的机器上测试时不会发生这种情况。您是否正在运行旧版本的 ncurses?这方面存在错误。 https://lists.gnu.org/archive/html/bug-ncurses/2002-01/msg00003.html

    【讨论】:

      【解决方案2】:

      当使用timeout(本例中为10秒)时,getch将在超时到期时返回ERR。这是手册页中的内容:

      timeoutwtimeout 例程设置阻塞或非阻塞读取 给定的窗口。如果 delay 为负数,则使用阻塞读取(即, 无限期地等待输入)。如果 delay 为零,则非阻塞 使用 read (即,如果没有输入等待,则 read 返回 ERR)。如果延迟 是正数,然后读取块 delay 毫秒,并返回 ERR 如果仍然没有输入。因此,这些例程提供相同的 nodelay 的功能,加上能够 仅阻塞延迟毫秒(延迟为正)。

      如果窗口指针为空或超时,则返回 ERR 在没有任何数据的情况下过期,或者如果执行被信号中断(errno 将设置为EINTR)。

      如果您有耐心(或测试缓慢),您会看到返回 -1。如果你让程序等待会更容易:

      #include <curses.h>
      
      int main() {
          initscr(); cbreak(); noecho(); timeout(10000);
          for (;;) {
          int x = getch();
          move(0,0);
          printw("%d", x);
          getch();
          clrtobot();
          }
          endwin();
      
          return 0;
      
      }
      

      这是通常的情况。如果您看到不同的东西,那么相关信息(ncurses 版本和平台)应该是问题的一部分。

      【讨论】:

      • 我假设他们得到 -1 而不是从问题“为什么在使用超时时调整大小会导致错误?”中调整大小,但是是的,如果他们达到超时,那么 -1 是预计。
      猜你喜欢
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 2018-02-27
      • 2013-11-13
      • 2019-12-14
      • 2013-09-04
      • 2012-04-03
      • 1970-01-01
      相关资源
      最近更新 更多