Что такое код ncurses_attroff

Содержание

Библиотека ncurses

Благодарности

Глозштейну Александру Моисеевичу за то, что показал библиотеку ncurses.
Victor Wagner за то, что показал библиотеку PDCurses.
Отдельное спасибо E.L.K. за пример использования UTF-8 в ncurses. И конечно всем тем, кто не мешал :).

Соглашения

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

Данное руководство многократно изменялось, по тому не исключены ошибки. Обнаруженные недочеты, поправки и дополнения просьба присылать автору.

Для изучения данного материала предполагается наличие у читателя начальных знаний языка С.

текст на синем фоне обозначает исходный текст программы

текст на чёрном фоне обозначает команду, которую нужно выполнить в командной строке

Краткое описание

Библиотека ncurses (аналог библиотеки crt в Pascal) предназначена для управления вводом выводом на терминал. Она позволяет программисту не беспокоиться об аппаратных различиях терминалов и писать достаточно переносимый код. Файлы библиотеки находятся в папке /usr/include/curses/, дополнительную информацию и примеры можно найти в /usr/share/doc/ncurses-версия_библиотеки и в /usr/share/doc/ncurses-devel-версия_библиотеки.

Библиотека ncurses построена на основе библиотеки curses. Есть и другие библиотеки, построенные на базе curses. Материал представленный здесь построен на общих функциях библиотек ncurses и PDCurses для создания максимально переносимых приложений.

Основные понятия

Экран — окно максимального для данного терминала размера.

Терминал — экран, на котором располагаются окна.

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

Новые типы и константы

chtype тип символов, с которыми работает ncurses (он включает в себя код символа, цвет и дополнительные атрибуты)
bool логический тип (может быть ложным FALSE или истинным TRUE)
WINDOW структура, хранящая данные окна
SCREEN структура, хранящая данные терминала

Константы

TRUE логическая истина (1)
FALSE логическая ложь (0)

Большинство функций возвращает код ошибки.
ERR значение, возвращаемое при ошибке (-1)
OK значение, возвращаемое при отсутствии ошибки
Подробнее о том в каких случаях и что возвращает конкретная функция можно узнать в документации или в man.

Знакомство

Что нового Вы увидели в этом примере?
1) Чтобы Вы смогли воспользоваться любой библиотекой её нужно подключить. Для библиотеки ncurses это делается добавлением «#include » в начале программы.
2) Для того чтобы начать работу с библиотекой ncurses необходимо её проинициализировать. Для этого нужно вызвать функцию initscr().
3) При завершении работы с библиотекой ncurses нужно вызвать endwin().
4) printw и getch аналогичны printf и getchar из
5) библиотека ncurses позволяет ускорить вывод на экран за счёт того, что она использует запись не непосредственно на экран, а в буфер в памяти и когда нужно отобразить все изменения при помощи функции refresh() выводится только изменившаяся часть экрана.

Таким образом, каждая программа, использующая ncurses, будет иметь следующую структуру:

Рассмотрим компиляцию программы использующую ncurses. Чтобы откомпилировать пример приведённый в листинге 1 нужно выполнить команду:

gcc sample1.c -o sample1 -lncurses

Если Вы уже компилировали программы в gcc, то наверно заметили, что добавился новый параметр -lncurses.

Для ввода-вывода в С используются такие функции как putchar, printf, scanf, getch. Однако их нельзя использовать вместе с библиотекой ncurses. Для ввода-вывода на экран в программах использующих ncurses могут использоваться только функции объявленные в самой библиотеке ncurses.

Вывод

Вывод символа
int addch(const chtype ch)
выводит символ ch в текущую позицию курсора и перемещает курсор на один символ вправо или в начало следующей строки, если курсор находится у правой границы экрана. (аналогична функции putchar из ) chtype тип символов с которыми работает ncurses (он включает в себя код символа, цвет и дополнительные атрибуты).

Вставка символа
int insch(chtype ch)
вставляет символ ch слева от курсора и все символы стоящие после курсора перемещаются на одну позицию вправо.

Вывод строки с преобразованием по формату
int printw(const char *fmt. )
пример:
выведет Значение i=1
(аналогична функции printf)

Вывод строки типа chtype*
int addchnstr(const chtype *chstr, int n)
выводит первые n символов или всю строку символов chstr, если n=-1 в позицию, где расположен курсор.

Вывод строки типа char*
int addstr(const char *str)
выводит строку str в позицию, где расположен курсор.

Вставка строки
int insnstr(const char* str, int n)
вставляет первые n символов или всю строку символов str, если n=-1 в позицию, где расположен курсор. (положение курсора не изменяется, то что стояло справа от курсора сдвигается вправо)

Вставка пустой строки
int insertln()
вставляет пустую строку (строки стоящие ниже начиная с текущей сдвигаются вниз на одну строку)

Режимы вывода

Для символов типа chtype можно устанавливать такие атрибуты, как мигание или цвет символа и фона. Для добавления символу атрибута мигания нужно включить флажок A_BLINK. Далается это так:
chtype ch = ‘w’ | A_BLINK;
Теперь при выводе этого символа он будет мигать, если конечно это позволяет сделать терминал. (A_DIM — пониженная яркость, A_BOLD — повышенная яркость, A_NORMAL — нормальное отображение, A_UNDERLINE — подчёркнутый, A_REVERSE — инверсный)

С включением цвета немного сложнее. Перед использованием цветов нужно проинициализировать палитру. Палитра это структура, в которой определённой цифре соответствует определённый цвет. В нашем случае одной цифре соответствуют сразу два цвета символов и фона.

Функция has_colors позволяет узнать можно ли использовать цвета. Функция start_color() должна вызываться до задания палитры. Функция init_pair() нужна чтобы задать какой цифре какой цвет будет соответствовать от 1 до COLOR_PAIRS-1 (0 зарезервирован для стандартного отображения). Для использования цвета в символе нужно включить флажок COLOR_PAIR(номер из палитры).
Список цветов:
COLOR_BLACK
COLOR_RED
COLOR_GREEN
COLOR_YELLOW
COLOR_BLUE
COLOR_MAGENTA
COLOR_CYAN
COLOR_WHITE

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

Включение атрибутов
int attron(int attrs)
включает атрибуты attrs. (Например attron(COLOR_PAIR(1)); устанавливает цвет 1 из палитры)

Отключение атрибутов
int attroff(int attrs)
отключает атрибуты attrs. (Например attroff(A_BLINK); отключает мигание)

Установка атрибутов
int attrset(int attrs)
Заменяет текущие атрибуты атрибутами attrs (Например attrset(A_NORMAL); заменяет текущие атрибуты на A_NORMAL)

Установка атрибутов очистки
void bkgdset(chtype ch)
Устанавливает атрибуты с которыми очищается экран такими функциями как clear(). (Например bkgdset(COLOR_PAIR(1)); очистка будет осуществляться цветом 1 из палитры)

(C) Copyright 2005-2006 Бердников Александр

Консольные приложения на Curses

Приложения с текстовым интерфейсом, работающие в терминале, по-прежнему очень популярны и отлично конкурируют с приложениями с графическим интерфейсом. Mutt , irssi , vim , tmux и многие другие являются незаменимыми в повседневной работе. На CPAN есть модули, позволяющие создавать приложения с текстовым интерфейсом, в том числе модуль Curses , являющийся обвязкой к распространённой C-библиотеке ncurses .

История

Для самых ранних ЭВМ в качестве ввода/вывода информации использовались электромеханические телетайпы (Teletype, или сокращённо TTY), которые позволяли вводить текст с клавиатуры и печатать на бумаге символ за символом, полученные от ЭВМ. Позже телетайп был заменён терминалом, где принтер заменил ЭЛТ-экран, на который на фиксированные позиции можно было выводить символы. Самым первым компьютерным терминалом стал DataPoint 3300, который имел экран, позволяющий выводить 25 рядов по 72 символа. Примечательно, что этот терминал был создан на основе обычных TTL-микросхем, а дальнейшие попытки упростить логику и уменьшить размер внутренней начинки терминала стали одной из побуждающих причин разработки микропроцессоров.

Как правило, к одному мейнфрейму под управлением какой-либо из UNIX-систем подключалось множество терминалов. ЭВМ запускала программу командной оболочки, ввод и вывод которой был связан с устройством терминала. Оболочка обрабатывала вводимые команды и выводила результаты их работы на терминал.

