Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

После присвоения указателю

sub_window_ptr
результата вызова
subwin
вы включаете прокрутку вложенного окна. Даже после удаления вложенного окна и обновления базового окна (
strdcr
) текст на экране не меняется, поскольку вложенное окно на самом деле откорректировало символьные данные экрана
strdcr
.

Дополнительная клавиатура

Вы уже познакомились с некоторыми средствами библиотеки curses для обработки клавиатурного ввода. У многих клавиатур, как минимум, есть клавиши управления курсором и функциональные клавиши.

Кроме того, у многих клавиатур есть дополнительная клавиатура и другие клавиши, например, <Insert> и <Home>.

Для большинства терминалов расшифровка этих клавиш — серьезная проблема, потому что они посылают строку символов, начинающуюся с escape-символа. Дело не только в том, что приложению трудно отличить одиночное нажатие клавиши <Esc> от строки символов, появившейся в результате нажатия функциональной клавиши, оно еще должно справляться с терминалами разных типов, применяющими разные управляющие последовательности для одних и тех же логических клавиш.

К счастью, библиотека curses предоставляет элегантное решение для управления функциональными клавишами. Обычно в структуре

terminfo
для каждого терминала хранится последовательность, отправляемая каждой функциональной клавишей, и во включенном в программу файле curses.h для логических клавиш есть набор определений, начинающихся с префикса
KEY_
.

Когда curses стартует, преобразование последовательностей в логические клавиши отключено, и его следует включить вызовом функции

keypad
. Если вызов успешен, функция вернет
OK
, в противном случае
ERR
.

#include <curses.h>

int keypad(WINDOW *window_ptr, bool keypad_on);

Когда режим дополнительной клавиатуры включен с помощью вызова функции

keypad
с параметром
keypad_on
, равным
true
, библиотека curses принимает на себя обработку клавиатурных последовательностей, так что чтение с клавиатуры может вернуть не только нажатую клавишу, но и одно из определений вида
KEY_
для логических клавиш.

Отметьте три незначительных ограничения, налагаемых при использовании режима дополнительной клавиатуры.

 Распознавание escape-последовательностей требует разного времени, и многие сетевые протоколы сгруппируют символы в пакеты (что приведет к неверному распознаванию escape-последовательностей) или разделят их (что приведет к распознаванию последовательностей функциональных клавиш, как клавиши <Esc> и отдельных символов). Такое поведение чаще всего наблюдается в региональных сетях (Wide-Area Network, WAN) и других медленных линиях связи. Единственный выход — попытаться запрограммировать терминалы так, чтобы они отправляли единичные уникальные символы в ответ на нажатие каждой функциональной клавиши, используемой вами, хотя это ограничит количество управляющих символов.

 Для того чтобы библиотека curses могла отличить нажатие клавиши <Esc> от клавиатурной последовательности, начинающейся с символа

Esc
, ей требуется ожидание в течение короткого промежутка времени. Иногда при включенном режиме дополнительной клавиатуры можно заметить легкую задержку при обработке клавиши <Esc>.

 Библиотека curses не может обрабатывать неуникальные escape-последовательности. Если у вашего терминала есть две разные клавиши, отправляющие одну и ту же последовательность, библиотека просто не будет ее обрабатывать, поскольку не может

решить, какую логическую клавишу следует вернуть.

Выполните упражнение 6.6.

Упражнение 6.6. Применение дополнительной клавиатуры

Далее приведена короткая программа keypad.c, демонстрирующая применение режима дополнительной клавиатуры. После запуска программы нажмите клавишу <Esc> и отметьте незначительную задержку, в течение которой программа пытается понять: Esc — это начало управляющей последовательности или просто нажатие одной клавиши,

1. Инициализировав программу и библиотеку curses, включите режим дополнительной клавиатуры:

#include <unistd.h>

#include <stdlib.h>

#include <curses.h>

#define LOCAL_ESCAPE_KEY 27

int main {

 int key;

 initscr;

 crmode;

 keypad(stdscr, TRUE);

2. Отключите отображение символов, чтобы помешать перемещению курсора при нажатии клавиш управления курсором. Экран очищается, и выводится некоторый текст. Программа ждет нажатия клавиши и до тех пор, пока не нажата клавиша <Q> или не возникла ошибка. Символ нажатой клавиши выводится на экран. Если нажатые клавиши соответствуют одной из последовательностей для дополнительной клавиатуры терминала, вместо символа выводится эта последовательность.

 noecho;

 clear;

 mvprintw(5, 5, "Key pad demonstration. Press 'q' to quit");

 move(7, 5);

 refresh;

 key = getch;

 while (key != ERR && key i= 'q') {

move(7, 5);

clrtoeol;

if ((key >= 'A' && key <= 'Z') || (key >= 'a' && key <= 'z')) {

printw("Key was%c", (char)key);

} else {

switch(key) {

case LOCAL_ESCAPE_KEY:

printw("%s", "Escape key");

break;

case KEY_END:

printw("%s", "END key");

break;

case KEY_BEG:

printw("%s", "BEGINNING key");

break;

case KEY_RIGHT:

printw("%s", "RIGHT key");

break;

case KEY_LEFT:

printw("%s", "LEFT key");

break;

case KEY_UP:

printw("%s", "UP key");

break;

case KEY_DOWN:

printw("%s", "DOWN key");

break;

default:

printw("Unmatched — %d", key);

Поделиться:
Популярные книги

Око Силы. Трилогия. 1937 -1938 годы

Валентинов Андрей
Око силы
Фантастика:
альтернативная история
8.08
рейтинг книги
Око Силы. Трилогия. 1937 -1938 годы

Путешественник

Юань Е
3. Повелитель тайн
Фантастика:
фэнтези
эпическая фантастика
5.00
рейтинг книги
Путешественник

Я до сих пор не князь. Книга XVI

Дрейк Сириус
16. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я до сих пор не князь. Книга XVI

Ты ждала меня, Заруна? Книга первая

Лу Энн
1. Мир Заруны
Фантастика:
героическая фантастика
8.00
рейтинг книги
Ты ждала меня, Заруна? Книга первая

Точка Бифуркации V

Смит Дейлор
5. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Точка Бифуркации V

Бояръ-Аниме. Газлайтер. Том 32

Володин Григорий Григорьевич
32. История Телепата
Фантастика:
альтернативная история
аниме
фэнтези
попаданцы
6.40
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 32

Первое поражение Сталина

Жуков Юрий Николаевич
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Первое поражение Сталина

Солнечный ветер (сборник)

Кларк Артур Чарльз
Шедевры фантастики
Фантастика:
космическая фантастика
5.00
рейтинг книги
Солнечный ветер (сборник)

Рейдер

Астахов Павел Алексеевич
Проза:
современная проза
7.75
рейтинг книги
Рейдер

Цвет сверхдержавы - красный 3 Восхождение. часть 1

Сергей Симонов
3. Цвет сверхдержавы - красный
Фантастика:
альтернативная история
5.00
рейтинг книги
Цвет сверхдержавы - красный 3 Восхождение. часть 1

Белая гвардия. История России

Булгаков Михаил Афанасьевич
Белая гвардия
Проза:
современная проза
советская классическая проза
5.00
рейтинг книги
Белая гвардия. История России

Жрец Хаоса. Книга ХVI

Борзых М.
16. Зов пустоты
Фантастика:
аниме
фэнтези
эпическая фантастика
попаданцы
5.00
рейтинг книги
Жрец Хаоса. Книга ХVI

Покушения и инсценировки: От Ленина до Ельцина

Зенькович Николай Александрович
Документальная литература:
биографии и мемуары
публицистика
5.00
рейтинг книги
Покушения и инсценировки: От Ленина до Ельцина

Дитя прибоя

Трофимов Ерофей
Дитя прибоя
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.25
рейтинг книги
Дитя прибоя