Wiki

8. Символьная графика

Эта глава имеет дело с вводом/выводом символов на экран. Когда мы
говорим "символ", то подразумеваем композицию пикселов, которая может
меняться в зависимости от таблицы представлений символов (charset).
Ваша графическая карта уже предлагает одну или более таких таблиц и по
умолчанию работает в текстовом (charset) режиме, потому что текст
обрабатывается быстрее, чем пиксельная графика. Терминалы можно
использовать лучше, чем как простые и скучные текстовые дисплеи.
Рассмотрим, как использовать специальные возможности, которые
предлагает терминал Linux-а, особенно консоль Linux-а.

* printf, sprintf, fprintf, scanf, sscanf, fscanf
С этими функциями libc вы можете выдавать форматированные строки
в stdout (стандартный вывод), с stderr (стандартная ошибка) или другие
потоки, определенные как FILE *stream (например, файлы). sscanf
обеспечивает подобные возможности для чтения форматированного ввода из
stdin.

* termcap
База данных TERMinal CAPabilitie - это таблица элементов описания
работы с терминалом в ASCII-файле /etc/termcap. Здесь вы можете найти
информацию о том, как выводить специальные символы, как осуществлять
операции (удаления, вставки символов или строк и т.д.) и как
инициализировать терминал. База данных используется, например,
редактором vi. Имеются библиотечные функции для чтения и использования
возможностей терминала (смотри termcap(3x)). С этой базой данных
программы могут работать с различными терминалами одним и тем же
кодом. База данных termcap и библиотечные функции предоставляют только
низкоуровневый доступ к терминалу. Изменение атрибутов или цветов,
параметризованный вывод и оптимизация остаются программисту.

* База данных terminfo
База данных TERMinal INFOrmation построена над базой данных
termcap и описывает некоторые возможности терминалов на более высоком
уровне. С terminfo программа может легко менять атрибуты экрана,
используя специальные клавиши, такие как функциональные клавиши и др.
Эта база данных может быть найдена в /usr/lib/terminfo/[A-z,0-9]*.
Каждый файл описывает один терминал.

* curses
Terminfo - хорошая база для работы с терминалом в программе.
Библиотека (BSD-)curses дает вам высокоуровневый доступ к терминалу,
базируясь на terminfo. curses позволяет открывать и манипулировать
окнами на экране, предоставляет весь необходимый набор функций
ввода/вывода и может изменять видеоатрибуты терминально-независимым
образом на более чем 150 терминалах. Библиотека находится в
/usr/lib/libcurses.a. Это BSD-версия curses.

* ncurses
ncurses - это развитие curses. В версии 1.8.6 она должна быть
совместима с AT&T curses, как это определено в SYSVR4, и иметь
несколько расширений, таких как манипулирование цветами, специальная
оптимизация для вывода, оптимизации, зависящие от терминала, и др.
ncurses была протестирована на множестве систем, таких как Sun-OS, HP
и Linux. Автор рекомендует предпочесть ncurses всему остальному. В
SYSV Unix системах (например, Solaris) должна существовать библиотека
curses с теми же функциональными возможностями, что и ncurses (на
самом деле солярисовская curses имеет немного больше функций и
поддержку мыши).

В следующих разделах мы рассмотрим, как пользоваться различными
пакетами доступа к терминалу. В Linux-е мы имеем GNU-версию termcap и
можем пользоваться ncurses вместо curses.

8.1. Функции ввода/вывода в libc

8.1.1. Форматированный вывод

Функции printf(...) в libc обеспечивают форматированный вывод и
позволяют трансформировать аргументы.

* int fprintf(FILE *stream, const char *format, ...),
преобразует выводимые аргументы в соответствии с шаблоном и
записывает его в stream. Формат определяется аргументом format.
Функция возвращает число записанных символов или отрицательное число в
случае ошибки.

format содержит два типа объектов: обычные символы и информацию,
как трансформировать или форматировать аргументы.

Форматная информация должна начинаться с %, за которым следуют
значения для формата, дальше идет символ для трансляции (чтобы
напечатать знак %, используйте %%). Возможны следующие значения для
формата:

- Флаги
* -
Форматированный аргумент будет при печати прижат влево на своем
поле.
* +
Каждое число будет напечатано со знаком, например, +12 или -2.32.

- Пробел
Если первый символ - не знак, то будет вставлен пробел.

- 0
Для чисел ширина поля будет заполнена слева нулями.

- #
Изменяет вывод в зависимости от трансформации для аргумента:
* Для o первое число будет 0.
* Для x или X будет напечатано в конце 0x или 0X соответственно.
* Для e, E, f, F вывод имеет десятичную точку.
* Для g или G в конце аргумента будут напечатаны нули.

- Число, указывающее минимальную ширину поля
Трансформированный аргумент печатается в поле, ширина которого не
меньше, чем сам аргумент. С этим числом вы можете увеличить ширину
поля. Если аргумент меньше, то оставшаяся часть поля заполняется
пробелами или нулями.

- Точка для отделения ширины поля и точности

- Число для точности

Возможные значения для трансформации смотри в таблице 8.1.

* int printf(const char *format, ...)
То же самое, что fprintf(stdout, ...).

* int sprintf(char *s, const char *format, ...)
То же, что и printf(...), но вывод будет записан в символьный
указатель s (с последующим \0). (Вы должны захватить достаточно памяти

для s.)

* vprintf(const char *format, va_list arg)
vfprintf(FILE *stream, const char *format, va_list arg)
vsprintf(char *s, const char *format, va_list arg)
То же, что и для вышеописанных функций, только список аргументов
находится в arg.

8.1.2. Форматированный ввод

Точно так же, как printf(...) для форматированного вывода, вы
можете использовать scanf(...) для форматированного ввода.

* int fscanf(FILE *stream, const char *format, ...)
fscanf(...) читает из stream и преобразует ввод по правилам,
определяемым в format. Результаты помещаются в аргументы, заданные в
"..." (эти аргументы должны быть указателями!). Чтение заканчивается,
когда в format исчерпаны правила форматирования.

Таблица 8.1: Libc - трансформации printf

Символ | Форматируется в
--------|-----------------------------------
d,i | int signed, десятиричный
o | int unsigned, восьмеричный, без предваряющего 0
x,X | int unsigned, шестнадцатиричный, без предваряющего 0x
u | int unsigned, десятиричный
c | int (unsigned) одиночный символ
s | char * до \0
f | double как [-]mmm.ddd
e,E | double как [-]m.dddddde+xx, [-]m.dddddde-xx
g,G | double использует %e или %f когда нужно
p | void *
n | int *
% | %

fscanf вернет EOF, при первом достижении конца файла или при
возникшей ошибке. Если этого не случится, будет возвращено количество

трансформированных аргументов.

format может содержать правила форматирования аргументов (см.
табл. 8.2)
Он может также включать:

- пропуски или табуляции, которые игнорируются;

- любой нормальный символ, кроме %. Символы должны быть во вводе
на соответствующих позициях.

- правила преобразования, заданные с %, необязательный символ *
(позволит fscanf(...) присвоить аргументу), необязательное
число, необязательный символ h, l или L (для задания длины
считываемой инфомации) и символ трансформации.

* int scanf(const char *format, ...)
То же, что fscanf(stdin,...)

* int sscanf(char *str, const char *format, ...)
То же, что scanf, но ввод производится из строки str.

8.2. Библиотека termcap

8.2.1. Введение

Библиотека termcap - это API для базы данных termcap, которая
находится в /etc/termcap/. Библиотечные функции позволяют:

* получить описание текущего терминала: tgetent(...);

Таблица 8.2: libc - трансформации sсanf

Символ | Вход - тип аргумента
-------|---------------------------------------------------------------
d | десятичный integer - int*
i | integer - int* (вход может быть восьме- или шестнадцатиричным)
o | восьмеричный integer - int* (с или без предваряющего 0)
u | десятичный unsigned - unsigned int*
x | шестнадцатиричный integer - int* (с или без предваряющего 0x)
c | одна или более литер - char* (без завершающего /0)
e,f,gf | float - float* (такой как [-]m.dddddde+xx, [-]m.dddddde-xx)
p | указатель - void*
n | число трансформированных аргументов - int*
[...] | непустое множество литер на входе - char*
[^...] | исключая такие литеры - char*
% | %
-----------------------------------------------------------------------
перед d,i,n,o,u,x может стоять h, если указатель - short
то же для l, если указатель - long
l также может быть перед e,f,g, если указатель - double
L может стоять перед e,f,g, если указатель - long double

* найти описание для информации: tgetnum(...), tgetflag(...),
tgetstr(...);

* вычислить и произвести поточечный вывод: tputs()

Программы, использующие библиотеку termcap должны включать
termcap.h и собираться с:

gcc [flags] files -ltermcap

Функции termcap терминально-независимые программы, но дают
программисту только низкоуровневый доступ к терминалу. Для пакета
более высокого уровня потребуется curses или ncurses.

8.2.2. Поиск описания терминала

* int tgetent(void *buffer, const char *termtype)
В операционной системе Linux текущее имя терминала содержится в
переменой среды TERM. Поэтому termtype есть результат вызова
getenv(3). Что касается buffer, то в GNU-версии Linux termcap не нужно
захватывать память. В других версиях вам придется выделить 2048 байт
(прежде buffer требовал 1024 байта, но сейчас размер удвоился).

tgetent(...) возвращает 1 в случае успеха и 0 когда база данных
найдена, но не имеет точки входа для TERM. Другие ошибки возвращают
различные значения.

Следующий пример объясняет как использовать getent(...):

#define buffer 0
char *termtype=getenv("TERM");
int ok;

ok=tgetent(buffer,termtype);
if(ok==1)
/* все нормально, мы имеем вход */
else if(ok==0)
/* ой, что-то не так с TERM
* проверим сначала termtype, затем базу данных termcap
*/
else
/* у-у-у, глобальная ошибка */

По умолчанию termcap использует /etc/termcap/ как базу данных.
Если переменная среды TERMCAP установлена, например, в
$HOME/mytermcap, то все функции будут пользоваться mytermcap вместо
/etc/termcap. Без начального слэша в TERMCAP определенное значение
понимается как имя для терминала.

8.2.3. Описание терминала

Каждый фрагмент информации называется свойством (capability).
Каждое свойство - это двухлитерный код, за каждым двухлитерным кодом
стоит значение свойства. Возможны следующие типы свойств.

* Числовой: например, co - число столбцов

* Логический или флаговый: например, hc - терминал твердой копии
(hardcopy terminal)

* Строковый: например, st - установка табуляции (подробнее см.
8.22.3)

Каждое свойство связано с единственным типом значений (co всегда
числовой, hc всегда флаг, а st всегда строка). Три типа значений - и
три типа функций, их запрашивающих. char *name - это двухлитерный код
свойства.

* int tgetnum(char *name)
Получение свойства с числовым значением, таким как co. Функция
tgetnum(...) возвращает числовое значение, если свойство доступно, 1 в
противном случае. (Заметьте, что возвращаемое значение всегда
неотрицательно.)

* int tgetflag(char *name)
Получение логического свойства. Возвращает 1, если флаг
установлен, 0 в противном случае.

* char *tgetstr(char *name, char **area)
Получение строкового свойства. Возвращает указатель на строку или
NULL в случае отсутствия. В GNU-версии, если area есть NULL, termcap
выделит память сам. termcap больше не позаботится об этом указателе,
если вы не освободите name перед выходом из программы. Такой метод
предпочтителен, поскольку вы не знаете сколько памяти потребуется для
указателя, поэтому позвольте termcap сделать все за вас.

char *clstr, *cmstr;
int lines, cols;

void term_caps()
{
char *tmp;

clstr=tgetstr("cl",0); /* очистка экрана */
cmstr=tgetstr("cm",0); /* перемещение y,x */

lines=tgetnum("li"); /* полосы терминала */
cols=tgetnum("co"); /* колонки терминала */

tmp=tgetstr("pc",0); /* символ дозаполнения */

PC=tmp ? *tmp : 0;
BC=tgetstr("le",0); /* сдвиг курсора на символ влево */
UP=tgetstr("up",0); /* сдвиг курсора на линию вверх */
}

8.2.4. Свойства termcap

Логические свойства

5i принтер не имеет эха на экране
am автоматические границы, что означает автоматическое
форматирование строки
bs Crtl-H представляет backspace
bw backspace на левой границе переносит строку на правую границу
предыдущей
da вывести сохраненное над текущим экраном
db вывести сохраненное под текущим экраном
eo пробел стирает литеру на позиции курсора
es esc-последовательности и специальные символы работают в строке
состояния
gn родовое устройство
hc это терминал твердой копии (hardcopy terminal)
HC курсор плохо видно, когда он не на последней линии

hs присутствует линия статуса
hz терминал не может напечатать тильды (tilde characters)
in терминал вставляет нули вместо пробелов на пустые места
km терминал имеет мета клавишу
mi режим вставки для курсора
ms режим стандартного вывода / подчеркивания для курсора
NP нет символов-заполнителей
NR ti не обращает teos терминал может забивать ошибки
ul терминал подчеркивает, но ошибки забивать не может
xb сбой, вызванный столпотворением, F1 посылает ESCAPE, F2 посылает ^C
xn сбой новой линии / соединения строк
xo терминал использует xon/xoff протокол
xs текст, напечатанный поверх выделенного, будет выделен
xt сбой телевизионного луча, неверная табуляция и странный режим
выделения

Числовые свойства

co число столбцов
dB приостановка на милисекунды для возврата на терминалах твердой
копии
dC приостановка на милисекунды для перевода каретки на терминалах
твердой копии
dF приостановка на милисекунды для заполнения страницы на терминалах
твердой копии
dN приостановка на милисекунды для новой линии на терминалах твердой
копии
dT приостановка на милисекунды для табуляции на терминалах твердой
копии
dV приостановка на милисекунды для вертикальной табуляции на терминалах
твердой копии
it раница между позициями табуляции
lh высота мягких меток
lm линии памяти
lw ширина
li число линий
Nl число мягких меток
pb наименьшая граница, когда требуется дозаполнение

sg сбой режима выделения
ug сбой режима подчеркивания
vt номер виртуального терминала
ws ширина линии статуса, если она отлична от ширины экрана

Строковые свойства