Стандартом де-факто на долгие времена стал терминал VT100, созданный компанией DEC в 1978 г. Терминал подключался к вычислительной машине через последовательный интерфейс, позволял выводить 80 или 132 символа в ряд и использовал для кодировки символов стандарт ASCII, а также набор управляющих последовательностей (escape-последовательностей), которые были стандартизованы ANSI в виде стандарта ECMA-48. Escape-последовательности получили своё название от кода клавиши Escape, который предварял набор кодов, определяющих управляющую последовательность. Управляющие последовательности позволяли передвигать курсор, очищать экран, задавать толщину символов или даже делать мигающую строку, на цветных терминалах появилась возможность задавать цвет фона и символа. Например, последовательность кодов ESC[1m задаёт жирный шрифт для последующих выводимых символов, а ESC[0m сбрасывает все установленные атрибуты.

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

С ростом числа терминалов стала возникать проблема с поддержкой всех их видов внутри программ. В 1978 г. Билл Джой, при работе над текстовым радактором vi для Berkeley Unix, выделил код для поддержки разных типов терминалов в отдельную библиотеку под названием termcap, которая стала базой данных описаний существующих терминалов и позволяла реализовывать программы, независимые от типа терминала. Termcap давал возможность программе узнать ширину терминала, правильную последовательность escape-кодов для перемещения курсора и т.д. Вслед за termcap появилась библиотека terminfo, которая являлась улучшенной реализацией termcap с более быстрым доступом к описанию терминала. Именно terminfo получила максимальное распространение в UNIX-системах.

В 1980 г. большую популярность получила игра Rogue, которая дала старт целому жанру rogue-подобных игр, в которой игровой персонаж исследует подземелья, сражается с монстрами и ищет сокровища. Игра для вывода использовала текстовую консоль, монстры обозначались заглавными буквами, коридоры и границы подземелий прорисовывались ASCII-символами | и — . Один из разработчиков, Кен Арнольд, специально для игры создал библиотеку, которая абстрагировалась от работы с конкретным типом терминала, вводила абстрактные понятия окон как матриц символов, забирая на себя все заботы по выводу и обновлению экрана. Библиотека получила название curses («проклятие»), что является каламбуром на словосочетание «cursor optimization». Первоначально curses была основана на termcap. В отличие от termcap, которая фактически являлась текстовой базой данных о свойствах терминалов, curses предоставляла довольно внятное C API.

Позже появились библиотеки pcurses и PDcurses, которые являлись свободными альтернативами BSD curses. В 1991 г. работа над pcurses была продолжена, а в 1993 г. она была переименована в ncurses, что было сокращением от new curses (новая curses), и стала развиваться в рамках проекта GNU. Со временем к ncurses появились обертки для других языков программирования, в том числе и Perl-модуль Curses, который позволяет использовать библиотеку в Perl-программах.

Широкое использование аппаратных терминалов прекратилось после появления видеодисплеев, но тем не менее простота интерфейса и количество существующих для него программ привело к тому, что были созданы эмуляторы терминала — программы, которые эмулировали видеотерминал внутри другой видео системы, например, X Window. Это позволяло продолжать использовать программы, заточенные для работы в терминале, и в других системах. Наиболее популярные графические эмуляторы терминала — xterm, rxvt, а также современные gnome-terminal и konsole.

Использование консольных приложений с текстовым интерфейсом актуально и на сегодняшний день. Такие приложения как top, vim, emacs, mutt, irssi, moc, midnight commander используют многие и просто не представляют себе другой альтернативы. Терминальное приложение может работать поверх последовательных линий и поверх сети на очень низких скоростях, которые недоступны VNC или RDP. А в отличие от веб-интерфейсов, не требуют от клиента наличия гигабайтов оперативной памяти и многоядерных процессоров для того, чтобы удовлетворить системным требованиям современных браузеров.

Устройство терминала

Поскольку исторически терминалы являлись внешними устройствами с посимвольным обменом информации по последовательным линиям, то в UNIX-системах каждому терминалу соответствовал файл устройства вида /dev/tty* . Системные консоли были доступны на /dev/tty[0..NN] , последовательные порты на /dev/ttyS[0..NN] и т.д. (вариация названия зависела от конкретной реализации UNIX-системы). Для каждого такого устройства существует возможность установки скорости обмена, управляющих последовательностей и других настроек. Текущие настройки любого такого устройства можно увидеть с помощью утилиты stty :

Для процессов, которым необходима работа с терминалом, не связанным с каким-то физическим устройством, создаются так называемые псевдотерминалы. В современных UNIX-системах для эмулятора терминала по запросу создаётся файл устройства псевдотерминала в файловой системе devpts, например /dev/pts/0 , c которым ассоциируются стандартные файловые дескрипторы ввода/вывода STDIN , STDOUT и STDERR запускаемых эмулятором дочерних процессов. Эмулятор терминала определяет, каким будет тип терминала, каков будет размер экрана (количество строк и символов в строке) и другие параметры. Для запущеного же в псевдотерминале приложения нет никакого отличия работает ли он в псевдотерминале или на любом другом реальном терминале.

Perl Curses

Perl-модуль Curses является низкоуровневой обвязкой к С-библиотеке ncurses. Из существующей POD-документации практически невозможно понять, как программировать приложения на Curses , поскольку подразумевается, что вы будете использовать документацию по самой C-библиотеке ncurses.

Помимо Curses , на CPAN существуют ещё несколько дистрибутивов, которые позволяют разрабатывать приложения с текстовым интерфейсом. Часть их используют Curses , но имеют более высокоуровневый интерфейс, удобный для разработки. Это такие модули как Curses::UI и Curses::Toolkit . Есть также модули, которые вообще не привязаны к ncurses, например, Tickit . Если вы планируете создание сложных консольных приложений, где будут активно использоваться примитивы окон, диалогов, меню, форм, функции обратного вызова на события, то эти модули, вероятно, наиболее лучший выбор для использования. Если же стоит задача создания тривиального позиционного вывода информации, как, например, в приложении top , то использование Curses может быть целесообразнее.

Библиотека Curses работает с экраном, который представляется в виде прямоугольной матрицы, каждый элемент которой связан с позицией на экране для вывода символа. Начало координат, позиция (0,0), задаёт левый верхний угол экрана. На экране могут быть заданы одно или несколько окон и субокон — прямоугольных областей, для которых определены свои свойства вывода.

Старт с Curses

Несколько функций библиотеки инициализируют работу приложения в текстовом режиме:

initscr — функция инициирует режим curses, создаёт окно по умолчанию, производит очистку экрана и устанавливает текущую позицию курсора в левый верхний угол (0,0);

cbreak и raw — функции отключают буферизованный ввод, и приложение сразу получает информацию о нажатых клавишах, при этом raw также перехватывает и специальные сочетания клавиш, такие как Ctrl+C и Ctrl+Z ;

echo и noecho — включают и отключают режим «эха», т.е. вывод на экран вводимых с клавиатуры символов.

Библиотека Curses имеет ОО-интерфейс, в этом случае вместо инициализации окна по умолчанию через initscr можно использовать вызов new :

Многие функции С-библиотеки ncurses имеют различные вариации одной и той же функции с префиксами w, mv, и wmv. Префикс подразумевает, что появляется какой-либо дополнительный параметр: w — объект окна, mv — координаты y, x позиции курсора. В Perl-библиотеке Curses такие вариации функций были объединены в одну, но с опциональными параметрами окна и координат:

Такие функции получили название унифицированных, и их можно использовать как методы при программировании с использованием ОО-интерфейса. В документации Curses приведён полный список функций и указано, какие из них являются унифицированными, а какие — нет. Во всех последующих примерах будет использоваться ОО-интерфейс, поэтому если используется прямой вызов функций, то это явно подразумевает, что функция не является унифицированной.

Рассмотрим пример приложения, которое выводит сообщение в центр экрана, ожидает ввод пользователя и завершает работу:

Приложение создаёт окно. Метод keypad со значением истины в параметре включает обработку специальных клавиш, таких как F1 , F2 и т.д. Метод getmaxyx позволяет определить максимальные значения координат на экране, т.е. размер текущего терминала. Метод addstr позволяет вывести строку по заданным начальным координатам. Метод refresh отображает всё то, что мы вывели на экран. Метод getch ожидает нажатия клавиши и возвращает введённый символ. Функция endwin завершает режим curses, возвращая предыдущее содержимое экрана.

Окна и субокна

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

Для создания нового окна используется функция newwin :

где $rows , $cols — определяют высоту и ширину окна, а $y , $x — положение окна на экране.

Окна могут перекрываться, при этом в месте пересечения будет отображаться контент того окна, которое было обновлено последним. Если требуется создать окно внутри другого окна, то можно использовать функцию создания субокна subwin или derwin :

Отличие subwin и derwin в том, что в derwin координаты субокна задаются относительно верхнего левого угла родительского окна.

Для удаления окна или субокна используется функция delwin

Окно можно перемещать по экрану с помощью функции mvwin ( mvderwin — для субкона):

Очистить содержимое окна можно с помощью функции clear :

Существует возможность отобразить границы окна с помощью функции box :

где первый параметр определяет символ для вертикальных линий, а второй — горизонтальных. Если используется значение 0 (или undef ), то используются символы границ по умолчанию.

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

Атрибуты

Для каждого выводимого символа может быть установлены атрибуты, в том числе:

  • A_BOLD — режим повышенной яркости;
  • A_NORMAL — нормальный режим яркости;
  • A_DIM — режим пониженной яркости;
  • A_UNDERLINE — подчёркнутый текст;
  • A_REVERSE — инверсный текст;
  • A_BLINK — мерцающий текст;
  • A_INVIS — невидимый текст.

Не все терминалы поддерживают указанные атрибуты (как правило, A_NORMAL совпадает с A_DIM , а некоторые атрибуты могут заменяться цветовым выделением).

Установить конкретный атрибут или набор атрибутов можно функцией attron :

После чего при выводе текста в данное окно начинают применяться указанные атрибуты. Также для установки атрибутов можно использовать функцию attrset , но данная функция сбросит все другие атрибуты, которые были до этого установлены:

Для отключения определённых атрибутов используется функция attroff :

Цвета

Многие терминалы имеют поддержку цвета. Для того, чтобы определить, поддерживает ли терминал цвет, можно использовать функцию has_colors . Если поддержка цветов в терминале присутствует, то перед работой с цветовой палитрой требуется инициализировать цвета вызовом функции start_color :

Для создания палитры из двух цветов (цвет фона и цвет текста) используется функция init_pair :

Установить указанную палитру цветов для вывода можно всё той же функцией attron :

Цветовая палитра ограничена 16 цветами, причём базовых цветов только 8, а дополнительные цвета получаются за счёт использования повышенной яркости ( A_BOLD ):

Существует возможность переопределить любой базовый цвет с помощью функции init_color , которая для заданного базового цвета устанавливает значения интенсивности соответственно красного, зелёного и синего цветов в диапазоне от 0 до 1000:

Не все терминалы поддерживают такую возможность, поэтому перед изменением цветов палитры следует выяснить, присутствует ли такая возможность в текущем терминале, с помощью функции can_change_color .

Обработка ввода

Для получения значения введённого символа используется метод getch . В случае если была активирована обработка специальных клавиш ( F1 , PgUp , PgDown и т.д.) с помощью keypad(1) , то getch возвращает числовой код специальной клавиши, например, значение 338 для PgDown . Если же обработка специальных клавиш отключена, то getch() вернёт лишь первый код из escape-последовательности клавиши.

Если на вводе оказывается символ Unicode, то getch воспринимает лишь первый байт последовательности. Соответственно для обработки Unicode-символа, имеющего внутреннее представление из двух байт, потребуется два последовательных вызова getch :

В Curses определены константы для функциональных клавиш, а также функция KEY_F , возвращающая код F* -клавиш. Названия констант можно найти в документации Curses , все они имеют префикс KEY_ .

В С-библиотеке ncursesw, есть функция get_wch , которая может обрабатывать ввод «широких» символов, но, к сожалению, она не перенесена в Perl-обвязку Curses .

С помощью функции halfdelay можно указать, какое время (в десятых долях секунды) getch должен ожидать ввода символа. Если после истечения таймаута клавиша не нажата, getch вернёт значение ERR (-1).

Для получения строки символов до символа переноса строки (или EOF ) может использоваться функция getstr :

Управление курсором

Получить текущие координаты курсора можно с помощью getyx :

Если вызывается какая-либо функция вывода на экран без указания координат, то вывод производится начиная с текущей позиции курсора. Курсор можно передвигать по экрану с помощью функции move :

Очистка экрана

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

Функция clear очищает окно целиком:

Функции clrtoeol и clrtobot очищают экран, начиная с текущей позиции курсора до конца строки и конца окна соответственно:

Функции deleteln и delch удаляют строку и символ соответственно на текущей позиции курсора:

Функция insdelln вставляет указанное число пустых строк, начиная с текущей позиции курсора (или удаляет, если аргумент отрицательный).

Обработка событий мыши

Curses позволяет обрабатывать события, возникающие при использовании мыши, такие как нажатие клавиш и перемещение указателя. Перед началом обработки действий мыши необходимо задать маску событий, которые будет фиксировать программа. Делается это с помощью функции mousemask :

Фиксировать наличие действий, произведённых мышью, можно всё той же функцией getch . Функция getmouse позволяет получить структуру произошедшего события, куда входит информация об идентификаторе устройства мыши (их может быть несколько), координатах мыши в трёх измерениях и непосредственно типе события.

Изменение размера экрана

Поскольку зачастую консольные приложения запускаются внутри графического окна эмулятора терминала, то во время работы приложения может происходить изменение размеров экрана, когда пользователь растягивает окно терминала или наоборот уменьшает. Для этих случаев существует сигнал SIGWINCH , которым эмулятор терминала оповещает запущенные приложения об изменении размера экрана.

Библиотека Curses устанавливает обработчик этого сигнала и пытается адаптировать существующие окна под новый размер экрана. Конечно не всегда это может быть выполнено корректно, поэтому для пользовательского приложения реализована возможность получить оповещение об произошедшем изменении размеров экрана — функция getch возвращает значение KEY_RESIZE :

Не стоит переопределять обработчик сигнала SIGWINCH в коде приложения, поскольку это приведёт к завершению работы приложения после получения сигнала.

Панели, меню и формы

В рамках проекта ncurses существуют дополнительные библиотеки, расширяющие возможности ncurses:

  • Панели. Представляют собой окна, которые могут перекрывать друг друга, при этом можно указать в каком порядке следуют панели, т.е. указывается третье измерение — глубина. Панели можно скрывать, отображать, перемещать наверх в стопке.
  • Меню. Позволяет реализовывать внутри ваших приложений привычные меню с поддержкой вложенности.
  • Формы. Позволяют создавать привычные элементы для ввода данных в виде текстовых полей, которые можно заполнять и редактировать.

Подробное описание этих расширений может стать темой для ещё одной статьи, но вполне возможно, если приложение требует подобного функционала, стоит посмотреть на более мощные альтернативы на CPAN, например, Curses::UI или Tickit .

Что такое код ncurses_attroff

Reha is a student of computer engineering in Istanbul, Turkey. He loves the freedom Linux provides as a software development platform. He spends much of his time in front of his computer, writing programms. He wishes to become a smart programmer someday.

Перевод на Русский:
Иванов Ю.А.

Содержание:

  • Что такое Ncurses?
  • Где взять?
  • Основы
  • Обновление экрана: refresh
  • Создание новых окон
  • Запись в окно и чтение из окна
  • Физический и логический курсоры
  • Очистка окна
  • Использование цветов
  • Рамки вокруг окон
  • Функциональные клавиши
  • Пример
  • Заключение
  • Ссылки
  • Страница отзывов

Введение в Ncurses

Ncurses это библиотека, которая реализует для текстовых терминалов многооконный интерфейс с большими возможностями.

Что такое Ncurses?

Вы хотите, чтобы ваша консольная программа имела цветной оконный интерфейс? Если да, то вам нужна ncurses, библиотека, которая реализует оконный интерфейс для текстовых терминалов. С помощью ncurses вы сможете:

  • использовать весь экран по своему устмотрению;
  • создавать окна и управлять ими;
  • использовать 8 различных цветов;
  • предоставить своей программе поддержку «мыши»;
  • использовать функциональные клавиши клавиатуры.

Ncurses можно использовать на любой UNIX системе, поддерживающей стандарт ANSI/ POSIX. Кроме того, библиотеку отличает способность определять свойства терминала через системную базу и реализовывать, таким образом, терминально-независимый интерфейс. Для вашей программы это означает, первое, кросс-платформенную переносимость и, второе, независимость от типа используемого терминала.

В качестве живых примеров использования библиотеки можно привести всем известный Midnight Commander и программу, используемую при конфигурации ядра системы. Их «скриншоты» вы можете увидеть ниже

Где взять?

Ncurses разработана по открытой лицензии и поэтому, чтобы скачать ее последний релиз, получить более подробную информацию или найти другие соответствующие ссылки, мы смело посещаем www.gnu.org/software/ncurses/.

Основы

Для того, чтобы использовать библиотеку, вам следует включить в исходный код своей программы заголовочный файл curses.h и при «линковке» программы не забыть указать компилятору gcc параметр -lcurses.

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

Наиболее часто используемыми компонентами ncurses являются окна. Даже если вы в своей программе не создаете окон, сам экран считается окном. Также как и файловый дескриптор stdout стандартной библиотеки I/O представляет экран ( когда нет других перенаправлений ), ncurses имеет свой указатель stdscr, который делает аналогичную работу. Кроме stdscr, библиотека имеет еще один похожий указатель — curscr. В то время как stdscr представляет экран, curscr представляет текущий экран. Вы можете спросить: «Так в чем отличие?». Читайте дальше.

Для того, чтобы использовать функции и переменные ncurses в своих программах, вы должны обратиться к функции initscr. Эта функция выделяет память для таких переменных как stdscr, curscr и делает библиотеку готовой к использованию. Другими словами, все функции библиотеки должны использоваться только после initscr. Очень похожим образом, вам следует обратиться к функции endwin, когда работа с ncurses закончена. Эта функция освобождает память, выделенную для ncurses. После вызова endwin, вы не сможете воспользоваться функциями ncurses до тех пор, пока снова не обратитесь к initscr.

Между обращениями к initscr и endwin, вам следует быть уверенным, что для работы с экраном не используются функции стандарьной библиотеки I/O. В противном случае, вы столкнетесь с нежелательным и, обычно, некорректным выводом на экран. Когда ncurses активна, используйте только ее функции. Перед обращением к initscr или после вызова endwin, вы можете делать что хотите.

Обновление экрана: refresh

Структура WINDOW не толлько хранит высоту, ширину и позицию окна, но также его контекст. Когда вы пишите в окно, его контекст меняется, но это не значит, что это сразу же отражается на экране. Для обновления экрана необходимо вызвать refresh или wrefresh.

Вот здесь и лежит различие между stdscr и curscr. В то время как curscr хранит контекст текущего экрана, stdscr, после обращения к фукнциям вывода библиотеки, может содержать уже другую информацию. Если вы хотите, чтобы последние изменения, отраженные в stdscr были перенесена в curscr, необходимо вызвать функцию refresh. Другими словами, refresh является единственной функцией связанной с curscr. И настоятельно рекомендуется, во избежание недоразумений с curscr, выполнять его обновление только с помощью этой функции.

В refresh реализован механизм обновления экрана с максимально возможной скоростью. При своем вызове, функция обновляет только те строки экрана, которые были изменены. Это бережет процессорное время, поскольку отпадает необходимость в повторном перезаписыании информации на экране. Это механизм как раз и является причиной несовместимости функций ncurses и стандартной библиотеки I/O при совместном использовании; при своем вызове функции библиотеки ncurses устанавливают флаг, который указывает refresh на измененнные строки экрана, при вызове функций стандартной библиотеки I/O ничего подобного не происходит.

refresh и wrefresh, в основном, делают одно и то же. wrefresh получает в качестве параметра указатель на структуру WINDOW и обновляет контекст только укзанного окна. refresh() является эквивалентом wrefresh(stdscr). Как я расскажу позднее, большинство функций ncurses, аналогично wrefresh, имеют подобные макросы, связывающие их с stdscr.

Создание новых окон

Давайте теперь поговорим о subwin и newwin, функциях, которые создают новые окна. Обе эти функции в качестве параметров получают высоту, ширину и координаты верхнего левого угла нового окна. В свою очередь, они возвращают указатель на структуру WINDOW, представляющую вновь созданное окно. Вы можете использовать этот указатель с wrefresh и другими функциями о которых я расскажу чуть позже.

«Если они делают одно и то же, зачем их дублировать?» можете вы спросить. И будете правы, они отличаются не сильно. subwin создает новое окно, как подокно в другом окне. Окно, созданное таким образом, наследует свойства родительского окна. Эти унаследованные свойства в дальнейшем могут быть изменены без влияния на родительское окно.

Кроме этого, существует еще одна вещь, которая связывает вместе родительское и дочернее окна. Символьный массив, который хранит контекст окна, становится общим и для родительского и для дочернего окон. Другими словами, символы на пересечении двух окон, могут быть изменены любым из них. Если родитель осуществляет запись в этой области, то меняется контекст и дочернего окна. Верно и обратное.

В противоположность subwin, newwin создает совершенно новое окно. Это окно, до тех пор пока в нем не будут созданы подокна, не разделяет свой символьный массив с другим окном. Преимущество использования subwin выражается в том, что общий символьный массив использует меньше памяти. Однако, когда окна накладываются одно на другое, использование newwin имеет свои положительные стороны.

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

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

Запись в окно и чтение из окна

Мы поговорили о stdscr, curscr, обновлении экрана и создании новых окон. Но как мы можем что-либо записать в окно? Или как мы прочитать данные из окна?

Функции, которые используются для этих целей очень похожи на своих собратьев из стандартной библиотеки I/O. Среди этих функций printw ( аналог printf ), scanw ( аналог scanf ), addch ( аналог putc или putchar ), getch ( аналог getc или getchar ). Они используются как обычно, разница только в именах. Аналогично, addstr можно использовать для записи в, а getstr для чтения строки из окна. Все эти функции с добавленной буквой ‘w’ впереди имени и указателем на структуру WINDOW в качестве первого передаваемого параметра, делают свою работу с различными окнами из stdscr. Например, printw(. ) и wprintw(stdscr, . ) эквивалентны, также как refresh() и wrefresh(stdscr).

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

Физический и логический курсоры

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

Логический курсор находится в области окна, где начнется процедура записи или чтения. Таким образом, имея возможность перемещать логический курсор практически повсюду, вы можете выводить информацию в любом месте экрана или окна в любое время. В этом заключается преимущество ncurses перед стандартной библиотекой I/O.

Функция, которая перемещает логический курсор это move или, как вы можете легко догадаться, wmove. move является макросом wmove, написанным для stdscr.

Теперь мы рассмотрим вопрос координации физического и логического курсоров. Позиция физического курсора, о которой можно говорить после завершения операции записи, определяется флагом _leave ( определен в структуре WINDOW ). Если _leave установлен, после операции записи, логический курсор будет перемещен в позицию физического курсора ( где был записан последний символ ). Если _leave не установлен, после операции записи, физический курсор возвращается в позицию логического курсора ( где был записан первый символ ). Флагом _leave управляет функция leaveok.

Перемещением физического курсора управляет функция mvcur. В отличие от других функций, работа mvcur отражается на экране мгновенно без ожидания следующего обновления. Если вы хотите, чтобы физический курсор стал невидимым, используйте функцию curs_set. Детали смотри в документации.

Также существуют макросы, которые комбинируют функции перемещения и записи, описанные выше, в один простой вызов. С этими функциями можно знакомится так же в документации.

Очистка окна

Запись в окно произведена. Но как мы можем очистить окно, строку или символы?

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

Сначала, давайте поговорим о функциях, которые связаны с очисткой символа или строки. Функции delch и wdelch удаляют символ, который находится в позиции логического курсора окна и смещают оставшиеся в той же строке символы влево. deleteln и wdeleteln удаляют строку на которой находится логический курсор и смещают все низлежащие строки вверх.

Функции clrtoeol и wclrtoeol удаляют все символы в одной строке справа от логического курсора. clrtobot и wclrtobot, сначала, вызывают wclrtoeol для удаления всех символов справа от логического курсора, а затем удаляют все последующие строки.

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

erase и werase заполняют символьный массив окна пробелами. И при следующем вызове refresh, окно очищается. Однако, если окно, которое следует очистить, заполняет весь экран, использование этих функций становится не эффективным. Они используют первый вариант очистки, описанный выше. Когда окно, которое нужно очистить, занимает весь экран, имеет смысл использовать функции, рассмотренные ниже.

Перед переходом к описанию других функций, пришло время рассказать о флаге _clear. Этот флаг определен в структуре WINDOW и если установлен, говорит refresh отправить на терминал управляющий код. При вызове, refresh проверяет занимает окно весь экран или нет ( используется флаг _FULLWIN ), если да, то она очищает экран с помощью управляющего кода. Это делает очистку экрана очень быстрой. Причина почему терминальный метод используется только для окон, занимающих весь экран лежит в том, что с помощью управляющего кода очищается экран, а не само окно. Флагом _clear управляет функция clearok.

Функции clear и wclear используются для очистки окон по ширине соответствующих экрану. Но на самом деле, эти функции эквивалентны вызовам werase и clearok. Сначала, они заполняют символьный массив окна пробелами. Затем, после установки флага _clear, очищают экран с помощью управляющего кода, если окно по ширине соответствует экрану или, же, обновляют окно, заполняя его пробелами.

Так что, если вы знаете, что окно, которое нужно очистить, занимает весь экран используйте clear или wclear. Это будет быстрее и эффективнее. Однако, когда окно не занимает экрана целиком, разницы в использовании wclear или werase нет.

Использование цветов

Цвета, которые вы видите на экране следует предсталять в виде пар цветов. Это потому, что каждая область имеет свой «background»- и «foreground»-цвет. Вывод информации в цвете, в ncurses, означает создание своих собственных пар цветов и использовании их в операции записи в окне.

Аналогично тому как initscr необходимо вызывать в начале работы с ncurses, start_color необходимо вызывать для инициализации работы с цветами. Функция, которую необходимо использовать для создания пар цветов это init_pair. Когда вы создаете с помощью init_pair пару цветов, она ассоциируется с числом, которое вы передаете функции в качестве первого параметра. Затем, когда бы вы не захотели использовать эту пару цветов, вы просто сошлетесь на нее с помощью этого числа.

Кроме создания пар цветов, вам необходимы функции, осуществляющие запись с использованием различных цветовых пар. Это осуществляется функциями attron и wattron. Эти функции, пока не будут вызваны attroff или wattroff, заставляют выводиться всю информацию в соответствующее окно выбранной парой цветов.

Также существуют функции bkgd и wbkgd, которые меняют пару цветов, ассоциированную с целым окном. При вызове, они изменяют «background»- и «foreground»-цвета всех областей окна. Это значит, что при следующем вызове refresh, каждая область окна будет перезаписана с помощью новой пары цветов.

Смотрите документацию по поводу доступных цветов и подробной информации о вышеприведенных функциях.

Рамки вокруг окон

Для придания вашей программе еще лучшего вида, вы можете создать вокруг окон рамки. В библиотеке существует макрос box, который и делает это для вас. В отличие от других функций, дял box wbox не существует; в качестве аргумента box получает указатель на структуру WINDOW.

Более подробную информацию о box вы можете найти в документации. Однако, следует упомянуть вот о чем. Обрамление окна рамкой означает просто запись необходимых символов в символьный массив окна, в его граничные области. Если вы позднее запишите в эти области какую-либо информацию, рамка окна будет испорчена. Для предотвращения этого, с помощью subwin вы создаете в исходном окне внутреннее окно, обрамляя, таким образом, исходное окно рамкой и используя внутреннее окно для записи.

Функциональные клавиши

Для того, чтобы использовать функциональные клавиши, для окна с которым вы собираетесь работать необходимо установить флаг _use_keypad. keypad является функцией, которая устанавливает значение _use_keypad. Когда вы устанавливаете _use_keypad, вы можете получить ввод с клавиатуры как обычно, используя функции ввода.

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

Пример

Сейчас мы собираемся проанализировать небольшую программу. В этой программе будет продемонстрирована работа с меню, созданным с помощью ncurses. «Скриншоты» вы можете посмотреть ниже:

Программа, как обычно, начинается с включения заголовочных файлов. Затем, мы определяем константы, чьими значениями будут ASCII-значения клавиш enter и escape.

Функция, приведенная ниже, вызывается в программе первой, при старте. В ней первой вызывается initscr для инициализации curses и, затем, start_color, которая делает возможным использование цветов. Пары цветов будут определены позднее. Вызов curs_set(0) делает физический курсор невидимым. noecho останавливает вывод информации с клавиатуры на экран. Функцию noecho можно также использовать для управления вводом с клавиатуры и отображения на экране только необходимой информации. Функция echo может быть вызвана когда нужно отменить действие noecho. И последней вызывается keypad, чтобы разрешить работу функциональных клавиш при получении ввода из stdscr. Это необходимо, так как мы собираемся использовать F1, F2 и клавиши со стрелками.

В следующей функции создается горизонтальное меню в верхней части экрана. Вы можете обратиться к функции main ( см. ниже ) и посмотреть, что это горизонтальное меню, появляющееся в виде одной строки в верхней части экрана, на самом деле определено как subwindow размером в одну строку для stdscr. Функция, приведенная ниже, получает в качестве параметра указатель на это окно, и сначала изменяет его цвет подложки, а затем выводит названия пунктов меню. Мы используем для вывода названий пунктов меню waddstr, хотя здесь можно было применить другую функцию. Обратите внимание на wattron, вызовы которой обычно используются для записи с другой парой цветов ( номер 3 ), а не с установленной по умолчанию ( номер 2 ). Помните, что пара номер 2 была установлена по умолчанию в первой строке wbkgd. wattroff вызывается, когда мы хотим переключиться на цветовую пару, используемую по-умолчанию.

Следующая функция отвечает за вывод меню при нажатии клавиш F1 или F2. Для создания эффекта меню, поверх синего окна, используемого в качестве подложки, создается новое окно с таким же белым цветом как и menubar. Мы не хотим, чтобы этим новым окном, были перезаписаны символы ранее выведенные на подложку. Они должны остаться на своем месте после закрытия меню. Вот почему, окно меню не может быть создано как subwindow stdscr. Как вы можете видеть ниже, окно items[0] создается с помощью newwin, а другие 8 окон items созданы как subwindows для items[0]. Здесь items[0] использовано для отрисовки рамки вокруг меню. Для того, чтобы отметить пункт как выбранный, имеет смысл сделать так, чтобы цвет его подложки отличался от цвета подложки других пунктов. Это то, что сделано в третьей строке снизу; цвет подложки первого пункта меню сделан другим по отношению к остальным пунктам и поэтому когда меню появляется, видно, что выбран первый пункт.

Следующая функция просто удаляет окно меню, созданное функцией выше. В ней, сначала, с помощью функции delwin удаляются окна, образующие пункты меню, а затем освобождается память, выделенная под указатель items.

Функция scroll_menu позволяет нам переключаться между меню и внутри меню. С помощью getch она определяет нажатые на клавиатуре клавиши. И если были нажаты клавиши со стрелками вверх или вниз, тогда становится выбранным пункт меню, расположенный выше или ниже. Это, если вы можете вспомнить, сделано путем изменения цвета подложки выбранного пункта меню отличным от цвета подложки других пунктов. Если были нажаты клавиши со стрелками влево или вправо, открытое меню закрывается и открывается другое. Если нажата клавиша enter, выбранный пункт меню по прежнему остается выбранным. При нажатии ESC, меню закрывается без выбора какого-либо пункта. Все другие клавиши функция игнорирует. В этой функции с помощью getch можно определять нажатие клавиши со стрелками. Позвольте мне напомнить вам, что все это осуществилось благодаря вызову в первой функции программы ( init_curses ) функции keypad(stdscr,TRUE) и тому, что возвращенное функцией getch значение было сохранено в переменной с типом int, а не char ( значения функциональных клавиш по величине больше величины, хранимой в переменной с типом char ).

И вот последняя функция — main. Она является каркасом для всех вышеописанных функций. В ней также происходит чтение с помощью getch нажатых клавиш и если F1 or F2 нажаты, отрисовывается соответствующее окно меню с помощью draw_menu. После этого, в ней вызывается scroll_menu и пользователю дается возможность выбрать какой-либо пункт меню. После отработки scroll_menu, она удаляет окна меню и выводит выбранный пункт в messagebar.

Еще я хочу упомянуть о функции touchwin. Если refresh, после закрытия меню, была вызвана напрямую без touchwin, то последнее открытое меню останется на экране. Причина этого в том, что функции меню не изменяют stdscr вообще, и при вызове refresh тоже, они не перезаписывают никаких символов в stdscr, поскольку полагают, что окно не изменилось. touchwin устанавливает все флаги в структуре WINDOW, которые говорят refresh обо всех измененных в окне строках и поэтому, при следующем вызове refresh, окно перезаписыватеся целиком, даже если контекст окна не изменился. Информация, записанная в stdscr остается там и после закрытия меню, поскольку меню не записывает ничего поверх stdscr, а только во вновь созданных окнах.

Если вы скопируете приведенный код в файл с именем example.c и удалите мои комментарии, то сможете скомпилировать программу следующим образом

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

Заключение

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

Ссылки

  • Пример программы: example.c
  • The ncurses website:www.gnu.org/software/ncurses/

Страница отзывов

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

talkback page

Webpages maintained by the LinuxFocus Editor team
© Reha K. Gerçeker, FDL
LinuxFocus.org
Click here to report a fault or send a comment to LinuxFocus
Translation information:

tr — : Reha K. Gerçeker
tr en: Reha K. Gerçeker
en ru: Иванов Ю.А.

2002-03-02, generated by lfparser version 2.19

Что такое код ncurses_attroff

(PHP 4 >= 4.1.0, PHP 5)

ncurses_attroff — Turn off the given attributes

Description int ncurses_attroff ( int attributes )

This function is EXPERIMENTAL . The behaviour of this function, the name of this function, and anything else documented about this function may change without notice in a future release of PHP. Use this function at your own risk.

Warning

This function is currently not documented; only the argument list is available.

Некорректно выводятся символы с атрибутами (ncurses)

Здравствуйте. Писал с ncurses «морской бой», появилась небольшая проблема. Для нормального отображения символов на экране мне потребовалось использовать атрибуты символов ncurses, но выводить каждый символ, используя различные атрибуты, у меня не вышло. Хотя я могу применить их через attr_on.

На выходе я получаю символ без каких-либо атрибутов. А если сделать так:

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

Что такое код ncurses_attroff

Скидка 25% на все тарифы хостинга по промокоду STDCITF

CURSES(3X)

НАЗВАНИЕ
curses — пакет подпрограмм управления выводом на терминал

ПРИМЕЧАНИЯ
Описание пакета curses устроено не совсем обычно.

В разделе СИНТАКСИС дается информация о компиляции, сводка имен аргументов процедур пакета и их типов, а также алфавитный указатель процедур пакета и их аргументов.

В разделе ОПИСАНИЕ рассказывается о том, как нужно использовать пакет curses.

В разделе ПРОЦЕДУРЫ приводится описание всех процедур пакета curses, процедуры при этом сгруппированы по следующим темам:

  • управление всем экраном
  • управление окнами
  • вывод
  • ввод
  • установка режимов вывода
  • установка режимов ввода
  • запросы к оборудованию
  • программируемые метки
  • процедуры нижнего уровня
  • процедуры уровня terminfo
  • эмуляция termcap
  • дополнительные процедуры
  • использование curscr

Ниже описаны аргументы процедур пакета curses, некоторые глобальные переменные, а затем сами процедуры. Все процедуры пакета, если не оговорено противное, возвращают значения ERR или OK типа int. В случае ошибки результат процедур, возвращающих значения-указатели, равен NULL. (Константы ERR, OK и NULL определяются во включаемом файле .)

ОПИСАНИЕ
Пакет curses дает пользователю независимый от терминала метод вывода на экран с разумной оптимизацией.

Инициализирующие процедуры initscr или newterm необходимо обязательно вызвать самыми первыми (три исключения из этого правила будут описаны ниже). При завершении работы нужно вызвать процедуру endwin. Чтобы вводимые символы не изображались на экране (большинству интерактивных экранных программ нужен именно такой режим) после вызова процедуры initscr необходимо вызвать Большинство программ дополнительно вызывают

Перед запуском программы, использующей пакет 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, outgf, 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, start, count) Забыть информацию о том, какие части окна изменились (эта информация используется для оптимизации вывода). Считать, что все окно требует перерисовки. Это часто бывает необходимо для пересекающихся окон, так как изменение одних окон вызывает изменение и других, но информация об этих изменениях в структурах данных других окон не отражается. Обращение к touchline говорит о том, что изменилось count строк окна, начиная со строки с номером start.

Ввод
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. Однако, если установлен режим >Отметим, что обе процедуры 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 напечатает сообщения о них и завершит программу. Таким образом, самый простой вызов, при котором используются только подразумеваемые значение, выглядит следующим образом:

Все переменные 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).

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. Все они могут быть заменены указанными процедурами:

