Что такое код ncurses_insch

Содержание

ncurses_insch — Insert character moving rest of line including character at current position

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

ncurses_insch — Insert character moving rest of line including character at current position

Описание

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

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

Введение в 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 .

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

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

Атрибут Описание
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, перевод А. Паутнова. Справочник на русском.

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

Комментарии

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

Консольные приложения на 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 на C++

В универе задали лабораторную: реализовать элемент интерфейса “всплывающее окно с сообщением” под DOS на C++, используя ООП подход. Ну спасибо тебе за актуальность, дорогой универ, нынче DOS и Turbo Vision наше всё, такой ценный опыт… К счастью, преподаватель отнёсся с пониманием и разрешил использовать современную кроссплатформенную библиотеку ncurses для рисования псевдографики, о ней я сегодня и расскажу.

Что такое ncurses и где оно обитает

Ncurses (произносится “энкёрсиз”) – это библиотека, которая существенно упрощает создание интерфейсов на псевдографике и позволяет при разработке вообще не думать о том, например, какую экранирующую последовательность символов нужно послать терминалу для того, чтобы текст выводился ^[[ 0 ; 31 ; 40 mКРАСНЫМ цветом. Мало того, что эти закорючки тяжело осмыслить, так они еще и для разных терминалов разные бывают. Вообще, чтобы как-то облегчить жизнь, разработчики UNIX решили хранить в специальном файле termcap (а в будущем terminfo) все те возможности, которые предоставляет конкретный терминал. Этот файл позволяет приложениям смотреть, какие экранирующие последовательности можно посылать, в него смотрит и библиотека ncurses, избавляя пользователя-программиста от написания лишнего кода для, так скажем, кросс-терминальности. Пожалуй, самыми известными программами, в которых для интерфейса используется ncurses, являются htop, GNU Midnight Commander и инструмент графической настройки конфигурации ядра Linux, хоть с какой-то из них сталкивался каждый.

Как установить

Linux

Windows

Под Windows и DOS есть PDCurses, которая практически полностью совместима с ncurses. Одной строчкой не ставится, вот тут есть вся необходимая информация по ней.

Написание программ

При компиляции программ важно не забывать приписать флаг -lncurses , чтобы всё нормально залинковалось. Разберем простейшую программу с комментариями и пояснениями, и заглянем глубже.

Hello World!

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

Инициализация

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

raw и cbreak

Обычно, терминал буфферит символы, которые набирает пользователь до переноса строки, но большинству программ набираемые символы требуются сразу же во время их набора. Указанные выше функции позволяют управлять буфферизацией. Разница заключается в том, как будут обрабатывается управляющие последовательности вроде CTRL-Z и CTRL-C. В raw режиме они попадают в программу, не генерируя сигналов, а в cbreak режиме они интерпретируются драйвером терминала и генерируют соответствующие им сигналы.

echo и noecho

Эти функции контролируют вывод напечатанного на экран. noecho отключает вывод, echo наоборот включает. Обычно в программах используется noecho и вывод производится другими, более гибкими средствами.

keypad

Позволяет чтение клавиш F1, F2, стрелок и тд. Чтобы включить для стандартного экрана, вызывается как keypad (stdscr, TRUE) .

curs_set;

Включает и отключает отображения курсора на экране, чтобы отключить курсор вызывается curs_set (FALSE)

Цвета

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

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

Цвет Циферка
COLOR_BLACK
COLOR_RED 1
COLOR_GREEN 2
COLOR_YELLOW 3
COLOR_BLUE 4
COLOR_MAGENTA 5
COLOR_CYAN 6
COLOR_WHITE 7

Ну а если стандартные цвета недостаточно кислотные для вашей хакерской проги, то можно сделать свои! Вот так это делается:

RGB-значения лежат в интервале от 0 до 1000. Если что-то пошло не так, или ваш терминал не умеет работать с цветами, то функция init_color вернет ERR .

Окна – это воображаемые экраны, определенные в curses. Окно в данном контексте не означает то окно с рамочкой в Turbo Pascal, которое можно таскать по экрану. При инициализации ncurses, создается воображаемое окно stdscr , которое является представлением открытого терминала (настоящего экрана) размером с этот терминал. На это окно уже можно сразу выводить строки или другие окна, передавать его как параметр в функцию и тд.

Данный код выведет строку в stdscr в текущей позиции курсора. Аналогично вызов refresh , работает только с stdscr .

После создания нового окна, для выполнения таких же действий с ним, а не с stdscr , вызывают функции, которые начинаются на w и принимают как параметр окно, с которым производятся действия, вот так для окна с именем win :

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

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

Что такое код ncurses_insch

Wikimedia Foundation . 2010 .

Смотреть что такое «ncurses» в других словарях:

ncurses — based menuconfig Developer(s) GNU Project Stable release 5.9 / 4 April 2011; 7 months ago ( … Wikipedia

Ncurses — Desarrollador Proyecto GNU www.gnu.org/software/ncurses/ncurses.html Información general Última versión estable 5.6 … Wikipedia Español

Ncurses — Entwickler: Free Software Foundation Aktuelle Version: 5.7 (2. November 2008) Betriebssystem: Unix Derivate, GNU/Li … Deutsch Wikipedia

Ncurses — Développeur Projet GNU Dernière version … Wikipédia en Français

ncurses — Entwickler Free Software Foundation Aktuelle Version 5.9 (4. April 2011) Betriebssystem Unix Derivate, GNU/Linux Kategorie Komponentenbibliothek … Deutsch Wikipedia

Ncurses — Тип W >Википедия

Ncurses — es una librería de programación que provee una API que permite al programador escribir interfaces basadas en texto, TUIs. También optimiza el refresco de la pantalla, lo que permite reducir la latencia experimentada cuando se usan shells remotas … Enciclopedia Universal

Ncurses — Infobox Software name = ncurses caption = developer = GNU Project latest release version = 5.6 latest release date = release date|2006|12|23 operating system = POSIX genre = W >Wikipedia

GNU Guile-Ncurses — Développeur Projet GNU Dernière version … Wikipédia en Français

Curses — ncurses Entwickler: Free Software Foundation Aktuelle Version: 5.7 (2. November 2008) Betriebssystem: Unix Derivate, GNU/Li … Deutsch Wikipedia

Что такое код ncurses_insch

Sven Goldt, Sven van der Meer, Skott Burkett, Matt Welsh

8. Символьная графика

Эта глава имеет дело с вводом/выводом символов на экран. Когда мы говорим «символ», то подразумеваем композицию пикселов, которая может меняться в зависимости от таблицы представлений символов (charset). Ваша графическая карта уже предлагает одну или более таких таблиц и по умолчанию работает в текстовом (charset) режиме, потому что текст обрабатывается быстрее, чем пиксельная графика. Терминалы можно использовать лучше, чем как простые и скучные текстовые дисплеи. Рассмотрим, как использовать специальные возможности, которые предлагает терминал Linux-а, особенно консоль Linux-а.

printf, sprintf, fprintf, scanf, sscanf, fscanf

С этими функциями libc вы можете выдавать форматированные строки в stdout (стандартный вывод), с stderr (стандартная ошибка) или другие потоки, определенные как FILE *stream (например, файлы). sscanf обеспечивает подобные возможности для чтения форматированного ввода из stdin.

База данных TERMinal CAPabilitie — это таблица элементов описания работы с терминалом в ASCII-файле /etc/termcap. Здесь вы можете найти информацию о том, как выводить специальные символы, как осуществлять операции (удаления, вставки символов или строк и т.д.) и как инициализировать терминал. База данных используется, например, редактором vi. Имеются библиотечные функции для чтения и использования возможностей терминала (смотри termcap(3x)). С этой базой данных программы могут работать с различными терминалами одним и тем же кодом. База данных termcap и библиотечные функции предоставляют только низкоуровневый доступ к терминалу. Изменение атрибутов или цветов, параметризованный вывод и оптимизация остаются программисту.

База данных terminfo

База данных TERMinal INFOrmation построена над базой данных termcap и описывает некоторые возможности терминалов на более высоком уровне. С terminfo программа может легко менять атрибуты экрана, используя специальные клавиши, такие как функциональные клавиши и др. Эта база данных может быть найдена в /usr/lib/terminfo/[A-z,0-9]*. Каждый файл описывает один терминал.

Terminfo — хорошая база для работы с терминалом в программе.

Библиотека (BSD-)curses дает вам высокоуровневый доступ к терминалу, базируясь на terminfo. curses позволяет открывать и манипулировать окнами на экране, предоставляет весь необходимый набор функций ввода/вывода и может изменять видеоатрибуты терминально-независимым образом на более чем 150 терминалах. Библиотека находится в /usr/lib/libcurses.a. Это BSD-версия curses.

ncurses — это развитие curses. В версии 1.8.6 она должна быть совместима с AT&T curses, как это определено в SYSVR4, и иметь несколько расширений, таких как манипулирование цветами, специальная оптимизация для вывода, оптимизации, зависящие от терминала, и др. ncurses была протестирована на множестве систем, таких как Sun-OS, HP и Linux. Автор рекомендует предпочесть ncurses всему остальному. В SYSV Unix системах (например, Solaris) должна существовать библиотека curses с теми же функциональными возможностями, что и ncurses (на самом деле солярисовская curses имеет немного больше функций и поддержку мыши).

В следующих разделах мы рассмотрим, как пользоваться различными пакетами доступа к терминалу. В Linux-е мы имеем GNU-версию termcap и можем пользоваться ncurses вместо curses.

8.1. Функции ввода/вывода в libc

8.1.1. Форматированный вывод

Функции printf(. ) в libc обеспечивают форматированный вывод и позволяют трансформировать аргументы. * int fprintf(FILE *stream, const char *format, . ), преобразует выводимые аргументы в соответствии с шаблоном и записывает его в stream. Формат определяется аргументом format. Функция возвращает число записанных символов или отрицательное число в случае ошибки.

format содержит два типа объектов: обычные символы и информацию, как трансформировать или форматировать аргументы.

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

Изменяет вывод в зависимости от трансформации для аргумента:

  • Для o первое число будет 0.
  • Для x или X будет напечатано в конце 0x или 0X соответственно.
  • Для e, E, f, F вывод имеет десятичную точку.
  • Для g или G в конце аргумента будут напечатаны нули.

— Число, указывающее минимальную ширину поля

Трансформированный аргумент печатается в поле, ширина которого не меньше, чем сам аргумент. С этим числом вы можете увеличить ширину поля. Если аргумент меньше, то оставшаяся часть поля заполняется пробелами или нулями. — Точка для отделения ширины поля и точности

— Число для точности

Возможные значения для трансформации смотри в таблице 8.1.

То же, что и для вышеописанных функций, только список аргументов находится в arg.

8.1.2. Форматированный ввод

Точно так же, как printf(. ) для форматированного вывода, вы можете использовать scanf(. ) для форматированного ввода.

fscanf(. ) читает из stream и преобразует ввод по правилам, определяемым в format. Результаты помещаются в аргументы, заданные в «. » (эти аргументы должны быть указателями!). Чтение заканчивается, когда в format исчерпаны правила форматирования.

Таблица 8.1: Libc — трансформации printf

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

format может содержать правила форматирования аргументов (см. табл. 8.2)

Он может также включать:

  • пропуски или табуляции, которые игнорируются;
  • любой нормальный символ, кроме %. Символы должны быть во вводе на соответствующих позициях.
  • правила преобразования, заданные с %, необязательный символ * (позволит fscanf(. ) присвоить аргументу), необязательное число, необязательный символ h, l или L (для задания длины считываемой инфомации) и символ трансформации.

* int scanf(const char *format, . )

То же, что fscanf(stdin. )

* int sscanf(char *str, const char *format, . )

То же, что scanf, но ввод производится из строки str.

8.2. Библиотека termcap

8.2.1. Введение

Библиотека termcap — это API для базы данных termcap, которая находится в /etc/termcap/. Библиотечные функции позволяют:

* получить описание текущего терминала: tgetent(. );

Таблица 8.2: libc — трансформации sсanf

* найти описание для информации: tgetnum(. ), tgetflag(. ), tgetstr(. );

* вычислить и произвести поточечный вывод: tputs()

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

Функции termcap терминально-независимые программы, но дают программисту только низкоуровневый доступ к терминалу. Для пакета более высокого уровня потребуется curses или ncurses.

8.2.2. Поиск описания терминала

* int tgetent(vo >В операционной системе Linux текущее имя терминала содержится в переменой среды TERM. Поэтому termtype есть результат вызова getenv(3). Что касается buffer, то в GNU-версии Linux termcap не нужно захватывать память. В других версиях вам придется выделить 2048 байт (прежде buffer требовал 1024 байта, но сейчас размер удвоился).

tgetent(. ) возвращает 1 в случае успеха и 0 когда база данных найдена, но не имеет точки входа для TERM. Другие ошибки возвращают различные значения.

Следующий пример объясняет как использовать getent(. ):

По умолчанию termcap использует /etc/termcap/ как базу данных. Если переменная среды TERMCAP установлена, например, в $HOME/mytermcap, то все функции будут пользоваться mytermcap вместо /etc/termcap. Без начального слэша в TERMCAP определенное значение понимается как имя для терминала.

8.2.3. Описание терминала

Каждый фрагмент информации называется свойством (capability). Каждое свойство — это двухлитерный код, за каждым двухлитерным кодом стоит значение свойства. Возможны следующие типы свойств.

  • Числовой: например, co — число столбцов
  • Логический или флаговый: например, hc — терминал твердой копии (hardcopy terminal)
  • Строковый: например, st — установка табуляции (подробнее см. 8.22.3)

Каждое свойство связано с единственным типом значений (co всегда числовой, hc всегда флаг, а st всегда строка). Три типа значений — и три типа функций, их запрашивающих. char *name — это двухлитерный код свойства.

* int tgetnum(char *name)

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

* int tgetflag(char *name)

Получение логического свойства. Возвращает 1, если флаг установлен, 0 в противном случае.

* char *tgetstr(char *name, char **area)

Получение строкового свойства. Возвращает указатель на строку или NULL в случае отсутствия. В GNU-версии, если area есть NULL, termcap выделит память сам. termcap больше не позаботится об этом указателе, если вы не освободите name перед выходом из программы. Такой метод предпочтителен, поскольку вы не знаете сколько памяти потребуется для указателя, поэтому позвольте termcap сделать все за вас.

8.2.4. Свойства termcap

Логические свойства

5i принтер не имеет эха на экране
am автоматические границы, что означает автоматическое форматирование строки
bs Crtl-H представляет backspace
bw backspace на левой границе переносит строку на правую границу предыдущей
da вывести сохраненное над текущим экраном
db вывести сохраненное под текущим экраном
eo пробел стирает литеру на позиции курсора
es esc-последовательности и специальные символы работают в строке состояния
gn родовое устройство
hc это терминал твердой копии (hardcopy terminal)
HC курсор плохо видно, когда он не на последней линии
hs присутствует линия статуса
hz терминал не может напечатать тильды (tilde characters)
in терминал вставляет нули вместо пробелов на пустые места
km терминал имеет мета клавишу
mi режим вставки для курсора
ms режим стандартного вывода / подчеркивания для курсора
NP нет символов-заполнителей
NR ti не обращает teos терминал может забивать ошибки
ul терминал подчеркивает, но ошибки забивать не может
xb сбой, вызванный столпотворением, F1 посылает ESCAPE, F2 посылает ^C
xn сбой новой линии / соединения строк
xo терминал использует xon/xoff протокол
xs текст, напечатанный поверх выделенного, будет выделен
xt сбой телевизионного луча, неверная табуляция и странный режим выделения

Числовые свойства

co число столбцов
dB приостановка на милисекунды для возврата на терминалах твердой копии
dC приостановка на милисекунды для перевода каретки на терминалах твердой копии
dF приостановка на милисекунды для заполнения страницы на терминалах твердой копии
dN приостановка на милисекунды для новой линии на терминалах твердой копии
dT приостановка на милисекунды для табуляции на терминалах твердой копии
dV приостановка на милисекунды для вертикальной табуляции на терминалах твердой копии
it раница между позициями табуляции
lh высота мягких меток
lm линии памяти
lw ширина
li число линий
Nl число мягких меток
pb наименьшая граница, когда требуется дозаполнение
sg сбой режима выделения
ug сбой режима подчеркивания
vt номер виртуального терминала
ws ширина линии статуса, если она отлична от ширины экрана

Строковые свойства

!1 клавиша сохранения в верхнем регистре
!2 клавиша подвешивания в верхнем регистре
!3 клавиша undo в верхнем регистре
#1 клавиша помощи в верхнем регистре
#2 клавиша home в верхнем регистре
#3 клавиша ввода в верхнем регистре
#4 клавиша курсор — влево в верхнем регистре
%0 клавиша redo
%1 клавиша помощи
%2 клавиша пометки
%3 клавиша сообщения
%4 клавиша перемещения
%5 клавиша следующего объекта
%6 клавиша открытия
%7 клавиша опций
%8 клавиша предыдущего объекта
%9 клавиша печати
%a клавиша сообщения в верхнем регистре
%b клавиша перемещения в верхнем регистре
%c клавиша следующего объекта в верхнем регистре
%d клавиша опций в верхнем регистре
%e клавиша предыдущего объекта в верхнем регистре
%f клавиша печати в верхнем регистре
%g клавиша redo в верхнем регистре
%h клавиша перестановки в верхнем регистре
%i клавиша курсор-вправо в верхнем регистре
%j клавиша продолжения в верхнем регистре
&0 клавиша cancel в верхнем регистре
&1 клавиша ссылки
&2 клавиша обновления
&3 клавиша перестановки
&4 клавиша перезапуска
&5 клавиша продолжения
&6 клавиша сохранения
&7 клавиша подвешивания
&8 клавиша undo
&9 клавиша начала в верхнем регистре
*0 клавиша поиска в верхнем регистре
*1 клавиша команды в верхнем регистре
*2 клавиша копирования в верхнем регистре
*3 клавиша создания в верхнем регистре
*4 клавиша удаления символа в верхнем регистре
*5 клавиша удаления строки в верхнем регистре
*6 клавиша выделения
*7 клавиша конца в верхнем регистре
*8 клавиша очистки линии в верхнем регистре
*9 клавиша выхода в верхнем регистре
клавиша поиска1 клавиша начала
2 клавиша cancel
3 клавиша закрытия
4 клавиша команды
5 клавиша копирования
6 клавиша создания
7 клавиша конца
8 клавиша ввода/посылки
9 клавиша выхода
al клавиша вставки одной линии
AL клавиша вставки %1 линий
ac цвет блока символов, отображаемых в другой таблице символов
ae конец множества символов из альтернативной таблицы
as начало блока символов в альтернативной таблице
bc backspace, если не ^H
bl символ звонка
bt переход к предыдущему месту табуляции
cb очистка от начала линии до курсора
cc странный командный символ
cd очистка до конца экрана
ce очистка до конца линии
ch перемещение курсора горизонтально до столбца %1
cl очистка экрана, курсор помещается в начало
cm курсор перемещается на полосу %1 и колонку %2 (на экране)
CM курсор перемещается на линию %1 и колонку %2 (в памяти)
cr возврат каретки
cs область прокрутки от линии %1 до линии %2
ct очистка табуляций
cv вертикальное движение курсора до линии %1
dc удаление 1 символа
DC удаление %1 символов
dl удаление 1 линии
DL удаление %1 линий
dm начало режима удаления
do курсор на 1 линию вниз
DO курсор на %1 линию вниз
ds убрать линию статуса
eA активирование альтернативной символьной таблицы
ec удаление %1 символов начиная с позиции курсора
ed конец режима удаления
ei конец режима вставки
ff символ дозаполнения экрана на терминалах твердой копии
fs возврат символа на его позицию перед переходом на линию статуса
F1 строка послана функциональной клавишей F11
. .
F9 строка послана функциональной клавишей F19
FA строка послана функциональной клавишей F20
. .
FZ строка послана функциональной клавишей F45
Fa строка послана функциональной клавишей F46
. .
Fr строка послана функциональной клавишей F63
hd перемещение курсора на пол-линии вниз
ho курсор в начало
hu перемещение курсора на пол-линии вверх
i1 инициализация строки 1 в начале сеанса
i3 инициализация строки 3 в начале сеанса
is инициализация строки 2 в начале сеанса
ic вставка 1 символа
IC вставка %1 символов
if файл инициализации
im начало режима вставки
ip вставка времени и необходимых специальных символов после вставки
iP программа инициализации
K1 верхняя левая клавиша на keypad
K2 центральная клавиша на keypad
K3 верхняя правая клавиша на keypad
K4 нижняя левая клавиша на keypad
K5 нижняя правая клавиша на keypad
k0 функциональная клавиша 0
. .
k9 функциональная клавиша 9
k; функциональная клавиша 10
ka клавиша очистки всех табуляций
kA клавиша вставки линии
kb клавиша backspace
kB клавиша возврата к предыдущему месту табуляции
kC клавиша очистки экрана
kd клавиша down
kD клавиша удаления символа под курсором
ke отключение keypad
kE клавиша очистки до конца линии
kh клавиша курсор — home
kH клавиша курсор home + down
kI вставка символа / клавиша режима вставки
kl клавиша курсор — left
kL клавиша удаления линии
kM Mклавиша выхода из режима вставки
kN клавиша следующей страницы
kP клавиша предыдущей страницы
kr клавиша курсор — right
kR клавиша прокрутки назад/вверх
ks включение keypad
kS клавиша очистки до конца экрана
kt клавиша очистки данной табуляции
kT клавиша установки табуляции на этом месте
ku клавиша курсор — up
l0 метка для нулевой функциональной клавиши, если не f0
l1 метка для первой функциональной клавиши, если не f1
l2 метка для второй функциональной клавиши, если не f2
.
la метка для десятой функциональной клавиши, если не f10
le курсор влево на 1 символ
ll перемещение курсора в нижний левый угол
LE курсор влево на %1 символов
LF отключение мягких меток
LO включение мягких меток
mb начало мерцания
MC очистка мягких границ
md начало режима верхнего регистра
me конец всех режимов типа so, us, mb, md, mr
mh начало полуяркого режима
mk начало темного режима (символы не видны)
ML установка левой мягкой границы
mm вход терминала в метарежим
mo выход терминала из метарежима
mp включение защищенного атрибута
mr начало режима обращения (reverse mode)
MR установка правой мягкой границы
nd курсор на 1 символ влево
nw команда возврата каретки
pc символ-заполнитель
pf отключение принтера
pk программная клавиша %1 для посылки строки %2, если нажата пользователем
pl программная клавиша %1 для исполнения строки %2 в локальном режиме
pn программная мягкая метка %1 для отображения строки %2
po подключение принтера
pO подключение принтера для %1 ( Если устанавливается TRUE, то каждое изменение в окне вызывает физическое обновление экрана. Это может ухудшить характеристики программы, поэтому значение по умолчанию — FALSE. (Пока не реализована.)

Если bf равен TRUE, то следующий вызов wrefresh(win) очистит экран и полностью его перерисует (Ctrl+L в редакторе vi).

* int leaveok(win, bf)

По умолчанию ncurses ставит курсор там, где он был при последнем обновлении окна. Программы, не использующие курсор, могут установить leaveok(. ) TRUE и сэкономить время, требующееся движения курсора. Кроме того, ncurses попытается сделать курсор терминала невидимым.

Управление переходом на новую строку. После nl() произойдетт возврат каретки и дозаполнение; nonl() отключает контроль. В последнем случае ncurses может ускорить перемещение курсора.

Использование ncurses в PHP

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

PHP очень гибок и расширяем, с его помощью можно создавать скрипты, которыми можно заменить аналогичные на других языках (Perl/bash-скрипты и прочее). Функциональность ncurses поразительна и действительно выводит возможности работы с терминальным php-приложением на новый уровень.

Предназначение статьи — дать вам «толчок» в сфере написания консольных утилит на php, которые будут использовать возможность этой библиотеки. Я собираюсь показать только самое важное, относящееся к самой библиотеке, и надеюсь дать вам базу для использования ncurses в вашем приложении.

Для кого предназначена статья

Изучаемые темы

Определения

От автора

Документация по функциями ncurses в php сильно ограничена. Некоторые функции использованные в данной статье отсутствуют на официальном сайте. Приложения с ncurses следуют стилю программирования на C, как если бы они были настоящими программами, а не скриптами.

Если у вас есть опыт программирования в C или C++, возможно вы уже знакомы с ncurses и можете представить, каким полезным инструментом может быть ncurses при использовании с интерпретируемым языком, таким как PHP.

Что нужно знать

Вам нужен PHP, скомпилированный с опцией -with-ncurses на unix-подобной системе. Не все терминалы поддерживают цветной вывод, поэтому я не стал включать использование цветов в статью.

Знайте, что вам может понадобиться «сбрасывать» ваш терминал командной reset. Если возникнет какая-либо ошибка и ncurses_end() не будет вызван, то ваш терминал будет работать неправильно.

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

Начнём с простого приложения прежде чем переходить к сложному.

Простой пример с окнами

Сначала создадим основное окно, которое будет использовать всё доступное пространство. Потом добавим меньшее окно посередине экрана и поместим туда строчку текста. Чтобы получилось вот так:

Начать нужно с вызова ncurses_init(); , чтобы перейти в режим ncurses. Без этого при вызове функций библиотеки PHP будет падать с ошибкой.

Сценарий для вывода двух окон и строки

Попробуйте изменить размеры окна и запустить скрипт ещё раз. Основное окно опять будет занимать ровно всё пространство.

Теперь вы может захотите увидеть какое-нибудь действо при нажатий на клавишу, или вы хотите сделать возможность выхода из приложения при нажатии на какую-либо кнопку. Я предпочитаю использовать для этого esc (27 ascii-код).
Чтобы добавить возможность выхода по нажатию на ESC, добавьте данный код вместо $pressed = ncurses_getch();

Теперь если вы нажмёте esc, программа завершится, в ином случае ascii-код нажатой клавиши будет отображён в маленьком окне.

Можно добавить заголовок, поместив код перед вызовом ncurses_refresh(); :

Вы не ограничены режимом REVERSE (цвет и фон меняются местами), также есть DIM, UNDERLINE и другие.

Можно повысить комфорт, добавив интерактивный выбор из меню.

Создаём меню

Многие программы имеют меню и возможность выбора из него. В прошлом на «чистом» PHP мы могли лишь выводить список вариантов, и давать возможность ввести номер нужного. Такой неудобный выбор одного варианта можно заменить более интуитивно понятным.

Сценарий вывода меню с возможностью выбора

По получившемуся меню можно перемещаться кнопками со стрелками и выходить с помощью esc.

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

Всё вместе

На сайте php.net перечислены 119 функций библиотеки ncurses. В нижеприведённой таблице есть список использованных функций и ссылки на документацию. Замечу, что четыре из перечисленных функций отсутствуют в официальной документации. (прим. переводчика: в настоящий момент все функции содержаться в документации на php.net, правда без подробного описания).

Функция Описание Документация
ncurses_init Инициализирует ncurses www.php.net/manual/en/function.ncurses-init.php
ncurses_newwin Создаёт новое окно www.php.net/manual/en/function.ncurses-newwin.php
ncurses_getmaxyx(resource window, int
return Y, int return X);
Записывает в переменные X и Y максимальных размеров терминала
ncurses_border Рисует рамку вокруг основного окна www.php.net/manual/en/function.ncurses-border.php
ncurses_refresh Обновляет основное окно. Для перерисовки второстепенных окон используйте ncurses_wrefresh www.php.net/manual/en/function.ncurses-refresh.php
ncurses_attron Применяет атрибут к выводимому тексту www.php.net/manual/en/function.ncurses-attron.php
ncurses_attroff Отключает применение атрибута www.php.net/manual/en/function.ncurses-attroff.php
ncurses_mvaddstr Выводит строку www.php.net/manual/en/function.ncurses-mvaddstr.php
ncurses_wborder (resource window, int
left, int right, int top, int bottom, int tl_corner, int tr_corner, int
bl_corner, int br_corner);
Рисует рамку для второстепенного окна.
ncurses_wattron(resource window, int
attribute)
Идентично ncurses_attron, только применяется для окна window
ncurses_mvwaddstr Помещает строку во второстепенное окно www.php.net/manual/en/function.ncurses-mvwaddstr.php
ncurses_wattroff (resource window, int
attribute)
Идентично ncurses_wattroff, только применяется для окна window
ncurses_wrefresh Перерисовывает второстепенное окно. www.php.net/manual/en/function.ncurses-wrefresh.php
ncurses_getch Ждёт ввода с клавиатуры или мыши. www.php.net/manual/en/function.ncurses-getch.php

Улучшенный traceroute

Сейчас создадим действительно полезную программу: traceroute с выводом whois-информации о каждом прыжке.

Этот скрипт запускает traceroute до zend.com (макс 10 прыжков) и показывает результаты в одном окне. По элементам можно переходить с помощью стрелок. При нажатии на enter информация о данном ip будет показана в нижнем окне. По нажатию на esc произойдёт завершение работы программы.

В заключение

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

Мы не рассматривали использование мыши, цветов и многих других функций вывода.

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

Вывести содержимое файла с помощью ncurses.h

18.06.2012, 13:43

Fatal error: ncurses.h: Нет такого файла или каталога
fatal error: ncurses.h: Нет такого файла или каталога Скажите, как установить эту библиотеку.

Вывести содержимое файла (с помощью чтения) на экран
задание:Используя лабораторную работу №9 «Процедуры и функции пользователя»(предыдущая), исходные.

Вывести содержимое textbox в другой форме с помощью messegebox
Здравствуйте.У меня есть 2 формы.В одной форме записано в textboxе некоторый текст.Как можно.

Скопировать содержимое файла в другой файл с помощью оператора For.. To.. Do
Имеется нетипизированный файл длиной 100 байт. Вывести его содержимое на экран. Скопировать его.

Можно ли с помощью цикла for each вывести на экран содержимое двумерного массива?
Приветствую! Допустим у нас есть одномерный целочисленный массив nambers. C помощью цикла for each.

ncurses_insch

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

ncurses_insch — Insert character moving rest of line including character at current position

Описание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, ее имя и относящаяся к ней документация могут измениться в последующих версиях 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]

Консольные приложения на 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 .

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