У меня есть небольшая программа на основе ncurses, которая выполняет основные химические расчеты.Его основная функция выглядит следующим образом:
int main() {
initscr();
cbreak();
nonl();
noecho();
/* draws borderlines from position 0 to (COLS - 1)
for purely decorative purposes at the top and bottom
of the screen */
draw_GUI();
keypress_loop();
endwin();
};
Функция keypress_loop()
ждет, пока пользователь нажмет клавишу, а затем печатает символ клавиши на экране, если клавиша является буквой или цифрой, и издает звуковой сигнал, еслиКлюч не является ни буквой, ни цифрой.Если пользователь нажимает клавишу F2, функция возвращается и программа завершается.
void keypress_loop()
{
int key;
while ((key = wgetch(stdscr)) != KEY_F(2))
process_key(key);
}
Пока все работает, как задумано.Но затем я добавляю обработчик сигнала для SIGWINCH, чтобы убедиться, что границы корректно перерисовываются после изменения размера окна эмулятора терминала.Перед initscr()
в функции main()
я вставляю:
signal(SIGWINCH, handle_resizing);
И handle_resizing
() выглядит так:
static void
handle_resizing(int signo) {
endwin();
initscr();
cbreak();
nonl();
noecho();
draw_GUI();
}
Эта функция обработки SIGWINCH перерисовывает границы какпредназначена.Но проблема в том, что когда пользователь нажимает клавишу после изменения размера, программа игнорирует эту клавишу.И только после того, как пользователь нажимает клавишу три или более раз, программа начинает распознавать клавишу, и тогда все работает ОК!Как сделать так, чтобы программа сразу распознавала нажатия клавиш после изменения размера?