Warning
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_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
влево
C1
вверх
B2
вниз
A3
вправо
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_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)] может привести к непредсказуемым результатам.

LXVII. Функции управления экраном терминала Ncurses

Предупреждение!

Это расширение является ЭКСПЕРИМЕНТАЛЬНЫМ. Поведение этого расширения, имена его функций и всё, что задокументировано, может измениться в последующих релизах РНР без предупреждения. Вы предупреждены и можете использовать это расширение только под вашу ответственность.

ncurses (new curses/новые курсы) это свободная программная эмуляция курсов в System V Rel 4.0 (и выше). Она использует формат terminfo, поддерживает заполнения, цвета, множественную подсветку/highlights, отображение символов формы и ключей функций.

Ncurses имеется для следующих платформ:


Digital Unix (aka OSF1)

Вам необходимы библиотеки и header-файлы ncurses. Загрузите последнюю версию с ftp://ftp.gnu.org/pub/gnu/ncurses/ или с другого зеркала GNU.

Чтобы эти функции работали, вы должны скомпилировали CGI-версию PHP с опцией —with-ncurses .

При ошибке ncurses-функции возвращают NCURSES_ERR.

Таблица 1. Константы цветов ncurses

константа значение
NCURSES_COLOR_BLACK нет цвета (чёрный)
NCURSES_COLOR_WHITE белый
NCURSES_COLOR_RED красный — поддерживается, если терминал находится в режиме color
NCURSES_COLOR_GREEN зелёный — поддерживается, если терминал находится в режиме color
NCURSES_COLOR_YELLOW жёлтый — поддерживается, если терминал находится в режиме color
NCURSES_COLOR_BLUE синий — поддерживается, если терминал находится в режиме color
NCURSES_COLOR_CYAN cyan — поддерживается, если терминал находится в режиме color
NCURSES_COLOR_MAGENTA magenta — поддерживается, если терминал находится в режиме color

