После перехвата SIGWINCH в программе на основе ncurses нажатия клавиш не распознаются - PullRequest
0 голосов
/ 19 октября 2018

У меня есть небольшая программа на основе 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 перерисовывает границы какпредназначена.Но проблема в том, что когда пользователь нажимает клавишу после изменения размера, программа игнорирует эту клавишу.И только после того, как пользователь нажимает клавишу три или более раз, программа начинает распознавать клавишу, и тогда все работает ОК!Как сделать так, чтобы программа сразу распознавала нажатия клавиш после изменения размера?

1 Ответ

0 голосов
/ 20 октября 2018

Функция handle_resizing вызывает функции, которые небезопасны для использования в обработчике сигналов.На странице справочника resizeterm есть раздел, где это обсуждается.Ваша программа должна использовать KEY_RESIZE возвращаемое значение от getch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...