ncurses 非阻塞读取将光标推到 window 的底部

ncurses non-blocking read pushes cursor to bottom of window

我的游戏的主循环依赖于来自 getnstr 的非阻塞读取。在继续循环的其余部分之前,它会检查它读取的字符串是否具有非零长度(如果存在,我找不到获得此行为的约定)。

问题是它具有强制输入光标向下 window 底部的效果,就好像我输入了 Enter 之类的垃圾邮件一样。

    char command[5];
    timeout(0);
    while (getnstr(command, 4) && gameActive) {
        if (strlen(command) == 0) { continue; } 
        ... 
    }

同意这似乎令人惊讶,但是 SVr4 诅咒(ncurses 在这个细节上确实匹配)总是 在完成(尝试)读取字符后移动到下一行。

您可以在 Illumos Github 的第 191-207 行中看到 (Open)Solaris 的相应代码:

/*
 * The following code is equivalent to waddch(win, '\n')
 * except that it does not do a wclrtoeol.
 */
if (doecho) {
    SP->fl_echoit = TRUE;
    win->_curx = 0;
    if (win->_cury + 1 > win->_bmarg)
        (void) wscrl(win, 1);
    else
        win->_cury++;

    win->_sync = savsync;
    win->_immed = savimmed;
    win->_leave = savleave;
    (void) wrefresh(win);
}

即“win->_cury++;”(或滚动操作)。