Таблица 2. Константы клавиш ncurses

константа значение
NCURSES_KEY_F0 — NCURSES_KEY_F64 функциональные клавиши F1 — F64
NCURSES_KEY_DOWN стрелка вниз
NCURSES_KEY_UP стрелка вверх
NCURSES_KEY_LEFT стрелка влево
NCURSES_KEY_RIGHT стрелка вправо
NCURSES_KEY_HOME клавиша home (upward+left arrow)
NCURSES_KEY_BACKSPACE backspace
NCURSES_KEY_DL удалить строку
NCURSES_KEY_IL вставить строку
NCURSES_KEY_DC удалить символ
NCURSES_KEY_IC вставить символ или войти в режим insert/вставки
NCURSES_KEY_EIC выйти из режима вставки символов
NCURSES_KEY_CLEAR очистить экран
NCURSES_KEY_EOS очистить до конца экрана
NCURSES_KEY_EOL очистить до конца строки
NCURSES_KEY_SF прокрутить вперёд на одну строку
NCURSES_KEY_SR прокрутить назад на одну строку
NCURSES_KEY_NPAGE следующая страница
NCURSES_KEY_PPAGE предыдущая страница
NCURSES_KEY_STAB установить tab/табуляцию
NCURSES_KEY_CTAB очистить tab
NCURSES_KEY_CATAB очистить все tabs
NCURSES_KEY_SRESET мягкий (частичный) reset
NCURSES_KEY_RESET reset (или жёсткий reset)
NCURSES_KEY_PRINT print
NCURSES_KEY_LL lower left/самая нижняя левая
NCURSES_KEY_A1 upper left цифрового блока
NCURSES_KEY_A3 upper right цифрового блока
NCURSES_KEY_B2 center цифрового блока
NCURSES_KEY_C1 lower left цифрового блока
NCURSES_KEY_C3 lower right цифрового блока
NCURSES_KEY_BTAB back tab
NCURSES_KEY_BEG начало
NCURSES_KEY_CANCEL cancel
NCURSES_KEY_CLOSE close
NCURSES_KEY_COMMAND cmd (command/команда)
NCURSES_KEY_COPY copy
NCURSES_KEY_CREATE create
NCURSES_KEY_END end
NCURSES_KEY_EXIT exit
NCURSES_KEY_FIND find
NCURSES_KEY_HELP help
NCURSES_KEY_MARK mark
NCURSES_KEY_MESSAGE message
NCURSES_KEY_MOVE move
NCURSES_KEY_NEXT next
NCURSES_KEY_OPEN open
NCURSES_KEY_OPTIONS options
NCURSES_KEY_PREVIOUS previous
NCURSES_KEY_REDO redo
NCURSES_KEY_REFERENCE ref (reference)
NCURSES_KEY_REFRESH refresh
NCURSES_KEY_REPLACE replace
NCURSES_KEY_RESTART restart
NCURSES_KEY_RESUME resume
NCURSES_KEY_SAVE save
NCURSES_KEY_SBEG shiftet beg (beginning)
NCURSES_KEY_SCANCEL shifted cancel
NCURSES_KEY_SCOMMAND shifted command
NCURSES_KEY_SCOPY shifted copy
NCURSES_KEY_SCREATE shifted create
NCURSES_KEY_SDC shifted delete char
NCURSES_KEY_SDL shifted delete line
NCURSES_KEY_SELECT select
NCURSES_KEY_SEND shifted end
NCURSES_KEY_SEOL shifted end of line
NCURSES_KEY_SEXIT shifted exit
NCURSES_KEY_SFIND shifted find
NCURSES_KEY_SHELP shifted help
NCURSES_KEY_SHOME shifted home
NCURSES_KEY_SIC shifted input
NCURSES_KEY_SLEFT shifted left arrow
NCURSES_KEY_SMESSAGE shifted message
NCURSES_KEY_SMOVE shifted move
NCURSES_KEY_SNEXT shifted next
NCURSES_KEY_SOPTIONS shifted options
NCURSES_KEY_SPREVIOUS shifted previous
NCURSES_KEY_SPRINT shifted print
NCURSES_KEY_SREDO shifted redo
NCURSES_KEY_SREPLACE shifted replace
NCURSES_KEY_SRIGHT shifted right arrow
NCURSES_KEY_SRSUME shifted resume
NCURSES_KEY_SSAVE shifted save
NCURSES_KEY_SSUSPEND shifted suspend
NCURSES_KEY_UNDO undo
NCURSES_KEY_MOUSE mouse event has occured
NCURSES_KEY_MAX maximum key value

