Опции ввода
Система UNIX производит множество действий с символами, вводимыми пользователем. Среди прочего, система выполняет следующее:
- Отображает вводимые символы на экране терминала (такое отображение мы будем называть эхом).
- Обрабатывает символы забоя (ERASE, обычно #) и уничтожения (KILL, обычно @).
- Интерпретирует CTRL+D как конец файла (EOF).
- Обрабатывает символы прерывания (INTR) и выхода (QUIT).
- Сбрасывает бит четности символа.
- Преобразует возврат каретки в перевод строки.
Curses полностью берет на себя управление экраном терминала, поэтому его подпрограммы отключают эхо, производимое системой UNIX, и делают его самостоятельно. Временами бывает необходимо программно отключать стандартную для системы UNIX обработку символов. Для этого предназначены некоторые подпрограммы curses, например, noecho() и cbreak(). Используя такие подпрограммы, можно управлять интерпретацией вводимых символов. В приведенной ниже таблице перечислены основные подпрограммы, предназначенные для управления режимом ввода.
Если программа использует curses и вводит с терминала, она должна установить некоторые опции ввода. Это связано с тем, что при старте программы терминал может оказаться в любом из режимов cbreak(), raw(), nocbreak(), или noraw(). Как показано в таблице, при запуске программы гарантируется только наличие режима echo().
Как правило, в интерактивной терминальной программе используются комбинация режимов noecho() и cbreak(). Пусть, например, нужно отображать вводимые символы не там, где находится курсор, а в нижней строке экрана. Для этого предназначена подпрограмма noecho(). Однако, хотя noecho() и подавляет отображение вводимых символов, символы забоя и уничтожения обрабатываются обычным образом. Для отключения этого режима используется подпрограмма cbreak().
Опции ввода | Символы | Интерпретируются | Не интерпретируются |
Нормальное состояние "вне curses" | прерывание, выход, сброс бита четности, <CR> в <NL>, забой, уничтожение, конец файла | |
Нормальное состояние "старт curses-программы" | эхо (заменяет эхо системы UNIX) | все остальное не определено |
cbreak () и echo () | прерывание, выход, сброс бита четности эхо | забой, уничтожение, конец файла |
cbreak () и noecho () | прерывание, выход, сброс бита четности | забой, уничтожение, конец файла, эхо |
nocbreak () и noecho () | разрыв, выход, сброс бита четности, забой, уничтожение, конец файла | эхо |
nocbreak () и echo () | См. предостережение ниже | |
nl () | <CR> в <NL> | |
nonl () | <CR> в <NL> | |
raw () [вместо cbreak ()] | разрыв, выход, сброс бита четности |
Предостережение
Не применяйте одновременно nocbreak() и noecho(). Если установлены оба режима и Вы вызываете getch(), программа при чтении каждого символа включает, а затем отключает cbreak(). В зависимости от состояния драйвера терминала при вводе символа, это может привести к выводу нежелательных данных на экран.
Помимо подпрограмм, перечисленных в таблице, для управления вводом используются следующие подпрограммы curses: noraw(), halfdelay(), nodelay(). Они обсуждаются в curses(3X).
Далее подробнее описываются подпрограммы noecho(), cbreak() и связанные с ними echo() и nocbreak().
echo( ), noecho( )
СИНТАКСИС | |
#include <curses.h> int echo ( ) int noecho ( ) |
ОПИСАНИЕ | |
echo() устанавливает режим "эхо" - отображение символов на экране по мере их ввода. При старте программы этот режим установлен. |
Ни та, ни другая подпрограмма не возвращают полезных значений.
curses-программы могут работать неправильно, если эхо установлено одновременно с nocbreak(). См. таблицу выше и последующее предостережение. После отключения эха вводимые символы можно отображать посредством addch().
ПРИМЕР | |
См. программы editor и show в разделе Примеры программ, работающих с curses. |
СИНТАКСИС | |
#include <curses.h> int cbreak ( ) int nocbreak ( ) |
ОПИСАНИЕ | |
cbreak() включает режим "прерывание при вводе каждого символа". Программа получает каждый символ сразу после его ввода, но символы забоя, уничтожения и конца файла не обрабатываются. |
Ни одна из подпрограмм не возвращает полезных значений.
curses-программы могут работать неправильно, если cbreak() включается и отключается в пределах одной программы, либо если используется комбинация nocbreak()
и echo().
См. таблицу выше и последующее предостережение.
ПРИМЕР | |
См. программы editor и show в разделе Примеры программ, работающих с curses. |