2

I want to use libev to listen for keyboard (keystrokes) events in the terminal. My idea is to use (n)curses getch() and set notimeout() (to be nonblocking) to tell getch() not to wait for next keypress.

Is there a file descriptor that getch uses I can watch?

4

3 回答 3

3

如果您使用initscr(),您要求的文件描述符是fileno(stdin),因为 initscr 子例程等价于:

newterm(getenv("TERM"), stdout, stdin); return stdscr;

如果使用newterm(type, outfile, infile),则文件描述符为fileno(infile).

于 2013-05-24T12:48:51.920 回答
2

诅咒,以及所有终端功能实际上是通过正常的标准输入和输出文件描述符与实际终端进行通信。

它所做的是使用特殊ioctl调用更改标志或直接发送由终端程序解析的特殊控制代码。

这意味着该getch函数只是从标准输入中读取其输入,如果你想要一个文件描述符STDIN_FILENO(来自<unistd.h>头文件)。

于 2013-05-24T12:58:03.723 回答
0

这是一个类似 getch 的功能。我现在在 Windows 上,所以无法重新测试它。如果您希望
它只听而不显示字符更改,如下所示:newt.c_lflag &= ~(ICANON);

int getch(void)
{
  struct termios oldt, newt;
  int ch;
  tcgetattr(STDIN_FILENO, &oldt);
  newt = oldt;
  newt.c_lflag &= ~(ICANON|ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  ch = getchar();
  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
  return ch;
}
于 2013-05-24T12:19:19.437 回答