Таблица 3. mouse-константы

константа значение
NCURSES_BUTTON1_RELEASED — NCURSES_BUTTON4_RELEASED кнопка (1-4) отпущена
NCURSES_BUTTON1_PRESSED — NCURSES_BUTTON4_PRESSED кнопка (1-4) нажата
NCURSES_BUTTON1_CLICKED — NCURSES_BUTTON4_CLICKED кнопка (1-4) щёлкнула
NCURSES_BUTTON1_DOUBLE_CLICKED — NCURSES_BUTTON4_DOUBLE_CLICKED кнопка (1-4) дважды щёлкнула
NCURSES_BUTTON1_TRIPLE_CLICKED — NCURSES_BUTTON4_TRIPLE_CLICKED кнопка (1-4) трижды щёлкнула
NCURSES_BUTTON_CTRL ctrl нажата при щелчке
NCURSES_BUTTON_SHIFT shift нажата при щелчке
NCURSES_BUTTON_ALT alt нажата при щелчке
NCURSES_ALL_MOUSE_EVENTS сообщает обо всех событиях мыши
NCURSES_REPORT_MOUSE_POSITION сообщает о позиции мыши
Содержание ncurses_addch — добавляет символ в текущей позиции и продвигает курсор вперёд ncurses_addchnstr — добавляет атрибуированную строку со специфицированной длиной в текущей позиции ncurses_addchstr — добавляет атрибуированную строку в текущей позиции ncurses_addnstr — добавляет строку со специфицированной длиной в текущей позиции ncurses_addstr — выводит текст в текущей позиции ncurses_assume_default_colors — определяет цвет по умолчанию для цвета 0 ncurses_attroff — отключает данный атрибут ncurses_attron — включает данный атрибут ncurses_attrset — устанавливает данные атрибуты ncurses_baudrate — возвращает baudrate терминала ncurses_beep — разрешает терминалу подать сигнал ncurses_bkgd — устанавливает свойство background экрана терминала ncurses_bkgdset — управляет фоном экрана ncurses_border — рисует рамку вокруг экрана с использованием атрибуированных символов ncurses_can_change_color — проверяет, можем ли мы изменить цвета терминала ncurses_cbreak — отключает буферизацию ввода ncurses_clear — очищает экран ncurses_clrtobot — очищает экран от текущей позиции до низа ncurses_clrtoeol — очищает экран от текущей позиции до конца строчки ncurses_color_set — устанавливает цвета переднего плана и фона ncurses_curs_set — устанавливает статус курсора ncurses_def_prog_mode — сохраняет режим терминала (программы) ncurses_def_shell_mode — сохраняет режим терминала (оболочки/shell) ncurses_define_key — определяет keycode/код клавиши ncurses_delay_output — задерживает вывод на терминал, используя заполняющие символы ncurses_delch — удаляет символ в текущей позиции, остаток строки сдвигается влево ncurses_deleteln — удаляет строчку в текущей позиции, остаток экрана сдвигается вверх ncurses_delwin — удаляет ncurses-окно ncurses_doupdate — записывает все подготовленные обновления в терминал ncurses_echo — активирует отображение ввода с клавиатуры ncurses_echochar — вывод одного символа, включая обновление ncurses_end — останавливает использование ncurses, очищает экран ncurses_erase — стирает экран терминала ncurses_erasechar — возвращает текущий удалённый символ ncurses_filter — ncurses_flash — вспышка на экране терминала (визуальный сигнал) ncurses_flushinp — очищает буфер клавиатурного ввода ncurses_getch — читает символ с клавиатуры ncurses_getmouse — читает событие от мыши ncurses_halfdelay — переводит терминал в режим halfdelay ncurses_has_colors — проверяет, имеет ли терминал цвета ncurses_has_ic — проверяет возможность вставки/удаления ncurses_has_il — проверяет возможность вставки/удаления ncurses_has_key — проверяет существование функциональной клавиши на клавиатуре терминала ncurses_hline — рисует горизонтальную линию в текущей позиции, используя атрибуированный символ и max. n длину символов ncurses_inch — получает символ и атрибут в текущей позиции ncurses_init_color — устанавливает новое RGB-значение цвета ncurses_init_pair — размещает цветовую пару ncurses_init — инициализирует ncurses ncurses_insch — вставляет символ, перемещая остаток строки, включая символ в текущей позиции ncurses_insdelln — вставляет строчки перед текущей строчкой, прокручивая вниз (отрицательные числа удаляют и прокручивают вверх) ncurses_insertln — вставляет строчку, перемещая остаток экрана вниз ncurses_insstr — вставляет string в текущей позиции, перемещая остаток строчки вправо ncurses_instr — читает строчку с экрана терминала ncurses_isendwin — Ncurses находится в режиме endwin, может выполняться нормальный вывод экрана ncurses_keyok — включает или отключает keycode/код клавиши ncurses_killchar — возвращает kill-символ текущей строки ncurses_longname — возвращает описание терминала ncurses_mouseinterval — устанавливает timeout для щелчка кнопки мыши ncurses_mousemask — устанавливает опции мыши ncurses_move — переводит позицию вывода ncurses_mvaddch — переводит текущую позицию и добавляет символ ncurses_mvaddchnstr — переводит позицию и add attrributed string with specified length ncurses_mvaddchstr — переводит позицию и добавляет атрибуированную строку ncurses_mvaddnstr — переводит позицию и добавляет строку со специфицированной длиной ncurses_mvaddstr — переводит позицию и добавляет строку ncurses_mvcur — переводит курсор немедленно ncurses_mvdelch — переводит позицию и удаляет символ, сдвигая остаток строчки влево ncurses_mvgetch — переводит позицию и получает символ в новой позиции ncurses_mvhline — устанавливает новую позицию рисует горизонтальную линию, используя трибуированный символ и max. n длину символов ncurses_mvinch — переводит позицию и получает атрибуированный символ в новой позиции ncurses_mvvline — устанавливает новую позицию и рисует вертикальную линию, используя атрибуированный символ и max. n длину символов ncurses_mvwaddstr — добавляет строку в новой позиции в окне ncurses_napms — Sleep ncurses_newwin — создаёт новое окно ncurses_nl — транслирует newline и carriage return / line feed ncurses_nocbreak — переключает терминал в режим cooked ncurses_noecho — отключает отображение ввода с клавиатуры ncurses_nonl — не транслировать newline и carriage return / line feed ncurses_noqiflush — не зачищает сигнальные символы ncurses_noraw — отключает терминал от режима raw ncurses_putp — ncurses_qiflush — зачищает сигнальные символы ncurses_raw — переключает терминал в режим raw ncurses_refresh — обновляет экран ncurses_resetty — восстанавливает сохранённый статус терминала ncurses_savetty — сохраняет статус терминала ncurses_scr_dump — выполняет дамп содержимого экрана в файл ncurses_scr_init — инициализирует экран из дампа файла ncurses_scr_restore — восстанавливает экран из дампа файла ncurses_scr_set — наследует экран из дампа файла ncurses_scrl — прокручивает содержимое окна верх или вниз без изменения текущей позиции ncurses_slk_attr — возвращает ключевой атрибут текущей soft-метки/label ncurses_slk_attroff — ncurses_slk_attron — ncurses_slk_attrset — ncurses_slk_clear — очищает soft-метки с экрана ncurses_slk_color — устанавливает цвет для ключей soft-меток ncurses_slk_init — инициализирует soft label key-функции ncurses_slk_noutrefresh — копирует soft label keys в виртуальный экран ncurses_slk_refresh — копирует soft label keys в экран ncurses_slk_restore — восстанавливает soft label keys ncurses_slk_touch — форсирует вывод при выполнении ncurses_slk_noutrefresh ncurses_standend — останавливает использование атрибута ‘standout’ ncurses_standout — стартует использование атрибута ‘standout’ ncurses_start_color — стартует использование цветов ncurses_termattrs — возвращает логическое ИЛИ всех флагов атрибутов, поддерживаемых терминалом ncurses_termname — возвращает (short)-имя терминала ncurses_timeout — устанавливает timeout для специальных последовательностей клавиш ncurses_typeahead — специфицирует другой filedescriptor для проверки typeahead ncurses_ungetch — помещает символ обратно в поток ввода ncurses_ungetmouse — проталкивает событие от мыши в очередь/queue ncurses_use_default_colors — присваивает цвета по умолчанию color id -1 ncurses_use_env — управляет использованием информации окружения о размере терминала ncurses_use_extended_names — управляет использованием расширенных имён в описаниях terminfo ncurses_vidattr — ncurses_vline — рисует вертикальную линию в текущей позиции, используя атрибуированный символ и max. n длину символов ncurses_wrefresh — обновляет окно экрана терминала

