Шрифт:
Интервал:
Закладка:
$ infocmp vt100
vt100|vt100-am|dec vt100 (w/advanced video),
am, mir, msgr, xenl, xon, cols#80, it#8, lines#24, vt#3,
acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
bel=^G, blink=E[5m$<2>, bold=E[1m$<2>,
clear=E[HE[J$<50>, cr=r, csr=E[%i%p1%d;%p2%dr,
cub=E[%p1%dD, cub1=b, cud=E[%p1%dB, cud1=n,
cuf=E[%p1%dC, cuf1=E[C$<2>,
cup=E[%i%p1%d; %p2%dH$<5>, cuu=E[%p1%dA,
cuu1=E[A$<2>, ed=E[J$<50>, el=E[K$<3>,
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, подобного приведенному далее:
#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 после своего аварийного завершения вызвала завершение программы:
$ cc -о badterm badterm.с -lncurses
$ ./badterm
'unlisted': unknown terminal type.
$
Обратите внимание на строку компиляции в примере: в этой системе Linux мы используем реализацию ncurses библиотеки curses со стандартным заголовочным файлом, находящимся в стандартном каталоге. В таких системах вы можете просто включить файл curses.h и задать -lncurses для библиотеки.
В функции выбора пункта меню хорошо было бы иметь возможность очищать экран, перемещать курсор по экрану и записывать его положение на экране. После вызова функции setupterm вы можете обращаться к характеристикам базы данных terminfo с помощью вызовов трех функций, по одной на каждый тип характеристики:
#include <term.h>
int tigetflag(char *capname);
int tigetnum(char *capname);
char *tigetstr(char *capname);
Функции tigetflag, tigetnum и tigetstr возвращают значения характеристик terminfo булева или логического, числового и строкового типов соответственно. В случае сбоя (например, характеристика не представлена) tigetflag вернет -1, tigetnum — -2, a tigetstr — (char*)-1.
Вы можете применять базу данных terminfo для определения размера экрана терминала, извлекая характеристики cols и lines с помощью следующей программы sizeterm.c:
#include <stdio.h>
#include <term.h>
#include <curses.h>
#include <stdlib.h>
int main() {
int nrows, ncolumns;
setupterm(NULL, fileno(stdout), (int *)0);
nrows = tigetnum("lines");
ncolumns = tigetnum("cols");
printf("This terminal has %d columns and %d rowsn", ncolumns, nrows);
exit(0);
}
$ echo $TERM
vt100
$ ./sizeterm
This terminal has 80 columns and 24 rows
Если запустить эту программу в окне рабочей станции, вы получите результат, отражающий размер текущего окна:
- Linux - Алексей Стахнов - Программное обеспечение
- Разработка приложений в среде Linux. Второе издание - Майкл Джонсон - Программное обеспечение
- Искусство программирования для Unix - Эрик Реймонд - Программное обеспечение
- Fedora 8 Руководство пользователя - Денис Колисниченко - Программное обеспечение
- Linux Mint и его Cinnamon. Очерки применителя - Алексей Федорчук - Программное обеспечение
- Недокументированные и малоизвестные возможности Windows XP - Роман Клименко - Программное обеспечение
- ELASTIX – общайтесь свободно - Владислав Юров - Программное обеспечение
- Изучаем Windows Vista. Начали! - Дмитрий Донцов - Программное обеспечение
- Windows Vista - Сергей Вавилов - Программное обеспечение
- Операционная система UNIX - Андрей Робачевский - Программное обеспечение