Основы программирования в Linux - Страница 103
int x_loop; int y_loop; int counter; char a_letter = '1'; initscr(); for (y_loop = 0; y_loop < LINES - 1; y_loop++) { for (x_loop = 0; x_loop < COLS - 1; x_loop++) { mvwaddch(stdscr, y_loop, x_loop, a_letter); a_letter++; if (a_letter > '9') a_letter = '1'; } }2. Теперь создайте новое подокно с прокруткой. Как рекомендовалось, вам следует перед обновлением экрана "коснуться" родительского окна:
ub_window_ptr = subwin(stdscr, 10, 20, 10, 10); scrollok(sub_window_ptr, 1); touchwin(stdscr); refresh(); sleep(1);3. Сотрите содержимое вложенного окна, выведите в нем текст и обновите его. Прокрутка текста обеспечивается циклом:
werase(sub_window_ptr); mvwprintw(sub_window_ptr, 2, 0, "%s", "This window will now scroll"); wrefresh(sub_window_ptr); sleep(1); 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_ptrsubwinstrdcrstrdcrДополнительная клавиатура
Вы уже познакомились с некоторыми средствами библиотеки curses для обработки клавиатурного ввода. У многих клавиатур, как минимум, есть клавиши управления курсором и функциональные клавиши. Кроме того, у многих клавиатур есть дополнительная клавиатура и другие клавиши, например,
Для большинства терминалов расшифровка этих клавиш — серьезная проблема, потому что они посылают строку символов, начинающуюся с escape-символа. Дело не только в том, что приложению трудно отличить одиночное нажатие клавиши
К счастью, библиотека curses предоставляет элегантное решение для управления функциональными клавишами. Обычно в структуре
terminfoKEY_Когда curses стартует, преобразование последовательностей в логические клавиши отключено, и его следует включить вызовом функции
keypadOKERR#include <curses.h>int keypad(WINDOW *window_ptr, bool keypad_on);Когда режим дополнительной клавиатуры включен с помощью вызова функции
keypadkeypad_ontrueKEY_Отметьте три незначительных ограничения, налагаемых при использовании режима дополнительной клавиатуры.
□ Распознавание escape-последовательностей требует разного времени, и многие сетевые протоколы сгруппируют символы в пакеты (что приведет к неверному распознаванию escape-последовательностей) или разделят их (что приведет к распознаванию последовательностей функциональных клавиш, как клавиши
□ Для того чтобы библиотека curses могла отличить нажатие клавиши Esc
□ Библиотека curses не может обрабатывать неуникальные escape-последовательности. Если у вашего терминала есть две разные клавиши, отправляющие одну и ту же последовательность, библиотека просто не будет ее обрабатывать, поскольку не может решить, какую логическую клавишу следует вернуть.
Выполните упражнение 6.6.
Далее приведена короткая программа keypad.c, демонстрирующая применение режима дополнительной клавиатуры. После запуска программы нажмите клавишу
1. Инициализировав программу и библиотеку curses, включите режим дополнительной клавиатуры:
#include <unistd.h>#include <stdlib.h>