Назад Оглавление Вперёд
syslog Вверх ncurses_addch

© 2006-2012 Веб-мастер Борисов Виктор Александрович

Что такое код ncurses_attroff

ncurses_attroff — Turn off the given attributes

Description int ncurses_attroff ( int attributes)

This function is EXPERIMENTAL . The behaviour of this function, the name of this function, and anything else documented about this function may change without notice in a future release of PHP. Use this function at your own risk.

Warning

This function is currently not documented; only the argument list is available.

Введение в ncurses

Библиотека ncurses обеспечивает программиста функциями для создания текстового интерфейса пользователя (Text-based User Interface — TUI) не зависящего от типа терминала. В частности, ncurses позволяет создавать окна и управлять их характеристиками, задавать экранные координаты, цвет и другие атрибуты выводимых символов. Она также оптимизирует операции по обновлению содержимого окон. ncurses можно рассматривать как аналог библиотеки crt в Turbo Pascal.

ncurses разрабатывается в рамках проекта GNU и работает на POSIX-совместимых системах. Для Windows существует PDCurses — свободная библиотека, реализующая большинство функций ncurses.

Структура программы

Программа, использующая ncurses, обычно имеет вид:

Вызов initscr инициализирует ncurses. Функция endwin очищает все выделенные для ncurses ресурсы и должна вызываться после любой другой функции этой библиотеки.