!1 клавиша сохранения в верхнем регистре
!2 клавиша подвешивания в верхнем регистре
!3 клавиша undo в верхнем регистре
#1 клавиша помощи в верхнем регистре
#2 клавиша home в верхнем регистре
#3 клавиша ввода в верхнем регистре
#4 клавиша курсор - влево в верхнем регистре
%0 клавиша redo
%1 клавиша помощи
%2 клавиша пометки
%3 клавиша сообщения
%4 клавиша перемещения
%5 клавиша следующего объекта
%6 клавиша открытия
%7 клавиша опций
%8 клавиша предыдущего объекта
%9 клавиша печати
%a клавиша сообщения в верхнем регистре
%b клавиша перемещения в верхнем регистре
%c клавиша следующего объекта в верхнем регистре
%d клавиша опций в верхнем регистре
%e клавиша предыдущего объекта в верхнем регистре
%f клавиша печати в верхнем регистре
%g клавиша redo в верхнем регистре
%h клавиша перестановки в верхнем регистре
%i клавиша курсор-вправо в верхнем регистре
%j клавиша продолжения в верхнем регистре
&0 клавиша cancel в верхнем регистре
&1 клавиша ссылки
&2 клавиша обновления
&3 клавиша перестановки

&4 клавиша перезапуска
&5 клавиша продолжения
&6 клавиша сохранения

&7 клавиша подвешивания
&8 клавиша undo
&9 клавиша начала в верхнем регистре
*0 клавиша поиска в верхнем регистре
*1 клавиша команды в верхнем регистре
*2 клавиша копирования в верхнем регистре
*3 клавиша создания в верхнем регистре
*4 клавиша удаления символа в верхнем регистре
*5 клавиша удаления строки в верхнем регистре
*6 клавиша выделения
*7 клавиша конца в верхнем регистре
*8 клавиша очистки линии в верхнем регистре
*9 клавиша выхода в верхнем регистре
0 клавиша поиска1 клавиша начала
2 клавиша cancel
3 клавиша закрытия
4 клавиша команды
5 клавиша копирования
6 клавиша создания
7 клавиша конца
8 клавиша ввода/посылки
9 клавиша выхода
al клавиша вставки одной линии
AL клавиша вставки %1 линий
ac цвет блока символов, отображаемых в другой таблице символов
ae конец множества символов из альтернативной таблицы
as начало блока символов в альтернативной таблице
bc backspace, если не ^H
bl символ звонка
bt переход к предыдущему месту табуляции
cb очистка от начала линии до курсора
cc странный командный символ
cd очистка до конца экрана
ce очистка до конца линии
ch перемещение курсора горизонтально до столбца %1

cl очистка экрана, курсор помещается в начало
cm курсор перемещается на полосу %1 и колонку %2 (на экране)
CM курсор перемещается на линию %1 и колонку %2 (в памяти)
cr возврат каретки
cs область прокрутки от линии %1 до линии %2
ct очистка табуляций
cv вертикальное движение курсора до линии %1
dc удаление 1 символа
DC удаление %1 символов
dl удаление 1 линии
DL удаление %1 линий
dm начало режима удаления
do курсор на 1 линию вниз
DO курсор на %1 линию вниз
ds убрать линию статуса
eA активирование альтернативной символьной таблицы
ec удаление %1 символов начиная с позиции курсора
ed конец режима удаления
ei конец режима вставки
ff символ дозаполнения экрана на терминалах твердой копии
fs возврат символа на его позицию перед переходом на линию статуса
F1 строка послана функциональной клавишей F11
... ...
F9 строка послана функциональной клавишей F19
FA строка послана функциональной клавишей F20
... ...
FZ строка послана функциональной клавишей F45
Fa строка послана функциональной клавишей F46
... ...
Fr строка послана функциональной клавишей F63
hd перемещение курсора на пол-линии вниз
ho курсор в начало
hu перемещение курсора на пол-линии вверх
i1 инициализация строки 1 в начале сеанса
i3 инициализация строки 3 в начале сеанса
is инициализация строки 2 в начале сеанса
ic вставка 1 символа
IC вставка %1 символов

if файл инициализации
im начало режима вставки
ip вставка времени и необходимых специальных символов после вставки
iP программа инициализации
K1 верхняя левая клавиша на keypad
K2 центральная клавиша на keypad
K3 верхняя правая клавиша на keypad
K4 нижняя левая клавиша на keypad
K5 нижняя правая клавиша на keypad
k0 функциональная клавиша 0
... ...
k9 функциональная клавиша 9
k; функциональная клавиша 10
ka клавиша очистки всех табуляций
kA клавиша вставки линии
kb клавиша backspace
kB клавиша возврата к предыдущему месту табуляции
kC клавиша очистки экрана
kd клавиша down
kD клавиша удаления символа под курсором
ke отключение keypad
kE клавиша очистки до конца линии
kh клавиша курсор - home
kH клавиша курсор home + down
kI вставка символа / клавиша режима вставки
kl клавиша курсор - left
kL клавиша удаления линии
kM Mклавиша выхода из режима вставки
kN клавиша следующей страницы
kP клавиша предыдущей страницы
kr клавиша курсор - right
kR клавиша прокрутки назад/вверх
ks включение keypad
kS клавиша очистки до конца экрана
kt клавиша очистки данной табуляции
kT клавиша установки табуляции на этом месте
ku клавиша курсор - up
l0 метка для нулевой функциональной клавиши, если не f0

l1 метка для первой функциональной клавиши, если не f1
l2 метка для второй функциональной клавиши, если не f2
...
la метка для десятой функциональной клавиши, если не f10
le курсор влево на 1 символ
ll перемещение курсора в нижний левый угол
LE курсор влево на %1 символов
LF отключение мягких меток
LO включение мягких меток
mb начало мерцания
MC очистка мягких границ
md начало режима верхнего регистра
me конец всех режимов типа so, us, mb, md, mr
mh начало полуяркого режима
mk начало темного режима (символы не видны)
ML установка левой мягкой границы
mm вход терминала в метарежим
mo выход терминала из метарежима
mp включение защищенного атрибута
mr начало режима обращения (reverse mode)
MR установка правой мягкой границы
nd курсор на 1 символ влево
nw команда возврата каретки
pc символ-заполнитель
pf отключение принтера
pk программная клавиша %1 для посылки строки %2, если нажата пользователем
pl программная клавиша %1 для исполнения строки %2 в локальном режиме
pn программная мягкая метка %1 для отображения строки %2
po подключение принтера
pO подключение принтера для %1 (<256) байт
ps печать содержимого экрана на принтере
px программная клавиша %1 для посылки строки %2 в компьютер
r1 сброс строки 1, установка нормальных режимов
r2 сброс строки 2, установка нормальных режимов
r3 сброс строки 3, установка нормальных режимов
RA отключение автоматических границ
rc восстановление сохраненной позиции курсора
rf сброс строки имени файла

RF требование ввода с терминала
RI курсор вправо на %1 символов
rp повторение символа %1 %2 раз
rP заполнение после присланного символа в режиме замены
rs сброс строки
RX выключение XON/XOFF управления
sa установка атрибутов %1 %2 %3 %4 %5 %6 %7 %8 %9
SA включение автоматических границ
sc сохранение позиции курсора
se конец режима стандартного вывода
sf нормальная прокрутка на одну линию
SF нормальная прокрутка на %1 линию
so начало режима стандартного вывода
sr обратная прокрутка
SR прокрутка назад на %1 линию
st установка табуляции во всех линиях в данной колонке
SX включение XON/XOFF управления
ta перемещение к следующей табуляции физического устройства
tc чтение в описании терминала с другой точки входа
te конец программы, использующей движение курсора
ti начало программы, использующей движение курсора
ts перемещение курсора на столбец %1 линии статуса
uc подчеркивание символа под курсором и движение курсора вправо
ue конец подчеркивания
up курсор на 1 линию вверх
UP курсор на %1 линию вверх
us начало подчеркивания
vb видимый звонок
ve нормальный видимый курсор
vi невидимый курсор
vs курсор стандартного вывода
wi установка окна с линии %1 до линии %2 и столбцов с %3 до %4
XF символ XOFF, если не ^S

8.3. Введение в ncurses

В этом разделе будем пользоваться следующей терминологией.

* окно (window) - внутреннее представление, содержащее
изображение части экрана. WINDOW определен в ncurses.h.

* экран (screen) - это окно размером в целый экран (с верхнего
левого до нижнего правого угла). Экранами являются stdscr и curscr.

* терминал (terminal) - специальный экран с информацией о том,
как выглядит экран на данный момент.

* переменные - следующие переменные и константы, определенные в
ncurses.h:

- WINDOW *curscr - текущий экран
- WINDOW *stdscr - стандартный экран
- int LINES - полосы на терминале
- int COLS - колонки на терминале
- bool TRUE - флаг истины, 1
- bool FALSE - флаг лжи, 0
- int ERR - флаг ошибки, -1
- int OK - флаг ok, 0

* функции - в описаниях функций аргументы будут следующих типов:

- win - WINDOW*
- bf - bool
- ch - chtype
- str - char*
- chstr - chtype*
- fmt - char*
- иначе int

Обычно программа, использующая ncurses, выглядит так:

#include
...
main()
{
...
initscr();
/* вызов функции ncurses */
endwin();
...
}

Подключение ncurses.h определит переменные и типы для ncurses,
такие как WINDOW, и прототипы функций. Автоматически подключатся
stdio.h, stdarg.h, termios.h, unctrl.h.

initscr() используется для инициализации структур данных ncurses
и для чтения файла terminfo. Будет захвачена память под stdscr и
curscr. Если произойдет ошибка, то initscr вернет ERR. В противном
случае возвращается указатель на stdscr. Кроме этого, экран будет
очищен и будут проинициализированы LINES и COLS.

endwin() очистит все выделенные ресурсы ncurses и восстановит
режимы tty, какими они были до вызова initscr(). Функция endwin()
должна вызываться перед любой другой функцией из библиотеки ncurses и
перед выходом из вашей программы. Если вы хотите использовать для
вывода более чем один терминал, используйте newterm(...) вместо
initscr().

Компилируйте программу посредством:

gcc [flags] files -lncurses

Вы можете устанавливать любые флаги (см. gcc(1)). Если путь к
ncurses.h изменился, вы должны включить следующую строку, иначе
ncurses.h, nterm.h, termcap.h и unctrl.h не будут найдены:

-I/usr/include/ncurses

Другие возможные в Linux-е флаги: -O2 -ansi -Wall -m486. O2
скажет gcc произвести некоторую оптимизацию; -ansi - для ANSI си-кода;
-Wall выведет все предупреждения; -m486 оптимизирует код для Intel 486
(можно и для Intel 386).

Библиотека ncurses находится в /usr/lib/. Существует 3 версии
библиотеки:
* libncurses.a - обычная ncurses
* libdcurses.a - ncurses для отладки
* libpcurses.a - ncurses для профилирования (существует ли что-нибудь
после 1.8.6libcurses.a?)
* libcurses.a - не четвертая версия, это первоначальная BSD curses

Структуры данных для экрана называются windows и определены в
ncurses.h. Окно - это нечто типа литерного массива в памяти, которым
программист может манипулировать без вывода на терминал. При помощи
newwin(...) вы можете создать другие окна.

Чтобы оптимально обновить физический терминал, ncurses имеет
другое окно, curscr. Это изображение, реально выводимое на экран. Для
отображения stdscr на экране используется функция refresh(). После
этого ncurses обновит curscr и физический терминал содержимым stdscr.
Библиотечные функции произведут внутреннюю оптимизацию для процесса
обновления, поэтому вы можете менять различные окна и затем обновлять
экран сразу самым оптимальным способом.

Функциями ncurses вы можете работать со структурой данных window.
Функции, начинающиеся с w, позволяют назначать окно window, тогда как
остальные обычно имеют дело с stdscr. Функции, начинающиеся с mv,
прежде всего переместят курсор на позицию y,x.

Символы имеют тип chtype, который является long unsigned int,
чтобы сохранять дополнительную информацию о себе (атрибуты и т.д.).

Библиотека ncurses использует базу данных terminfo. Обычно она
находится в usr/lib/terminfo/, и ncurses обращается туда за локальными

определениями терминала. Если вы хотите проверить некоторые другие
определения для терминала, не исправляя первоначальную terminfo,
установите соответственно переменную среды TERMINFO. Эта переменная
будет протестирована ncurses, и вместо usr/lib/terminfo/ сохранятся
ваши определения.

Текущей версией ncurses является 1.8.6.

В конце этого раздела вы найдете обзорную таблицу для BSD-Curses,
ncurses и Sun-OS 5.4 curses.

8.4. Инициализация

* WINDOW *initscr()
Обычно это первая функция, вызываемая из программы, использующей
ncurses. В некоторых случаях полезно вызывать slk_init(int), filter(),
ripoffline(...) или use_env(bf) перед initscr(). Для работы с
несколькими терминалами (или тестирования возможностей системы) вы
можете использовать newterm(...) вместо initscr(). initscr() прочитает
terminfo файл и установит структуры данных ncurses, выделит память для
curscr и stdscr и проинициализирует переменные LINES и COLS
значениями, соответствующими вашему терминалу. Будет возвращен
указатель на stdscr или ERR в случае ошибки. Вам НЕ нужно
инициализировать указатель.

stdscr=initscr();

поскольку initscr() сделает это за вас. Если возвращен ERR, ваша
программа должна завершиться, поскольку ни одна функция ncurses не
будет работать:

if(!(initscr())){
fprintf(stderr,"type: initscr() failed\n\n");
exit (1);
}

* SCREEN *newterm(char *type, FILE *outfd, FILE *infd)
Работая в ncurses с несколькими терминалами, вы должны вызвать
для каждого из них newterm(...) вместо initscr(). type - это имя
терминала как оно содержится в $TERM (ansi, xterm, vt100, например);
outfd - это указатель для вывода, infd - указатель для ввода. Для
каждого терминала, открытого newterm(...), следует вызывать endwin().

* SCREEN *set_term(SCREEN *new)
При помощи set_term(SCREEN) вы можете переключать текущий
терминал. Все функции будут работать с текущим терминалом,
установленным set_term(SCREEN).

* int endwin()
endwin() произведет очистку, восстановит режимы терминала,
сохраненные перед вызовом initscr(), и поставит курсор в левый верхний
угол экрана. Не забудьте закрыть все окна перед тем, как вызвать
endwin(), перед выходом из вашей программы. Дополнительный вызов
refresh() после endwin() восстановит содержимое терминала,
отображавшееся до вызова initscr() (visual-mode), в противном случае
экран будет очищен (non-visual-mode).

* int isendwin()
Возвращает TRUE, если после endwin() была вызвана refresh(),
иначе - FALSE.

