微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

调整终端大小时的Getch行为? ncurses

如何解决调整终端大小时的Getch行为? ncurses

调整终端大小时,

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;

}

解决方法

/* curses.h */
#define KEY_RESIZE  0632        /* Terminal resize event */

410 = 0632(八进制)。

关于您的第二个问题,当我在计算机上进行测试时不会发生。您也许正在运行ncurses的旧版本?周围有错误。 https://lists.gnu.org/archive/html/bug-ncurses/2002-01/msg00003.html

,

使用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的版本和平台)应该是问题的一部分。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。