for (counter = 1; counter < 10; counter++) {
wprintw(sub_window_ptr, "%s", "This text is both wrapping and \
scrolling.");
wrefresh(sub_window_ptr);
sleep(1);
}
4. Завершив цикл, удалите вложенное окно и обновите основной экран:
delwin(sub_window_ptr);
touchwin(stdscr);
refresh;
sleep(1);
endwin;
exit(EXIT_SUCCESS);
}
К концу программы вы увидите вывод, показанный на рис. 6.6.
Рис. 6.6
Как это работает
После присвоения указателю sub_window_ptr
результата вызова subwin
вы включаете прокрутку вложенного окна. Даже после удаления вложенного окна и обновления базового окна (strdcr
) текст на экране не меняется, поскольку вложенное окно на самом деле откорректировало символьные данные экрана strdcr
.
Дополнительная клавиатура
Вы уже познакомились с некоторыми средствами библиотеки curses для обработки клавиатурного ввода. У многих клавиатур, как минимум, есть клавиши управления курсором и функциональные клавиши. Кроме того, у многих клавиатур есть дополнительная клавиатура и другие клавиши, например,
Для большинства терминалов расшифровка этих клавиш — серьезная проблема, потому что они посылают строку символов, начинающуюся с escape-символа. Дело не только в том, что приложению трудно отличить одиночное нажатие клавиши
К счастью, библиотека curses предоставляет элегантное решение для управления функциональными клавишами. Обычно в структуре terminfo
для каждого терминала хранится последовательность, отправляемая каждой функциональной клавишей, и во включенном в программу файле curses.h для логических клавиш есть набор определений, начинающихся с префикса KEY_
.
Когда curses стартует, преобразование последовательностей в логические клавиши отключено, и его следует включить вызовом функции keypad
. Если вызов успешен, функция вернет OK
, в противном случае ERR
.
#include
int keypad(WINDOW *window_ptr, bool keypad_on);
Когдаkeypad
с параметром keypad_on
, равным true
, библиотека curses принимает на себя обработку клавиатурных последовательностей, так что чтение с клавиатуры может вернуть не только нажатую клавишу, но и одно из определений вида KEY_
для логических клавиш.
Отметьте три незначительных ограничения, налагаемых при использовании режима дополнительной клавиатуры.
Распознавание escape-последовательностей требует разного времени, и многие сетевые протоколы сгруппируют символы в пакеты (что приведет к неверному распознаванию escape-последовательностей) или разделят их (что приведет к распознаванию последовательностей функциональных клавиш, как клавиши
Для того чтобы библиотека curses могла отличить нажатие клавиши Esc
, ей требуется ожидание в течение короткого промежутка времени. Иногда при включенном режиме дополнительной клавиатуры можно заметить легкую задержку при обработке клавиши
Библиотека curses не может обрабатывать неуникальные escape-последовательности. Если у вашего терминала есть две разные клавиши, отправляющие одну и ту же последовательность, библиотека просто не будет ее обрабатывать, поскольку не может решить, какую логическую клавишу следует вернуть.
Выполните упражнение 6.6.