* void delscreen(SCREEN *sp)
Вызывается после endwin() для высвобождения всех занятых
ресурсов, когда SCREEN больше не нужен. (Пока не реализована.)

8.5. Окна

Окна могут быть созданы, уничтожены, перемещены, скопированы,
задублированы и т.д.

* WINDOW *newwin(nlines, ncols, begy, begx)
begy и begx - координаты верхнего левого угла окна. nlines - это
число линий (integer); ncols - число колонок (integer).

WINDOW *mywin;
mywin=newwin(10,60,10,10);

Верхний левый угол нашего окна находится на линии 10 в колонке
10; окно имеет 10 линий и 60 колонок. Если nlines равна нулю, окно
будет иметь (LINES - begy) полос. Точно так же, если ncols равна нулю,
то окно будет иметь (COLS - begx) колонок. Когда мы вызываем
newwin(...) с нулевыми аргументами:

WINDOW *mywin;
mywin=newwin(0,0,0,0);

открытое окно получает размеры экрана.

При помощи LINES и COLS мы можем открыть окно на середине экрана,
какую бы размерность оно ни имело:

0 begx
| |
0 | | COLS
- - - - -------|-------------------------|------->
| | ncols |
begy | |<. . . . . . . . . . . .>|
- - - -|- - - -|-------------------------|
| ^| |
| .| |
| .| |
|nlines.| newwin(nlines, ncols, |
| .| begy, begx) |
| v| |
|- - - -|-------------------------|
LINES |
v

#define MYLINE (int) ((LINES-22)/2)
#define MYCOL ((COLS-70)/2)
#define MYLINES 22
#define MYCOLS 70

...
WINDOW *win;
...
if(!(initscr())){
fprintf(stderr, "type: iniscr() failed\n\n");
exit(1);
}
...
if ((LINES<22)||(COLS<70)){
fprintf(stderr, "screen too small\n\n");
endwin(); exit (1);
}
win=newwin(MYLINES,MYCOLS,MYLINE,MYCOL);
...

Откроется окно с 22 линиями и 70 колонками в середине экрана.
Проверьте размер экрана перед тем, как открывать окно. Консоль Linux-а
имеет не менее 25 линий и 80 колонок, но на x-терминалах это может не
выполняться (их размеры изменяемы).

С другой стороны, используйте LINES и COLS, чтобы поместить два
окна в один экран:

#define MYROWS (int) (LINES/2+LINES/4)
#define MYCOLS (int) (COLS/2+COLS/4)
#define LEFTROW (int) ((LINES-MYROWS)/2)
#define LEFTCOL (int) (((COLS-2)-MYCOLS)/2)
#define RIGHTROW (int) (LEFTROW)
#define RIGHTCOL (int) (LEFTROW+2+MYCOLS)
#define WCOLS (int) (MYCOLS/2)
...
WINDOW *leftwin, *rightwin;
...
leftwin=newwin(MYROWS, WCOLS, LEFTROW, LEFTCOL);
rightwin=newwin(MYROWS, WCOLS, RIGHTROW, RIGHTCOL);
...

Подробнее смотрите screen.c в директории с примерами.

* int delwin(win)
Удаляет окно win. Подокна win удаляются перед win. Будут
освобождены все ресурсы, занятые win. Удаляйте все открытые вами окна
перед вызовом endwin().

* int mvwin(win, by, bx)
Перемещает окно на координаты by,bx. Если это означает выход за
пределы экрана, то ничего не произойдет и будет возвращен ERR.

* WINDOW *subwin(origwin, nlines, ncols, begy, begx)
Возвращает подокно в середине origwin-а. Когда вы изменяете одно
из двух окон (origwin или новое), это изменение отразится на обоих
окнах. Вызывайте touchwin(origwin) перед следующим refresh().

begx и begy относятся не к origwin, а к экрану.

* WINDOW *derwin(origwin, nlines, ncols, begy, begx)
То же, что subwin(), begx и begy относятся не к экрану, а к
origwin.

* int mvderwin(win, y, x)
Перенесет win за пределы родительского окна. (Пока не
реализована.)

* WINDOW *dupwin(win)
Дублирует окно win.

* int syncok(win, bf)
void wsyncup(win)
void wcursyncup(win)
void wsyncdown(win)
(Пока не реализованы.)

* int overlay(win1, win2)
int overwrite(win1, win2)
overlay(...) скопирует весь текст из win1 в win2, игнорируя
пропуски. overwrite(...) делает то же самое, но копирует вместе с
пропусками.

* int copywin(win1, win2, sminrow, smincol, dminrow, dmincol, dmaxrow,
dmaxcol, overlay)
То же, что overlay(...) и overwrite(...), но позволяет
контролировать область окна для копирования.

8.6. Вывод

* int addch(ch)
int waddch(win, ch)
int mvaddch(y, x, ch)
int mvwaddch(win, y, x, ch)
Эти функции выводят символ в окно. Они работают с окном; вам
нужно вызвать refresh(), чтобы поместить окно на экран. Функции
addch(...) и waddch(...) помещают символ ch в окно stdscr или win.
mvaddch(...) и mvwaddch(...) предварительно ставят курсор на позицию
y,x.

* int addstr(str)
int addnstr(str, n)
int waddstr(win, str)
int waddnstr(win, str, n)
int mvaddstr(y, x, str)
int mvaddnstr(y, x, str, n)
int mvwaddstr(win, y, x, str)
int mvwaddnstr(win, y, x, str, n)
Эти функции заносят строку в окно и эквивалентны сериям вызовов
addch(...). str - это строка, заканчивающаяся символом с кодом 0
("кукареку\0"). Функции, начинающиеся с w, заносят str в окно win,
остальные - в stdscr. Функции с n пишут n символов строки str. Если n
равен -1, будет записана вся строка.

* int addchstr(chstr)
int addchnstr(chstr, n)
int waddchstr(win, chstr)
int waddchnstr(win, chstr, n)
int mvaddchstr(y, x, chstr)
int mvaddchnstr(y, x, chstr, n)
int mvwaddchstr(win, y, x, chstr)
int mvwaddchnstr(win, y, x, chstr, n)
Эти функции копируют chstr в окно stdscr или win. Начальной
позицией является позиция курсора. Функции с n пишут n символов строки
chstr. Если n равен -1, будет записана вся строка. Курсор не двигается
и символы не контролируются. Эти функции быстрее, чем addstr(...).
chstr является указателем на массив элементов chtype.

* int echochar(ch)
int wechochar(win, ch)
То же, что addch(...), waddch(win), с последующим refresh(),
wrefresh(win).

8.6.1. Форматированный вывод

* int printw(fmt, ...)
int wprintw(win, fmt, ...)
int mvprintw(y, x, fmt, ...)
int mvwprintw(win, y, x, fmt, ...)
int vwprintw(win, fmt, va_list)
Эти функции соответствуют printf(...) и подобным ей функциям
libc. В libc printf(...) используется для форматированного вывода. Вы
можете определять выводимую строку и включать в нее переменные
различных типов. Подробнее смотрите раздел 8.1.1.

vwprintw(...) требует подключения varargs.h.

8.6.2. Вставка символов и линий

* int insch(c)
int winsch(win, c)
int mvinsch(y, x, c)
int mvwinsch(win, y, x, c)
Символ ch вставляется слева от курсора, и все символы сдвигаются
на одну позицию вправо. Самый правый символ строки может быть потерян.

* int insertln()
int winsertln(win)
Вставляет чистую строку над текущей. Нижняя строка будет
потеряна.

* int insdelln(n)
int winsdelln(win, n)
Для положительного n эти функции вставляют n линий в
соответствующем окне (n нижних линий будут потеряны). Для
отрицательных n будут удалены n линий под курсором, оставшиеся
сдвинутся вверх.

* int insstr(str)
int insnstr(str, n)
int winsstr(win, str)
int winsnstr(win, str, n)
int mvinsstr(y, x, str)
int mvinsnstr(y, x, str, n)
int mvwinsstr(win, y, x, str)
int mvwinsnstr(win, y, x, str, n)
Эти функции занесут str в текущую строку слева от курсора
(сколько возможно до конца строки). Символы справа от курсора
сдвигаются вправо и удаляются достигнув конца строки. Курсор остается
на месте. y и x - координаты, на которые переместится курсор перед
вставкой str; n - это число вставляемых символов (n=0 вводит чистую
строку).

8.6.3. Удаление символов и линий

* int delch()
int wdelch(win)
int mvdelch(y, x)
int mvwdelch(win, y, x)
Удаление символа под курсором и сдвиг оставшейся справа от
курсора строки на одну позицию влево.

y и x - координаты, на которые курсор переместится перед
удалением.

* int deleteln()
int wdeleteln(win)
Удаление строки под курсором и перемещение нижележащих линий на
одну позицию вверх. Последняя линия окна будет очищена.

8.6.4. Боксы и линии

* int border(ls, rs, ts, bs, tl, tr, bl, br)
int wborder(win, ls, rs, ts, bs, tl, tr, bl, br)
int box(win, vert, hor)
Очерчивают соответствующее окно (stdscr или win). В таблице 8.3
вы увидите символы и их значения по умолчанию для box(...). На
картинке вы увидите позиции символов для бокса.

* int vline(ch, n)
int wvline(win, ch, n)
int hline(ch, n)
int whline(win, ch, n)
Эти функции вычерчивают вертикальную или горизонтальную прямую
начиная с позиции курсора. ch - это используемый символ, n - число
таких символов. Позиция курсора не изменяется.

8.6.5. Фоновый (background) символ

* void bkgdset(ch)
void wbkgdset(win, ch)
Устанавливает фоновый символ и атрибут для экрана или окна.
Атрибут в ch будет OR-нут с каждым непробельным символом окна. Фон
становится частью окна и не изменяется при прокрутке и вводе/выводе.

Таблица 8.3: ncurses - ограничительные символы

Литера | Позиция | По умолчанию
-------|----------------------|----------------------
tl | левая верхняя | ACS_ULCORNER
ts | верхняя сторона | ACS_HLINE
tr | правая верхняя | ACS_URCORNER
ls | левая сторона | ACS_VLINE
rs | правая сторона | ACS_VLINE
bl | левая нижняя | ACS_LLCORNER
bs | нижняя сторона | ACS_HLINE
br | правая нижняя | ACS_LRCORNER
rt | правая средняя | ACS_RTEE
lt | левая средняя | ACS_LTEE
tt | верхняя средняя | ACS_TTEE
bt | нижняя средняя | ACS_BTEE

Рисунок 8.2: ncurses - символы бокса

tl ts tt ts tr
|------------|------------|
| |
ls| | |rs
| |
| | |
lt|- - - - - - - - - - - - -|rt
| | |
| |
ls| | |rs
| |
|------------|------------|
bl bs bt bs br
* int bkgd(ch)
int wbkgd(win, ch)
Установит в ch фоновый символ и атрибут.

8.7. Ввод

* int getch()
int wgetch(win)
int mvgetch(y, x)
int mvwgetch(win, y, x)
getch() прочитает ввод с терминала. Если режим паузы установлен,
getch() будет ждать нажатия клавиши. Если нет - вернет клавишу из
буфера ввода или ERR, если буфер пуст. mvgetch(...) и mvwgetch(...)
сначала установят курсор на позицию y,x. w-функции читают ввод с
терминала, связанного с окном win, getch() и mvgetch(...) - с stdscr.

Со включенной keypad(...) при нажатии функциональной клавиши
getch() вернет код, определенный в ncurses.h как макрос KEY_*. При
нажатии ESCAPE (который может быть началом функциональной клавиши)
ncurses запустит односекундный таймер. Если остаток не получен в
течение этой секунды, то возвращается ESCAPE, иначе - значение
функциональной клавиши. При необходимости секундный таймер можно
отключить через notimeout().

* int ungetch(ch)
Вернет ch в буфер ввода.

* int getstr(str)
int wgetstr(win, str)
int mvgetstr(y, x, str)
int mvwgetstr(win, y, x, str)
int wgetnstr(win, str, n)
Эти функции проделают серию вызовов getch(), пока не будет
получена новая линия. Символы помещаются в str, поэтому не забывайте
захватывать память для вашего символьного указателя перед вызовом
getstr(...). Если включено эхо, то строка отображается (используйте
noecho(), чтобы его отключить) и пользовательские символы удаления
будут проинтерпретированы.

* chtype inch()
chtype winch(win)
chtype mvinch(y, x)
chtype mvwinch(win, y, x)
Эти функции возвращают литеру с экрана или окна. Поскольку
возвращается тип chtype, возвращается и атрибут. Информация об
атрибуте может быть получена с помощью констант A_* (см. таблицу 8.4).

* int instr(str)
int innstr(str, n)
int winstr(win, str)
int winnstr(win, str, n)
int mvinstr(y, x, str)
int mvinnstr(y, x, str, n)
int mvwinstr(win, y, x, str)
int mvwinnstr(win, y, x, str, n)
Возвращает символьную строку из экрана или окна. (Пока не
реализована.)

* int inchstr(chstr)
int inchnstr(chstr, n)
int winchstr(win, chstr)
int winchnstr(win, chstr, n)
int mvinchstr(y, x, chstr)
int mvinchnstr(y, x, chstr, n)
int mvwinchstr(win, y, x, chstr)
int mvwinchnstr(win, y, x, chstr, n)
Возвращает строку типа chtype из экрана или окна вместе с
атрибутом для каждого символа. (Пока не реализована; lib_inchstr не
включена в библиотеку ncurses.)

8.7.1. Форматированный ввод

* int scanw(fmt, ...)
int wscanw(win, fmt, ...)
int mvscanw(y, x, fmt, ...)
int mvwscanw(win, y, x, fmt, ...)
int vwscanw(win, fmt, va_list)
Функции эквивалентны scanf(...) из libc (см. раздел 8.1.2).
Входом для сканирования служит вызов wgetstr(...).

8.8. Опции

Опции вывода

* int idlok(win, bf)
void idcok(win, bf)
Включение и отключение возможностей вставки/удаления для окна
терминала (idlok(...) для линий, idcok(...) - для символов).
(idcok(...) пока не реализована.)

* void immedok(win, bf)
Если устанавливается TRUE, то каждое изменение в окне вызывает
физическое обновление экрана. Это может ухудшить характеристики
программы, поэтому значение по умолчанию - FALSE. (Пока не
реализована.)

