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

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

Жанры

Основы программирования в 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);

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

Я не князь. Книга XIII

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

Ветер и искры. Тетралогия

Пехов Алексей Юрьевич
Ветер и искры
Фантастика:
фэнтези
9.45
рейтинг книги
Ветер и искры. Тетралогия

Древесный маг Орловского княжества 2

Павлов Игорь Васильевич
2. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 2

Орден Архитекторов 3

Винокуров Юрий
Фантастика:
фэнтези
5.00
рейтинг книги
Орден Архитекторов 3

Имя нам Легион. Том 18

Дорничев Дмитрий
18. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 18

Санек

Седой Василий
1. Санек
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Санек

Матабар. II

Клеванский Кирилл Сергеевич
2. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар. II

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

Ст. сержант. Назад в СССР. Книга 5

Гаусс Максим
5. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ст. сержант. Назад в СССР. Книга 5

Черный маг императора 3

Герда Александр
3. Черный маг императора
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора 3

Газлайтер. Том 12

Володин Григорий Григорьевич
12. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 12

Имя нам Легион. Том 17

Дорничев Дмитрий
17. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 17

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

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

Двойник короля 17

Скабер Артемий
17. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 17