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

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

Жанры

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

 sgr0=\E[m^0$<2>, smacs=^N, smkx=\E[?1h\E=,

 smso=\E[1;7m$<2>; smul=\E[4m$<2>, tbc=\E[3g,

Каждое определение в

terminfo
состоит из трех типов элементов. Каждый элемент называется
capname
(имя характеристики) и определяет характеристику терминала.

Булевы или логические характеристики просто обозначают наличие или отсутствие поддержки терминалом конкретного свойства. Например, булева характеристика

xon
присутствует, если терминал поддерживает управление потоком
XON/XOFF
.

Числовые

характеристики определяют размеры или объемы, например
lines
— это количество строк на экране, a
cols
— количество столбцов. Число отделяется от имени характеристики символом
#
. Для описания терминала с 80 столбцами и 24 строками следует написать
cols#80, lines#24
.

Строковые характеристики немного сложнее. Они применяются для двух разных типов характеристик: определения строк вывода, необходимых для доступа к функциям терминала, и определения строк ввода, которые будут получены, когда пользователь нажмет определенные клавиши, обычно функциональные или специальные клавиши на цифровой клавиатуре. Некоторые строковые параметры очень просты, например

el
, что означает "стереть до конца строки". Для того чтобы сделать это на терминале VT100, потребуется escape-последовательность
Esc, [, K
. В исходном формате terminfo это записывается как
еl=\Е[K
.

Специальные клавиши определены аналогичным образом. Например, функциональная клавиша <F1> на терминале VT100 посылает последовательность

Esc, O, P
, которая определяется как
kf1=\EOP
.

Все несколько усложняется, если escape-последовательности требуются какие-либо параметры. Большинство терминалов могут перемещать курсор в заданные строку и столбец. Ясно, что неразумно хранить отдельную характеристику для каждой точки экрана, в которую можно переместить курсор, поэтому применяется общая строковая характеристика с параметрами, определяющими значения, которые вставляются при использовании характеристики. Например, терминал VT100 использует последовательность

Esc, [, <row>, <col>, H
для перемещения курсора в заданную позицию. В исходном формате terminfo это записывается довольно устрашающе:
cup=\E[%i%p1%d;%p2%dH$<5>
.

Эта строка означает следующее:

 

\E
— послать escape-символ;

 

[
— послать символ
[
;

 

%i
— дать приращение аргументам;

 

%p1
— поместить первый аргумент в стек;

 

%d
— вывести число из стека как десятичное;

 

;
— послать символ
;
;

 

%р2
— поместить второй аргумент в стек;

 

%d
— вывести число из стека как десятичное;

 

H
—послать символ
H
.

Данная запись кажется сложной, но позволяет задавать параметры в строгом порядке, не зависящем от порядка, в котором терминал ожидает их появления в финальной escape-последовательности. Приращение аргументов

%i
необходимо, поскольку стандартная адресация курсора задается, начиная от верхнего левого угла экрана (0, 0), а терминал VT100 обозначает начальную позицию курсора как (1, 1). Заключительные символы
$<5>
означают,
что для обработки терминалом перемещения курсора требуется задержка, эквивалентная времени вывода пяти символов.

Примечание

Мы могли бы описывать огромное множество характеристик, но, к счастью, в основном системы UNIX и Linux приходят с большинством предопределенных терминалов. Если нужно добавить новую модель терминала, вы можете найти полный список характеристик на странице интерактивного справочного руководства, посвященной terminfo. Лучше всего начать с поиска включенного в базу данных терминала, похожего на ваш новый, и затем создания описания новой модели как вариации существующего, т. е. осуществить последовательный просмотр характеристик, одну за другой, и исправление нуждающихся в корректировке.

Применение характеристик terminfo

Теперь, когда вы знаете, как определить характеристики терминала, нужно научиться обращаться к ним. Когда используется terminfo, прежде всего вам нужно задать тип терминала, вызвав функцию

setupterm
. Она инициализирует структуру
TERMINAL
для текущего типа терминала. После этого вы сможете запрашивать характеристики терминала и применять его функциональные возможности. Делается это с помощью вызова
setupterm
, подобного приведенному далее:

#include <term.h>

int setupterm(char *term, int fd, int *errret);

Библиотечная функция

setupterm
задает текущий тип терминала в соответствии с заданным параметром
term
. Если
term
— пустой указатель, применяется переменная окружения
TERM
. Открытый дескриптор файла, предназначенный для записи на терминал, должен передаваться в параметре
fd
. Результат функции хранится в целой переменной, на которую указывает
errret
, если это не пустой указатель. Могут быть записаны следующие значения:

 -1 — нет базы данных terminfo;

 0 — нет совпадающего элемента в базе данных terminfo;

 1 — успешное завершение.

Функция

setupterm
возвращает константу
OK
в случае успешного завершения и
ERR
в случае сбоя. Если на параметр
errret
установлен как пустой указатель,
setupterm
выведет диагностическое сообщение и завершит программу в случае своего аварийного завершения, как в следующем примере:

#include <stdio.h>

#include <term.h>

#include <curses.h>

#include <stdlib.h>

int main {

 setupterm("unlisted", fileno(stdout), (int *)0);

 printf("Done.\n");

 exit(0);

}

Результат выполнения этой программы в вашей системе может не быть точной копией приведенного далее, но его смысл будет вполне понятен. "

Done.
" не выводится, поскольку функция
setupterm
после своего аварийного завершения вызвала завершение программы:

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

Сталин

Рыбас Святослав Юрьевич
1190. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
4.50
рейтинг книги
Сталин

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

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

Мир приключений 1967 г. №13

Булычев Кир
Альманах "Мир приключений"
Фантастика:
научная фантастика
5.00
рейтинг книги
Мир приключений 1967 г. №13

Досье Сарагоса

де Вильмаре Пьер
1. Спецслужбы
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Досье Сарагоса

Неучтенный элемент. Том 7

NikL
7. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 7

Сказки народов Америки

Ващенко Александр Владимирович
Детские:
сказки
5.00
рейтинг книги
Сказки народов Америки

Александр Македонский. Трилогия

Рено Мэри
2. В лабиринтах истории
Приключения:
исторические приключения
6.25
рейтинг книги
Александр Македонский. Трилогия

100 великих войн

Соколов Борис Вадимович
100 великих
Справочная литература:
энциклопедии
6.40
рейтинг книги
100 великих войн

Звёздная дорога

Гамильтон Питер Ф.
Фантастика:
научная фантастика
космическая фантастика
6.00
рейтинг книги
Звёздная дорога

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

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

Алексей Михайлович

Сахаров Андрей Николаевич
4. Романовы. Династия в романах
Проза:
историческая проза
5.80
рейтинг книги
Алексей Михайлович

Мир без милосердия

Голубев Анатолий Дмитриевич
Стрела
Приключения:
прочие приключения
5.00
рейтинг книги
Мир без милосердия

История западной философии

Рассел Бертран Артур Уильям
Научно-образовательная:
история
философия
религиоведение
7.43
рейтинг книги
История западной философии

Андер Арес

Грехов Тимофей
1. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Андер Арес