|-------|-------|-------| |-------|-------|-------|-------|
| ??? | KEY_ | KEY_ | | NUM | / | * | - |
| | HOME | PPAGE | | | | | |
|-------|-------|-------| |-------|-------|-------|-------|
| CTRL | KEY_ | KEY_ | | KEY_ | KEY_ | KEY_ | |
| +D | END | NPAGE | | HOME | UP | PPAGE | |
|-------|-------|-------| |-------|-------|-------| + |
| KEY_ | ??? | KEY_ | |
| LEFT | | RIGHT | |
|-------| |-------|-------|-------|-------|
| KEY_ | | KEY_ | KEY_ | KEY_ | |
| UP | | END | DOWN | NPAGE | CTRL |
|-------|-------|-------| |-------|-------|-------| +M |
| KEY_ | KEY_ | KEY_ | | ??? | KEY_ | |
| LEFT | DOWN | RIGHT | | | DC | |
|-------|-------|-------| |-------|-------|-------|-------|

* int clearok(win, bf)
Если bf равен TRUE, то следующий вызов wrefresh(win) очистит
экран и полностью его перерисует (Ctrl+L в редакторе vi).

* int leaveok(win, bf)
По умолчанию ncurses ставит курсор там, где он был при последнем
обновлении окна. Программы, не использующие курсор, могут установить
leaveok(...) TRUE и сэкономить время, требующееся движения курсора.
Кроме того, ncurses попытается сделать курсор терминала невидимым.

* int nl()
nonl()
Управление переходом на новую строку. После nl() произойдетт
возврат каретки и дозаполнение; nonl() отключает контроль. В последнем
случае ncurses может ускорить перемещение курсора.

8.8.1. Опции ввода

* int keypad(win, bf)
TRUE активизирует keypad на клавиатуре во время ожидания ввода.
Для функциональных клавиш и стрелок keypad ncurses вернет код клавиши,
определенный как KEY_* в ncurses.h. Это очень удобно для клавиатуры
ПК, потому что вы имеете возможность и пользоваться цифровым блоком, и
перемещать курсор.

* int meta(win, bf)
Если TRUE, то коды клавиш, возвращаемые getch(), 8-битовочистые
(верхний бит не учитывается).

* int cbreak()
int nocbreak()
int crmode()
int nocrmode()
cbreak() и nocbreak() устанавливают или снимают режим терминала
CBREAK. Когда CBREAK установлен, читаемый ввод немедленно доступен
программе, когда нет - будет буферизован до получения целой строки.
(Замечание: crmode() и nocrmode() существуют для повышения
совместимости, их использовать не нужно.)

* int raw()
int noraw()
Устанавливает или снимает режим RAW. RAW - это то же, что и
CBREAK, только без обработки специальных символов.

* int echo()
int noecho()
Вызывайте echo() для отображения ввода пользователя и noecho(),
чтобы его скрыть.

* int halfdelay(t)
То же, что cbreak() с паузой в t секунд.

* int nodelay(win, bf)
Терминал устанавливается в неблокируемый режим. getch() вернет
ERR, если ввод не готов. Если bf есть FALSE, то getch() будет ждать
нажатия клавиши.

* int timeout(t)
int wtimeout(win, t)
Эти функции рекомендуется использовать вместо halfdelay(t) и
nodelay(win, bf). Результат getch() зависит от значения t. При
положительном t считывание блокируется на t милисекунд; при t, равном
нулю, блокировки не происходит; при отрицательном t программа
блокируется, пока ввод не станет возможен.

* int notimeout(win, bf)
Если bf равен TRUE, getch() будет использовать односекундный
таймер для интерпретации вводимой последовательности, начинающейся с
ESCAPE и т.п.

* int typeahead(fd)
При fd, равном -1, никакой проверки печати производиться не
будет, при других значениях ncurses будет использовать для таких
проверок файловый дескриптор fd вместо stdin.

* int intrflush(win, bf)
При активизации истинным bf нажатая клавиша прерывания (типа
quit, break) очистит очередь драйвера tty.

* void noqiflush()
void qiflush()
(Пока не реализованы.)

8.8.2. Атрибуты терминала

* int baudrate()
Возвращает скорость терминала в bps (бит в секунду).

* char erasechar()
Возвращает текущий символ erase.

* char killchar()
Возвращает текущий символ kill.

* int has_ic()
int has_il()
has_ic() возвращает TRUE, если терминал может вставлять/удалять
символ, has_il() возвращает TRUE, если терминал может
вставлять/удалять линию. В противном случае возвращается ERR. (Пока не
реализованы.)

* char *longname()
Указатель предоставляет доступ к описанию текущего терминала.

* chtype termattrs()
(Пока не реализована.)

* char *termname
Возвращает содержимое TERM из пользовательской среды. (Пока не
реализована.)

8.8.3. Использование опций

Поговорим об использовании опций окна и режимов терминала.

Прежде всего, под Linux-ом вам следует подключить keypad. Это
позволит пользоваться цифровым блоком и клавишами перемещения курсора
на клавиатуре ПК.

keypad(stdscr,TRUE);

Теперь имеется 2 основных типа ввода:
1) программа ожидает нажатия клавиши, чтобы вызвать
соответствующую функцию (например, что-нибудь вроде "press 'q' for
quit" и ждет q);
2) ожидается, что пользователь напечатает строку символов в маску
на экране (например, каталог или адрес в базе данных).

Для первого случая мы установим следующие опции и режимы, и цикл
while сработает корректно:

char c;

noecho();
timeout(-1);
nonl();
cbreak();
keypad(stdscr,TRUE);
while(c=getch()){
switch(c){
case 'q': your_quit_function();
default: break;
}
}

Эта программа повиснет до нажатия клавиши. Если нажата q, мы
вызываем your_quit_function(), иначе - ждем другого ввода.

Выражение switch может быть расширено по нашему желанию. Макросы
KEY_* служат для учета специальных клавиш. Например,

KEY_UP KEY_RIGHT KEY_A1 KEY_B2 KEY_C1
KEY_DOWN KEY_LEFT KEY_A3 KEY_C3

для клавиш перемещения курсора.

Для просмотра файла цикл может выглядеть примерно так:

int loop=TRUE;
char c;
enum{UP,DOWN,RIGHT,LEFT};

noecho();
timeout(-1);
nonl();
cbreak();

keypad(stdscr,TRUE);
while(loop==TRUE){
c=getch();
switch(c){
case KEY_UP:
case 'u':
case 'U': scroll_s(UP);
break;
case KEY_DOWN:
case 'd':
case 'D': scroll_s(DOWN);
break;
case KEY_LEFT:
case 'l':
case 'L': scroll_s(LEFT);
break;
case KEY_RIGHT:
case 'r':
case 'R': scroll_s(RIGHT);
break;
case 'q':
case 'Q': loop=FALSE;
default: break;
}
}

Для второго случая, нам достаточно установить echo(), и символы,
набираемые пользователем, будут напечатаны на экране. Место печати
задается функциями move(...) или wmove(...).

Или вы можете открыть окно с маской (выделяемой другими цветами)
и попросить пользователя ввести строку:

WINDOW *maskwin;
WINDOW *mainwin;
char *ptr=(char *)malloc(255);
...
mainwin=newwin(3,37,9,21);

maskwin=newwin(1,21,10,35);
...
werase(mainwin);
werase(maskwin);
...
box(mainwin,0,0)
mvwaddstr(mainwin,1,2,"Inputstring:");
...
wnoutrefresh(mainwin);
wnoutrefresh(maskwin);
doupdate();
...
mvwgetstr(maskwin,0,0,ptr);
...
delwin(maskwin);
delwin(mainwin);
endwin();
free(ptr);

Более подробно см. input.c в директории примеров.

8.9. Очистка окна и линий

* int erase()
int werase(win)
werase(...) и erase() скопируют пробелы на каждую позицию окна
win или stdscr. Например, если вы установили атрибуты цвета в окне и
вызвали werase(), окно должно быть окрашено. Однако автор имел
некоторые проблемы с COLOR_PAIRS, если определял другие атрибуты, а
затем черный по белому, так он писал его собственную стирающую функцию
(это низкоуровневый доступ к структуре WINDOW):

void NewClear(WINDOW *win)
{
int y,x;

for ( y = 0 ; y <= win -> _maxy ; y++ )
for ( x = 0 ; x <= win -> _maxx ; x++ )

(chtype *) win-> _line[y][x] = ' '|win-> _attrs;
win -> _curx = win -> _cury = 0; touchwin(win);
}

Проблема состоит в том, что ncurses иногда делает совершенно
бесполезными атрибуты окна, когда заполняет экран пробелами. Если в
lib_clrtoeol.c BLANK определен как

#define BLANK ' '|A_NORMAL,

то другие атрибуты окна теряются, пока идет стирание строки.

* int clear()
int wclear(win)
То же, что erase(), но будет также установлен clearok() (экран
будет очищен с последующим обновлением).

* int clrtobot()
int wclrtobot(win)
Очистка текущей линии курсора (начинается с символа справа от
курсора) и строки под курсором.

* int clrtoeol()
int wclrtoeol(win)
Очистка текущей строки начиная справа от курсора и до конца
строки.

8.10. Обновление терминала

Как написано в обзоре, окна ncurses есть отображения в памяти.
Это означает, что любое изменение окна не отражается на физическом
экране до тех пор, пока не будет произведено обновление. Это
оптимизирует вывод на экран, поскольку вы получаете возможность
совершать множество действий, а затем лишь единожды вызвать
обновление, чтобы напечатать его на экране. В противном случае на
терминале отражалось бы каждое изменение, что ухудшало бы исполнение
ваших программ.

* int refresh()
int wrefresh(win)
refresh() копирует stdscr на терминал, а wrefresh(win) копирует
изображение окна в stdscr и затем делает curscr подобным stdscr.

* int wnoutrefresh(win)
int dourdate()
wnoutrefresh(win) копирует окно win только в stdscr. Это
означает, что вывода на терминал не производится, но виртуальный экран
stdscr на самом деле выглядит именно так, как того хочет программист.
doupdate() произведет вывод на терминал. Программа может менять
различные окна, вызывая wnoutrefresh(win) для каждого окна, а затем
достаточно один раз вызвать doupdate(), чтобы обновить физический
экран.

Допустим, мы имеем следующую программу с двумя окнами. Мы
изменяем оба окна, меняя несколько линий текста. Напишем
cgangewin(win) с wrefresh(win).

main() changewin(WINDOW *win)
{ {
WINDOW *win1,*win2; ... /* здесь мы изменяем */
... ... /* строки */
changewin(win1); wrefresh(win);
changewin(win2); return;
... }
}

Тогда ncurses обновит терминал дважды, а это замедлит исполнение
нашей программы. Благодаря doupdate() мы изменим changewin(win) и нашу
основную функцию, добившись этим лучшего исполнения.

main() changewin(WINDOW *win)
{ {
WINDOW *win1,*win2; ... /* здесь мы изменяем */
... ... /* строки */
changewin(win1); wnoutrefresh(win);
changewin(win2); return;

doupdate(); }
...
}

* int redrawwin(win)
int wredrawln(win, bline, nlines)
Используйте эти функции, когда перед записью чего-нибудь нового
требуется выбросить несколько линий или целый экран (может быть линии
попорчены или что-либо вроде этого).

* int touchwin(win)
int touchline(win, start, count)
int wtouchln(win, y, n, changed)
int untouchwin(win)
Говорит ncurses-у, что были произведены манипуляции с целым окном
или линиями от start до start+count. Например, когда у вас есть
несколько окон, перекрывающих друг друга (как в примере type.c),
изменение одного из них никак не повлияет на изображение других.

wtouchln(...) захватит n линий, начинающихся в y. Если change
соответствует TRUE, то линии захватываются, в противном случае - нет
(изменяются или не изменяются).

untouchwin(win) пометит окно win как неизмененное со времени
последнего вызова refresh().

* int is_linetouched(win, line)
int is_wintouched(win)
При помощи этих функций вы можете проверить, были ли линия line
или окно win захвачены со времени последнего вызова refresh().

Таблица 8.4: Ncurses - атрибуты

Определение | Атрибут
----------------|------------------------------------------------
A_ATTRIBUTES | маска для атрибутов (chtype)
A_NORMAL | нормальный, переустановка всего остального
A_STANDOUT | наиболее яркий режим
A_UNDERLINE | подчеркивание
A_REVERSE | обратное изображение
A_BLINK | мигание
A_DIM | тусклый или полуяркий режим
A_BOLD | четкий или очень яркий режим
A_ALTCHARSET | использование альтернативной символьной таблицы
A_INVIS | невидимый режим
A_PROTECT | ???
A_CHARTEXT | маска для действующих символов (chtype)
A_COLOR | маска для цвета
COLOR_PAIR(n) | установка цветовой пары n
PAIR_NUMBER(a) | получение цветовой пары, лежащей в атрибуте a

8.11. Видеоатрибуты и цвет

Атрибуты - это специальные возможности терминала, применяемые во
время печати символов на экран. Символы могут быть напечататы жирно,
могут быть подчеркнуты, могут мигать и т.д. В ncurses вы имеете
возможность включать или отключать атрибуты для достижения наилучшего
внешнего вида вывода. Возможные атрибуты перечислены в нижеследующей
таблице.
Определение | Цвет
--------------|-----------
COLOR_BLACK | черный
COLOR_RED | красный
COLOR_GREEN | зеленый
COLOR_YELLOW | желтый
COLOR_BLUE | синий
COLOR_MAGENTA | пурпурный
COLOR_CYAN | голубой
COLOR_WHITE | белый

Ncurses определяет 8 цветов, которыми вы можете пользоваться на
терминале с цветовой поддержкой. Сначала проинициализируйте цветовые
структуры данных посредством start_color(), затем проверьте
возможности терминала при помощи has_colors(). start_color() будет
инициализировать COLORS, наибольшее количество цветов, поддерживаемых
терминалом, и COLOR_PAIR, максимальное число цветовых пар, которые вы
можете определить.

Атрибуты могут быть совмещены '|' (OR), поэтому вы можете
получить четкий мерцающий вывод при помощи
A_BOLD|A_BLINK

Если вы установите окно с атрибутом attr, все символы,
напечатанные в этом окне, приобретут это свойство и будут его
сохранять до изменения вами атрибута. Это не будет утеряно при
прокрутке или движении окна и т.п.

Будьте осторожны с цветами, если вы пишете программы для ncurses
и BSD curses, так как BSD curses не имеет цветовой поддержки. (Точно
так же не имеют цветовой поддержки старые версии SYS V). Поэтому, если
вы компилируете для обеих библиотек, вам придется использовать
операции #ifdef.

