el1=E[1K$<3>, enacs=E(BE)0, home=E[H, ht=t,
hts=EH, ind=n, ka1=EOq, ka3=EOs, kb2=EOr, kbs=b,
kc1=EOp, kc3=EOn, kcub1=EOD, kcud1=EOB,
kcuf1=EOC, kcuu1=EOA, kent=EOM, kf0=EOy, kf1=EOP,
kf10=EOx, kf2=EOQ, kf3=EOR, kf4=EOS, kf5=EOt,
kf6=EOu, kf7=EOv, kf8=EOl, kf9=EOw, rc=E8,
rev=E[7m$<2>, ri=EM$<5>, rmacs=^O, rmkx=E[?11E>,
rmso=E[m$<2>, rmul=E[m$<2>,
rs2=E>E[?31E[?41E[?51E[?7hE[?8h, sc=E7,
sgr=E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^N%e^O%;,
sgr0=E[m^0$<2>, smacs=^N, smkx=E[?1hE=,
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, подобного приведенному далее:
<b>#include <term.h></b>
<b>int setupterm(char *term, int fd, int *errret);</b>
Библиотечная функция setupterm задает текущий тип терминала в соответствии с заданным параметром term. Если term — пустой указатель, применяется переменная окружения TERM. Открытый дескриптор файла, предназначенный для записи на терминал, должен передаваться в параметре fd. Результат функции хранится в целой переменной, на которую указывает errret, если это не пустой указатель. Могут быть записаны следующие значения:
□ -1 — нет базы данных terminfo;
□ 0 — нет совпадающего элемента в базе данных terminfo;
□ 1 — успешное завершение.
Функция setupterm возвращает константу OK в случае успешного завершения и ERR в случае сбоя. Если на параметр errret установлен как пустой указатель, setupterm выведет диагностическое сообщение и завершит программу в случае своего аварийного завершения, как в следующем примере: