ОКНО ncurses* исчезает после изменения размера консоли

#c #ncurses

Вопрос:

Итак, давайте предположим, что у нас есть

 WINDOW *main_win=newwin(50, 80, 1, 0); // 50 rows, 80 columns
WINDOW *status_win=newwin(3, 100, 51, 0); // Status bar
WINDOW *interaction_bar=newwin(1, 200, 0, 0);
 

У меня есть функция, которая печатает на нем строки ( mvwaddstr ), и она работает так, как планировалось. Но после изменения размера терминала, в частности, до <50 столбцов и изменения его размера обратно до >53 столбцов, <50 столбцов и изменение его размера обратно до > status_win просто волшебным образом исчезают. wclear и wrefresh ничего на него не накладывает.

Я проверил что-то вроде

 delwin(main_win);
delwin(status_win);
delwin(interaciton_bar);
main_win=newwin(50, 80, 1, 0);
status_win=newwin(3, 100, 51, 0);
interaction_bar=newwin(1, 200, 0, 0);
 

Удивительно, но status_win возвращается обратно. Но есть одна проблема.

Я использую int ch = wgetch(main_win); для ввода с клавиатуры. Каким-то образом он может считывать такие клавиши, как «w», «a», «s», «d», но когда дело доходит до таких клавиш, как KEY_LEFT и KEY_RIGHT, моя консоль просто начинает дрожать и кажется, что она не обрабатывается.

Ответ №1:

Что касается исчезающего окна (вероятно, уменьшенного до 1×1, которое не «волшебным образом исчезает»). ncurses попытается сохранить окно той же ширины (или высоты) stdscr , что и при изменении размера, как указано на странице руководства:

При изменении размера окон resize_term рекурсивно настраивает подокна, сохраняя их в пределах обновленного родительского окна. Если окно верхнего уровня расширяется до пределов экрана, то при изменении размера окна оно будет расширяться до resize_term соответствующего предела, независимо от того, уменьшился или вырос экран.

Что касается «начинает дрожать», если ваше окно не включено keypad (как в данном фрагменте кода), то клавиши курсора будут отображаться как последовательность символов, а не как один код:

Эта keypad опция включает клавиатуру пользовательского терминала. Если включено (значение bf равно TRUE), пользователь может нажать функциональную клавишу (например, клавишу со стрелкой) и wgetch (3 раза) возвращает одно значение, представляющее функциональную клавишу, как в KEY_LEFT . Если отключено (значение bf равно FALSE), проклятия не обрабатывают функциональные клавиши специально, и программа должна сама интерпретировать escape-последовательности. Если клавиатуру в терминале можно включить (для передачи) и выключить (для локальной работы), включение этой опции приведет к включению клавиатуры терминала при wgetch вызове (3x). Значение по умолчанию для клавиатуры равно FALSE.