* int attroff(attr)
int wattroff(win, attr)
int attron(attr)
int wattron(win, attr)
Включают или отключают указанный атрибут attr, не влияя на другие
атрибуты в окне (stdscr или win).

* int attrset(attr)
int wattrset(win, attr)
Установка атрибута в attr в stdscr или win.

* int standout()
int standend()
int wstandout(win)
int wstandend(win)
Включают атрибут наиболее яркого режима для окна (stdscr или
win).

* chtype getattrs(win)
Выдает текущие атрибуты для окна win.

* bool has_colors()
Возвращает TRUE, если терминал имеет цвета. Перед тем, как
использовать цвета, проверьте терминал has_colors()-ом, а перед этим
проинициализируйте цвета start_color()-ом.

* bool can_change_color()
TRUE, если терминал может переопределять цвета.

* int start_color()
Цветовая инициализация. Эта функция должна быть вызвана перед
использованием цветов!

* int init_pair(pair, fg, bg)
Если вы используете цвета в атрибутах окна, то сначала вы должны
определить цветовую пару через init_pair(...). fg и bg - это цвета
переднего и заднего плана, спаренные в pair. pair принимает значения
от 1 до COLORPAIRS -1. (0 - не ошибка, но зарезервирован для черного и
белого.) Определенную однажды pair можно использовать как атрибут. К
примеру, вам нужны красные символы на синем экране:
init_pair(1,COLOR_RED,COLOR_BLUE);

Теперь вызовем wattr(...) для установки новой пары цветов для
win:

wattr(win,COLOR_PAIR(1));

Или соединим цветовые пары с другими атрибутами, например:

wattr(win,A_BOLD|COLOR_PAIR(1));
wattr(win1,A_STANDOUT|COLOR_PAIR(1));

Первый вызов установит цветовую пару и атрибут BOLD, второй -
подключит режим STANDOUT, и вы получите светлый красный на синем
экране.

* int pair_content(pair, f, b)
Вернет цвета переднего и заднего плана из pair.

* int init_color(color, r, g, b)
Изменит цветовые компоненты r, g и b для color. r, g и b
находятся в диапазоне от 1 до COLORS -1.

* int color_content(color, r, g, b)
Получение компонентов r, g и b для color.

Как комбинировать атрибуты и цвета? Некоторые терминалы, как
консоли в Linux-е, имеют цвета, а некоторые - нет (xterm, vs100 и
т.д.). Следующий код решит эту проблему:

void CheckColor(WINDOW *win1, WINDOW *win2)
{
start_color();
if (has_colors()){
/* Хорошо, у нас есть цвета, определяем цветовые пары для
* цветов переднего и заднего плана
*/
init_pair(1,COLOR_BLUE,COLOR_WHITE);
init_pair(2,COLOR_WHITE,COLOR_RED);

/* теперь используем уже определенные цветовые пары для окон */
wattrset(win1,COLOR_PAIR(2));
wattrset(win2,COLOR_PAIR(1));
}
else{

/* Ох, нет цвета (может быть vt100 или xterm). Ладно, будем
* пользоваться вместо этого черно-белыми атрибутами.
*/
wattrset(win1,A_REVERSE);
wattrset(win2,A_BOLD);
}
return;
}
Прежде всего, функция CheckColor проинициализирует цвета при
помощи start_color(). Затем has_colors() вернет TRUE, если текущий
терминал имеет цвета. После этого вызывается ini_tpair(...) для
соединения цветов переднего и заднего плана, и wattrset(...) для
установки этих цветов в данном окне. Впрочем, чтобы установить
атрибуты для черно-белого терминала, мы можем использовать только
wattrset(...).

Чтобы получить цвета на xterm, лучший способ, найденный автором,
- это использовать ansi_xterm с надерганными элементами terminfo из
Midnight Commander-а. Просто добудьте исходники ansi_xterm и Midnight
Commander-а (mc-x.x.tar.gz). Потом скомпилируйте ansi_xterm и
используйте tic с xterm.ti и vt100.ti из архива mc-x.x.tar.gz.
Запустите ansi_xterm и протестируйте его.

8.12. Координаты курсора и окна

* int move(y, x)
int wmove(win, y, x)
Движение курсора stdscr или win. Для функций ввода/вывода
определяются дополнительные макросы, передвигающие курсор перед
вызовом данных функций.

* int curs_set(bf)
Переключает видимость/невидимость курсора, если терминал имеет
такую возможность.

* void getyx(win, y, x)
Возвращает координаты курсора. Замечание: это макрос.

* void getparyx(win, y, x)
Если win - подокно, getparyx(...) сохранит координаты окна
относительно родительского окна. В противном случае y и x установятся
в -1. (Пока не реализована.)

* void getbegyx(win, y, x)
void getmaxyx(win, y, x)
int getmaxx(win)
int getmaxy(win)
Сохранит начальные и размерные координаты для win в y и x.

* int getsyx(int y, int x)
int setsyx(int y, int x)
Сохранит виртуальный курсор экрана в y и x или установит этот
курсор. При y и x, равных -1, getsyx(...) установит leaveok.

8.13. Прокрутка

* int scrollok(win, bf)
Если TRUE, текст в окне win будет прокручен вверх на одну линию,
когда курсор находится в правом нижнем углу и напечатан символ.Если
FALSE, то курсор остается на прежней позиции.

При включенном scrollok(...) содержимое окна может быть
прокручено при помощи нижеследующих функций. (Замечание: оно будет
прокручено и в случае, если вы напечатаете новую линию, находясь на
последней линии окна, поэтому будьте осторожны со scrollok(...).)

* int scroll(win)
Эта функция прокрутит окно (и строки в структуре данных) на одну
линию вверх.

* int scrl(n)
int wscrl(win, n)
Эти функции прокрутят окно stdscr или win вверх или вниз, в
зависимости от целого n. Если n положительное, произойдет прокрутка
окна на n линий вверх, если n отрицательное - на n линий вниз.

* int setscrreg(t, b)
int wsetscrreg(win, t, b)
Устанавливают программную область прокрутки.

Следующий код объяснит, как прокручивать текст на экране. Смотри также type.c в директории примеров.

Мы хотим прокрутить текст в окне, имеющем 18 линий и 66 колонок. S[] - это массив символов с текстом. Max_s является номером последней линии в S[]. Clear_line напечатает пробелы с текущей позиции курсора до конца линии, используя текущие атрибуты окна (не A_NORMAL, как это делает clrtoeol). Beg - это последняя линия из s[], изображенная на данный момент на экране. Scroll - это перечень того, что должна сделать функция, показать NEXT или PREVious (следующую или предыдущую) линию текста.

enum{PREV,NEXT};
 
void scroll_s(WINDOW *win, int scroll)
{
   /* пробуем, должны ли мы прокрутить вниз и если что-нибудь есть,
    * то прокрутить
    */
   if((scroll==NEXT)&&(beg<=(max_s-18))){
 
   /* одна строка вниз */
      beg++;
 
   /* задаем права на прокрутку */
      scrollok(win, TRUE);
 
   /* прокручиваем */
      wscrl(win, +1);
 
   /* отклоняем права на прокрутку */
      scrollok(win, FALSE);
 
   /* устанавливаем новую строку в последней линии */
      mvwaddnstr(win,17,0,s[beg+17],66);
   /* очищаем последнюю строку от последнего символа до конца
    * строки. Иначе атрибуты не будут учтены.
    */
       clear_line(66,win);
   }
   else if((scroll==PREV)&&(beg>0)){
      beg--;
      scrollok(win, TRUE);
      wscrl(win, -1);
      scrollok(win, FALSE);
      mvwaddnstr(win,0,0,s[beg],66);
      clear_line(66,win);
   }
   wrefresh(win);
   return;
}

8.14. Заполнители

  • WINDOW *newpad(nlines, ncols)
  • WINDOW *subpad(orig, nlines, ncols, begy, begx)
  • int prefresh(pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol)
  • int pnoutrefresh(pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol)
  • int pechochar(pad, ch)

8.15. Мягкие метки (Soft-labels)

  • int slk_init(int fmt)
  • int slk_set(int labnum, char *label, int fmt)
  • int slk_refresh()
  • int slk_noutrefresh()
  • char *slk_label(int labnum)
  • int slk_clear()
  • int slk_restore()
  • int slk_touch()
  • int slk_attron(chtype attr)
    int slk_attrset(chtype attr)
    int slk_attroff(chtype attr)

Эти функции соответствуют функциям attron(attr), attrset(attr) и attroff(attr). Пока не реализованы.

8.16. Разное

  • int beep()
  • int flash()
  • char *unctrl(chtype c)
  • char *keyname(int c)
  • int filter() (Пока не реализована.)
  • void use_env(bf)
  • int putwin(WINDOW *win, FILE *filep) (Пока не реализована.)
  • WINDOW *getwin(FILE *filep) (Пока не реализована.)
  • int delay_output(int ms)
  • int flushinp

8.17. Низкоуровневый доступ

  • int def_prog_mode()
  • int def_shell_mode()
  • int reset_prog_mode()
  • int reset_shell_mode()
  • int resetty()
  • int savetty()
  • int ripoffline(int line, int (*init)(WINDOW *, int))
  • int napms(int ms)

8.18. Дамп экрана

  • int scr_dump(char *filename) (Пока не реализована.)
  • int scr_restore(char *filename) (Пока не реализована.)
  • int scr_init(char *filename) (Пока не реализована.)
  • int scr_set(char *filename) (Пока не реализована.)

8.19. Эмуляция termcap

  • int tgetent(char *bp, char *name)
  • int tgetflag(char id[2])
  • int tgetnum(char id[2])
  • char tgetstr(char id[2], char **area)
  • char tgoto(char *cap, int col, int row)
  • int tputs(char *str, int affcnt, int (*putc)())

8.20. Функции terminfo

  • int setupterm(char *term, int fildes, int *errret)
  • int setterm(char *term)
  • int set_curterm(TERMINAL *nterm)
  • int del_curterm(TERMINAL *oterm)
  • int restartterm(char *term, int fildes, int *errret) (Пока не реализована.)
  • char *tparm(char *str, p1, p2, p3, p4, p5, p6, p7, p8, p9) p1 - p9 long int.
  • int truts(char *str, int affcnt, int (*putc)(char))
  • int putp(char *str)
  • int vidputs(chtype attr, int (*putc)(char))
  • int vidsttr(chtype attr)
  • int mvcur(int oldrow, int oldcol, int newrow, int newcol)
  • int tigetflag(char *capname)
  • int tigetnum(char *capname)
  • int tigetstr(char *capname)

8.21. Функции отладки

  • void _init_trace()
  • void _tracef(char *, ...)
  • char *_traceattr(mode)
  • void traceon()
  • void traceoff()

8.22. Свойства (capabilities) terminfo
8.22.1. Логические свойства

   Переменная                  Имя    Внутр. Описание свойства  код
   auto_left_margin           bw       bw    Cub1 переносит с колонки 0 в последнюю колонку
   auto_right_margin          am       am    Границы терминала устанавливаются автоматически
   back_color_erase           bce      ut    Экран очищается с цветом фона
   can_change                 ccc      cc    Терминал может переопределять существующие цвета
   ceol_standout_glitch       xhp      xs    выделение не удаляется перезаписью (hp)
   col_addr_glith             xhpa     YA    Только положительное движение для свойств hpa/mhpa
   cpi_changes_res            cpix     YF    Изменение размеров символа изменяет разрешение<A NAME="page_138"></A>
   cr_cancels_micro_mode      crxm     YB    Использование cr отключает режим micro
   eat_newline_glitch         xenl     xn    Новая линия игнорируется после 80 столбцов (Concept)
   erase_overstrike           eo       eo    Можно забить пробелом
   generic_type               gn       gn    Общий тип линии (такой как выделенная или коммутируемая)
   hard_copy                  hc       hc    Терминал твердой копии
   hard_cursor                chts     HC    Курсор аппаратный
   has_meta_key               km       km    Имеет метаклавишу ($shift, sets parity bit$)
   has_print_wheel            daisy    YC    требуется вмешательство оператора, чтобы изменить символьную таблицу притера
   has_status_line            hs       hs    Имеет дополнительную "линию статуса"
   hue_lightness_saturation   hls      hl    Терминал использует только цветовую нотацию HLS (Tektronix)
   insert_null_glitch         in       in    Режим вставки распознает нули
   lpi_changes_res            lpix     YG    Изменение толщины линии изменяет разрешение
   memory_above               da       da    Сохранение содержимого дисплея над экраном
   memory_below               db       db    Сохранение содержимого дисплея под экраном
   move_insert_mode           mir      mi    Безопасность передвижения в режиме вставки
   move_standout_mode         msgr     ms    Безопасность передвижения в режиме выделения
   needs_xon_xoff             nxon     nx    Дозаполнение не будет работать, требуется xon/xoff
   no_esc_ctl_c               xsb      xb    $Beehive$ (f1=escape, f2=Ctrl-C)
   non_rev_rmcup              nrrmc    NR    smcup не оборачивает rmcup
   no_pad_char                npc      NP    Символ заполнения не существует
   non_dest_scroll_region     ndscr    ND    Область прокрутки ненарушаема
   over_strike                os       os    Терминал забивает символы
   prtr_silent                mc5i     5i    Принтер не создает эха на экране<A NAME="page_139"></A>
   row_addr_glitch            xvpa     YD    Только положительное движение для свойств vhp\mvpa
   semi_auto_right_margin     sam      YE    Печать в последнем столбце вызывает cr
   status_line_esc_ok         eslok    es    Escape может быть использован на линии статуса
   dest_tabs_magic_smso       xt       xt    Нарушена табуляция, magic so char (Teleray 1061)
   tilde_glitch               hz       hz    Невозможно напечатать тильды
   transparent_underline      ul       ul    Забой подчеркивания
   xon_xoff                   xon      xo    Терминал использует команды xon/xoff

8.22.2. Числа

   Переменная                  Имя    Внутр. Описание свойства   код
   bit_image_entwining        bitwin   Yo    Не документировано в SYSV
   buffer_capacity            bufsz    Ya    Буфер печати
   columns                    cols     co    Число колонок в линии
   dot_vert_spacing           spinv    Yb    Высота позиции, в pin-ах на дюйм
   dot_horz_spacing           spinh    Yc    Ширина позиции, в точках на дюйм
   init_tabs                  it       it    Табуляторы изначально каждые # позиций
   label_height               lh       lh    Линий в каждой метке
   label_width                lw       lw    Колонок в каждой метке
   lines                      lines    li    Число линий на экране или странице
   lines_of_memory            lm       lm    Число линий в памяти, 0 означает переменное
   magic_cookie_glitch        xmc      sg    Число пробелов слева от smso или rmso
   max_colors                 colors   Co    Максимальное количество цветов на экране
   max_micro_address          maddr    Yd    Максимальное значение в micro_..._adress
   max_micro_jump             mjump    Ye    Максимальное значение в<A NAME="page_140"></A>parm_..._micro
   max_pairs                  pairs    pa    Максимальное число цветовых пар на экране
   micro_col_size             mcs      Yf    Размер шага символа в режиме micro
   micro_line_size            mls      Yg    Размер шага линии в режиме micro
   no_color_video             ncv      NC    Видеоатрибуты, которые нельзя использовать с цветами
   number_of_pins             npins    Yh    Число pin-ов на головке принтера
   num_labels                 nlab     Nl    Число меток на экране
   output_res_char            orc      Yi    Горизонтальное разрешение, в единицах на линию
   output_res_line            orl      Yj    Вертикальное разрешение, в единицах на линию
   output_res_horz_inch       orhi     Yk    Горизонтальное разрешение, в единицах на дюйм
   output_res_vert_inch       orvi     Yl    Вертикальное разрешение, в единицах на дюйм
   padding_baud_rate          pb       pb    Нижняя граница, когда требуется cr/nl заполнение
   virtual_terminal           vt       vt    Номер виртуального терминала (UNIX)
   width_status_line          wsl      ms    Число колонок в линии статуса

(Следующие числовые свойства присутствуют в структуре term SYSV, но не задокументированы в man page. Комментарии взяты из заголовка этой структуры.)
   bit_image_type             bitype   Yp    Тип устройства двоичного образа
   buttons                    btns     BT    Количество кнопок мыши
   max_attributes             ma       ma    Максимальное число атрибутов, которое можно установить для терминала одновременно
   maximum_windows            wnum     MW    Максимальное число возможных окон
   print_rate                 cps      Ym    Скорость печати, в символах в секунду
   wide_char_size             widcs    Yn    Размер шага символа в режиме

