Вводить символы в окно curses можно с клавиатуры или из приложения. В этом разделе описаны способы добавления, удаления и изменения символов в окне curses.
В этом разделе рассматриваются следующие вопросы:
Ранее каждому символу на экране соответствовал один байт памяти. В настоящее время это правило не действует по следующим причинам:
Некоторые наборы включают символы, занимающие несколько столбцов на экране.
Вывод символа, ширина которого превышает ширину целевого окна, приводит к ошибке.
Библиотека Curses содержит набор функций, позволяющих изменять текст в окне и выделять область в окне для обновления функцией wrefresh.
Функции waddch заменяют символ в текущей позиции логического курсора на указанный символ. После этого логический курсор перемещается на одну позицию вправо. На правой границе окна функции waddch автоматически добавляют символ новой строки. Кроме того, если курсор находится на нижней границе и включен режим прокрутки, то область прокручивается на одну строку вверх. Это происходит, например, при добавлении новой строки к последней строке окна.
При добавлении символа табуляции,
новой строки или забоя библиотека curses соответственно обновляет позицию
курсора в окне. Позиции табуляции расположены через каждые восемь
символов. При выводе символа новой строки curses сначала вызывает
функцию wclrtoeol, удаляющую все символы строки начиная с текущего
положения курсора и до конца строки, а затем перемещает курсор.
Семейство waddch состоит из следующих элементов:
Применяя совместно функции семейств winch и waddch, можно скопировать текст и атрибуты видеоизображения из одной области окна в другую. Функции семейства winch позволяют получать символы и атрибуты из окна или экрана, а функции waddch - выводить символы на экран.
Кроме того, функции waddch позволяют выводить управляющие символы. Эти символы будут показаны в виде ^X.
Примечание: Получить код управляющего символа с помощью функции winch невозможно. Вместо него будет возвращен символ, представляющий управляющий символ на экране.
Для вывода отдельных символов, отличных от управляющих, рекомендуется использовать функции wechochar, которые позволяют значительно повысить производительность. Эти функции по своему действию равносильны соответствующим парам функций waddchr и wrefresh. В семейство wechochar входят функция wechochar, макроопределение echochar и функция pechochar.
Некоторые наборы символов содержат невидимые символы. (Невидимыми называются отличные от ('\0') символы, для которых функция wcwidth () возвращает нулевую ширину.) Приложение может выводить такие символы в окно. Каждый невидимый символ в окне связан с одним обычным символом и изменяет его определенным образом. Невидимые символы в окне не адресуются непосредственно, а лишь неявно при операциях curses с обычными символами, с которыми они связаны.
С невидимыми символами не связаны атрибуты. Интерфейсы, принимающие атрибуты и широкие символы, игнорируют атрибуты, связанные c невидимыми символами. При выводе широких символов для всех столбцов определен единый набор атрибутов. Приложение может управлять связью невидимых символов с обычными с помощью интерфейса широких символов. Эта связь зависит от конкретного набора символов.
Обычно невидимый символ действует на обычный символ (назовем его b) одним из следующих способов:
Максимальное число невидимых символов, которые могут быть связаны с одним обычным символом, зависит от конкретной реализации, но не может быть меньше пяти.
Составной символ - это набор связанных символов, который может включать один обычный символ, а также некоторое количество невидимых символов. Видимый составной символ обязательно содержит один обычный символ. Составные символы встречаются, например, в наборе символов ISO/IEC 10646-1:1993.
Составной символ может быть выведен на экран. Если составной символ не включает обычный символ, то все его невидимые символы связываются с обычным символом, находящимся в указанной точке экрана. При считывании информации с экрана приложение получает только видимые составные символы.
Тип данных cchar_t содержит описание и представление составного символа. Если cchar_t представляет невидимый составной символ (в котором отсутствует обычный символ), то его представление игнорируется; при выводе используется представление видимого символа, уже показанного на экране.
Объект типа cchar_t может быть инициализирован функцией setchar( ), а его содержимое может быть получено функцией getchar( ). Результат применения функций к объекту cchar_t, который не был инициализирован указанным способом или получен от функции curses типа cchar_t, не определен.
Некоторые функции могут обрабатывать специальные символы.
В функциях, не перемещающих курсор на основании информации окна,
специальные символы будут влиять только на расположение последующих символов в
строке; любое заданное впоследствии перемещение курсора не повлияет на
положение видимого курсора. В функциях, не перемещающих курсор, эти
специальные символы могут применяться для управления положением последующих
символов и перемещения физического курсора.
Забой | Символ Забой перемещает курсор на один столбец к началу строки, если только он уже не находится в нулевом столбце; все дальнейшие символы добавляются с новой позиции курсора. |
Возврат каретки | Символ Возврат каретки перемещает курсор в начало текущей строки. Все дальнейшие символы добавляются с новой позиции курсора. |
Новая строка | В операции добавления функция curses заполняет пробелами текущую строку
до конца. Затем выполняется прокрутка, курсор перемещается в начало
новой строки и все последующие символы добавляются с новой позиции
курсора.
В операции вставки функция curses очищает текущую строку до конца с помощью wclrtoeol( ), а затем помещает курсор в начало следующей строки. Переход курсора на следующую строку может вызвать прокрутку, если она разрешена. Все последующие символы вставляются с новой позиции курсора. |
Табуляция | Символ табуляции в тексте сдвигает следующие за ним символы до очередной
позиции табуляции. По умолчанию позиции табуляции расположены в
столбцах 0, 8, 16 ...
В операции вставки или добавления функция curses соответственно вставляет или добавляет пробелы в последовательные столбцы до очередной позиции табуляции. Если до конца текущей строки позиции табуляции отсутствуют, выполняется перевод строки и прокрутка. |
Функции curses, обрабатывающие специальные символы, заменяют их на символ '^' и обычный символ (если это буква, то она будет прописной). Функциям получения текста из окна передается указанная пара символов, а не код специального символа.
Ниже описаны переменные и функции
waddch, с помощью которых вы можете выводить на экран символы
псевдографики. Для применения символов из дополнительной части кодового
набора нужно установить разряд A_ALTCHARSET. В противном
случае будут выведены символы из основной части набора (см. столбец
Символ по умолчанию в следующей таблице).
Имя переменной | Символ по умолчанию | Описание символа |
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 | # | закрашенный квадрат |
Функции waddstr
добавляют в окно строку, оканчивающуюся символом NULL, начиная с текущего
символа. Для добавления одного символа эффективнее функция
waddch. Функции waddstr предназначены для вывода
строк символов. Семейство waddstr состоит из следующих
элементов:
Функция waddstr | Выводит строку символов в пользовательское окно. |
Макрокоманда addstr | Выводит строку символов в stdscr. |
Макрокоманда mvaddstr | Перемещает логический курсор в заданную позицию, а затем выводит строку символов в stdscr. |
Макрокоманда wmvaddstr | Перемещает логический курсор в заданную позицию, а затем выводит строку символов в пользовательское окно. |
Функции winsch вставляют символ перед текущим символом в
окне. Все символы справа от вставленного сдвигаются на один столбец
вправо. Такой сдвиг может привести к потере крайнего правого
символа. Положения логических и физических курсоров не меняются.
Семейство winsch включает следующие элементы:
Функции winsertln вставляют пустую строку перед следующей. Функция insertln вставляет строку в stdscr. Нижняя строка окна удаляется. Функция winsertln выполняет аналогичную операцию с пользовательским окном.
Функции wprintw заменяют последовательность символов
(начиная с текущего) форматированным выводом. Их формат совпадает с
форматом команды printf. Семейство
printw состоит из следующих элементов:
Функции wprintw для замены символов вызывают функции waddch.
Макрокоманда unctrl возвращает печатное представление управляющих символов в формате ^X. Печатные символы макрокоманда unctrl оставляет без изменений.
idlok | Разрешает библиотеке curses применять аппаратные функции вставки и удаления строк. |
scrollok | Разрешает прокрутку окна при выходе курсора за правую границу последней строки. |
setscrreg и wsetscrreg | Задает область программной прокрутки в окне. |
Если пользователь или приложение перемещают курсор за нижний край окна, то может быть выполнена прокрутка. Прокрутка должна быть разрешена функцией scrollok. Прокрутка выполняется, если она разрешена указанной функцией и происходит одно из следующих событий:
При прокрутке окна функции curses обновляют как окно, так и экран. Однако для того чтобы прокрутка была видна, необходимо вызвать функцию idlok с параметром Флаг, равным TRUE (истина).
Если прокрутка запрещена, то курсор остается на последней строке в позиции последнего введенного символа.
Если прокрутка окна разрешена, то с помощью функций setscrreg в нем можно создать программную область прокрутки. Вызываемым функциям setscrreg необходимо передать номера верхней и нижней строк области. После этого любая попытка вывести курсор за указанную нижнюю строку будет приводить к прокрутке всей области на одну строку вверх. Макроопределение setscrreg позволяет создать область прокрутки в stdscr. Для создания областей прокрутки в пользовательских окнах применяется функция wsetscrreg.
Примечание: В отличие от функции idlok, функции setscrreg не используют аппаратную прокрутку, даже если терминал обладает такой возможностью.
Удаление символов может быть выполнено путем замены их пробелами или сдвига строки влево.
erase и werase | Заменяет все символы окна пробелами. |
Макрокоманда erase заменяет пробелами все символы stdscr. Функция werase заменяет пробелами все символы пользовательского окна. Для удаления одного символа из окна воспользуйтесь функцией wdelch.
clear или wclear | Очищает экран и устанавливает флаг clear для следующего обновления. |
clearok | Определяет, будет ли выполнена очистка окна при следующем вызове функции refresh или wrefresh. |
Функции wclear аналогичны функциям werase. Однако после замены всех символов окна пробелами функции wclear дополнительно вызывают функцию wclearok. В результате при следующем вызове функции wrefresh экран автоматически очищается.
Семейство функций wclear включает функцию wclear, макрокоманду clear и функцию clearok. Макрокоманда clear заменяет пробелами все символы stdscr.
clrtoeol или wclrtoeol | Очищает текущую строку начиная с позиции логического курсора до конца. |
Макрокоманда clrtoeol работает с stdscr, тогда как функция wclrtoeol выполняет те же действия в пользовательском окне.
clrtobot или wclrtobot | Очищает текущую строку начиная с позиции логического курсора до конца, а также все последующие строки. |
Макрокоманда clrtobot работает с stdscr, тогда как функция wclrtobot выполняет те же действия в пользовательском окне.
Функции wdelch удаляют текущий символ и смещают все последующие символы текущей строки на одну позицию влево. Последний символ строки заменяется пробелом. Семейство функций delch состоит из следующих элементов:
deleteln и wdeleteln | Удаляет текущую строку. |
Функции wdeleteln удаляют текущую строку и перемещают все последующие строки на одну строку вверх. Нижняя строка окна при этом очищается.
Программы могут получать символы как с клавиатуры, так и с экрана. Функции wgetch получают символы с клавиатуры, функции winch - с экрана.
Функции wgetch получают символы, введенные с клавиатуры, подключенной к текущему терминалу. Если содержимое окна или положение курсора изменилось, то перед получением символа эти функции вызывают функции wrefresh. Если функция wgetch получит сочетание клавиш Ctrl-D, она возвращает управление вызывающей программе.
Семейство wgetch
содержит следующие элементы:
Для того чтобы поместить символ, полученный с помощью функции wgetch, обратно в очередь ввода, вызовите функцию ungetch. Этот символ будет получен при следующем вызове функции wgetch.
Результат работы функции
wgetch зависит от режима работы терминала. Ниже описаны
действия, выполняемые функциями wgetch в каждом из режимов:
Примечание: при работе с функциями wgetch не устанавливайте одновременно режимы NOCBREAK и ECHO. Это может привести к непредсказуемым результатам, зависящим от состояния драйвера терминала в момент ввода каждого символа.
Функциональные клавиши определены
в файле curses.h. Они могут быть получены функцией
wgetch, если будут набраны с дополнительной клавиатуры.
Терминал может поддерживать не все функциональные клавиши. Информация о
поддержке клавиш приведена в базе данных terminfo. В
следующей таблице приведен список функциональных клавиш, определенных в файле
curses.h:
Имя | Название клавиши |
KEY_BREAK | Break (прервать; может отсутствовать). |
KEY_DOWN | Down (вниз). |
KEY_UP | Up (вверх). |
KEY_LEFT | Left (влево). |
KEY_RIGHT | Right (вправо). |
KEY_HOME | Home (в начало; стрелка влево и вверх). |
KEY_BACKSPACE | Backspace (забой; может отсутствовать). |
KEY F0 | Функциональные клавиши. Зарезервированы коды для 64 функциональных клавиш. |
KEYF(n) | Формула для Fn. |
KEY_DL | Delete line (удалить строку). |
KEY_IL | Insert line (вставить строку). |
KEY_DC | Delete character (удалить символ). |
KEY_IC | Insert (вставить символ или перейти в режим вставки). |
KEY_EIC | Выйти из режима вставки. |
KEY_CLEAR | Clear (очистить экран). |
KEY_EOS | Очистить до конца экрана. |
KEY_EOL | Очистить до конца строки. |
KEY_SF | Прокрутить на одну строку вперед. |
KEY_SR | Прокрутить на одну строку назад. |
KEY_NPAGE | Next page (следующая страница). |
KEY_PPAGE | Previous page (предыдущая страница). |
KEY_STAB | Set tab (установить позицию табуляции). |
KEY_CTAB | Clear tab (очистить позицию табуляции). |
KEY_CATAB | Clear all tabs (очистить все позиции табуляции). |
KEY_ENTER | Enter (ввод). |
KEY_SRESET | Программный сброс. |
KEY_RESET | Аппаратный сброс. |
KEY_PRINT | Print (печать) или Copy (копировать). |
KEY_IL | Home down или bottom (вниз и в начало; стрелка влево и вниз) на дополнительной клавиатуре. |
KEY_A1 | Левая верхняя клавиша дополнительной клавиатуры. |
KEY_A3 | Правая верхняя клавиша дополнительной клавиатуры. |
KEY_B2 | Центральная клавиша дополнительной клавиатуры. |
KEY_C1 | Левая нижняя клавиша дополнительной клавиатуры. |
KEY_C3 | Правая нижняя клавиша дополнительной клавиатуры. |
KEY_BTAB | Back tab (обратная табуляция). |
KEY_BEG | Begin (запуск). |
KEY_CANCEL | Cancel (отмена). |
KEY-CLOSE | Close (закрыть). |
KEY_COMMAND | Command (команда). |
KEY_COPY | Copy (скопировать). |
KEY_CREATE | Create (создать). |
KEY_END | End (в конец). |
KEY_EXIT | Exit (выход). |
KEY_FIND | Find (найти). |
KEY_HELP | Help (справка). |
KEY_MARK | Mark (пометить). |
KEY_MESSAGE | Message (сообщение). |
KEY_MOVE | Move (переместить). |
KEY_NEXT | Next object (следующий объект). |
KEY_OPEN | Open (открыть). |
KEY_OPTIONS | Options (опции). |
KEY_PREVIOUS | Previous object (предыдущий объект). |
KEY_REDO | Redo (повторить). |
KEY_REFERENCE | Reference (ссылка). |
KEY_REFRESH | Refresh (обновить). |
KEY_REPLACE | Replace (заменить). |
KEY_RESTART | Restart (перезапустить). |
KEY_RESUME | Resume (возобновить). |
KEY_SAVE | Save (сохранить). |
KEY_SBEG | Shift+Begin. |
KEY_SCANCEL | Shift+Cancel. |
KEY_SCOMMAND | Shift+Command. |
KEY_SCOPY | Shift+Copy. |
KEY_SCREATE | Shift+Create. |
KEY_SDC | Shift+Delete character. |
KEY_SDL | Shift+Delete line. |
KEY_SELECT | Select (выбрать). |
KEY_SEND | Shift+End. |
KEY_SEOL | Shift+Clear line. |
KEY_SEXIT | Shift+Exit. |
KEY_SFIND | Shift+Find. |
KEY_SHELP | Shifted+Help. |
KEY_SHOME | Shift+Home. |
KEY_SIC | Shift+Input. |
KEY_SLEFT | Shift+Left. |
KEY_SMESSAGE | Shift+Message. |
KEY_SMOVE | Shift+Move. |
KEY_SNEXT | Shift+Next. |
KEY_SOPTIONS | Shift+Options. |
KEY_SPREVIOUS | Shift+Previous. |
KEY_SPRINT | Shift+Print. |
KEY_SREDO | Shift+Redo. |
KEY_SREPLACE | Shift+Replace. |
KEY_SRIGHT | Shift+Right. |
KEY_SRSUME | Shift+Resume. |
KEY_SSAVE | Shift+Save. |
KEY_SSUSPEND | Shift+Suspend. |
KEY_SUNDO | Shift+Undo. |
KEY_SUSPEND | Suspend (приостановить). |
KEY_UNDO | Undo (отменить). |
Если программа вызывает функцию keypad и пользователь нажимает функциональную клавишу, то вместо соответствующей этой клавише последовательности символов возвращается код нажатой функциональной клавиши. Коды функциональных клавиш определены в файле /usr/include/curses.h. Каждое макроопределение начинается префиксом KEY_, а коды клавиш представляют собой целые числа, начинающиеся с 03510.
При получении символа, который может быть началом последовательности символов функциональной клавиши (например, символа Escape), curses устанавливает таймер (структуру типа timeval, определенную в файле /usr/include/sys/time.h). Если оставшаяся часть последовательности не поступает за отведенное время, то символ передается для дальнейшей обработки. В противном случае возвращается код функциональной клавиши. По этой причине программы реагируют на нажатие клавиши Escape с задержкой. В связи с этим не рекомендуется назначать какие-либо действия на клавишу Escape, если ввод считывается с клавиатуры функцией wgetch. Параметры таймера можно изменить с помощью переменной среды ESCDELAY.
Переменная среды ESCDELAY задает время ожидания дополнительных символов, по истечении которого вызывающей программе код клавиши Escape. ESCDELAY=1 означает задержку в 1/5000 с. Если переменная ESCDELAY равна нулю, то система передает код клавиши Escape, не ожидая появления в буфере дополнительной информации. Допустимы значения от 0 до 99999. По умолчанию значение ESCDELAY равно 500 (0,1 с).
Для того чтобы запретить функции wgetch устанавливать таймер, вызовите функцию notimeout. В этом случае curses не будет делать различия между функциональными и обычными клавишами.
Функция keyname возвращает указатель на имя клавиши, код которой указан в аргументе Клавиша. Значение Клавиша может быть получено от любой из функций wgetch, getch, mvgetch или mvwgetch.
Функции winch считывают текущий символ. Если с
символом связаны атрибуты, то они прибавляются к полученному значению двоичной
дизъюнкцией. С помощью функций winch можно узнать код
символа или его атрибуты. Для этого нужно вычислить значение
A_CHARTEXT & A_ATTRIBUTES. Указанные
константы определены в файле curses.h. Семейство
inch содержит следующие элементы:
Функции wscanw считывают символьные данные,
интерпретируют их в соответствии с заданной спецификацией преобразования и
сохраняют результат. Для считывания символов функции wscanw
пользуются функциями wgetstr. Семейство wscanw
состоит из следующих элементов:
Функция vwscanw просматривает содержимое окна, получая переменный список аргументов. Дополнительная информация о работе с переменными списками аргументов приведена в описании макроопределения varargs.
Основные сведения о функциях curses для работы с терминалом