我正在try 实现一个非阻塞键盘输入,支持INKEY$
/my BASIC interpreter.在阅读这里的(许多!)帖子时,我发现了似乎是canonical solution under POSIX的东西:
static int getkey(void)
{
int c;
static struct termios oldState, newState;
if (tcgetattr(STDIN_FILENO, &oldState) == -1)
return 0;
newState = oldState;
newState.c_lflag &= ~ICANON; // use noncanonical input
newState.c_lflag &= ~ECHO; // disable echo
newState.c_cc[VMIN] = 1; // minimum chars to wait for
newState.c_cc[VTIME] = CTIME; // minimum wait time
if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &newState) == -1)
return 0;
c = getchar();
if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &oldState) == -1)
return 0;
return c;
}
当newState.c_cc[VMIN] = 1时,它会停止并等待,但会按预期工作.将其更改为0可以阻止它等待,但也会导致c永远不为非零.我判断了tcsetattr是否失败,返回0 - nope,一切正常.
有没有人真的能在现代风格的MacOS上使用这个软件?我用的是12.7.1和Xcode 14.2,但我怀疑这个代码有没有变化,因为按钮仍然是蓝色的和脉动的.
附注:需要注意的是,ECHO标志在Xcode控制台中似乎没有效果,但在终端中确实如预期的那样工作.我想这并不完全令人惊讶.