Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
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_ptr
subwin
strdcr
strdcr
Дополнительная клавиатура
Вы уже познакомились с некоторыми средствами библиотеки curses для обработки клавиатурного ввода. У многих клавиатур, как минимум, есть клавиши управления курсором и функциональные клавиши. Кроме того, у многих клавиатур есть дополнительная клавиатура и другие клавиши, например, <Insert> и <Home>.
Для большинства терминалов расшифровка этих клавиш — серьезная проблема, потому что они посылают строку символов, начинающуюся с escape-символа. Дело не только в том, что приложению трудно отличить одиночное нажатие клавиши <Esc> от строки символов, появившейся в результате нажатия функциональной клавиши, оно еще должно справляться с терминалами разных типов, применяющими разные управляющие последовательности для одних и тех же логических клавиш.
К счастью, библиотека curses предоставляет элегантное решение для управления функциональными клавишами. Обычно в структуре
terminfo
KEY_
Когда curses стартует, преобразование последовательностей в логические клавиши отключено, и его следует включить вызовом функции
keypad
OK
ERR
<b>#include <curses.h></b>
<b>int keypad(WINDOW *window_ptr, bool keypad_on);</b>
Когда режим дополнительной клавиатуры включен с помощью вызова функции
keypad
keypad_on
true
KEY_
Отметьте три незначительных ограничения, налагаемых при использовании режима дополнительной клавиатуры.
□ Распознавание escape-последовательностей требует разного времени, и многие сетевые протоколы сгруппируют символы в пакеты (что приведет к неверному распознаванию escape-последовательностей) или разделят их (что приведет к распознаванию последовательностей функциональных клавиш, как клавиши <Esc> и отдельных символов). Такое поведение чаще всего наблюдается в региональных сетях (Wide-Area Network, WAN) и других медленных линиях связи. Единственный выход — попытаться запрограммировать терминалы так, чтобы они отправляли единичные уникальные символы в ответ на нажатие каждой функциональной клавиши, используемой вами, хотя это ограничит количество управляющих символов.
□ Для того чтобы библиотека curses могла отличить нажатие клавиши <Esc> от клавиатурной последовательности, начинающейся с символа
Esc
□ Библиотека curses не может обрабатывать неуникальные escape-последовательности. Если у вашего терминала есть две разные клавиши, отправляющие одну и ту же последовательность, библиотека просто не будет ее обрабатывать, поскольку не может решить, какую логическую клавишу следует вернуть.
Выполните упражнение 6.6.
Далее приведена короткая программа keypad.c, демонстрирующая применение режима дополнительной клавиатуры. После запуска программы нажмите клавишу <Esc> и отметьте незначительную задержку, в течение которой программа пытается понять: Esc — это начало управляющей последовательности или просто нажатие одной клавиши,
1. Инициализировав программу и библиотеку curses, включите режим дополнительной клавиатуры:
#include <unistd.h>
#include <stdlib.h>