Выведем на экран традиционную надпись «Hello, World!» :

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

Ожидание ввода данных getch нужно для того, чтобы надпись не исчезла с экрана.

Экран и окна

Кроме экрана, в ncurses используются окна — буферы данных, содержащие изображение части экрана. С другой стороны, экран можно рассматривать как самое большое из возможных окон. Окна могут создаваться, уничтожаться, перемещаться, копироваться и т. п.

Для описания окна (экрана) в ncurses существует структура данных WINDOW . Теперь мы можем описать работу функций библиотеки более подробно. Так, при вызове initscr выделяется память под следующие переменные:

Если произойдет ошибка, то initscr вернет ERR . В противном случае возвращается указатель на stdscr .

stdscr — это буфер, в который выводит данные printw и другие подобные функции, а curscr — изображение, реально выводимое на экран. При вызове функции refresh происходит копирование содержимого stdscr в curscr .

Переделаем наш пример так, чтобы надпись выводилась в окно:

В начале программы мы проверяем инициализацию ncurses, а затем создаем окно с помощью функции newwin :

  • nlines — это число строк;
  • ncols — число столбцов окна;
  • y0 и x0 — координаты верхнего левого угла окна.

При этом начало координат (0,0) находится в левом верхнем углу экрана. Переменные LINES и COLS инициализируются при вызове initscr и задают высоту экрана в строках и ширину в столбцах. В нашем случае окно совпадает с экраном. Все указанные переменные имеют тип int .