двойной ширины
8.22.3. Строки

   Переменная                  Имя    Внутр. Описание свойства  код
   acs_chars                  acsc     ac    $Graphics charset pairs$ - def=vt100
   alt_scancode_esc           scesa    S8    Альтернативный esc для эмуляции $scancode$ (по умолчанию vt100)
   back_tab                   cbt      bt    Возврат табулятора (P)
   bell                       bel      bl    Слышимый сигнал (звонок) (P)
   bit_image_repeat           birep    Xy    Повторение двоичного образа ячейки #1 #2 раз (использует tparm)
   bit_image_newline          binel    Zz    Передвижение на следующую линию двоичного образа (использует tparm)
   bit_image_carriage_return  bicr     Yv    Передвижение на начало линии двоичного образа (использует tparm)
   carriage_return            cr       cr    Возврат каретки
   change_char_pitch          cpi      ZA    Изменение # символов на дюйм
   change_line_pitch          lpi      ZB    Изменение # линий на дюйм
   change_res_horz            chr      ZC    Изменение горизонтального разрешения
   change_res_vert            cvr      ZD    Изменение вертикального разрешения
   change_scroll_region       csr      cs    Изменение до #1 линий через #2 (vt100) (PG)
   char_padding               rmp      rP    Как ip, только когда в режиме вставки
   char_set_names             csnm     Zy    Список наименований символьной таблицы
   clear_all_tabs             tbc      ct    Очистка всех позиций табуляции P)
   clear_margins              mgc      MC    Очистка всех границ (верхней, нижней и сторон)


   clear_screen               clear    cl    Очистка экрана и курсор home(P*)
   clr_bol                    el1      cb    Очистка до начала линии
   clr_eol                    el       ce    Очистка до конца линии (P)
   clr_eos                    ed       cd    Очистка до конца дисплея (P*)
   code_set_init              csin     ci    Инициализация последовательности для сложных таблиц кодов
   color_names                colornm  Yw    Дать наименование для цвета #1
   column_address             hpa      ch    Установка колонки курсора (PG)
   command_character          cmdch    CC    cmd символ терминально устанавливаем в прототипе
   cursor_address             cup      cm    Показ движения курсора линия #1 колонка #2 (PG)
   cursor_down                cud1     do    Вниз на одну линию
   cursor_home                home     ho    Курсор - в начало (если не указана позиция курсора)
   cursor_invisible           civis    vi    Сделать курсор невидимым
   cursor_left                cub1     le    Передвижение курсора на одну позицию влево
   cursor_mem_address         mrcup    CM    Запоминание соответствующей адресации курсора
   cursor_normal              cnorm    ve    Придать курсору нормальную видимость (undo vs/vi)
   cursor_right               cuf1     nd    Ненарушаемое пространство (курсор вправо)
   cursor_to_ll               ll       ll    Последняя линия, первая колонка (если не указана позиция курсора)
   cursor_up                  cuu1     up    Пересылка на верхний уровень (курсор вверх)
   cursor_visible             cvvis    vs    Сделать курсор сильновидимым
   define_bit_image_region    defbi    Yx    Определение прямоугольной области двоичного образа (использует tparm)
   define_char                defc     ZE    Определение символов в символьной таблице
   delete_character           dch1     dc    Удаление символа (P*)
   delete_line                dl1      dl    Удаление линии (P*)


   device_type                devt     dv    Индикация поддержки языка/таблицы кодов
   dis_status_line            dsl      ds    Невозможна линия статуса
   display_pc_char            dispc    S1    Отображение символа ПК
   down_half_line             hd       hd    Пол-линии вниз (вперед 1/2 перевода строки)
   ena_acs                    enacs    eA    Включена альтернативная символьная таблица
   end_bit_image_region       endbi    Yy    Конец области двоичного образа (использует tparm)
   enter_alt_charset_mode     smacs    as    Начало альтернативная символьной таблицы (P)
   enter_am_mode              smam     SA    Включение автоматических границ
   enter_blink_mode           blink    mb    Включение мигания
   enter_bold_mode            bold     md    Включения суперяркого режима
   enter_ca_mode              smcup    ti    Строка начала программ, использующих позицию курсора
   enter_delete_mode          smdc     dm    Режим удаления (enter)
   enter_dim_mode             dim      mh    Включение полуяркого режима
   enter_doublewide_mode      swidm    ZF    Возможен режим двойной ширины
   enter_draft_quality        sdrfq    ZG    Установка качества печати
   enter_insert_mode          smir     im    Режим вставки (enter)
   enter_italics_mode         sitm     ZH    Возможен режим курсива
   enter_leftward_mode        slm      ZI    Возможно движение каретки влево
   enter_micro_mode           smicm    ZJ    Разблокирование возможностей микропередвижения
   enter_near_letter_quality  snlq     ZK    Установка печати NLQ
   enter_normal_quality       snrmq    ZL    Установка нормального качества печати
   enter_pc_charset_mode      smpch    S2    Ввод режима показа символов ПК
   enter_protected_mode       prot     mp    Включение защищенного режима
   enter_reverse_mode         rev      mr    Включение обратного видеорежима
   enter_scancode_mode        smsc     S4    Ввод режима scancode ПК
   enter_secure_mode          invis    mk    Включение пробельного режима (символы невидимы)
   enter_shadow_mode          sshm     ZM    Возможен режим оттененной печати
   enter_standout_mode        smso     so    Начало режима выделения
   enter_subscript_mode       ssubm    ZN    Возможна печать индекса


   enter_superscript_mode     ssupm    ZO    Возможна печать верхнего индекса
   enter_underline_mode       smul     us    Начало режима подчеркивания
   enter_upward_mode          sum      ZP    Возможно движение каретки вверх
   enter_xon_mode             smxon    SX    Включение подтверждения связи xon/xoff
   erase_chars                ech      ec    Очистка #1 символов (PG)
   exit_alt_charset_mode      rmacs    ae    Конец альтернативной символьной таблицы (P)
   exit_am_mode               rmam     RA    Отключение автоматических границ
   exit_attribute_mode        sgr0     me    Отключение всех атрибутов
   exit_ca_mode               rmcup    te    Строка конца программ, использующих позицию курсора
   exit_delete_mode           rmdc     ed    Конец режима удаления
   exit_doublewide_mode       rwidm    ZQ    Невозможна печать с двойной шириной
   exit_insert_mode           rmir     ei    Конец режима вставки
   exit_italics_mode          ritm     ZR    Невозможна печать курсивом
   exit_leftward_mode         rlm      ZS    Возможно движение каретки вправо (нормального режима)
   exit_micro_mode            rmicm    ZT    Заблокированы возможности микропередвижения
   exit_pc_charset_mode       rmpch    S3    Невозможен показ символов ПК
   exit_scancode_mode         rmsc     S5    Невозможен режим просмотра ПК
   exit_shadow_mode           rshm     ZU    Невозможна оттененная печать
   exit_standout_mode         rmso     se    Конец режима выделения
   exit_subscript_mode        rsubm    ZV    Невозможна подстрочная печать
   exit_superscript_mode      rsupm    ZW    Невозможна надстрочная печать
   exit_underline_mode        rmul     ue    Конец режима подчеркивания
   exit_upward_mode           rum      ZX    Возможно движение каретки вниз
   exit_xon_mode              rmxon    RX    Отключение подтверждения связи xon/xoff
   flash_screen               flash    vb    Видимый звонок (невозможно передвижение курсора)
   form_feed                  ff       ff    Терминал твердой копии извергает страницы (P*)
   form_status_line           fsl      fs    Возврат с линии статуса
   init_1string               is1      i1    Строка инициализации терминала
   init_2string               is2      i2    Строка инициализации терминала
   init_3string               is3      i3    Строка инициализации терминала


   init_file                  if       if    Название содержащего файла
   init_prog                  iprog    iP    Путь программы для инициализации
   initialize_color           initc    Ic    Инициализация определения цвета
   initialize_pair            initp    Ip    Инициализация цветовой пары
   insert_character           ich1     ic    Символ вставки (P)
   insert_line                il1      al    Добавление новой чистой линии (P*)
   insert_padding             ip       ip    Забивка после вставленного символа (p*)
   key_a1                     ka1      K1    Верхний левый keypad-а
   key_a3                     ka3      K3    Верхний правый keypad-а
   key_b2                     ka2      K2    Центр keypad-а
   key_backspace              kbs      kb    Послан клавишей backspace
   key_beg                    kbeg     1     Клавиша начала
   key_btab                   kcbt     kB    Клавиша назад табуляции
   key_c1                     kc1      K4    Нижний левый keypad-а
   key_c3                     kc3      K5    Нижний левый keypad-а
   key_cancel                 kcan     2     Клавиша cancel
   key_catab                  ktbc     ka    Послан клавишей очистки всей табулиции
   key_clear                  kclr     kC    Послан клавишей очистки экрана или клавишей очистки (стирания)
   key_close                  kclo     3     Клавиша close
   key_command                kcmd     4     Командная клавиша
   key_copy                   kcpy     5     Клавиша копирования
   key_create                 kcrt     6     Клавиша создания
   key_ctab                   kctab    kt    Послан клавишей очистки табулиции
   key_dc                     kdch1    kD    Послан клавишей удаления символа
   key_dl                     kdl1     kL    Послан клавишей удаления линии
   key_down                   kcud1    kd    Послан клавишей нижнего терминального массива
   key_eic                    krmir    kM    Послан клавишей rmir или smir в режиме вставки
   key_end                    kend     7     Клавиша end
   key_enter                  kent     8     Клавиша ввода/посылки
   key_eol                    kel      kE    Послан клавишей очистки до конца линии


   key_eos                    ked      kS    Послан клавишей очистки до концаэкрана
   key_exit                   kext     9     Клавиша выхода
   key_f0                     kf0      k0    Функциональная клавиша F00
   key_f1                     kf1      k1    Функциональная клавиша F01
   key_f2                     kf2      k2    Функциональная клавиша F02
   key_f3                     kf3      k3    Функциональная клавиша F03
   key_f4                     kf4      k4    Функциональная клавиша F04
   key_f5                     kf5      k5    Функциональная клавиша F05
   key_f6                     kf6      k6    Функциональная клавиша F06
   key_f7                     kf7      k7    Функциональная клавиша F07
   key_f8                     kf8      k8    Функциональная клавиша F08
   key_f9                     kf9      k9    Функциональная клавиша F09
   key_f10                    kf10     k;    Функциональная клавиша F10
   key_f11                    kf11     F1    Функциональная клавиша F11
   key_f12                    kf12     F2    Функциональная клавиша F12
   key_f13                    kf13     F3    Функциональная клавиша F13
   key_f14                    kf14     F4    Функциональная клавиша F14
   key_f15                    kf15     F5    Функциональная клавиша F15
   key_f16                    kf16     F6    Функциональная клавиша F16
   key_f17                    kf17     F7    Функциональная клавиша F17
   key_f18                    kf18     F8    Функциональная клавиша F18
   key_f19                    kf19     F9    Функциональная клавиша F19
   key_f20                    kf20     FA    функциональная клавиша F00
   key_f21                    kf21     FB    функциональная клавиша F01
   key_f22                    kf22     FC    функциональная клавиша F02
   key_f23                    kf23     FD    функциональная клавиша F03
   key_f24                    kf24     FE    функциональная клавиша F04
   key_f25                    kf25     FF    функциональная клавиша F05
   key_f26                    kf26     FG    функциональная клавиша F06
   key_f27                    kf27     FH    функциональная клавиша F07
   key_f28                    kf28     FI    функциональная клавиша F08
   key_f29                    kf29     FJ    функциональная клавиша F09
   key_f30                    kf30     FK    функциональная клавиша F10
   key_f31                    kf31     FL    функциональная клавиша F11
   key_f32                    kf32     FM    функциональная клавиша F12
   key_f33                    kf33     FN    функциональная клавиша F13
   key_f34                    kf34     FO    функциональная клавиша F14


   key_f35                    kf35     FP    функциональная клавиша F15
   key_f36                    kf36     FQ    функциональная клавиша F16
   key_f37                    kf37     FR    функциональная клавиша F17
   key_f38                    kf38     FS    функциональная клавиша F18
   key_f39                    kf39     FT    функциональная клавиша F19
   key_f40                    kf40     FU    функциональная клавиша F00
   key_f41                    kf41     FV    функциональная клавиша F01
   key_f42                    kf42     FW    функциональная клавиша F02
   key_f43                    kf43     FX    функциональная клавиша F03
   key_f44                    kf44     FY    функциональная клавиша F04
   key_f45                    kf45     FZ    функциональная клавиша F05
   key_f46                    kf46     Fa    функциональная клавиша F06
   key_f47                    kf47     Fb    функциональная клавиша F07
   key_f48                    kf48     Fc    функциональная клавиша F08
   key_f49                    kf49     Fd    функциональная клавиша F09
   key_f50                    kf50     Fe    функциональная клавиша F10
   key_f51                    kf51     Ff    функциональная клавиша F11
   key_f52                    kf52     Fg    функциональная клавиша F12
   key_f53                    kf53     Fh    функциональная клавиша F13
   key_f54                    kf54     Fi    функциональная клавиша F14
   key_f55                    kf55     Fj    функциональная клавиша F15
   key_f56                    kf56     Fk    функциональная клавиша F16
   key_f57                    kf57     Fl    функциональная клавиша F17
   key_f58                    kf58     Fm    функциональная клавиша F18
   key_f59                    kf59     Fn    функциональная клавиша F19
   key_f60                    kf60     Fo    функциональная клавиша F10
   key_f61                    kf61     Fp    функциональная клавиша F11
   key_f62                    kf62     Fq    функциональная клавиша F12
   key_f63                    kf63     Fr    функциональная клавиша F13
   key_find                   kfnd     0     клавиша поиска
   key_help                   khlp     %1    клавиша помощи
   key_home                   khome    kh    послан клавишей home
   key_ic                     kich1    kI    послан клавишей символ вставки/
                                             ввод режима вставки
   key_il                     kil1     kA    послан клавишей вставки линии
   key_left                   kcub1    kl    послан клавишей левого
                                             терминального массива
   key_ll                     kll      kH    послан клавишей home-down


   key_mark                   kmrk     %2    клавиша пометки
   key_message                kmsg     %3    клавиша сообщения
   key_move                   kmov     %4    клавиша перемещения
   key_next                   knxt     %5    клавиша следующего
   key_npage                  knp      kN    послан клавишей следующей страницы
   key_open                   kopn     %6    клавиша открывания
   key_options                kopt     %7    клавиша опций
   key_ppage                  kpp      kP    послан клавишей предыдущей страницы
   key_previous               kprv     %8    клавиша предыдущего
   key_print                  kprt     %9    клавиша печати
   key_redo                   krdo     %0    клавиша redo
   key_reference              kref     &1    клавиша ссылки
   key_refresh                krfr     &2    клавиша обновления
   key_replace                krpl     &3    клавиша перестановки
   key_restart                krst     &4    клавиша перезапуска
   key_resume                 kres     &5    клавиша возобновления работы
   key_right                  kcuf1    kr    послан клавишей стрелки враво
   key_save                   ksav     &6    клавиша сохранения
   key_sbeg                   kBEG     &9    клавиша начала в верхнем регистре
   key_scancel                kCAN     &0    клавиша cancel в верхнем регистре
   key_scommand               kCMD     *1    командная клавиша в верхнем регистре
   key_scopy                  kCPY     *2    клавиша копирования в верхнем регистре
   key_screate                kCRT     *3    клавиша создания в верхнем регистре   
   key_sdc                    kDC      *4    клавиша удаления символа в верхнем регистре
   key_sdl                    kDL      *5    клавиша удаления линии в верхнем регистре
   key_select                 kslt     *6    клавиша выделения
   key_send                   kEND     *7    клавиша конца в верхнем регистре
   key_seol                   kEOL     *8    клавиша конца строки в верхнем регистре


   key_sexit                  kEXT     *9    клавиша выхода в верхнем регистре
   key_sf                     kind     kF    послан клавишей прокрутки прямо/вниз
   key_sfind                  kFND     *0    клавиша поиска в верхнем регистре
   key_shelp                  kHLP     #1    клавиша помощи в верхнем регистре
   key_shome                  kHOM     #2    клавиша начала в верхнем  регистре
   key_sic                    kIC      #3    клавиша вставки символа в верхнем регистре
   key_sleft                  kLFT     #4    клавиша влево в верхнем регистре
   key_smessage               kMSG     %a    клавиша сообщения в верхнем регистре
   key_smove                  kMOV     %b    клавиша перемещения в верхнем регистре
   key_snext                  kNXT     %c    клавиша следующего в верхнем регистре
   key_soptions               kOPT     %d    клавиша опций в верхнем регистре
   key_sprevious              kPRV     %e    клавиша предыдущего в верхнем регистре
   key_sprint                 kPRT     %f    клавиша печати в верхнем регистре
   key_sr                     kri      kR    послан клавишей прокрутки назад/вверх
   key_sredo                  kRDO     %g    клавиша redo в верхнем регистре
   key_sreplace               kRPL     %h    клавиша перестановки в верхнем регистре
   key_sright                 kRIT     %i    клавиша вправо в верхнем регистре
   key_sresume                kRES     %j    клавиша возобновления работы в верхнем регистре
   key_ssave                  kSAV     !1    клавиша сохранения в верхнем регистре
   key_ssuspend               kSPD     !2    клавиша приостановки в верхнем регистре
   key_stab                   khts     kT    послан клавишей установки табуляции


   key_sundo                  kUND     !3    клавиша undo в верхнем регистре
   key_suspend                kspd     &7    клавиша приостановки
   key_undo                   kund     &8    клавиша undo
   key_up                     kcuu1    ku    послан клавишей вверх терминала
   keypad_local               rmkx     ke    выход из режима $"keypad transmit"$
   keypad_xmit                smkx     ks    установка режима $"keypad transmit"$ терминала
   lab_f0                     lf0      l0    метки на функциональную клавишу f0, если не f0
   lab_f1                     lf1      l1    метки на функциональную клавишу f1, если не f1
   lab_f2                     lf2      l2    метки на функциональную клавишу f2, если не f2
   lab_f3                     lf3      l3    метки на функциональную клавишу f3, если не f3
   lab_f4                     lf4      l4    метки на функциональную клавишу f4, если не f4
   lab_f5                     lf5      l5    метки на функциональную клавишу f5, если не f5
   lab_f6                     lf6      l6    метки на функциональную клавишу f6, если не f6
   lab_f7                     lf7      l7    метки на функциональную клавишу f7, если не f7
   lab_f8                     lf8      l8    метки на функциональную клавишу f8, если не f8
   lab_f9                     lf9      l9    метки на функциональную клавишу f9, если не f9
   lab_f10                    lf10     la    метки на функциональную клавишу f10, если не f10
   label_on                   smln     LO    подключение мягких меток
   label_off                  rmln     LF    отключение мягких меток
   meta_off                   rmm      mo    отключение метарежима
   meta_on                    smm      mm    включение метарежима (8-ой бит)
   micro_column_address       mhpa     ZY    как column_address для микрорегулировки
   micro_down                 mcud1    ZZ    как cursor_down для микрорегулировки


   micro_left                 mcub1    Za    как cursor_left для микрорегулировки
   micro_right                mcuf1    Zb    как cursor_right для микрорегулировки
   micro_row_address          mvpa     Zc    как row_address для микрорегулировки
   micro_up                   mcuu1    Zd    как cursor_up для микрорегулировки   newline nel      nw    новая линия (действует, как lf после cr)
   order_of_pins              porder   Ze    Соединяет программные $buts$ с pin-ами головки принтера
   orig_colors                oc       oc    Сброс всех цветовых пар
   orig_pair                  op       op    Установка цветовой пары по умолчанию, как в первоначальном варианте
   pad_char                   pad      pc    Символ-заполнитель (скорее всего null)
   parm_dch                   dch      DC    Удаление #1 символов (PG*)
   parm_delete_line           dl       DL    Удаление #1 линий (PG*)
   parm_down_cursor           cud      DO    Движение курсора вниз на #1 линий (PG*)
   parm_down_micro            mcud     Zf    Как cud для микрорегулирования
   parm_ich                   ich      IC    Вставка #1 пробельных символов (PG*)
   parm_index                 indn     SF    Прокрутка вперед #1 линий (PG)
   parm_insert_line           il       AL    Добавление #1 новых чистых линий (PG*)
   parm_left_cursor           cub      LE    Перемещение курсора влево на #1 позиций (PG)
   parm_left_micro            mcub     Zg    Как cul для микрорегулирования
   parm_right_cursor          cuf      RI    Перемещение курсора вправо на #1 позиций (PG*)
   parm_right_micro           mcuf     Zh    Как cur для микрорегулирования
   parm_rindex                rin      SR    Прокрутка назад на #1 линий (PG*)
   parm_upcursor              cuu      UP    Перемещение курсора вверх на #1 линий (PG*)
   parm_upmicro               mcuu     Zi    Как cuu для микрорегулирования<A NAME="page_152"></A>
   pkey_key                   pfkey    pk    Программная функциональная клавиша #1 для печати строки #2
   pkey_local                 pfloc    pl    Программная функциональная клавиша #1 для выполнения строки #2
   pkey_xmit                  pfx      px    Программная функциональная клавиша #1 для xmit строки #2
   pkey_plab                  pfxl     xl    Программная клавиша #1 для xmit #2 и показа #3
   plab_norm                  pln      pn    Программная метка #1 для показа строки #2
   print_screen               mc0      ps    Печать содержимого экрана
   prtr_non                   mc5p     pO    Включение принтера для #1 байт
   prtr_off                   mc4      pf    Выключение принтера
   prtr_on                    mc5      po    Включение принтера
   repeat_char                rep      rp    Повторение символа #1 #2 раз (PG*)
   req_for_input              rfi      RF    Запрос на ввод
   reset_1string              rs1      r1    Перезапуск терминала в нормальный режим
   reset_2string              rs2      r2    Перезапуск терминала в нормальный режим
   reset_3string              rs3      r3    Перезапуск терминала в нормальный режим
   reset_file                 rf       rf    Имя файла, содержащего строку перезапуска
   restore_cursor             rc       rc    Установка курсора на позицию последнего sc
   row_address                vpa      cv    Абсолютная вертикальная позиция (установка линии) (PG)
   save_cursor                sc       sc    Сохранение позиции курсора (P)
   scancode_escape            scesc    S7    Escape для эмуляции scancode
   scroll_forward             ind      sf    Прокрутка текста вверх (P)
   scroll_reverse             ri       sr    Прокрутка текста вниз (P)
   select_char_set            scs      Zj    Выбор символьной таблицы
   set0_des_seq               s0ds     s0    $Shift to codeset 0 (EUC set 0, ASCII)$
   set1_des_seq               s1ds     s1    $Shift to codeset 1$<A NAME="page_153"></A>
   set2_des_seq               s2ds     s2    $Shift to codeset 2$
   set3_des_seq               s3ds     s3    $Shift to codeset 3$
   set_a_background           setab    AB    Установка цвета заднего плана, используя ANSI escape
   set_a_foreground           setaf    AF    Установка цвета переднего плана, используя ANSI escape
   set_attributes             sgr      sa    Установка видеоатрибутов (PG9)
   set_background             setb     Sb    Установка текущего цвета заднего плана
   set_bottom_margin          smgb     Zk    Объявление текущей линии нижней границей
   set_bottom_margin_parm     smgbp    Zl    Линии на расстоянии #1 или #2 от нижней границы объявляются нижней границей
   set_color_band             setcolor Yz    Установить текущим цвет #1
   set_color_pair             scp      sp    Установка текущей цветовой пары
   set_foreground             setf     Sf    Установка текущего цвета переднего плана
   set_left_margin            smgl     ML    Установка текущей колонки как левой границы
   set_left_margin_parm       smglp    Zm    Установка левой (правой) границы на #1 (#2)
   set_lr_margin              smglr    ML    Установка левой и правой границ
   set_page_lingth            slines   YZ    Установка длины страницы в #1 линий (используйте tparm)
   set_right_margin           smgr     MR    Установка текущей колонки как правой границы
   set_right_margin_parm      smgrp    Zn    Установка колонки #1 как правой границы
   set_tab                    hts      st    Установка табуляций на всех линиях в текущей колонке
   set_tb_margin              smgtb    MT    Установка верхней и нижней границ
   set_top_margin             smgt     Zo    Установка текущей линии как верхней границы
   set_top_margin_parm        smgtp    Zp    Установка линии #1 как верхней границы
   set_window                 wind     wi    Текущее окно - это линии #1-#2, колонки #3-#4<A NAME="page_154"></A>
   start_bit_image            sbim     Zq    Начало печати bit image
   start_char_set_def         scsd     Zr    Начало определения символьной таблицы
   stop_bit_image             rbim     Zs    Конец печати bit image
   stop_char_set_def          rcsd     Zt    Конец определения символьной таблицы
   subscript_characters       subcs    Zu    Список подстрочных символов
   superscript_characters     supcs    Zv    Список надстрочных символов
   tab                        ht       ta    Табуляция на 8 следующих позиций
   these_cause_cr             docr     Zw    Данные символы вызывают CR
   to_status_line             tsl      ts    Переход на линию статуса, первую колонку
   underline_char             uc       uc    Подчеркнуть символ и встать после него
   up_half_line               hu       hu    Передвижение на 1/2 содержимого линии
   xoff_character             xoffc    XF    символ XOFF
   xon_character              xonc     XN    символ XON

(Следующие числовые свойства присутствуют в структуре term SYSV, но не задокументированы в man page. Комментарии взяты из заголовка этой структуры.)
   label_format               fln      Lf     ??
   set_clock                  sclk     SC     Установка времени дня
   display_clock              dclk     DK     Вывод времени дня на экран
   remove_clock               rmclk    RC     Удаление времени дня ??
   create_window              cwin     CW     Определение окна #1 с параметрами от #2, #3 до #4 #5
   goto_window                wingo    WG     Переход в окно #1
   hangup                     hup      HU     Положить трубку телефона
   dial_phone                 dial     DI     Набрать номер телефона #1
   quick_dial                 qdial    QD     Набрать номер телефона #1 без дальнейшего повторения
   tone                       tone     TO     Выбрать длинные гудки
   pulse                      pulse    PU     Выбрать короткие гудки
   flash_hook                 hook     fh     Нажать телефонную клавишу
   fixed_pause                pause    PA     Пауза на 2-3 секунды<A NAME="page_155"></A>
   wait_tone                  wait     WA     Ожидание ответного сигнала
   user0                      u0       u0     Пользовательская строка #0
   user1                      u1       u1     Пользовательская строка #1
   user2                      u2       u2     Пользовательская строка #2
   user3                      u3       u3     Пользовательская строка #3
   user4                      u4       u4     Пользовательская строка #4
   user5                      u5       u5     Пользовательская строка #5
   user6                      u6       u6     Пользовательская строка #6
   user7                      u7       u7     Пользовательская строка #7
   user8                      u8       u8     Пользовательская строка # 8
   user9                      u9       u9     Пользовательская строка # 9
   get_mouse                  getm     Gm     Curses должна предоставить события от мыши
   key_mouse                  kmous    Km     ??
   mouse_info                 minfo    Mi     Информация о состоянии мыши
   pc_term_options            pctrm    S6     Опции терминала ПК
   req_mouse_pos              reqmp    RQ     Требование отчета о позиции мыши
   zero_motion                zerom    Zx     Следующий символ не двигается

