Применение характеристик terminfo
Теперь, когда вы знаете, как определить характеристики терминала, нужно научиться обращаться к ним. Когда используется terminfo, прежде всего вам нужно задать тип терминала, вызвав функцию setupterm. Она инициализирует структуру TERMINALдля текущего типа терминала. После этого вы сможете запрашивать характеристики терминала и применять его функциональные возможности. Делается это с помощью вызова setupterm, подобного приведенному далее:
#include
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
#include
#include
#include
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
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
#include
#include
#include
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 rows\n", ncolumns, nrows);
exit(0);
}
$ echo $TERM
vt100
$ ./sizeterm
This terminal has 80 columns and 24 rows
Если запустить эту программу в окне рабочей станции, вы получите результат, отражающий размер текущего окна:
$ echo $TERM
xterm
$ ./sizeterm
This terminal has 88 columns and 40 rows
$
Если применить функцию tigetstrдля получения характеристики перемещения курсора ( cup) терминала типа xterm, вы получите параметризованный ответ: \Е[%p1%d;%p2%dH.
Этой характеристике требуются два параметра: номер строки и номер столбца, в которые перемещается курсор. Обе координаты измеряются, начиная от нулевого значения в левом верхнем углу экрана.
Вы можете заменить параметры в характеристике реальными значениями с помощью функции tparm. До девяти параметров можно заменить значениями и получить в результате применяемую escape-последовательность символов.
#include
char *tparm(char *cap, long p1, long p2, ..., long p9);
Читать дальше