Функция delwin(win) удаляет окно win .

Создадим теперь окно размером 20 строк на 50 столбцов и выведем надпись в его центре:

Здесь, для наглядности, границы окна показаны с помощью функции box .

Функции ncurses, начинающиеся с w , предназначены для работы с окнами WINDOW , тогда как остальные имеют дело с stdscr . В нашем случае wrefresh(win) обновляет curscr , помещая в него содержимое окна win , то есть делает с win то же самое, что refresh делает с stdscr .

Функции, начинающиеся с mv , сначала переместят курсор в позицию (y,x) , а затем выполняют какое-то действие. Так, в примере, функция mvaddstr перемещает курсор в середину экрана, учитывая при этом длину строки hello , после чего выводит эту строку.

Символы

В следующем примере с помощью функции mvaddch , выводящей заданный пользователем символ, строится график функции y = x^2 для целочисленных x , лежащих в диапазоне [-4;4]:

Для выводимых символов можно устанавливать цвет символа и цвет фона. Ниже приведен фрагмент программы, в которой надпись «Hello, world!» выводится разными цветами символов и фона:

Чтобы символ ‘X’ был выведен с цветами из цветовой пары номер 4, укажем:

Установить атрибуты для окна можно с помощью функции wattron :

которая задает для окна атрибут (или комбинацию атрибутов) attr . После этого любой текст, выводимый в этом окне с помощью waddch или waddstr будет иметь атрибуты attr .

Например, для вывода на экран сообщения в наиболее ярком режиме, наберем:

Предопределенные значения атрибутов приведены в таблице:

Warning
Атрибут Описание
A_NORMAL нормальный, переустановка всего остального
A_STANDOUT наиболее яркий режим
A_UNDERLINE подчеркивание
A_REVERSE обратное изображение
A_BLINK мигание
A_DIM тусклый или полуяркий режим
A_BOLD жирный шрифт
A_ALTCHARSET использование альтернативной символьной таблицы
A_INVIS невидимый режим
A_PROTECT режим защиты
A_CHARTEXT маска для действующих символов (chtype)
A_COLOR маска для цвета
COLOR_PAIR(n) установка цветовой пары n
PAIR_NUMBER(a) получение цветовой пары, лежащей в атрибуте a

Определим для окна атрибуты «мерцание» и «жирный шрифт» и будем выводить символы с заданными ранее цветами

[Код полностью](/images/comp/Comp.NcursesTutorial/nccolor.c](/images/comp/Comp.NcursesTutorial/ncattrr.c)

Остальная часть этой программы — такая же как в примере из раздела «Экран и окна».

Перед началом использования цветов необходимо проверить, доступны ли они нам, и убедиться, что количество возможных цветовых пар COLOR_PAIRS не меньше того, которое мы хотим создать.

Для инициализации операций с цветом вызывается функция start_color .

Функция has_colors позволяет узнать, можно ли использовать цвета. Если она возвращает FALSE , то использовать цвета нельзя.

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

foreground — цвет символа; background — цвет фона. pair_number — номер созданной цветовой пары. Каждой паре будет соответствовать номер от 1 до COLOR_PAIRS-1 (0 зарезервирован для стандартного отображения). Для изменения цвета вызывается функция color_set , в которой указывается номер нужной цветовой пары.

Атрибуты

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

Есть два способа использования атрибутов: указывать их для каждого выводимого символа или глобально — для всего окна.

Атрибут символа устанавливается при вызове функции waddch(win, ch) или addch(ch) . Для связывания символа с атрибутом и комбинирования атрибутов служит логическое ИЛИ. Например, A_UNDERLINE — предопределенный атрибут, отвечающий за подчеркивание символа. Для того, чтобы вывести в окно win символ ‘X’ с подчеркиванием нужно указать:

Обратите внимание, что атрибуты окна относятся ко всему содержимому окна, в том числе и к рамке. В то же время надпись «Hello, world!» не мерцает, поскольку выводится не в окне, а на экране, на который не распространяется назначение атрибутов с помощью wattron .

Для чтения символа из stdscr используется функция getch :

По умолчанию введенный символ отображается на экране. Запретить отображение можно функцией noecho .

Вызов функции cbreak позволяет getch считывать поступившие от пользователя данные непосредственно после нажатия клавиши. В противном случае полученные данные поступят в обработку только после того, как будет считан символ новой строки. Тогда данные поступают в getch посимвольно, по принципу FIFO, до тех пор пока буфер ввода не опустеет.

По умолчанию, getch ожидает нажатие клавиши. Это полезно, например, когда нужно притормозить выполнение программы. Отменить это умолчание можно с помощью функции nodelay(stdscr, TRUE) . Такое поведение используются для создания циклов в игровых программах, где требуется оперативная реакция пользователя. Например:

Вызов функции keypad(stdstr, TRUE) , позволяет обрабатывать нажатия специальных клавиш, таких как стрелки, Ctrl или Delete, а также их комбинаций. В результате нажатия генерируется целое число, которое можно считать, обработать и выполнить какое-либо действие.

В таблице ниже приведены коды клавиш:

Код клавиши Описание
KEY_DOWN Клавиши со стрелками
KEY_UP
KEY_LEFT
KEY_RIGHT
KEY_HOME Home
KEY_BACKSPACE Backspace
KEY_F(n) Функциональная клавиша с 0 = 63
KEY_DC Delete
KEY_IC Insert
KEY_ENTER Enter

Считывание и обработка нажатия клавиш выполняется так:

Чтение символов из окна выполняется функцией

Чтение может выполняется вместе с перемещением курсора в заданную позицию:

В следующем пример символ ‘X’ перемещается по экрану клавишами со стрелками:

Ссылки

  • Мэтью Н., Стоунс Р. Основы программирования в Linux. — СПб.: БХВ-Петербург, 2009, Глава 6. — с. 253—301. Ncurses Programming Guide by by X. Li. Еще одно краткое руководство.NCURSES Programming HOWTO, Pradeep Padala. Все, что нужно. *Руководство программиста для Linux, перевод А. Паутнова. Справочник на русском.

Читайте также

Комментарии

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

ncurses_slk_attroff

(PHP 4 >= 4.0.7, PHP 5 = 1.0.0)

ncurses_slk_attroff — Turn off the given attributes for soft function-key labels

Описание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, ее имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

К настоящему времени эта функция еще не была документирована; для ознакомления доступен только список аргументов.

Список параметров

НОВОСТИ ФОРУМА
Рыцари теории эфира
01.10.2020 — 05:20: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]69vJGqDENq4[/Youtube][/center]
[center]14:36[/center]
Osievskii Global News
29 сент. Отправлено 05:20, 01.10.2020 г.’ target=_top>Просвещение от Вячеслава Осиевского — Карим_Хайдаров.
30.09.2020 — 12:51: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Ok]376309070[/Ok][/center]
[center]11:03[/center] Отправлено 12:51, 30.09.2020 г.’ target=_top>Просвещение от Дэйвида Дюка — Карим_Хайдаров.
30.09.2020 — 11:53: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]VVQv1EzDTtY[/Youtube][/center]
[center]10:43[/center]

интервью Раввина Борода https://cursorinfo.co.il/all-news/rav.
мой телеграмм https://t.me/peshekhonovandrei
мой твиттер https://twitter.com/Andrey54708595
мой инстаграм https://www.instagram.com/andreipeshekhonow/

[b]Мой комментарий:
Андрей спрашивает: Краснодарская синагога — это что, военный объект?
— Да, военный, потому что имеет разрешение от Росатома на манипуляции с радиоактивными веществами, а также иными веществами, опасными в отношении массового поражения. Именно это было выявлено группой краснодарцев во главе с Мариной Мелиховой.

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

Илон Маск рекомендует:  Iis о сертификатах
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL