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++;
”(或滚动操作)。
我的游戏的主循环依赖于来自 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++;
”(或滚动操作)。