8.23. Обзор функций [n]curses
В следующем тексте вы найдете обзор различных пакетов (n)curses. Первая колонка содержит bsd-curses (в версии 2.1.0 и в SunOS 4.x), во второй колонке - sysv-curses (в SunOS 5.4 / Solaris 2), наконец, третья колонка - это (n)curses. В четвертой колонке содержится ссылка на страницу данного руководства, где описывается эта функция.

x - пакет содержит эту функцию
n - функция пока не реализована

Функция                 BSD   SYSV  Nc. Страница
 
_init_trace()                       x   118
_traceattr(mode)                    x   118
_tracef(char *, ...)                x   118
addbytes(...)           x
addch(ch)               x     x     x   96
addchnstr(...)                x     x   96
addchstr(chstr)               x     x   96
addnstr(...)                  x     x   96


addnwstr(...)                 x
addstr(str)             x     x     x   96
addwch(...)                   x
addwchnstr(...)               x
addwchstr(...)                x
addwstr(...)                  x
adjcurspos()                  x
attroff(attr)                 x     x   110
attron(attr)                  x     x   110
attrset(attr)                 x     x   110
baudrate()              x     x     x   103
beep()                        x     x   115
bkgd(ch)                      x     x   100
bkgdset(ch)                   x     x   98
border(...)                   x     x   98
box(...)                x     x     x   98
can_change_color()            x     x   110
cbreak()                x     x     x   102
clear()                 x     x     x   107
clearok(...)            x     x     x   102
clrtobot()              x     x     x   107
clrtoeol()              x     x     x   107
color_content(...)            x     x   111
copywin(...)                  x     x   96
crmode()                x     x     x   102
curs_set(bf)                  x     x   112
curserr()                     x
def_prog_mode()               x     x   116
def_shell_mode()              x     x   116
del_curterm(...)              x     x   117
delay_output(ms)              x     x   115
delch()                 x     x     x   98
deleteln()              x     x     x   98
delscreen(...)                x     x,n 93
delwin(win)             x     x     x   95
derwin(...)                   x     x   95
doupdate()                    x     x   107
drainio(int)                  x


dupwin(win)                   x     x   95
echo()                  x     x     x   103
echochar(ch)                  x     x   96
echowchar(ch)                 x
endwin()                x     x     x   93
erase()                 x     x     x   106
erasechar()             x     x     x   104
filter()                      x     x   115
flash()                       x     x   115
flushinp()                    x     x   115
flushok(...)            x
garbagedlines(...)            x
garbagedwin(win)              x
getattrs(win)                 x     x   110
getbegyx(...)                 x     x   112
getbkgd(win)                  x
getbmap()                     x
getcap(str)             x
getch()                 x     x     x   100
getmaxx(win)                  x     x   112
getmaxy(win)                  x     x   112
getmaxyx(...)                 x     x   112
getmouse()                    x
getnwstr(...)                 x
getparyx(...)                 x     x   112
getstr(str)             x     x     x   100
getsyx(...)                   x     x   112
gettmode()              x     x
getwch(...)                   x
getwin(...)                   x
getwin(FILE *)                x     x,n 115
getwstr(...)                  x
getyx(...)              x     x     x   112
halfdelay(t)                  x     x   103
has_colors()                  x     x   110
has_ic()                      x     x,n 104
has_il()                      x     x,n 104
hline(...)                    x     x   98


idcok(...)                    x     x,n 101
idlok(...)              x     x     x   101
immedok(...)                  x     x   101
inch()                  x     x     x   100
inchnstr(...)                 x     x,n 101
inchstr(...)                  x     x,n 101
init_color(...)               x     x   111
init_pair(...)                x     x   110
initscr()               x     x     x   92
innstr(...)                   x     x,n 101
innwstr(...)                  x
insch(c)                x     x     x   97
insdelln(n)                   x     x   97
insertln()              x     x     x   97
insnstr(...)                  x     x   97
insstr(str)                   x     x   97
instr(str)                    x     x,n 101
inswch(...)                   x
inswstr(...)                  x
intrflush(...)                x     x   103
inwch(...)                    x
inwchnstr(...)                x
inwchstr(...)                 x
inwchstr(...)                 x
inwstr(...)                   x
is_linetouched(...)           x     x   108
is_wintouched(win)            x     x   108
isendwin()                    x     x   93
keyname(c)                    x     x   115
keypad(...)                   x     x   102
killchar()              x     x     x   104
leaveok(...)            x     x     x   102
longname()              x     x     x   104
map_button(long)              x
meta(...)                     x     x   102
mouse_off(long)               x
mouse_on(long)                x
mouse_set(long)               x


move(...)               x     x     x   112
movenextch()                  x
moveprevch()                  x
mvaddbytes(...)         x
mvaddch(...)            x     x     x   96
mvaddchnstr(...)              x     x   96
mvaddchstr(...)               x     x   96
mvaddnstr(...)                x     x   96
mvaddnwstr(...)               x
mvaddstr(...)           x     x     x   96
mvaddwch(...)                 x
mvaddwchnstr(...)             x
mvaddwchstr(...)              x
mvaddwstr(...)                x
mvcur(...)              x     x     x   117
mvdelch(...)            x     x     x   98
mvderwin(...)                 x     x,n 95
mvgetch(...)            x     x     x   100
mvgetnwstr(...)               x
mvgetstr(...)           x     x     x   100
mvgetwch(...)                 x
mvgetwstr(...)                x
mvhline(...)                  x
mvinch(...)             x     x     x   100
mvinchnstr(...)               x     x,n 101
mvinchstr(...)                x     x,n 101
mvinnstr(...)                 x     x,n 101
mvinnwstr(...)                x
mvinsch(...)            x     x     x   97
mvinsnstr(...)                x     x   97
mvinsnwstr(...)               x
mvinsstr(...)                 x     x   97
mvinstr(...)                  x     x,n 101
mvinswch(...)                 x
mvinswstr(...)                x
mvinwch(...)                  x
mvinwchnstr(...)              x
mvinwchstr(...)               x


mvinwstr(...)                 x
mvprintw(...)           x     x     x   97
mvscanw(...)            x     x     x   101
mvvline(...)                  x
mvwaddbytes(...)        x
mvwaddch(...)           x     x     x   96
mvwaddchnstr(...)             x     x   96
mvwaddchstr(...)              x     x   96
mvwaddnstr(...)               x     x   96
mvwaddnwstr(...)              x
mvwaddstr(...)          x     x     x   96
mvwaddwch(...)                x
mvwaddwchnstr(...)            x
mvwaddwchstr(...)             x
mvwaddwstr(...)               x
mvwdelch(...)           x     x     x   98
mvwgetch(...)           x     x     x   100
mvwgetnwstr(...)              x
mvwgetstr(...)          x     x     x   100
mvwgetwch(...)                x
mvwgetwstr(...)               x
mvwhline(...)                 x
mvwin(...)              x     x     x   95
mvwinch(...)            x     x     x   100
mvwinchnstr(...)              x     x,n 101
mvwinchstr(...)               x     x,n 101
mvwinnstr(...)                x     x,n 101
mvwinnwstr(...)               x
mvwinsch(...)           x     x     x   97
mvwinsnstr(...)               x     x   97
mvwinsstr(...)                x     x   97
mvwinstr(...)                 x     x,n 101
mvwinswch(...)                x
mvwinswstr(...)               x
mvwinwch(...)                 x
mvwinwchnstr(...)             x
mvwinwchstr(...)              x
mvwinwstr(...)                x


mvwprintw(...)          x     x     x   97
mvwscanw(...)           x     x     x   101
mvwvline(...)                 x
napms(ms)                     x     x   116
newkey(...)                   x
newpad(...)                   x     x   114
newscreen(...)                x
newterm(...)                  x     x   92
newwin(...)             x     x     x   93
nl()                    x     x     x   102
nocbreak()              x     x     x   102
nocrmode()              x     x     x   102
nodelay(...)                  x     x   103
noecho()                x     x     x   103
nonl()                  x     x     x   102
noqiflush()                   x     x,n 103
noraw()                 x     x     x   103
notimeout(...)                x     x   103
overlay(...)            x     x     x   95
overwrite(...)          x     x     x   95
pair_content(...)             x     x   111
pechochar(...)                x     x   114
pechowchar(...)               x
pnoutrefresh(...)             x     x   114
prefresh(...)                 x     x   114
printw(...)             x     x     x   97
putp(char *)                  x     x   117
putwin(...)                   x     x,n 115
qiflush()                     x     x,n 103
raw()                   x     x     x   103
redrawwin(win)                x     x   108
refresh()               x     x     x   107
request_mouse_pos()           x
reset_prog_mode()             x     x   116
reset_shell_mode()            x     x   116
resetty()               x     x     x   116
restartterm(...)              x     x,n 117
ripoffline(...)               x     x   116


savetty()               x     x     x   116
scanw(...)              x     x     x   101
scr_dump(char *)              x     x,n 116
scr_init(char *)              x     x,n 116
scr_restore(char *)           x     x,n 116
scr_set(char *)               x     x,n 116
scrl(n)                       x     x   113
scroll(win)             x     x     x   113
scrollok(...)           x     x     x   112
set_curterm(...)              x     x   117
set_term(...)                 x     x   93
setcurscreen(SCREEN *)        x
setscrreg(...)                x     x   113
setsyx(...)                   x     x   112
setterm(char *)         x     x     x   117
setupterm(...)                x     x   117
slk_attroff(attr)             x     x,n 115
slk_attron(attr)              x     x,n 115
slk_attrset(attr)             x     x,n 115
slk_clear()                   x     x   115
slk_init(fmt)                 x     x   114
slk_label(labnum)             x     x   115
slk_noutrefresh()             x     x   114
slk_refresh()                 x     x   114
slk_restore()                 x     x   115
slk_set(...)                  x     x   114
slk_touch()                   x     x   115
standend()              x     x     x   110
standout()              x     x     x   110
start_color()                 x     x   110
subpad(...)                   x     x   114
subwin(...)             x     x     x   95
syncok(...)                   x     x,n 95
--------------------------------------------------------------
termattrs()                   x     x,n 104
termname()                    x     x,n 104
tgetent(...)                  x     x   116
tgetflag(char [2])            x     x   116


tgetnum(char [2])             x     x   116
tgetstr(...)                  x     x   117
tgoto(...)                    x     x   117
tigetflag(...)                x     x   117
tigetnum(...)                 x     x   117
tigetstr(...)                 x     x   117
timeout(t)                    x     x   103
touchline(...)          x     x     x   108
touchwin(win)           x     x     x   108
tparm(...)                    x     x   117
tputs(...)                          x   117
traceoff()                    x     x   118
traceon()                     x     x   118
typeahead(fd)                 x     x   103
unctrl(chtype c)              x     x   115
ungetch(ch)                   x     x   100
ungetwch(c)                   x
untouchwin(win)               x     x   108
use_env(bf)                   x     x   115
vidattr(...)                  x     x   117
vidputs(...)                  x     x   117
vidupdate(...)                x
vline(...)                    x     x   98
vwprintw(...)                 x     x   97
vwscanw(...)                  x     x   101
waddbytes(...)          x
waddch(...)             x     x     x   96
waddchnstr(...)               x     x   96
waddchstr(...)                x     x   96
waddnstr(...)                 x     x   96
waddnwstr(...)                x
waddstr(...)            x     x     x   96
waddwch(...)                  x
waddwchnstr(...)              x
waddwchstr(...)               x
waddwstr(...)                 x
wadjcurspos(win)              x
wattroff(...)                 x     x   110


wattron(...)                  x     x   110
wattrset(...)                 x     x   110
wbkgd(...)                    x     x   100
wbkgdset(...)                 x     x   98
wborder(...)                  x     x   98
wclear(win)             x     x     x   107
wclrtobot(win)          x     x     x   107
wclrtoeol(win)          x     x     x   107
wcursyncup(win)               x     x,n 95
wdelch(win)             x     x     x   98
wdeleteln(win)          x     x     x   98
wechochar(...)                x     x   96
wechowchar(...)               x
werase(win)             x     x     x   106
wgetch(win)             x     x     x   100
wgetnstr(...)                 x     x   100
wgetnwstr(...)                x
wgetstr(...)            x     x     x   100
wgetwch(...)                  x
wgetwstr(...)                 x
whline()                      x
whline(...)                   x
whline(...)                   x     x   98
winch(win)              x     x     x   100
winchnstr(...)                x     x,n 101
winchstr(...)                 x     x,n 101
winnstr(...)                  x     x,n 101
winnwstr(...)                 x
winsch(...)             x     x     x   97
winsdelln(...)          x     x     x   97
winsertln(win)                x     x   97
winsnstr(...)                 x     x   97
winsnwstr(...)                x
winsstr(...)                  x     x   97
winstr(...)                   x     x,n 101
winswch(...)                  x
winswstr(...)                 x
winwch(...)                   x

winwchnstr(...)               x
winwchstr(...)                x
winwstr(...)                  x
wmouse_position(...)          x
wmove(...)              x     x     x   112
wmovenextch(win)              x
wmoveprevch(win)              x
wnoutrefresh(win)             x     x   107
wprintw(...)            x     x     x   97
wredrawln(...)                x     x   108
wrefresh(win)           x     x     x   107
wscanw(...)             x     x     x   101
wscrl(...)                    x     x   113
wsetscrreg(...)               x     x   113
wstandend(win)          x     x     x   110
wstandout(win)          x     x     x   110
wsyncdown(win)                x     x,n 95
wsyncup(win)                  x     x,n 95
wtimeout(...)                 x     x   103
wtouchln(...)                 x     x   108
wvline()                      x
wvline(...)                   x
wvline(...)                   x     x   98
 
   To be continued...