Библиотека сайта rus-linux.net
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 database
База данных 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.2 Библиотека termcap
- 8.3 Введение в ncurses
- 8.4 Инициализация
- 8.5 Окна
- 8.6 Вывод
- 8.7 Ввод
- 8.8 Опции
- 8.9 Очистка окна и линий
- 8.10 Обновление терминала
- 8.11 Видеоатрибуты и цвет
- 8.12 Координаты курсора и окна
- 8.13 Прокрутка
- 8.14 Заполнители
- 8.15 Мягкие метки
- 8.16 Разное
- 8.17 Низкоуровневый доступ
- 8.18 Дамп экрана
- 8.19 Эмуляция termcap
- 8.20 Функции terminfo
- 8.21 Функции отладки
- 8.22 Свойства terminfo
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
.
Символ | Форматируется в |
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 * |
% | % |
Таблица 8.1: Libc: трансформации printf
8.1.2 Форматированный ввод
Точно так же, как printf(...) для форматированного вывода, Вы можете использовать scanf(...) для форматированного ввода.
int fscanf(FILE *stream, const char *format, ...)
fscanf(...) читает из stream и преобразует ввод по правилам, определяемым вformat
. Результаты помещаются в аргументы, заданные в"..."
(эти аргументы должны быть указателями!). Чтение заканчивается, когда вformat
исчерпаны правила форматирования. 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
.Символ Вход: тип аргумента 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* % %
Таблица 8.2: Libc: правила scanf
перед d,i,n,o,u,x может стоять h, если указатель short
то же для l, если указатель long
l также может быть перед e,f,g, если указатель double
L может стоять перед e,f,g, если указатель long double
8.2 Библиотека termcap
8.2.1 Введение
Библиотека termcap это API для базы данных termcap, которая находится в /etc/termcap. Библиотечные функции позволяют:
- получить описание текущего терминала: tgetent(...).
- найти описание для информации: tgetnum(...), tgetflag(...), tgetstr(...).
- Представить числовые параметры в форме, специфичной для терминала: tparam(...), tgoto(...).
- вычислить и произвести поточечный вывод: 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. Другие ошибки возвращают различные значения.
Следующий пример объясняет как использовать tgetent(...):
#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 установка табуляции
Каждое свойство связано с единственным типом значений (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 сделать все за вас.
8.2.4 Свойства termcap
Boolean
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 | сбой телевизионного луча, неверная табуляция и странный режим выделения |
Numeric
co | число столбцов |
dB | приостановка на милисекунды для возврата на терминалах твердой копии |
dC | приостановка на милисекунды для перевода каретки на терминалах твердой копии |
dF | приостановка на милисекунды для заполнения страницы на терминалах твердой копии |
dN | приостановка на милисекунды для новой линии на терминалах твердой копии |
dT | приостановка на милисекунды для табуляции на терминалах твердой копии |
dV | приостановка на милисекунды для вертикальной табуляции на терминалах твердой копии |
it | раница между позициями табуляции |
lh | высота мягких меток |
lm | линии памяти |
lw | ширина |
li | число линий |
Nl | число мягких меток |
pb | наименьшая граница, когда требуется дозаполнение |
sg | сбой режима выделения |
ug | сбой режима подчеркивания |
vt | номер виртуального терминала |
ws | ширина линии статуса, если она отлична от ширины экрана |
String
!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: true flag, 1
- bool FALSE: false flag, 0
- int ERR: error flag, -1
- int OK: ok flag, 0
- Функции: в описаниях функций аргументы будут следующих типов:
- win - WINDOW*
- bf - bool
- ch - chtype
- str - char*
- chstr - chtype*
- fmt - char*
- otherwise int
Обычно программа, использующая ncurses, выглядит так:
#include <ncurses.h> ... 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 скажет 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 (в slackware 2.1.0 в пакете bsd).
Структуры данных для экрана называются 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).0 begx | | 0 | | COLS - - - - -------|-------------------------|-------> | | ncols | begy | |<. . . . . . . . . . . .>| - - - -|- - - -|-------------------------| | ^| | | .| | | .| | |nlines.| newwin(nlines, ncols, | | .| begy, begx) | | v| | |- - - -|-------------------------| LINES | v
Рисунок 8.1: Ncurses: схема для newwin
Верхний левый угол нашего окна находится в строке 10 в колонке 10; окно имеет 10 строк и 60 колонок. Если
nlines
равна нулю, окно будет иметь (LINES-begy) строк. Точно так же, еслиncols
равна нулю, то окно будет иметь (COLS-begx) колонок.Когда мы вызываем newwin(...) с нулевыми аргументами:
WINDOW *mywin; mywin=newwin(0,0,0,0);
открытое окно получает размеры экрана.При помощи
LINES
иCOLS
мы можем открыть окно на середине экрана, какую бы размерность оно ни имело:#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 колонок, но на Х-терминалах это может не выполняться (их размеры изменяемы).
С другой стороны, используйте
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 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
в окно или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 ("blafoo\
0"). Функции, начинающиеся с w, заносятstr
в окноwin
, остальные в stdscr. Функции сn
пишутn
символов строкиstr
. Еслиn
равен -1, будет записана вся строкаstr
.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-нут с каждым непробельным символом окна. Фон становится частью окна и не изменяется при прокрутке и вводе/выводе.int bkgd(ch)
int wbkgd(win, ch)
Установит вch
фоновый символ и атрибут.
Код символа | Позиция | По умолчанию |
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.3: Ограничительные символы Ncurses
Рисунок 8.2: Символы бокса в ncurses.
tl ts tt ts tr |------------|------------| | | ls| | |rs | | | | | lt|- - - - - - - - - - - - -|rt | | | | | ls| | |rs | | |------------|------------| bl bs bt bs br
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(...) для символов).void immedok(win, bf)
Если устанавливается TRUE, то каждое изменение в окнеwin
вызывает физическое обновление экрана. Это может ухудшить характеристики программы, поэтому значение по умолчанию FALSE.int clearok(win, bf)
Еслиbf
равен TRUE, то следующий вызовwrefresh(win)
очистит экран и полностью его перерисует (Ctrl+L в редакторе vi).int leaveok(win, bf)
По умолчанию ncurses ставит курсор там, где он был при последнем обновлении окна. Программы, не использующие курсор, могут установить leaveok(...) TRUE и сэкономить время, требующееся для движения курсора.int nl()
int nonl()
Управление переходом на новую строку. После nl() произойдетт возврат каретки и дозаполнение; nonl() отключает контроль. В последнем случае ncurses может ускорить перемещение курсора.
8.8.1 Опции ввода
int keypad(win, bf)
TRUE активизирует keypad на клавиатуре во время ожидания ввода. Для функциональных клавиш и стрелок keypad ncurses вернет код клавиши, определенный как KEY_* в ncurses.h. Это очень удобно для клавиатуры ПК, потому что вы имеете возможность и пользоваться цифровым блоком, и перемещать курсор.int meta(win, bf)
Если TRUE, то коды клавиш, возвращаемые getch(), 7-битовые (верхний бит не учитывается).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.
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()
Указатель предоставляет доступ к описанию текущего терминала.char *termname()
Возвращает содержимое TERM из пользовательской среды.
8.8.3 Использование опций
Поговорим об использовании опций окна и режимов терминала.
Прежде всего, под Linux следует подключить keypad. Это позволит пользоваться цифровым блоком и клавишами перемещения курсора на клавиатуре ПК.
Теперь имеется 2 основных типа ввода:
- Программа ожидает нажатия клавиши, чтобы вызвать соответствующую функцию (например, что-нибудь вроде "press 'q' for quit" и ждет q);
- Ожидается, что пользователь введет строку символов в маску на экране (например, каталог или адрес в базе данных).
Для первого случая мы установим следующие опции и режимы, и цикл 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 doupdate()
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.11 Видеоатрибуты и цвет
Атрибуты это специальные возможности терминала, применяемые во время печати символов на экран. Символы могут быть напечататы жирно, могут быть подчеркнуты, могут мигать и т.д. В 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 |
Ncurses определяет 8 цветов, которыми вы можете пользоваться на терминале с цветовой поддержкой. Сначала проинициализируйте цветовые структуры данных посредством start_color(), затем проверьте возможности терминала при помощи has_colors(). start_color() будет инициализировать COLORS, наибольшее количество цветов, поддерживаемых терминалом, и COLOR_PAIR, максимальное число цветовых пар, которые вы можете определить.
Определение | Цвет |
COLOR_BLACK | черный |
COLOR_RED | красный |
COLOR_GREEN | зеленый |
COLOR_YELLOW | желтый |
COLOR_BLUE | синий |
COLOR_MAGENTA | пурпурный |
COLOR_CYAN | голубой |
COLOR_WHITE | белый |
Атрибуты могут быть совмещены '|' (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. Для функций ввода/вывода определяются дополнительные макросы, передвигающие курсор перед вызовом данных функций.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.
int curs_set(bf)
Переключает видимость/невидимость курсора, если терминал имеет такую возможность.
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 Мягкие метки
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) and 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))
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 tputs(char *str, int affcnt, int (*putc)(char))
int putp(char *str)
int vidputs(chtype attr, int (*putc)(char))
int vidattr(chtype attr)
int mvcur(int oldrow, int oldcol, int newrow, int newcol)
int tigetnum(char *capname)
int tigetstr(char *capname)
8.21 Функции отладки
8.22 Свойства terminfo
8.22.1 Boolean
Переменная | Имя свойства | Внутренний код | Описание |
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 | Изменение размеров символа изменяет разрешение |
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 | Принтер не создает эха на экране |
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 Numbers
Переменная | Имя свойства | Внутренний код | Описание |
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/TD> | lm | Число линий в памяти, 0 означает переменное |
magic_cookie_glitch | xmc/TD> | sg/TD> | Число пробелов слева от smso или rmso |
max_colors | colors/TD> | Co | Максимальное количество цветов на экране |
max_micro_address | maddr | Yd | Максимальное значение в micro_..._adress |
max_micro_jump | mjump | Ye | Максимальное значение в 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 | Число колонок в строке статуса |
bit_image_type | bitype | Yp | Тип устройства двоичного образа |
buttons | tns | BT | Количество кнопок мыши |
max_attributes | ma | ma | Максимальное число атрибутов, которое можно установить для терминала одновременно |
maximum_windows | wnum | MW | Максимальное число возможных окон |
print_rate | cps | Ym | Скорость печати, в символах в секунду |
wide_char_size | widcs | Yn | Размер шага символа в режиме двойной ширины |
Последние шесть числовых свойств присутствуют в структуре term SYSV, но не задокументированы в man page. Комментарии взяты из заголовка этой структуры.
8.22.3 Strings
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 для микрорегулирования | |
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$ | |
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 | |
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 секунды |
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 | Следующий символ не двигается |
Converted on:
Fri Mar 29 14:43:04 EST 1996