Основы программирования в Linux - Страница 90
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,Каждое определение в
terminfocapnameБулевы или логические характеристики просто обозначают наличие или отсутствие поддержки терминалом конкретного свойства. Например, булева характеристика
xonXON/XOFFЧисловые характеристики определяют размеры или объемы, например
linescols#cols#80, lines#24Строковые характеристики немного сложнее. Они применяются для двух разных типов характеристик: определения строк вывода, необходимых для доступа к функциям терминала, и определения строк ввода, которые будут получены, когда пользователь нажмет определенные клавиши, обычно функциональные или специальные клавиши на цифровой клавиатуре. Некоторые строковые параметры очень просты, например
elEsc, [, Kеl=Е[KСпециальные клавиши определены аналогичным образом. Например, функциональная клавиша Esc, O, Pkf1=EOP
Все несколько усложняется, если escape-последовательности требуются какие-либо параметры. Большинство терминалов могут перемещать курсор в заданные строку и столбец. Ясно, что неразумно хранить отдельную характеристику для каждой точки экрана, в которую можно переместить курсор, поэтому применяется общая строковая характеристика с параметрами, определяющими значения, которые вставляются при использовании характеристики. Например, терминал VT100 использует последовательность
Esc, [, <row>, <col>, Hcup=E[%i%p1%d;%p2%dH$<5>Эта строка означает следующее:
□
E□
[[□
%i□
%p1□
%d□
;;□
%р2□
%d□
HHДанная запись кажется сложной, но позволяет задавать параметры в строгом порядке, не зависящем от порядка, в котором терминал ожидает их появления в финальной escape-последовательности. Приращение аргументов
%i$<5>Мы могли бы описывать огромное множество характеристик, но, к счастью, в основном системы UNIX и Linux приходят с большинством предопределенных терминалов. Если нужно добавить новую модель терминала, вы можете найти полный список характеристик на странице интерактивного справочного руководства, посвященной terminfo. Лучше всего начать с поиска включенного в базу данных терминала, похожего на ваш новый, и затем создания описания новой модели как вариации существующего, т. е. осуществить последовательный просмотр характеристик, одну за другой, и исправление нуждающихся в корректировке.
Применение характеристик terminfo
Теперь, когда вы знаете, как определить характеристики терминала, нужно научиться обращаться к ним. Когда используется terminfo, прежде всего вам нужно задать тип терминала, вызвав функцию
setuptermTERMINALsetupterm#include <term.h>int setupterm(char *term, int fd, int *errret);Библиотечная функция
setuptermtermtermTERMfderrret□ -1 — нет базы данных terminfo;
□ 0 — нет совпадающего элемента в базе данных terminfo;
□ 1 — успешное завершение.
Функция
setuptermOKERRerrretsetupterm