[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Основные сведения о функциях curses для работы с терминалом

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

Дополнительная информация о терминалах приведена в следующих разделах:

Работа с несколькими терминалами

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

Для запуска curses на одном экране по умолчанию вызовите функцию initscr. Такой режим запуска пригоден для большинства приложений. Однако если ваше приложение выводит данные на несколько терминалов, то следует воспользоваться функцией newterm. Эта функция должна быть вызвана для каждого терминала. Функцию newterm следует применять и в том случае, если ваше приложение обрабатывает ошибки таким образом, что на терминалах, не поддерживающих полноэкранный режим, оно может продолжить работу в построчном режиме.

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

Функция set_term позволяет назначить терминал для операций ввода и вывода.

Определение характеристик терминала

Функции curses поддерживают следующие функции, предназначенные для определения характеристик терминала:

longname Возвращает полное имя терминала.
has_ic Определяет, поддерживает ли терминал вставку символов.
has_il Определяет, поддерживает ли терминал вставку строк.

Функция longname возвращает указатель на статическую область памяти, в которой хранится подробное описание текущего терминала. Эта область становится определенной только после вызова функции initscr или newterm. Если вы хотите пользоваться функцией longname при работе с несколькими терминалами, то учтите, что после каждого вызова функция newterm переписывает содержимое этой области. Вызов функции set_term не восстанавливает прежнее содержимое. Поэтому следует сохранять содержимое этой области в промежутках между вызовами функции newterm.

Функция has_ic возвращает значение TRUE, если терминал может вставлять и удалять символы.

Функция has_il возвращает значение TRUE, если терминал может вставлять и удалять строки, либо может имитировать эти действия с помощью областей прокрутки. Функция has_il позволяет определить, можно ли включить физическую прокрутку функцией scrollok или idlok.

Выбор режимов ввода и вывода для терминала

Функции управления вводом-выводом определяют, каким образом приложение считывает данные и предоставляет информацию пользователю.

Режимы ввода

К специальным символам ввода относятся символы управления потоком, символ прерывания, символ стирания и символ уничтожения. В библиотеке curses реализованы четыре взаимоисключающих режима ввода, что позволяет приложениям гибко управлять вводом символов.

Обычный режим
Обычная обработка текста по строкам, все специальные символы обрабатываются вне приложения. Этот режим аналогичен стандартному режиму обработки ввода. При переходе в этот режим путем вызова функции nocbreak( ) флаги ISIG и IXON не изменяются, путем вызова функции noraw( ) - устанавливаются.

Реализация поддерживает символы стирания (erase) и уничтожения (kill) для всех поддерживаемых локалей, независимо от ширины удаляемого символа.

Режим cbreak
Введенные пользователем символы немедленно поступают в приложение, функции curses не выполняют специальную обработку символов стирания и уничтожения. В приложении можно установить режим cbreak для того, чтобы оно само редактировало строки, но при этом его выполнение можно будет прервать с помощью клавиш отмены задания. Этот режим аналогичен нестандартному режиму обработки ввода, случай В (MIN равен 1, ICRNL сброшен). При переходе в этот режим значения флагов ISIG и IXON не изменяются.

Режим ввода с задержкой
Аналогичен режиму cbreak, за исключением того, что функции ввода ожидают либо завершения интервала, определенного в приложении, либо момента, когда символ станет доступным, в зависимости от того, что произойдет раньше. Этот режим аналогичен нестандартному режиму ввода, случай С (TIME равно значению, указанному в приложении). При переходе в этот режим значения флагов ISIG и IXON не изменяются.

Режим прямого ввода
В этом режиме приложение полностью управляет обработкой ввода. В приложение передаются все введенные с клавиатуры символы. Этот режим аналогичен нестандартному режиму обработки ввода, случай D. При переходе в этот режим флаги ISIG и IXON сбрасываются.

При инициализации curses с помощью функций initscr и newterm текущие параметры терминала сохраняются. В дальнейшем их можно восстановить с помощью функции endwin. Начальный режим ввода при работе с функциями curses не определен, если только приложение не поддерживает опцию Enhanced curses - тогда в начале работы устанавливается режим cbreak.

Эффект нажатия клавиши BREAK зависит от других разрядов в драйвере дисплея, на которые функции curses не влияют.

Режим задержки

Два взаимоисключающих режима задержки определяют, насколько быстро происходит возврат из некоторых функций curses, если отсутствует ввод терминала, ожидающий вызова функции:

Без задержки Происходит сбой функции.
С задержкой Приложение ожидает передачи текста в приложение. В режиме cbreak или в режиме прямого ввода ожидание заканчивается после приема одного символа. В других режимах приложение ждет до получения первого символа <новой строки>.

Обработка функциональных клавиш в режиме Без задержки не определена.

Эхоповтор

Режим эхоповтора (echo) определяет, должны ли функции curses отображать вводимые символы на экране. Работа в режиме эхоповтора аналогична обработке ввода при установленном флаге echo в поле local mode структуры termios, соответствующей терминалу данного окна. Однако функции curses при вызове всегда сбрасывают флаг echo, чтобы операционная система не выполняла эхоповтор. Способ эхоповтора символов в curses отличен от способа эхоповтора в операционной системе, так как curses выполняют дополнительную обработку ввода, поступающего на терминал.

В режиме эхоповтора функции curses самостоятельно отображают символы. Вызванная приложением функция ввода сохраняет любые введенные видимые символы в текущем или указанном окне в позиции курсора, как при вызове функции addch( ). Выполняются также все дополнительные действия по обработке ввода, например, перемещение курсора и перенос строк.

В режиме без эхоповтора отображение символов должно выполняться приложением. Приложения часто отображают ввод в своей области экрана или вообще отключают эхоповтор.

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

cbreak или nocbreak Переключает терминал в режим CBREAK или отключает этот режим.
delay_output Задает интервал задержки вывода в миллисекундах.
echo и noecho Включает или отключает эхоповтор вводимых символов.
halfdelay Возвращает ERR, если в течение указанного времени после блокировки не было введено ни одного символа.
nl или nonl Определяет, должны ли функции curses преобразовывать символ начала строки в символы возврата каретки и перевода строки (при выводе) и символ Return в символ начала строки (при вводе).
raw или noraw Переключает терминал в режим прямого ввода или отключает этот режим.

Функция echo переводит терминал в режим эхоповтора. В этом режиме функции curses отображают введенные с клавиатуры символы в текущей позиции курсора на экране. Функция noecho отключает режим эхоповтора.

Функция raw переключает терминал в режим прямого ввода. В этом режиме введенные пользователем символы немедленно передаются в программу. Символы прерывания, выхода, приостановки и управления потоком также передаются в программу, а не вызывают генерацию сигнала, как в режиме cbreak. Функция noraw отключает режим прямого ввода.

Функция cbreak включает режим, частично совпадающий с режимом прямого ввода (функция raw). В режиме cbreak введенные пользователем символы немедленно передаются в программу, символы стирания и уничтожения не обрабатываются. Однако, в отличие от режима прямого ввода, выполняется обработка символов прерывания и управления потоком. Кроме того, введенные символы хранятся в буфере терминала до ввода символа начала строки или возврата каретки.

Примечание: В режиме cbreak драйвер терминала не выполняет преобразование символов.

Функция nocbreak выключает режим cbreak.

Функция delay_output задает время задержки вывода в миллисекундах. Не следует злоупотреблять вызовами этой функции, так как она генерирует символы заполнения, а не отсчитывает паузу по тактам процессора.

Функция nl определяет, должны ли функции curses при выводе заменять символы новой строки на символы возврата каретки и перевода строки. Функция nonl определяет, должны ли функции curses при вводе заменять символы возврата каретки в символы новой строки. По умолчанию выполняются обе эти операции. При отключении этих преобразований библиотека функций curses получает возможность более гибко управлять переводом строк, вследствие чего возрастает скорость движения курсора.

Работа с файлами terminfo и termcap

При инициализации библиотеки curses она определяет тип терминала с помощью значения переменной среды TERM. Затем curses выполняет поиск определения, в котором содержится информация о характеристиках терминала. Обычно эти данные хранятся в локальном каталоге, имя которого указано в переменной среды TERMINFO, или в каталоге /usr/share/lib/terminfo. Все программы curses сначала проверяют каталог, указанный в переменной TERMINFO, если она определена. Если она не определена, проверяется каталог /usr/share/lib/terminfo.

Например, если переменной среды TERM присвоено значение vt100, а переменной TERMINFO - значение /usr/mark/myterms, то curses проверяет содержимое файла /usr/mark/myterms/v/vt100. Если этот файл не существует, curses проверяет содержимое файла /usr/share/lib/terminfo/v/vt100.

Если вам требуется переопределить значения, заданные в описании терминала, установите переменные среды LINES и COLUMNS.

Применение функций terminfo в программах

Функции terminfo позволяют программе напрямую обращаться к базе данных terminfo. Например, с их помощью можно программировать функциональные клавиши. Во всех остальных случаях рекомендуется использовать функции из библиотеки curses.

Инициализация терминалов

Сначала программа должна вызвать функцию setupterm. Как правило, эта функция вызывается неявно при вызове функции initscr или newterm. Функция setupterm из базы данных terminfo значения переменных, зависящих от терминала. База данных terminfo содержит булевские, численные и строковые переменные. Значения всех таких переменных terminfo зависят от того, какой терминал выбран. После считывания переменных из базы данных функция setupterm помещает описание терминала в cur_term. При работе с несколькими терминалами можно с помощью функции set_curterm определить переменную cur_term для данного терминала.

Функция restartterm во многом схожа с функцией setupterm. Однако она вызывается после восстановления исходного состояния памяти. Например, ее рекомендуется вызывать после функции scr_restore. Функция restartterm "полагает", что опции ввода и вывода те же, что и в момент сохранения памяти, но что тип терминала и скорость передачи данных могли измениться.

Функция del_curterm освобождает память, выделенную для хранения информации о характеристиках указанного терминала.

Файлы заголовков

Файлы curses.h и term.h должны быть указаны в программе в следующем порядке:

#include <curses.h>
#include <term.h>

Эти файлы содержат определения строковых и числовых переменных, а также флагов базы данных terminfo.

Обработка характеристик терминала

Передайте все параметризованные строки функции tparm для инициализации. Печать всех строк terminfo и вывода функции tparm должна выполняться с помощью функции tputs или putp.

putp Обеспечивает быстрый доступ к функции tputs.
tparm Инициализирует параметризованную строку.
tputs Добавляет символы заполнения к строке и выводит ее.

Следующие функции можно применять для считывания характеристик терминала и передачи их в другие функции:

tigetflag Возвращает значение указанной булевской переменной. Если указанная переменная другого типа, возвращает -1.
tigetnum Возвращает значение указанной числовой переменной. Если указанная переменная другого типа, возвращает -2.
tigetstr Возвращает значение указанной строковой переменной. Если указанная переменная другого типа, возвращает значение (char *) -1.

Завершение работы программы

При завершении работы программы необходимо восстановить исходное состояние терминала. Для этого следует вызвать функцию reset_shell_mode. Если программа работает с адресацией курсора, то она при запуске должна вывести строку enter_ca_mode, а при завершении работы - строку exit_ca_mode.

Если в программе выполняется временный вход в оболочку, то перед запуском оболочки необходимо вызвать функцию reset_shell_mode и вывести строку exit_ca_mode. После завершения сеанса оболочки программа должна вывести строку enter_ca_mode и вызвать функцию reset_prog_mode. Этот процесс отличается от стандартного выхода из программы с помощью функции curses endwin.

Низкоуровневые функции для работы с экраном

Следующие функции можно применять для выполнения низкоуровневых операций с экраном:

scr_restore Выводит на виртуальный экран содержимое предыдущего файла.
scr_dump Записывает содержимое виртуального экрана в указанный файл.
scr_init Инициализирует структуры данных curses значениями из указанного файла.
ripoffline Удаляет одну строку из stdscr.

Функции termcap

Если программа работает с информацией о терминале из файла termcap, то для ее преобразования применяются функции termcap. Параметры функций termcap те же. Библиотека curses эмулирует эти функции с помощью базы данных terminfo. Поддерживаются следующие функции termcap:

tgetent Эмулирует функцию setupterm.
tgetflag Возвращает запись идентификатора termcap булевского типа.
tgetnum Возвращает запись идентификатора termcap числового типа.
tgetstr Возвращает запись идентификатора termcap строкового типа.
tgoto Дублирует функцию tparm. Вывод функции tgoto должен передаваться в функцию tputs.

Преобразование описаний termcap в описания terminfo

Команда captoinfo преобразует описания termcap в описания terminfo. Приведенный ниже пример иллюстрирует работу команды captoinfo:

captoinfo /usr/lib/libtermcap/termcap.src

Эта команда преобразует файл /usr/lib/libtermcap/termcap.src в исходный файл terminfo. Вывод команды captoinfo направляется в стандартный файл вывода, при этом комментарии и прочая подобная информация в файле сохраняются.

Работа с терминалами

Перечисленные ниже функции предназначены для сохранения и восстановления состояния режимов терминала:

savetty Сохраняет текущее состояние режимов терминала.
resetty Восстанавливает состояние режимов терминала, существовавшее на момент последнего вызова функции savetty.

Связанная информация

Глава 2, Библиотека curses

Работа с видеоатрибутами

Синхронные и сетевые асинхронные терминалы

В больших системах и при связи с хостом в блочном режиме часто применяются синхронные, сетевые асинхронные (NWA) и нестандартные напрямую подключенные асинхронные терминалы. На таких терминалах пользователь вводит данные, а затем нажимает специальную клавишу для передачи введенных символов на хост.

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

Вывод

Интерфейс curses обычно можно применять для всех операций вывода на терминал, но с одним возможным исключением: на некоторых терминалах применение функции refresh( ) для обновления любых участков экрана может вызвать полную его перерисовку.

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

Ввод

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


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]