2015-11-28 44 views
0

我的游戏的主循环依赖于来自getnstr的非阻塞读取。在继续进行剩余的循环之前,它会检查它读取的字符串是否具有非零长度(如果存在,我找不到用于获取此行为的约定)。ncurses非阻塞读取将光标移动到窗口底部

问题是,它具有强制输入光标在窗口底部的效果,就好像我有垃圾邮件输入或其他东西。

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

除了'stdscr'之外,你有任何'WINDOW'吗? –

+0

我只调用了initscr并没有做任何其他的WINDOWS。 – norbornyl

+0

这不是ncurses中的错误(我刚刚证实SVr4诅咒是这样做的)。我会调查并解释行为。 –

回答

1

达成一致,这似乎令人吃惊,但是SVR4诅咒(其中的ncurses确实在这个细节匹配)总是移动到下一行完成(尝试)后读取字符。

你可以看到线191-207的(开放)的Solaris在Illumos的的Github相应的代码:

/* 
* 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++;”(或滚动操作)。