#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.