2013-05-24 4 views
1

Я хочу использовать libev для прослушивания событий клавиатуры в клавиатуре (на клавиатуре). Моя идея - использовать (n) curses getch() и установить notimeout() (чтобы неблокировать), чтобы сказать getch() не ждать следующего нажатия клавиши.Дескриптор файла getch()

Есть ли дескриптор файла, который использует getch, я могу посмотреть?

+0

Я не понял ваш вопрос. –

+1

['STDIN_FILENO'] (http://en.wikipedia.org/wiki/Standard_streams#Standard_input_.28stdin.29)? –

+0

Хммм я думал, что stdin был обойден, попробует это =) – Codeape

ответ

2

Если вы используете initscr(), дескриптор файла вы просите это fileno(stdin), так как подпрограмма initscr эквивалентна:

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

Если вы используете newterm(type, outfile, infile), то дескриптор файла: fileno(infile).

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; 
} 
2

Curses, и все функции терминала фактически обмениваются данными с фактическим терминалом через стандартные стандартные дескрипторы входных и выходных файлов.

Что он делает, это изменение флагов с использованием специальных вызовов ioctl или передача специальных управляющих кодов непосредственно, которые анализируются программой терминала.

Это означает, что функция getch просто считывает свой ввод со стандартного ввода, который, если вы хотите, чтобы дескриптор файла был STDIN_FILENO (из файла заголовка <unistd.h>).