Основы программирования в Linux - Страница 91
#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#include <term.h>int tigetflag(char *capname);int tigetnum(char *capname);char *tigetstr(char *capname);Функции
tigetflagtigetnumtigetstrtigetflagtigetnumtigetstrВы можете применять базу данных terminfo для определения размера экрана терминала, извлекая характеристики
colslines#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 $TERMvt100$ ./sizetermThis terminal has 80 columns and 24 rowsЕсли запустить эту программу в окне рабочей станции, вы получите результат, отражающий размер текущего окна:
$ echo $TERMxterm$ ./sizetermThis terminal has 88 columns and 40 rows$Если применить функцию
tigetstrcupЕ[%p1%d;%p2%dHЭтой характеристике требуются два параметра: номер строки и номер столбца, в которые перемещается курсор. Обе координаты измеряются, начиная от нулевого значения в левом верхнем углу экрана.
Вы можете заменить параметры в характеристике реальными значениями с помощью функции
tparm#include <term.h>char *tparm(char *cap, long p1, long p2, ..., long p9);После формирования escape-последовательности с помощью
tparmprintf#include <term.h>int putp(char *const str);int tputs(char *const str, int affcnt, int (*putfunc)(int));В случае успешного завершения функция
putpOKERRИтак, для перемещения в строку 5 и столбец 30 на экране можно применить блок программного кода, подобный приведенному далее:
char *cursor;char *esc_sequence;cursor = tigetstr("cup");esc_sequence = tparm(cursor, 5, 30);putp(esc_sequence);Функция
tputsstdoutputfuncaffcntputfuncputp(string)tputs (string, 1, putchar)tputs