CURSES(3X) CURSES(3X) НАЗВАНИЕ curses - пакет подпрограмм управления выводом на терми- нал ПРИМЕЧАНИЯ Описание пакета curses устроено не совсем обычно. В разделе СИНТАКСИС дается информация о компиляции, сводка имен аргументов процедур пакета и их типов, а также алфавитный указатель процедур пакета и их аргу- ментов. В разделе ОПИСАНИЕ рассказывается о том, как нужно ис- пользовать пакет curses. В разделе ПРОЦЕДУРЫ приводится описание всех процедур пакета curses, процедуры при этом сгруппированы по сле- дующим темам: управление всем экраном управление окнами вывод ввод установка режимов вывода установка режимов ввода запросы к оборудованию программируемые метки процедуры нижнего уровня процедуры уровня terminfo эмуляция termcap дополнительные процедуры использование curscr Затем идут разделы АТРИБУТЫ, ФУНКЦИОНАЛЬНЫЕ КЛАВИШИ, ПСЕВДОГРАФИКА. СИНТАКСИС |cc [опция ...] файл ... -lcurses [библиотека ...] |#include (автоматически включает , и ) Ниже описаны аргументы процедур пакета curses, некото- рые глобальные переменные, а затем сами процедуры. Все процедуры пакета, если не оговорено противное, возвра- щают значения ERR или OK типа int. В случае ошибки ре- зультат процедур, возвращающих значения-указатели, ра- вен NULL. (Константы ERR, OK и NULL определяются во включаемом файле .) bool bf char **area, *boolnames [ ], *boolcodes [ ], *boolfnames [ ], *bp char *cap, *capname, *codename [2], erasechar, *filename, *fmt char *keyname, killchar, *label, *longname char *name, *numnames [ ], *numcodes [ ], *numfnames [ ] char *slk_label, *str, *strnames [ ], *strcodes [ ], strfnames [ ] char *term, *tgetstr, *tigetstr, *tgoto, *tparm, *type chtype attrs, ch, horch, vertch FILE *infd, *outfd int begin_x, begin_y, begline, bot, c, col, count int dmaxcol, dmaxrow, dmincol, dminrow, *erret, fildes int (*init ( )), labfmt, labnum, line int ms, ncols, new, newcol, newrow, nlines, numlines int oldcol, oldrow, overlay int p1, p2, p3, p4, p5, p6, p7, p8, p9 int pmincol, pminrow, (*putc ( )), row int smaxcol, smaxrow, smincol, sminrow, startrow int tenths, top, visibility, x, y SCREEN *new, *newterm, *set_term TERMINAL *cur_term, *nterm, *oterm va_list varglist WINDOW *curscr, *dstwin, *initscr, *newpad, *newwin, *orig WINDOW *pad, *srcwin, *stdscr, *subpad, *subwin, *win addch (ch) addstr (str) attroff (attrs) attron (attrs) attrset (attrs) baudrate ( ) beep ( ) box (win, vertch, horch) cbreak ( ) clear ( ) clearok (win, bf) clrtobot ( ) clrtoeol ( ) copywin (srcwin, dstwin, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol, overlay) curs_set (visibility) def_prog_mode ( ) def_shell_mode ( ) del_curterm (oterm) delay_output (ms) delch ( ) deleteln ( ) delwin (win) doupdate ( ) draino (ms) echo ( ) echochar (ch) endwin ( ) erase ( ) erasechar ( ) filter ( ) flash ( ) flushinp ( ) garbagedlines (win, begline, numlines) getbegyx (win, y, x) getch ( ) getmaxyx (win, y, x) getstr (str) getsyx (y, x) getyx (win, y, x) halfdelay (tenths) has_ic ( ) has_il ( ) idlok (win, bf) inch ( ) initscr ( ) insch (ch) insertln intrflush (win, bf) isendwin ( ) keyname (c) keypad (win, bf) killchar ( ) leaveok (win, bf) longname ( ) meta (win, bf) move (y, x) mvaddch (y, x, ch) mvaddstr (y, x, str mvcur (oldrow, oldcol, newrow, newcol) mvdelch (y, x) mvgetch (y, x) mvgetstr (y, x, str) mvinch (y, x) mvinsch (y, x, ch mvprintw (y, x, fmt[, arg...]) mvscanw (y, x, fmt[, arg...]) mvwaddch (win, y, x, ch) mvwaddstr (win, y, x, str) mvwdelch (win, y, x) mvwgetch (win, y, x) mvwgetstr (win, y, x, str) mvwin (win, y, x) mvwinch (win, y, x) mvwinsch (win, y, x, ch) mvwprintw (win, y, x, fmt[, arg...]) mvwscanw (win, y, x, fmt[, arg...]) napms (ms) newpad (nlines, ncols) newterm (type, outfd, infd) newwin (nlines, ncols, begin_y, begin_x) nl ( ) nocbreak ( ) nodelay (win, bf) noecho ( ) nonl ( ) noraw ( ) notimeout (win, bf) overlay (srcwin, dstwin) overwrite (srcwin, dstwin) pechochar (pad, ch) pnoutrefresh (pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol) prefresh (pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol) printw (fmt[, arg...]) putp (str) raw ( ) refresh ( ) reset_prog_mode ( ) reset_shell_mode ( ) resetty ( ) restartterm (term, fildes, erret) ripoffline (line, init) savetty ( ) scanw (fmt[, arg...]) scr_dump (filename) scr_init (filename) scr_restore (filename) scroll (win) scrollok (win, bf) set_curterm (nterm set_term (new) setscrreg (top, bot) setsyx (y, x) setupterm (term, fildes, erret) slk_clear ( ) slk_init (labfmt) slk_label (labnum) slk_noutrefresh ( ) slk_refresh ( ) slk_restore ( ) slk_set (labnum, label, fmt) slk_touch ( ) standend ( ) standout ( ) subpad (orig, nlines, ncols, begin_y, begin_x) subwin (orig, nlines, ncols, begin_y, begin_x) tgetent (bp, name) tgetflag (codename) tgetnum (codename) tgetstr (codename, area) tgoto (cap, col, row) tigetflag (capname) tigetnum (capname tigetstr (capname) touchline (win, startrow, count) touchwin (win) tparm (str, p1, p2, p3, p4, p5, p6, p7, p8, p9) tputs (str, count, putc) traceoff ( ) traceon ( ) typeahead (fildes unctrl (c) ungetch (c) vidattr (attrs vidputs (attrs, putc) vwprintw (win, fmt, varglist) vwscanw (win, fmt, varglist) waddch (win, ch) waddstr (win, str) wattroff (win, attrs) wattron (win, attrs) wattrset (win, attrs) wclear (win) wclrtobot (win) wclrtoeol (win) wdelch (win) wdeleteln (win) wechochar (win, ch) werase (win) wgetch (win) wgetstr (win, str) winch (win) winsch (win, ch) winsertln (win) wmove (win, y, x) wnoutrefresh (win) wprintw (win, fmt[, arg...]) wrefresh (win) wscanw (win, fmt[, arg...]) wsetscrreg (win, top, bot) wstandend (win) wstandout (win) ОПИСАНИЕ Пакет curses дает пользователю независимый от терминала метод вывода на экран с разумной оптимизацией. Инициализирующие процедуры initscr или newterm необхо- димо обязательно вызвать самыми первыми (три исключения из этого правила будут описаны ниже). При завершении работы нужно вызвать процедуру endwin. Чтобы вводимые символы не изображались на экране (большинству интерак- тивных экранных программ нужен именно такой режим) пос- ле вызова процедуры initscr необходимо вызвать |cbreak (); noecho (); Большинство программ дополнительно вызывают |nonl (); |intrflush (stdscr, FALSE); keypad (stdscr, TRUE); Перед запуском программы, использующей пакет curses, на терминале необходимо установить позиции табуляции и, если требуется, вывести инициализирующие последователь- ности. Это обычно делается командой tput init, причем переменная окружения TERM должна быть предварительно определена и помещена в окружение командой export TERM. Подробнее см. profile(4), tput(1) и раздел Табуляции и инициализация в terminfo(4). Библиотека curses содержит процедуры, манипулирующие структурами данных, называемыми окнами, которые можно мыслить как двумерные массивы символов, представляющие весь экран или его часть. Всегда имеется стандартно окно, размером с экран, называемое stdscr. Другие окна могут быть созданы процедурой newwin. В программах на окна ссылаются с помощью переменных типа WINDOW *; тип структур WINDOW определен во включаемом файле . Этими структурами данных можно манипулиро- вать с помощью процедур, описанных ниже, среди которых основными являются move и addch. (Самыми общими являют- ся процедуры, имена которых начинаются с буквы w, в них можно указать окно в качестве параметра. Процедуры, имена которых не начинаются с буквы w, обычно имеют де- ло с stdscr.) Затем вызывается процедура refresh, кото- рая обращается к нужным процедурам, чтобы экран пользо- вателя выглядел как stdscr. Символы в окне имеют тип chtype, что позволяет для каждого символа хранить до полнительную информацию. Существуют окна специального типа (спецокна), которые не ограничены размерами экрана и содержимое которых це- ликом на экране не изображается. Более подробно об этих окнах см. ниже в разделе Управление окнами (процедура newpad). Для каждого изображаемого на экране символа могут быть заданы атрибуты визуализации, что позволяет выводить подчеркнутые или инвертированные символы на терминалах, обладающих соответствующими возможностями. С помощью пакета curses можно вывести псевдографические символы. При вводе процедуры пакета могут преобразовывать после- довательности, посылаемые стрелками и функциональными клавишами. Атрибуты визуализации, псевдографические символы и коды для функциональных клавиш описаны в фай ле , например A_REVERSE, ACS_HLINE, KEY_LEFT. В пакете curses определена также переменная curscr типа WINDOW *, которую можно использовать в качестве аргу мента некоторых процедур нижнего уровня, таких как пе рерисовка испорченного экрана. Если обратиться к проце- дуре clearok с аргументом curscr, то следующее обраще ние к wrefresh для любого окна приведет к очистке экра- на и затем его полной перерисовке. Если обратиться к процедуре wrefresh с аргументом curscr, то экран немед- ленно очистится и перерисуется. Именно так большинство программ осуществляет перерисовку экрана. Информация о размерах экрана, заданная в terminfo, мо- жет быть перекрыта переменными окружения LINES и COLUMNS, что используется, например, для терминала AT&T 5620, имеющего переменный размер экрана. Если определена переменная окружения TERMINFO, процеду- ры пакета curses сначала ищут описание терминала не в стандартном месте, а в указанном. Например, если пер менная окружения TERM имеет значение att4425, то ском- пилированное описание характеристик по умолчанию извле- кается из файла /usr/lib/terminfo/a/att4425. Однако, если значение переменной окружения TERMINFO равно $HOME/myterms, то curses вначале проверит файл $HOME/ myterms/a/att4425, и только если этот файл отсутствует, обратится к /usr/lib/terminfo/a/att4425. Подобное сог лашение удобно для экспериментов с описаниями, а также тогда, когда нет прав на запись в каталог /usr/lib/ terminfo. Во включаемом файле определены глобальные переменные LINES и COLS типа int. В процедуре initscr этим переменным присваивается число строк экрана и чис- ло символов в строке (более подробную информацию см. в разделе Процедуры уровня terminfo). Константы TRUE и FALSE суть 1 и 0 соответственно. Процедуры обычно возв ращают значения ERR или OK; таким образом можно опреде- лить, успешно ли завершилась процедура. Константы ERR и OK также определены в файле ПРОЦЕДУРЫ Для многих описываемых ниже процедур имеется несколько версий. Процедуры с префиксом w имеют дополнительный аргумент - окно. Процедуры с префиксом p имеют дополни тельный аргумент - спецокно. Процедуры без префикса ра ботают с stdscr. Процедуры с префиксом mv имеют дополнительные аргументы - координаты x и y места, куда нужно поместить курсор перед выполнением соответствующего действия. Эти проце дуры вначале вызывают move (y, x), а затем соответст- вующую процедуру без префикса mv. Аргумент y всегда оз- начает строку окна, а x - колонку. Левый верхний угол окна имеет координаты (0, 0), а не (1, 1). Для процедур с префиксом mvw в качестве дополнительных аргументов задаются и окно, и координаты курсора. Аргумент, задаю- щий окно, всегда указывается перед координатами. Во всех процедурах параметр win задает окно, а параметр pad - спецокно. (И win, и pad имеют тип WINDOW *.) Для процедур, устанавливающих режимы, аргумент bf типа bool должен иметь значение TRUE или FALSE. Типы WINDOWS *, bool и chtype определены во включаемом файле . Описание типов всех переменных приведено в разделе СИНТАКСИС. Все процедуры, если не оговорено противное, возвращают значения ERR или OK. В случае ошибки результат проце дур, возвращающих значения-указатели, равен NULL. Управление всем экраном WINDOW *initscr ( ) Первой вызываемой процедурой почти всегда является initscr. Есть только следующие три исключения: slk_init, filter и ripoffline. Процедура initscr определяет тип терминала и инициализирует структу ры данных пакета curses. Выполняются такие дейст- вия, чтобы первое обращение к refresh очистило эк- ран. Если обнаружены ошибки, initscr выводит сооб- щение в стандартный протокол и завершает програм му; если ошибок не было, возвращается значение stdscr. Если программа сама желает обрабатывать ошибки инициализации, вместо initscr следует ис- пользовать newterm. Процедуру initscr нужно вызы- вать только один раз. endwin ( ) Процедуру endwin необходимо обязательно вызывать перед завершением программы, а также, например, перед запуском порожденного процесса shell или вы- полнением функции system(3S). Процедура endwin восстанавливает начальные характеристики драйвера tty(7), помещает курсор в левый нижний угол экрана и переводит терминал в нормальный режим визуализа- ции. Чтобы продолжить пользование пакетом curses, необходимо вызвать процедуру wrefresh или doupdate. isendwin ( ) Возвращает значение TRUE, если перед этим был вы зов процедуры endwin, но еще не было вызова wrefresh или doupdate. SCREEN *newterm (type, outfd, infd) Программа, осуществляющая вывод на несколько тер- миналов одновременно, должна использовать для ини- циализации каждого из них не initscr, а newterm. Программа, которая сама может обрабатывать ошибки инициализации, например, путем работы в строчном режиме вместо экранного, также должна использовать для инициализации процедуру newterm. В случае нес- кольких терминалов процедура newterm должна бы вызвана для каждого терминала. Процедура возвраща- ет значение типа SCREEN *, которое должно быть сохранено для последующих ссылок на терминал. Ар- гумент type задает имя терминала, которое будет использоваться вместо значения переменной окруже- ния TERM, аргумент outfd является указателем пото ка, открытого на вывод [см. stdio(3S)], а аргумент infd - это указатель потока, открытого на ввод. При завершении программа должна вызвать процедуру endwin для каждого терминала. Если newterm вызы- вался несколько раз для одного и того же термина- ла, endwin должен вызываться в порядке, обратном вызовам newterm. SCREEN *set_term (new) Эта процедура используется для переключения между несколькими терминалами. Терминал, на который ссы лается аргумент new, становится текущим. Процедура возвращает указатель на терминал, бывший до этого текущим. Это единственная процедура, которая мани- пулирует указателями типа SCREEN *; все остальные процедуры относятся к текущему терминалу. Управление окнами |refresh ( ) |wrefresh (win) Эти процедуры (или процедуры prefresh, pnoutrefresh, wnoutrefresh или doupdate) должны вызываться для реального вывода на экран, тогда как большинство остальных процедур только манипу лируют структурами данных. Процедура wrefresh ко- пирует указанное окно на экран терминала, принимая во внимание то, что на экран уже выведено, чтобы не выводить информацию повторно (это называется оптимизацией вывода). Процедура refresh делает то же самое для стандартного окна stdscr. Если не ус- тановлен режим leaveok, физический курсор термина- ла помещается на текущее место в окне. Процедура возвращает количество символов, выведенных на тер- минал. Отметим, что refresh является макросом. |wnoutrefresh (win) |doupdate ( ) Эти две процедуры обеспечивают более эффективное изменение экрана, чем просто wrefresh. Это делает- ся следующим образом. Процедуры пакета curses хранят две структуры дан- ных, представляющих экран терминала: физический экран, описывающий реальное состояние экрана и виртуальный экран, описывающий то, что программист хочет видеть на экране. Процедура wrefresh сначала вызывает процедуру wnoutrefresh, которая копирует указанное окно на виртуальный экран, а затем обра- щается к doupdate для сравнения виртуального экра- на с физическим и выполнения необходимых изменений на физическом экране. Если программист хочет изме- нить сразу несколько окон, то несколько вызовов wrefresh приведут к последовательным вызовам wnoutrefresh и doupdate, то есть к нескольким всплескам на экране. Если же вначале сделать нес колько вызовов wnoutrefresh, а потом один вызов doupdate, то на экране будет один всплеск, на тер- минал будет передано меньшее число символов и про- цессор будет меньше загружен. WINDOW *newwin (nlines, ncols, begin_y, begin_x) Создать новое окно, содержащее nlines строк и ncols колонок, и возвратить указатель на него. Ле вый верхний угол окна помещается в строке begin_y, колонке begin_x. Если nlines или ncols равны 0, размер окна будет LINES-begin_y строк и COLS begin_x колонок соответственно. Новое окно разме- ром с целый экран создается вызовом newwin (0, 0, 0, 0). mvwin (win, y, x) Переместить указанное окно так, чтобы его левый верхний угол находился в позиции (y, x). Если пе ремещение выводит окно за пределы экрана, это счи- тается ошибкой и перемещение окна не выполняется. WINDOW *subwin (orig, nlines, ncols, begin_y, begin_x) Создать новое окно, содержащее nlines строк и ncols колонок, и возвратить указатель на него. Ле вый верхний угол окна помещается в строке begin_y, колонке begin_x (номер строки и колонки относи тельно экрана, а не относительно окна orig). Счи тается, что новое окно перекрывается с окном orig, то есть изменения в одном окне влияют на оба окна. При использовании этой процедуры обычно требуется перед обращением к wrefresh вызвать процедуры touchwin и touchline для окна orig. delwin (win) Удалить указанное окно, освободив всю память, свя занную с ним. В случае перекрытия окон сначала должны быть удалены окна, созданные с помощью про- цедур subwin или subpad. WINDOW *newpad (nlines, ncols) Создать новое спецокно, содержащее nlines строк и ncols колонок, и возвратить указатель на него. Спецокна не ограничены размерами экрана и даже не обязательно связаны с какой-либо частью экрана. Спецокна используются, когда требуется большое ок- но, из которого на экране будет изображаться толь- ко часть. Автоматической перерисовки спецокон (например, при роллировании) не происходит. Сп цокно нельзя указывать в качестве аргумента проце- дуры wrefresh, вместо этого необходимо пользовать ся процедурами prefresh и pnoutrefresh. Отметим, что эти процедуры имеют дополнительные аргументы посредством которых задается та часть спецокна, которая должна изображаться, и та часть экрана, на которой должно располагаться изображение. WINDOW *subpad (orig, nlines, ncols, begin_y, begin_x) Создать новое спецокно, содержащее nlines строк и ncols колонок, и возвратить указатель на него. В отличие от процедуры subwin, левый верхний угол нового спецокна задается относительно спецокна orig. Новое окно перекрывается с окном orig, то есть изменения в одном окне влияют на оба окна. При использовании этой процедуры обычно требуется перед обращением к prefresh вызвать процедуры touchwin и touchline для окна orig. |prefresh (pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol) |pnoutrefresh (pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol) Эти процедуры аналогичны процедурам wrefresh и wnoutrefresh, только работают они над спецокнами. Дополнительные аргументы задают место на экране, куда пойдет вывод. Аргументы pminrow и pmincol за дают левый верхний угол области спецокна, которая будет изображаться; sminrow, smincol, smaxrow smaxcol задают прямоугольник на экране, в котором будет вестисть отображение. Правый нижний угол изображаемого прямоугольника в спецокне вычисляет- ся по координатам на экране, так как прямоугольни- ки имеют одинаковые размеры. Оба прямоугольника не должны выходить за пределы спецокна и экрана. От- рицательные значения pminrow, pmincol, sminrow smincol трактуются как нули. Вывод Следующие процедуры предназначены для вывода текста в окна. |addch (ch) |waddch (win, ch) |mvaddch (y, x, ch) |mvwaddch (win, y, x, ch) Символ ch помещается в текущую позицию окна, теку- щая позиция при этом сдвигается на единицу вправо. На правой границе окна происходит автоматический перевод строки, на нижней строке окна, если уста- новлен режим scrollok, происходит роллирование. Если ch является символом табуляции, перевода строки или возврата на шаг, выполняется соответст- вующее действие в окне. Для перевода строки перед перемещением вызывается процедура clrtoeol. Счита ется, что позиции табуляции расположены в каждой восьмой позиции. Другие управляющие символы будут выведены в виде ^X. (Вызов процедуры winch после вывода управляющего символа вернет не сам управля- ющий символ, а его печатное представление.) К символу могут быть добавлены атрибуты визуализа- ции с помощью логической операции ИЛИ, текст будет визуализироваться с этими атрибутами. Копирование текста с атрибутами из одного места экрана в дру- гое может быть выполнено с помощью процедур inch и addch. См. ниже описание процедуры standout. Отметим, что ch имеет тип chtype, а не char, а addch, mvaddch и mvwaddch являются макросами. |echochar (ch) |wechochar (win, ch) |pechochar (pad, ch) Эти процедуры соответственно эквивалентны вызову addch (ch), за которым следует refresh ( ), вызову waddch (win, ch), за которым следует wrefresh (win), вызову waddch (pad, ch), за которым следует prefresh (pad). При этом нужно учитывать, что на экран выводится ровно один символ, поэтому расходы на вывод возрастают. Для процедуры pechochar ис- пользуется та область экрана, в которую последний раз выводилось указанное спецокно. Отметим, что ch имеет тип chtype, а не char, а echochar является макросом. |addstr (str) |waddstr (win, str) |mvaddstr (y, x, str) |mvwaddstr (win, y, x, str) Эти процедуры выводят цепочку символов str, огра- ниченную нулевым байтом, в указанное окно. Они эк- вивалентны вызову waddch для каждого символа це- почки. Отметим, что addstr, mvaddstr и mvwaddstr являются макросами. |attroff (attrs) |wattroff (win, attrs) |attron (attrs) |wattron (win, attrs) |attrset (attrs) |wattrset (win, attrs) |standend ( ) |wstandend (win) |standout ( ) |wstandout (win) Эти процедуры манипулируют атрибутами визуализации в указанном окне. Атрибуты могут быть любой комби- нацией из следующих: A_STANDOUT (сообщение), A_REVERSE (инверсия), A_BOLD (выделение), A_DIM (пониженная яркость), A_BLINK (мерцание), A_UNDERLINE (подчеркивание), A_ALTCHARSET (альтер- нативный набор символов). Все константы определены в файле и могут комбинироваться опера цией логическое ИЛИ (| в языке C). Текущие атрибуты окна применяются ко всем симво- лам, которые записываются в окно процедурой waddch. Атрибуты принадлежат символу и перемеща- ются вместе с символом при роллировании и вставке/ удалении строк/символов. Пакет curses изображает все атрибуты в той степени, в какой это позволяет конкретный терминал. Процедура attrset устанавливает текущий набор ат- рибутов окна равным аргументу attrs. Процедура attroff сбрасывает указанные атрибуты, остальные атрибуты при этом не меняются. Процедура attron устанавливает указанные атрибуты без изменения ос- тальных. Вызов standout ( ) эквивалентен attron (A_STANDOUT), а вызов standend ( ) эквивалентен attrset (0), то есть сбрасывает все атрибуты. Отметим, что ch имеет тип chtype, а не char, а attroff, attron, attrset, standend и standout яв- ляются макросами. |beep ( ) |flash ( ) Эти процедуры используются для привлечения внима- ния пользователя, сидящего за терминалом. Процеду ра beep подает звуковой сигнал, если это возможно, а если нет, то делает вспышку на экране. Процедура flash делает вспышку на экране, если это возможно, а если нет, подает звуковой сигнал. Если терминал не умеет подавать звуковой сигнал и не умеет де- лать вспышку на экране, то ничего не происходит. Почти все терминалы умеют подавать звуковой сиг- нал, но только некоторые умеют делать вспышку на экране. box (win, vertch, horch) По краю окна win рисуется рамка. Аргументы vertch и horch - это символы, с помощью которых рисуются вертикальные и горизонтальные линии. Если vertch и horch равны 0, то используются символы по умолча- нию - ACS_VLINE и ACS_HLINE соответственно. Отметим, что аргументы vertch и horch имеют тип chtype, а не char. |erase ( ) |werase (win) цедуры помещают пробелы во все позиции ок на. Отметим, что erase является макросом. |clear ( ) |wclear (win) Эти процедуры совпадают с erase ( ) и werase (win), но они еще дополнительно вызывают процедуру clearok. Вследствие этого при следующем обращении к wrefresh экран будет очищен и перерисован. Отметим, что clear является макросом. |clrtobot ( ) |wclrtobot (win) Все строки ниже позиции курсора, а также текущая строка правее позиции курсора, включая саму пози- цию, очищаются. Отметим, что clrtobot является макросом. |clrtoeol ( ) |wclrtoeol (win) Текущая строка правее позиции курсора, включая са му позицию, очищается. Отметим, что clrtoeol является макросом. |delay_output (ms) При выводе сделать паузу на ms миллисекунд. Не ре- комендуется, однако, интенсивно применять эту про- цедуру. Предпочтительнее использовать символы-за- полнители, а не паузу процессора. |delch ( ) |wdelch (win) |mvdelch (y, x) |mvwdelch (win, y, x) Текущий символ в окне удаляется. Все символы спра- ва от него сдвигаются на единицу влево, в послед- нюю позицию записывается пробел. Позиция курсора не изменяется (может быть только предварительное перемещение в (y, x)). Описываемые процедуры не требуют использования аппаратной функции удаления символа. Отметим, что delch и mvdelch являются макросами. |deleteln ( ) |wdeleteln (win) Текущая строка окна удаляется. Все строки ниже удаленной поднимаются вверх. Последняя строка окна очищается. Позиция курсора не меняется. Описывае- мые процедуры не требуют использования аппаратной функции удаления строки. Отметим, что deleteln является макросом. getyx (win, y, x) Позиция курсора в окне помещается в аргументы y и x. Поскольку getyx является макросом, перед имена- ми аргументов не требуется знак &. |getbegyx (win, y, x) |getmaxyx (win, y, x) В духе getyx эти процедуры позволяют получить ко- ординаты левого верхнего угла окна на экране и его размеры. Отметим, что getbegyx и getmaxyx являются макроса- ми. |insch (ch) |winsch (win, ch) |mvinsch (y, x, ch) |mvwinsch (win, y, x, ch) Символ ch вставляется перед текущим. Все символы правее текущего, включая и сам текущий символ, сдвигаются вправо, при этом, возможно, самый пра- вый символ строки пропадает. Позиция курсора не изменяется (может быть только предварительное пе- ремещение в (y,x)). Описываемые процедуры не тре- буют использования аппаратной функции вставки сим- вола. Отметим, что ch имеет тип chtype, а не char, а insch, mvinsch и mvwinsch являются макросами. |insertln ( ) |winsertln (win) Перед текущей строкой окна вставляется пустая. Нижняя строка окна теряется. Описываемые процедуры не требуют использования аппаратной функции встав- ки строки. Отметим, что insertln является макросом. |move (y, x) |wmove (win, y, x) Текущая позиция, соответствующая окну, перемещает- ся в строку y, колонку x. Физический курсор на эк- ране не перемещается до тех пор, пока не будет вызвана процедура refresh. Позиция указывается от носительно левого верхнего угла окна, имеющего ко- ординаты (0, 0). Отметим, что move является макросом. |overlay (srcwin, dstwin) |overwrite (srcwin, dstwin) Эти процедуры помещают окно srcwin поверх окна dstwin, то есть текст из srcwin копируется в dstwin. Окна не обязаны иметь одинаковый размер, копируется только пересекающаяся часть. Разница между двумя процедурами заключается в том, что overlay не копирует пробелы, оставляя на этом мес- те то, что было, а overwrite производит полное ко пирование |copywin (srcwin, dstwin, sminrow, smincol, dminrow, dmincol, | dmaxrow, dmaxcol, overlay) Эта процедура дает существенно больше, чем проце- дуры overlay и overwrite. Как и в процедуре prefresh, задается прямоугольник в окне-приемнике (dminrow, dmincol, dmaxrow, dmaxcol) и левый верх ний угол в окне-источнике (sminrow, smincol). Если аргумент overlay не равен 0, то пробелы не копиру ются, как в overlay. |printw (fmt[, arg...]) |wprintw (win, fmt[, arg...]) |mvprintw (y, x, fmt[, arg...]) |mvwprintw (win, y, x, fmt[, arg...]) Эти процедуры аналогичны printf(3S), только сгене- рированная цепочка символов выводится с помощью waddstr в указанное окно. vwprintw (win, fmt, varglist) Эта процедура аналогична vfprintf(3S). Она вызыва- ет wprintw с переменным списком аргументов. Третий аргумент, varglist, является указателем на список аргументов, как это определено в . O работе со списком аргументов переменной длины см. vprintf(3S) и varargs(5). scroll (win) Окно роллируется вверх на одну строку. При этом изменяются строки и в структурах данных, описываю- щих окно. Для оптимизации, в окне stdsrc, если роллируется окно целиком, одновременно роллируется и физический экран. |touchwin (win) |touchline (win, startrow, count) Забыть информацию о том, какие части окна измени- лись (эта информация используется для оптимизации вывода). Считать, что все окно требует перерисов- ки. Это часто бывает необходимо для пересекающихся окон, так как изменение одних окон вызывает изме- нение и других, но информация об этих изменениях в структурах данных других окон не отражается. Обра- щение к touchline говорит о том, что изменилось count строк окна, начиная со строки с номером startrow. Ввод |getch ( ) |wgetch (win) |mvgetch (y, x) |mvwgetch (win, y, x) С клавиатуры терминала, связанного с окном, считы- вается символ. Если установлен режим NODELAY и символ еще не введен, возвращается значение ERR. Если установлен режим DELAY, программа приостанав- ливается до тех пор, пока система не передаст ей введенный текст. В зависимости от режима CBREAK это будет после ввода одного символа (режим CBREAK) или после ввода строки целиком (режим NOCBREAK). В режиме HALF-DELAY программа приоста навливается до тех пор, пока не будет введен сим- вол или истечет указанный период времени. Если не установлен режим NOECHO, вводимые символы отобра- жаются в соответствующем окне. Между обращениями к move и getch, вызываемыми из процедур mvgetch и mvwgetch, не делается refresh. Используя процедуры getch, wgetch, mvgetch и mvwgetch, нельзя устанавливать одновременно режимы NOCBREAK и ECHO. Результаты могут оказаться неп- редсказуемыми и зависят от состояния, в котором находится драйвер tty(7). Если предварительно была вызвана процедура keypad (win, TRUE) и нажата функциональная клавиша, то вместо посланных ею кодов будет возвращено значе ние, соответсвующее клавише (см. keypad в Установ- ке режимов ввода). Функциональные клавиши опреде- лены в , их значения начинаются с числа 0401, а имена - с префикса KEY_. Если поступает символ, который может быть началом функциональной клавиши (например, ESC), curses запускает таймер. Если за ожидаемое время не будет получено продол- жения, то символ передается сам по себе, в против ном случае возвращается значение функциональной клавиши. Поэтому на многих терминалах после нажа- тия клавиши ESC необходимо немного подождать, прежде чем эта клавиша попадет программе. По этой же причине не рекомендуется программистам исполь- зовать клавишу ESC как односимвольную команду программе. См. также notimeout ниже. Отметим, что getch, mvgetch и mvwgetch являются макросами. |getstr (str) |wgetstr (win, str) |mvgetstr (y, x, str) |mvwgetstr (win, y, x, str) Процедура getch вызывается до тех пор, пока не бу дет нажата клавиша перевода строки, возврата ка ретки или клавиша "ввод". Результат помещается в область памяти, на которую указывает аргумент str. При вводе обрабатываются управляющие символы erase и kill. Так же как и в процедуре mvgetch, между обращениями к move и getstr, вызываемыми из проце- дур mvgetstr и mvwgetstr, не делается refresh. Отметим, что getstr, mvgetstr и mvwgetstr являются макросами. flushinp ( ) Проигнорировать все символы, введенные пользовате лем к этому моменту, но еще не считанные програм- мой. ungetch (c) Положить символ c обратно во входную очередь, так что он будет считан следующим вызовом wgetch. |chtype inch ( ) |chtype winch (win) |chtype mvinch (y, x) |chtype mvwinch (win, y, x) Эти процедуры возвращают символ (типа chtype), расположенный в текущей позиции указанного окна, вместе с имеющимися атрибутами (как логическое ИЛИ атрибутов и кода символа). Константы A_CHARTEXT и A_ATTRIBUTES, определенные в файле , можно использовать в операции "логическое И" (& в языке C) для выделения из возвращаемого значения только кода символа или только атрибутов. Отметим, что inch, winch, mvinch и mvwinch являют- ся макросами. |scanw (fmt[, arg...]) |wscanw (win, fmt[, arg...]) |mvscanw (y, x, fmt[, arg...]) |mvwscanw (win, y, x, fmt[, arg...]) Эти процедуры аналогичны scanf(3S) и по аргумен- там, и по возвращаемым значениям. В окне вызывает- ся процедура wgetstr, а полученная цепочка симво- лов сканируется в соответствии с указанным форма- том. vwscanw (win, fmt, varglist) Эта процедура аналогична процедуре vwprintw, опи- санной выше. Она вызывает wscanw с переменным списком аргументов. Третий аргумент, varglist, яв- ляется указателем на список аргументов, как это определено в . O работе со списком ар- гументов переменной длины см. vprintf(3S) и varargs(5). Установка режимов вывода Следующие процедуры устанавливают режимы вывода для па- кета curses. Все режимы при инициализации равны FALSE. Нет необходимости перед вызовом endwin возвращать все режимы в состояние FALSE. clearok (win, bf) Если значение аргумента bf равно TRUE, то следую- щий вызов wrefresh приведет к очистке окна и пол- ной его перерисовке. Это удобно, если содержимое окна испортилось, кроме того, иногда полная пере рисовка окна дает лучший визуальный эффект, чем частичная. idlok (win, bf) Если значение аргумента bf равно TRUE, то процеду- ры пакета curses для вставки и удаления строк бу дут использовать аппаратные команды (если они име- ются). Если bf равно FALSE, то curses этими коман дами пользуется редко (команды вставки/удаления символов используются всегда). Этот режим следует использовать только если Вам действительно нужно вставлять и удалять строки (например, в программе - экранном редакторе). По умолчанию этот режим имеет значение FALSE, так как применение аппарат- ной вставки и удаления строк в программах, в кото рых это реально не требуется, приводит к неприят- ным визуальным эффектам. Если использование аппа- ратных команд запрещено, то curses перерисовывает изменившуюся часть всех строк. leaveok (win, bf) Обычно аппаратный курсор находится в текущей пози ции текущего окна. Если bf равно TRUE, то разреша- ется оставлять курсор там, где его оставило пос леднее изменение экрана. Это удобно для программ, не использующих позицию курсора, так как уменьшает необходимость в его перемещениях. Если использует- ся этот режим, то курсор делается невидимым (если терминал это позволяет). |setscrreg (top, bot) |wsetscrreg (win, top, bot) Эти процедуры позволяют установить роллируемую об- ласть в окне. Аргументы top и bot - это номера верхней и нижней строки задаваемой области (номер верхней строки окна равен 0). Если задана область роллирования и установлен режим scrollok, то из нижней строки окна происходит роллирование только заданной области. Описываемые процедуры не требуют использования аппаратного роллирования полос, как это имеет место в терминале DEC vt100. Однако, ес ли установлен режим idlok и терминал умеет ролли- ровать полосы или вставлять и удалять строки, то эти возможности будут использованы процедурами вы- вода. Отметим, что обе процедуры setscrreg и wsetscrreg являются макросами. scrollok (win, bf) Процедура служит для формирования режима обработки ситуации, когда курсор в окне выходит за границы роллируемой области из-за перевода строки в пос- ледней строке области или вывода символа в послед- нюю позицию последней строки. Если этот режим не установлен (значение bf равно FALSE), курсор оста- ется в последней строке на том же месте. Если ре жим установлен (значение bf равно TRUE) происходит вызов wrefresh, а затем окно и экран физического терминала роллируются на одну строку вверх. Обра- тите внимание, что для того, чтобы физический эк- ран роллировался, необходимо установить режим idlok. |nl ( ) |nonl ( ) Эти процедуры управляют преобразованием символа перевода строки в возврат каретки и переход к но вой строке при выводе и символа возврата каретки в перевод строки при вводе. По умолчанию эти преоб- разования выполняются. При отмене этих преобразо- ваний процедурой nonl пакет curses получает воз- можность осуществлять более быстрые перемещения курсора, пользуясь переходом к новой строке. Установка режимов ввода Следующие процедуры устанавливают режимы ввода для па кета curses. Установка режимов включает в себя обраще ние к системному вызову ioctl(2) и может оказывать вли- яние на другие режимы. Нет необходимости перед выполне нием endwin возвращать все режимы в начальное состоя ние. |cbreak ( ) |nocbreak ( ) Эти две процедуры соответственно устанавливают и сбрасывают режим CBREAK. В режиме CBREAK вводимые символы сразу передаются программе, обработка сим- волов erase и kill не производится. В режиме NOCBREAK драйвер tty(7) буферизует вводимые симво- лы до тех пор, пока не будет введен символ перево- да строки или возврата каретки. Символы прерывания и управления передачей в этом режиме не затрагива- ются [см. termio(7)]. Начальное состояние термина ла может быть любым, поэтому, если требуется, не обходимо явно вызвать процедуру cbreak или nocbreak. Большинство интерактивных программ, ис- пользующих curses, устанавливают режим CBREAK. Отметим, что процедура cbreak устанавливает режим raw. См. также getch в разделе Ввод по поводу то го, как описываемые процедуры взаимодействуют с процедурами echo и noecho. |echo ( ) |noecho ( ) Эти процедуры управляют тем, отображаются ли на экране символы, вводимые по getch. Эхо, выполняе- мое драйвером, всегда отменено, но при инициализа- ции для getch устанавливается режим ECHO, то есть вводимые символы отображаются. Авторы большинства интерактивных программ предпочитают самостоятельно отображать вводимые символы в отдельной части эк- рана, либо не отображать их вовсе, для чего вызы вается процедура noecho. См. getch в разделе Ввод по поводу того, как описываемые процедуры взаимо- действуют с процедурами cbreak и nocbreak. halfdelay (tenths) Этот режим похож на режим CBREAK тем, что вводимые символы сразу передаются программе. Однако если ни одна клавиша не была нажата на протяжении tenths десятых долей секунды, будет возвращено значение ERR. Число tenths должно быть от 1 до 255. Для выключения этого режима используется процедура nocbreak. intrflush (win, bf) Если установлен этот режим, то при нажатии одного из символов прерывания (interrupt, break, quit) весь ввод, накопленный в драйвере tty(7), будет проигнорирован, что позволяет быстро отреагировать на прерывание. Правда, состояние экрана при этом может перестать соответствовать представлению, имеющемуся в структурах curses. Отмена этого режи- ма предотвращает очистку буферов в драйвере. На- чальное значение данного режима зависит от состоя ния драйвера. Аргумент win игнорируется. keypad (win, bf) Эта процедура устанавливает режим обработки функ- циональных клавиш на клавиатуре терминала. Если этот режим установлен, то при нажатии пользовате- лем функциональной клавиши (например, стрелки вле- во), процедура wgetch возвратит соответствующее этой клавише значение (KEY_LEFT). Если данный ре- жим не установлен, то последовательности кодов, посылаемых функциональными клавишами, не преобра- зуются, программа может обрабатывать их сама. Если функциональная клавиатура терминала может нахо- диться как в режиме передачи, так и в локальном режиме, вызов процедуры keypad приводит к переводу клавиатуры в режим передачи при первом обращении к wgetch. meta (win, bf) Если этот режим установлен, все 8 бит символов, вводимых с клавиатуры, передаются программе, иначе процедура wgetch сбрасывает восьмой бит. Чтобы ре жим META работал правильно, необходимо, чтобы в базе данных terminfo(4) для данного терминала была задана характеристика km (клавиша МЕТА) nodelay (win, bf) Этот режим не позволяет процедуре wgetch уходить в ожидание. Если этот режим установлен и нет готово- го символа, то возвращается значение ERR. Если р жим не установлен, то wgetch ожидает ввода следую щего символа. notimeout (win, bf) При интерпретации вводимых управляющих последов тельностей процедура wgetch запускает таймер, ожи- дая следующего символа. Если вызвать процедуру notimeout (win, TRUE), то запуска таймера не про- исходит. Таймер используется для различения после- довательностей, приходящих от функциональных кла- виш, и последовательных нажатий обычных клавиш. |raw ( ) |noraw ( ) Устанавливается или отменяется режим RAW. Режим RAW аналогичен режиму CBREAK, вводимые символы сразу передаются программе. Отличие заключается том, что символы прерывания (interrupt, quit), также символы управления передачей (xon, xoff) пе- редаются без интерпретации, сигналы при этом не генерируются. Режим RAW устанавливает восьмибитный ввод и вывод. Реакция на клавишу BREAK зависит от других бит в характеристиках драйвера tty(7), эти биты пакетом curses не устанавливаются. |typeahead (fildes) Обычно curses выполняет следующий вид оптимизации. Перед выводом на экран проверяется, нет ли уже на- жатых клавиш, и, если есть, то вывод откладывается до следующего вызова refresh или doupdate. Это позволяет быстрее реагировать на последовательнос- ти команд. Обычно для проверки используется деск риптор файла, переданного в качестве аргумента процедуре newterm, или stdin, если инициализация проводилась с помощью initscr. Процедура typeahead позволяет заменить проверяемый файл на файл с дескриптором fildes. Если fildes равен -1, то опи- санная выше оптимизация не выполняется. Отметим, что fildes - это дескриптор файла, а не указатель на структуру типа FILE. Запросы к оборудованию baudrate ( ) Скорость вывода на терминал. Возвращается целое число, означающее скорость передачи в битах в се- кунду, например 9600. char erasechar ( ) Возвращается текущее значение символа erase. has_ic ( ) Истина, если терминал умеет вставлять и удалять символы. has_il ( ) Истина, если терминал умеет вставлять и удалять строки. char killchar ( ) Возвращается текущее значение символа kill. char *longname ( ) Процедура возвращает указатель на статическую об- ласть, содержащую словесное описание данного тер- минала. Максимальная длина словесного описания - 128 символов. К данной процедуре можно обращаться только после initscr или newterm. Статическая об- ласть изменяется при последующих вызовах newterm и не восстанавливается вызовами set_term, поэтому, если предполагается пользоваться словесными описа- ниями для нескольких терминалов, то описание необ- ходимо скопировать в другое место. Программируемые метки Пакет curses дает доступ к программируемым меткам на клавишах, которые имеются на некоторых терминалах. Для тех терминалов, на которых нет программируемых меток, имеется возможность их эмуляции в верхней строке окна stdscr, при этом уменьшается на единицу размер окна stdscr и значение переменной LINES. Curses поддерживает восемь меток по восемь символов каждая. slk_init (labfmt Чтобы использовать программируемые метки, процеду- ра slk_init должна быть вызвана раньше процедур initscr и newterm. Если процедура initscr будет использовать верхнюю строку экрана для меток, то аргумент labfmt задает их расположение в строке. Если значение labfmt равно 0, метки размещаются тремя группами 3-2-3, а если значение labfmt равно 1, то двумя группами 4-4. slk_set (labnum, label, labfmt) Аргумент labnum - это номер метки, от 1 до 8. Ар гумент label представляет собой цепочку символов (длиной не более 8), которая помещается в виде метки. Пустая цепочка или адрес, равный NULL, за- дают пустую метку. Значения labfmt, равные 0, 1 или 2, говорят о том, что метка соответственно вы- ровнена влево, центрирована или выровнена вправо. |slk_refresh ( ) |slk_noutrefresh ( ) Эти процедуры соответствуют процедурам wrefresh и wnoutrefresh. Большинство программ вызывают slk_noutrefresh, так как обычно довольно скоро приходится вызывать wrefresh. char *slk_label (labnum) Возвращается текущее значение метки с номером labnum, из которого удалены начальные и хвостовые пробелы. slk_clear ( ) Программируемые метки убираются с экрана. slk_restore ( ) Программируемые метки, убранные с экрана процеду рой slk_clear, восстанавливаются. slk_touch ( ) При следующем обращении к slk_noutrefresh все программируемые метки будут выведены на экран за ново. Процедуры нижнего уровня Следующие процедуры нижнего уровня дают доступ к раз- личным возможностям пакета curses. Обычно эти процедуры вызываются из библиотечных процедур. |def_prog_mode ( ) |def_shell_mode ( ) Сохранить текущие значения характеристик термина- ла, как значения, необходимые для выполнения самой программы (с пакетом curses) или программы shell (без пакета curses) для последующего восстановле- ния процедурами reset_prog_mode и reset_shell_mode. Эти процедуры вызываются проце- дурой initscr. |reset_prog_mode ( ) |reset_shell_mode ( ) Восстановить запомненные значения характеристик терминала для продолжения работы пакета curses или для запуска программы shell. Эти процедуры вызыва- ются процедурами endwin и doupdate. |resetty ( ) |savetty ( ) Эти процедуры запоминают и восстанавливают запом- ненные характеристики терминала. Процедура savetty запоминает характеристики в буфере, а resetty восстанавливает последние запомненные характерис- тики. getsyx (y, x) Аргументам y и x присваиваются значения координат курсора на виртуальном экране. Как и в getyx, пе- ред именами переменных не нужно указывать &. Если установлен режим leaveok, то переменным присваива ются значения (-1,-1). Если верхние строки экрана были удалены с помощью процедуры ripoffline и по лученные значения предполагается не просто пере- дать процедуре setyx, а использовать еще как-то, то значение y должно быть скорректировано путем прибавления значения stdscr->_yoffset. Отметим, что getsyx является макросом. setsyx (y, x) Виртуальный курсор устанавливается в позицию (y, x). Если оба значения y и x равны -1, то устанав- ливается режим leaveok. Две процедуры getsyx и setsyx созданы для того, чтобы библиотечные проце дуры могли манипулировать окнами, не испортив те- кущей позиции курсора. Библиотечные процедуры вна- чале вызывают getsyx, затем производят манипуляции над окнами, вызывают для измененных окон wnoutrefresh, после чего вызывают setsyx и закан- чивают вызовом doupdate. ripoffline (line, init) Эта процедура позволяет уменьшить размер экрана, ею пользуется процедура slk_init. Процедуру ripoffline необходимо вызывать раньше процедур initscr и newterm. Если значение line положитель но, удаляется одна строка сверху окна sdtscr, если отрицательно - удаляется строка снизу. После этого из процедуры initscr вызывается процедура init с двумя аргументами: указателем на созданное окно единичной высоты и шириной этого окна в колонках. При вызове данной процедуры не гарантируется пра- вильность глобальных переменных LINES и COLS (оп- ределенных в ), кроме того, из этой про- цедуры нельзя обращаться к процедурам wrefresh и doupdate, но можно обращаться к wnoutrefresh. Перед обращением к initscr или newterm процедуру ripoffline можно вызывать несколько раз (до пяти). scr_dump (filename) Текущее состояние виртуального экрана записывается в файл filename. scr_restore (filename) Текущее состояние виртуального экрана восстанавли- вается из файла filename, куда оно должно быть предварительно записано командой scr_dump. После восстановления необходимо вызвать процедуру doupdate для изображения восстановленного состоя ния. scr_init (filename) Содержимое файла filename используется для коррек- ции информации о том, что изображено на экране Если данные пройдут проверку на корректность, то curses при следующей перерисовке экрана использует полученную информацию. Процедура scr_init обычно используется после initscr и после системного вы- зова system(3S) для сохранения состояния экрана, сформированного другим процессом, который должен предварительно, после обращения к endwin, обра- титься к scr_dump. Проверка на корректность заклю- чается в проверке времени модификации файла с сос- тоянием экрана, кроме того в базе данных terminfo(4) для данного терминала должна присутст- вовать характеристика nrrmc. curs_set (visibility) Курсор делается невидимым, нормальным или более ярким, если значение visibility равно, соответст- венно, 0, 1 или 2. draino (ms) Подождать, пока весь сформированный вывод на экран не будет почти закончен, то есть до его окончания останется не более ms миллисекунд. garbagedlines (win, begline, numlines) Эта процедура сообщает пакету curses, что экран испорчен и должен быть перерисован. Это может быть использовано, например, экранными редакторами, имеющими команду для перерисовки отдельной строки. Подобная команда требуется, если терминал подсое- динен по линии, на которой много шумов, причем полная перерисовка экрана приведет к еще большим шумам. Перерисовка одной строки дает возможность надеяться, что она будет исполнена правильно. napms (ms) Пауза на ms миллисекунд. Процедуры уровня terminfo Данные процедуры используются программами, которым тре- буется работа непосредственно с базой данных terminfo(4) для отработки специфических возможностей терминалов, например, программирования функциональной клавиатуры. В остальных случаях рекомендуется пользо- ваться только процедурами пакета curses, описанными вы- ше. Вначале должна быть вызвана процедура setupterm (эта процедура автоматически вызывается процедурами initscr и newterm. В ней присваиваются значения всем перемен- ным, определенным в terminfo(4). Значения переменным terminfo(4) lines и columns присваиваются следующим об- разом: если определены переменные окружения LINES и COLUMNS, используются их значения. Иначе используются значения, заданные в базе данных terminfo(4). Для того, чтобы программа имела доступ ко всем необхо- димым переменным, цепочкам, числам и флагам, в нее должны быть включены файлы и в ука- занном порядке. Параметризованные цепочки должны быть конкретизированы процедурой tparm. Все цепочки terminfo(4), включая цепочки, выходные для tparm, долж- ны выводиться на экран процедурами tputs или putp. Пе- ред завершением необходимо вызвать процедуру reset_shell_mode для восстановления характеристик тер- минала. Программы, в которых используется адресация курсора, должны вывести цепочку enter_ca_mode в начале работы и цепочку exit_ca_mode перед концом работы [см. terminfo(4)]. Программы, предусматривающие запуск по рожденного процесса shell, должны вызвать процедуру reset_shell_mode и вывести цепочку exit_ca_mode перед запуском shell, а после завершения порожденного процес- са необходимо вывести цепочку enter_ca_mode и вызвать процедуру reset_prog_mode. Обратите внимание на отличие этой процедуры от стандартной процедуры для пакета curses [см. endwin]. setupterm (term, fildes, erret) Читает базу данных terminfo(4), инициализирует структуры данных terminfo(4). Структуры управления выводом для пакета curses при этом не устанавлива ются. Тип терминала задается аргументом term, яв- ляющемся цепочкой символов. Если значение term равно NULL, используется значение переменной окру- жения TERM. Вывод ведется в файл с дескриптором fildes. Если значение erret не равно NULL, то setupterm возвратит значение OK или ERR и поместит в переменную *erret код завершения. Код, равный 1, означает нормальное завершение, 0 означает, что терминал не найден в базе данных, -1 означает, что не удалось найти саму базу данных terminfo(4). Ес- ли значение erret равно NULL, то в случае наличия ошибок setupterm напечатает сообщения о них и за вершит программу. Таким образом, самый простой вы- зов, при котором используются только подразумевае- мые значение, выглядит следующим образом: |setupterm ((char *) 0, 1, (int *) 0) Все переменные terminfo(4) булева, числового и символьного типа размещаются в структуре типа TERMINAL. После успешного завершения процедуры setupterm глобальной переменной cur_term типа TERMINAL * присваивается значение указателя на за- полненную структуру. Этот указатель может быть сохранен перед следующим вызовом setupterm. По торный вызов setupterm размещает в памяти новую структуру и записывает новую информацию в новое место. set_curterm (nterm) Аргумент nterm имеет тип TERMINAL *. Процедура set_curterm присваивает переменной cur_term значе- ние nterm, после этого все переменные terminfo(4) получают значения, заданные для nterm. del_curterm (oterm) Аргумент oterm имеет тип TERMINAL *. Процедура del_curterm освобождает память, занятую структу рой, на которую указывает oterm. Если oterm совпа- дает с cur_term, то после этого нельзя обращаться ни к одной переменной terminfo(4) до тех пор, пока снова не будет вызвана процедура setupterm. restartterm (term, fildes, erret) То же, что и setupterm после восстановления памя- ти. char *tparm (str, p1, p2, p3, p4, p5, p6, p7, p8, p9) Подставляет в цепочку str аргументы p1, p2, ... p9. Возвращается указатель на цепочку с подстав- ленными аргументами. tputs (str, count, putc) Добавляет, если надо, заполнитель к цепочке str и выводит ее. Цепочка str должна быть значением ка- кой-либо символьной переменной terminfo(4), либо результатом работы процедур tparm, tsgetstr, tigetstr или tgoto. Аргумент count задает коли- чество строк, которые затрагиваются выводом; если оно неизвестно, задается 1. Аргумент putc - это процедура, аналогичная putchar(3S). Этой процедуре символы передаются последовательно. putp (str) Процедура, вызывающая tputs (str, 1, putchar). vidattr (attrs) Задает атрибуты выводимых символов. vidputs (attrs, putc) Выводит цепочку, переводящую терминал в режим ви- зуализации символов с атрибутами attrs - комбина- цией атрибутов, описанных ниже, в разделе АТРИБУ- ТЫ. Символы передаются процедуре putc, аналогичной putchar(3S). mvcur (oldrow, oldcol, newrow, newcol) Процедура нижнего уровня для перемещения курсора. Следующие процедуры возвращают значения характеристик, которые передаются им в качестве параметров, например xenl. tigetflag (capname) Если capname не является булевой характеристикой, возвращается значение -1. tigetnum (capname) Если capname не является числовой характеристикой, возвращается значение -2. char *tigetstr (capname) Если capname не является символьной характеристи- кой, возвращается значение (char*) -1. |char *boolnames [ ], *boolcodes [ ], *boolfnames [ ] |char *numnames [ ], *numcodes [ ], *numfnames [ ] |char *strnames [ ], *strcodes [ ], strfnames [ ] Эти массивы, завершающиеся нулевыми байтами, со- держат имена, коды termcap и длинные C-имена для каждой переменной terminfo(4). Эмуляция termcap Данные процедуры включены для того, чтобы упростить преобразование программ, использовавших библиотеку termcap. Параметры у них остались прежними, но теперь они эмулируются через базу данных terminfo(4). tgetent (bp, name) Найти элемент termcap для имени name. При эмуляции параметр bp игнорируется. tgetflag (codename) Получить булево значение элемента codename. tgetnum (codename) Получить числовое значение элемента codename. char *tgetnum (codename, area) Получить символьное значение элемента codename. Если указатель area не равен NULL, то поместить то же значение в буфер, на который указывает *area, и продвинуть *area. Для вывода возвращенной цепочки символов необходимо использовать процедуру tputs. char *tgoto (cap, col, row) Подставить аргументы в указанный элемент. Для вы- вода возвращенной цепочки символов необходимо ис- пользовать процедуру tputs. tputs (str, count, putc) См. выше раздел Процедуры уровня terminfo. Дополнительные процедуры |traceoff ( ) |traceon ( ) Включить и выключить трассировочную печать отла- дочной версии библиотеки curses (/usr/lib/ libdcurses.a). Эта библиотека доступна только тем, кто приобрел лицензию на исходные тексты пакета curses. unctrl (c) Этот макрос преобразует символ в цепочку, содержа- щую его печатное представление. Управляющие симво- лы изображаются в виде ^X. Печатные символы не из- меняются. Отметим, что unctrl - это макрос, определенный в файле , автоматически подключающемся к . char *keyname (c) Возвращается цепочка символов, соответствующая клавише c. filter ( ) Данная процедура является одной из тех, которые должны вызываться перед initscr. Вызов этой проце- дуры означает, что в пределах пакета curses экран считается имеющим единичную высоту. В результате процедуры пакета не будут использовать возможнос- тей терминала, подразумевающих знание номера стро- ки на экране. Использование curscr Спецокно curscr может использоваться только несколькими процедурами. Если обратиться к процедуре clearok с ар гументом curscr, то следующее обращение к wrefresh для любого окна приведет к очистке экрана и затем его пол ной перерисовке. Если обратиться к процедуре wrefresh с аргументом curscr, то экран немедленно очистится и пе- рерисуется. Именно так большинство программ осуществля- ет перерисовку экрана. Если curscr указывается в ка- честве аргумента процедур overlay, overwite или copywin, то доступ производится к текущему состоянию виртуального экрана терминала. Устаревшие процедуры Следующие процедуры оставлены только для того, чтобы обеспечить совместимость с программами, написанными для старых версий пакета curses. Все они могут быть замене- ны указанными процедурами: crmode ( ) заменяется на cbreak ( ) fixterm ( ) заменяется на reset_prog_mode ( ) gettmode ( ) заменяется на пустую процедуру nocrmode ( ) заменяется на nocbreak ( ) resetterm ( ) заменяется на reset_shell_mode ( ) saveterm ( ) заменяется на def_prog_mode ( ) setterm ( ) заменяется на setupterm ( ) АТРИБУТЫ Следующие атрибуты визуализации, определенные в файле , могут передаваться в качестве аргументов процедурам attron, attroff и attrset. Их можно также добавить (операцией логическое ИЛИ) к символам, переда ваемым процедуре addch. A_STANDOUT Режим, в котором лучше всего выводить сообщения, привлекающие внимание. A_UNDERLINE Подчеркивание. A_REVERSE Инверсия. A_BLINK Мерцание. A_DIM Пониженная яркость. A_BOLD Выделение - жирность или повышенная яркость. A_ALTCHARSET Альтернативный набор символов. A_CHARTEXT Битная маска для выделения кода символа [см. winch]. A_ATTRIBUTES Битная маска для выделения атрибутов [см. winch]. A_NORMAL Битная маска для сброса всех атрибутов (например, attrset (A_NORMAL)). ФУНКЦИОНАЛЬНЫЕ КЛАВИШИ Следующие коды функциональных клавиш, определенные в файле , могут быть возвращены процедурой getch, если установлен режим keypad. Отметим, что не все клавиши на конкретном терминале могут поддерживать- ся, особенно если они не посылают уникальных кодов, а также если определение клавиши отсутствует в базе дан- ных terminfo(4). Название Значение Описание KEY_BREAK 0401 клавиша прерывания (ненадежно) KEY_DOWN 0402 стрелка вниз KEY_UP 0403 стрелка вверх KEY_LEFT 0404 стрелка влево KEY_RIGHT 0405 стрелка вправо KEY_HOME 0406 HOME (стрелка влево-вверх) KEY_BACKSPACE 0407 забой KEY_F0 0410 F0 KEY_Fn KEY_F0+n Fn, есть место для 64 клавиш KEY_DL 0510 DL, удаление строки KEY_IL 0511 IL, вставка строки KEY_DC 0512 DC, удаление символа KEY_IC 0513 IC, вставка символа KEY_EIC 0514 выход из режима вставки KEY_CLEAR 0515 очистка экрана KEY_EOS 0516 очистка конца экрана KEY_EOL 0517 очистка конца строки KEY_SF 0520 роллирование на строку вперед KEY_SR 0521 роллирование на строку назад KEY_NPAGE 0522 следующая страница KEY_PPAGE 0523 предыдущая страница KEY_STAB 0524 установить позицию табуляции KEY_CTAB 0525 снять позицию табуляции KEY_CATAB 0526 снять все позиции табуляции KEY_ENTER 0527 ENTER, ввод KEY_SRESET 0530 мягкий сброс KEY_RESET 0531 жесткий сброс KEY_LL 0533 стрелка влево-вниз дополнительная клавиатура устроена следующим образом: A1 вверх A3 влево B2 вправо C1 вниз C3 KEY_A1 0534 A1 KEY_A3 0535 A3 KEY_B2 0536 B2 KEY_C1 0537 C1 KEY_C3 0540 C3 KEY_BTAB 0541 обратная табуляция KEY_BEG 0542 BEG KEY_CANCEL 0543 CANCEL KEY_CLOSE 0544 CLOSE KEY_COMMAND 0545 CMD KEY_COPY 0546 COPY KEY_CREATE 0547 CREATE KEY_END 0550 END KEY_EXIT 0551 EXIT KEY_MARK 0554 MARK KEY_MESSAGE 0555 MESSAGE KEY_MOVE 0556 MOVE KEY_NEXT 0557 NEXT KEY_OPEN 0560 OPEN KEY_OPTIONS 0561 OPTIONS KEY_PREVIOUS 0562 PREVIOUS KEY_REDO 0563 REDO KEY_REFERENCE 0564 REFERENCE KEY_REFRESH 0565 REFRESH KEY_REPLACE 0566 REPLACE KEY_RESTART 0567 RESTART KEY_RESUME 0570 RESUME KEY_SAVE 0571 SAVE KEY_SBEG 0572 SHIFT+BEG KEY_SCANCEL 0573 SHIFT+CANCEL KEY_SCOMMAND 0574 SHIFT+COMMAND KEY_SCOPY 0575 SHIFT+COPY KEY_SCREATE 0576 SHIFT+CREATE KEY_SDC 0577 SHIFT+"удалить символ" KEY_SDL 0600 SHIFT+"удалить строку" KEY_SELECT 0601 SELECT KEY_SEND 0602 SEND KEY_SEOL 0603 SHIFT+EOL KEY_SEXIT 0604 SHIFT+EXIT KEY_SFIND 0605 SHIFT+FIND KEY_SHELP 0606 SHIFT+HELP KEY_SHOME 0607 SHIFT+HOME KEY_SIC 0610 SHIFT+"вставить символ" KEY_SLEFT 0611 SHIFT+"стрелка влево" KEY_SMESSAGE 0612 SHIFT+MESSAGE KEY_SMOVE 0613 SHIFT+MOVE KEY_SNEXT 0614 SHIFT+NEXT KEY_SOPTIONS 0615 SHIFT+OPTIONS KEY_SPREVIOUS 0616 SHIFT+PREVIOUS KEY_SPRINT 0617 SHIFT+PRINT KEY_SREDO 0620 SHIFT+REDO KEY_SREPLACE 0621 SHIFT+REPLACE KEY_SRIGHT 0622 SHIFT+"стрелка вправо" KEY_SRSUME 0623 SHIFT+RESUME KEY_SSAVE 0624 SHIFT+SAVE KEY_SSUSPEND 0625 SHIFT+SUSPEND KEY_SUNDO 0626 SHIFT+UNDO KEY_SUSPEND 0627 SUSPEND KEY_UNDO 0630 UNDO ПСЕВДОГРАФИКА Следующие переменные могут быть использованы для рисо- вания рамочек на экране терминала с помощью процедуры waddch. Если соответствующий символ может быть выведен на терминал, значение переменной будет иметь установ- ленный бит A_ALTCHARSET. В противном случае переменная имеет подразумеваемое значение. Отправной точкой для набора символов послужили возможности терминала vt100. Имя Символ по Описание умолчанию ACS_ULCORNER + левый верхний угол ACS_LLCORNER + левый нижний угол ACS_URCORNER + правый верхний угол ACS_LRCORNER + правый нижний угол ACS_RTEE + правый край ACS_LTEE + левый край ACS_BTEE + нижний край ACS_TTEE + верхний край ACS_HLINE - горизонталь ACS_VLINE | вертикаль ACS_PLUS + крест ACS_S1 - надчеркивание ACS_S9 _ подчеркивание ACS_DIAMOND + алмаз ACS_CKBOARD : клетка ACS_DEGREE ' знак градуса ACS_PLMINUS # плюс/минус ACS_BULLET o перечисление ACS_LARROW < стрелка влево ACS_RARROW > стрелка вправо ACS_DARROW v стрелка вниз ACS_UARROW ^ стрелка вверх ACS_BOARD # квадраты ACS_LANTERN # фонарик ACS_BLOCK # сплошной блок ДИАГНОСТИКА Все процедуры, для которых при описании не указано возвращаемое значение, возвращают целое значение OK при успешном завершении и ERR при неудаче. Все макросы возвращают значение то же, что и соответст- вующие w-процедуры, кроме setscrreg, wsetscrreg, getsyx, getyx, getbegy, getmaxyx, возвращаемые значения которых описаны выше. В случае ошибки результат процедур, возвращающих значе- ния-указатели, равен (тип *) NULL. СЮРПРИЗЫ В настоящее время при использовании пакета curses неп- рерывно производится проверка ввода путем чтения без ожидания и возврата символа обратно, если он вдруг ока- зался прочитанным. Проверка ввода начинается после пер- вого вызова wgetch. В дальнейшем, когда появится соот- ветствующая поддержка со стороны ядра операционной сис- темы, это будет изменено. Программы, которые перемеши- вают ввод от пакета curses и свой собственный, должны вызвать typeahead (-1) для отключения проверки ввода. Аргумент функции napms в настоящее время округляется до ближайшего целого числа секунд. Процедура draino (ms) работает, только если значение ms равно 0. ПРЕДОСТЕРЕЖЕНИЯ Для версии операционной системы 3.1 необходимо пользо- ваться пакетом curses версии 3.1. Программы, использо- вавшие пакет curses в операционной системе версии 2 для выполнения в операционной системе версии 3.1 требуют пересборки объектных файлов с новой библиотекой libcurses.a версии 3.1. Если Ваша программа не пользу- ется новыми возможностями пакета версии 3.1, то объект- ные файлы можно собрать с библиотекой версии 2 и выпол нять в операционной системе версии 2. Библиотеки plot(3X) и curses(3X) используют одинаковые имена процедур erase и move, причем версии пакета curses являются макросами. Если Вам требуется работать с обеими библиотеками, то соответствующие фрагменты нужно поместить в разные исходные файлы или использо- вать в тексте, работающем с пакетом plot(3X), директивы #undef move и #undef erase. Между вызовами initscr и endwin выводить на экран можно только с помощью процедур пакета curses. Использование для этих целей процедур стандартного пакета ввода/выво- да [см. stdio(3S)] может привести к непредсказуемым ре- зультатам. СМ. ТАКЖЕ ioctl(2), plot(3X), putc(3S), scanf(3S), stdio(3S), system(3S), vprintf(3S), profile(4), term(4), terminfo(4), varargs(5). cc(1), ld(1) в Справочнике пользователя. termio(7), tty(7) в Справочнике администратора.