Что такое код ncurses_init_color


FPublisher

Web-технологии: База знаний

Документация PHP

ncurses_init_color

(PHP 4 >= 4.2.0, PHP 5, PECL ncurses:1.0.0)

ncurses_init_color — Set new RGB value for color

Описание

int ncurses_init_color ( int $color , int $r , int $g , int $b )

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

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

Что такое код ncurses_init_color

(PHP 4 >= 4.2.0, PHP 5)

ncurses_init_color — Set new RGB value for color

Описание int ncurses_init_color ( int color, int r, int g, int b )

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

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

Комментарии

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

ncurses_init_color — Define a terminal color

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

ncurses_init_color — Define a terminal color

Описание

Defines or redefines the given color. When this function is called, all occurrences of the given color on the screen, if any, immediately change to the new definition.

Color capabilities must be supported by the terminal and initialized using ncurses_start_color() prior to calling this function. In addition, the terminal must have color changing capabilities; use ncurses_can_change_color() to check for this.

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

The identification number of the color to redefine. It may be one of the default color constants.

A color value, between 0 and 1000, for the red component.

A color value, between 0 and 1000, for the green component.

A color value, between 0 and 1000, for the blue component.

Возвращаемые значения

Returns -1 if the function was successful, and if ncurses or terminal color capabilities have not been initialized or the terminal does not have color changing capabilities.

Смотрите также

  • ncurses_color_content() — Retrieves RGB components of a color
  • ncurses_start_color() — Initializes color functionality


Что такое код ncurses_init_color

Life seems dull with no colors. Curses has a nice mechanism to handle colors. Let’s get into the thick of the things with a small program.

Example 9. A Simple Color example

#include vo , string); refresh(); >

As you can see, to start using color, you should first call the function start_color() . After that, you can use color capabilities of your terminals using various functions. To find out whether a terminal has color capabilities or not, you can use has_colors() function, which returns FALSE if the terminal does not support color.

Curses initializes all the colors supported by terminal when start_color() is called. These can be accessed by the define constants like COLOR_BLACK etc. Now to actually start using colors, you have to define pairs. Colors are always used in pairs. That means you have to use the function init_pair() to define the foreground and background for the pair number you give. After that that pair number can be used as a normal attribute with COLOR_PAIR() function. This may seem to be cumbersome at first. But this elegant solution allows us to manage color pairs very easily. To appreciate it, you have to look into the the source code of «dialog», a utility for displaying dialog boxes from shell scripts. The developers have defined foreground and background combinations for all the colors they might need and initialized at the beginning. This makes it very easy to set attributes just by accessing a pair which we already have defined as a constant.

The following colors are defined in curses.h . You can use these as parameters for various color functions.

COLOR_BLACK 0 COLOR_RED 1 COLOR_GREEN 2 COLOR_YELLOW 3 COLOR_BLUE 4 COLOR_MAGENTA 5 COLOR_CYAN 6 COLOR_WHITE 7

The function init_color() can be used to change the rgb values for the colors defined by curses initially. Say you wanted to lighten the intensity of red color by a minuscule. Then you can use this function as

init_color(COLOR_RED, 700, 0, 0); /* param 1 : color name * param 2, 3, 4 : rgb content min = 0, max = 1000 */

If your terminal cannot change the color definitions, the function returns ERR. The function can_change_color() can be used to find out whether the terminal has the capability of changing color content or not. The rgb content is scaled from 0 to 1000. Initially RED color is defined with content 1000(r), 0(g), 0(b).

The functions color_content() and pair_content() can be used to find the color content and foreground, background combination for the pair.

NCurses: Почему init_color возвращает OK, но все еще не устанавливает цвет?

Я пытаюсь установить фон блока текста на красный, установив для значения COLOR_BLUE значения rgb: (1000, 0, 0). Фон является правильным (КРАСНЫМ), если я использую приложение «Terminal» в Gnome, но неверным (СИНИЙ), если я использую «Консоль» KDE. Почему это? Следующий код будет компилироваться в Linux с помощью строки компиляции:

Я установил свой тип TERM на xterm-256color через:

3 ответа

Вы хотели установить для фона значение COLOR_BLUE? Несмотря на проверку can_change_color , кажется, что цвет init не влияет на Konsole, и фон остается COLOR_BLUE в init_pair.

На man init_color актуальная выдержка из man init_color :

Таким образом, эти строки делают что-то, что не должно работать в соответствии с документацией, но может и работает в некоторых терминалах:

Должно быть 16 предопределенных пар цветов (если мы посчитаем полужирные цвета), так что использование пар 16 и 17 вместо COLOR_BLUE и 2 может сработать.

(Нет Konsole чтобы проверить это, но это может быть причиной или, по крайней мере, стоит указать.)

Проблема в том, что Konsole не реализует ожидаемую вами функцию. ncurses знает только то, что находится в описании терминала, которое вы настроили. Не существует универсального метода проверки его правильности. В разделе ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ init_color говорится

init_color
возвращает ошибку, если терминал не поддерживает эту функцию, например, если в описании терминала отсутствует функция initialize_color .

Предположительно у вас есть что-то вроде TERM=xterm-256color . Терминальная база данных ncurses имеет правильный konsole-256color , который (с помощью infocmp для сравнения с xterm-256color ) отличается во многих отношениях:

Там, где вы видите NULL , Konsole вообще не реализовала эту функцию. В частности, он ничего не сделал для initc (функция, о которой вы спрашиваете).

Программирование с ncurses: первые шаги 0

Программирование

Статья была опубликована 1 марта 2013 года в 12:00, а последний раз правилась 9 апреля 2015 года в 11:49.

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

Примечание: эта статья была впервые опубликована в электронном издании «Open Source» от журнала «Системный администратор» и размещена на nixp.ru по согласованию с редакцией.

Иногда нужно написать какую-нибудь программу, не прибегая к тяжеловесным библиотекам графических тулкитов вроде Qt или GTK, а возможностей обычного консольного вывода (printf, cout) всё же маловато. Как быть? На помощь приходит ncurses.

В незапамятные времена, в Беркли, существовала библиотека под названием curses. Создал её известный UNIX-гуру Кен Арнолд. По своим функциям curses напоминала модуль CRT для Pascal, а основным её назначением было взаимодействие с экраном (на уровне терминала) и клавиатурой. Со временем у неё появилось развитие под названием pcurses, а потом (в 1993 году) — ncurses (new curses), которая надолго поселилась под сенью проекта GNU (http://www.gnu.org/software/ncurses/ncurses.html). Ncurses используется довольно большим количеством программ — среди них, например, файловый менеджер Midnight Commander и веб-браузер lynx. Писать программу под ncurses выгодно: эта библиотека найдется в любом дистрибутиве *nix, и будет входить в эти дистрибутивы по крайней мере еще долгое время. В общем, пишем под ncurses — пишем на века!

Подключить ncurses к своей программе на Си или С++ очень просто. Достаточно использовать в исходнике директиву #include , а для компиляции указать -lncurses для линковки:

Конечно, надо, чтобы были установлены заголовочные файлы ncurses. В Debian и Ubuntu пакет с ними называется ncurses-dev:

Для сборки программ, где более чем один файл, удобно использовать какую-нибудь систему сборки вроде autotools или Scons. В случае последней (я предпочитаю её), в каталоге с исходником программы нужно создать файл под названием SConstruct такого содержания:

Теперь при запуске в том же каталоге команды scons будут скомпилированы все .cpp-файлы и слинкованы с библиотеками ncurses и любыми другими (в примере — «other-libs»). Для сборки и установки программы надо выполнить с правами root:

Для инициализации ncurses чаще всего вызываются три функции:
1. initscr(); — инициализирует работу с консолью. Эта функция выполняет довольно много работы, поскольку существует множество различных терминалов, а ncurses перед началом работы с каким-либо из них надо определить тип терминала и «адаптироваться» под него. Вызов initscr возвращает указатель WINDOW *, который потом можно использовать в других функциях. К последним относятся getyx() для получения координат курсора, putwin() для сохранения окна в файл, getwin() для чтения окна из файла, copywin() для копирования содержимого одного окна в другое… Кроме того, initscr() очищает окно.
2. keypad (stdscr, TRUE); — если так вызвать keypad(), вы сможете «отлавливать» нажатия клавиш ряда F и курсорных. stdscr — стандартный, определенный в ncurses указатель на окно «по умолчанию». Если не вызвать keypad с параметром TRUE, то функции вроде getch() вместо кода нажатой клавиши будут возвращать escape-последовательности.
3. noecho(); — если вызвана, то последующие нажатия клавиш не будут отображаться на экране автоматически. Это нормальный режим, если вы хотите сами обрабатывать нажатия на клавиши (например, реализуете собственное меню и тому подобное).

Завершить работу с библиотекой ncurses следует вызовом функции endwin(), которая освободит все распределенные библиотекой ресурсы и вернет терминал к состоянию до инициализации библиотеки вашей программой.

Для считывания нажатий на клавиши в общих целях используется функция getch(), а для считывания из конкретного окна — wgetch(). Цикл выглядит примерно так:

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

Для вывода текста в консоль чаще всего используют функцию printw(), которая принимает те же аргументы, что и printf(), то есть вы можете форматировать текст как угодно. Для строк C++ (std:string) в качестве строковых параметров надо передавать их через функцию c_str(), то есть:

При выводе строки без завершающего символа «\n» курсор остается в текущей строке, на последнем выведенном символе, так что следующий вызов printw() в этом случае дополнит текущую строку. Функция addch() служит для вывода одного символа, переданного в параметре. Сразу можно задать ему атрибуты начертания (символ комбинируется с атрибутами с помощью логического OR):

Вывести символ по заданным координатам можно так:

Атрибуты текста — это цвет и начертание. Они актуальны и для printw(). Как можно изменить атрибуты?

Сначала нужно включить «цветовой движок» ncurses, вызывая (обычно после initscr()) функцию:

Внутри неё создается палитра из 8 основных цветов (COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW, COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE), а также инициализируются глобальные переменные COLORS и COLOR_PAIRS. Допустим, стоит задача вывода некоего меню, списка, где обычные элементы будут отрисованы обычным цветом и начертанием, а текущий элемент — жирным и другими цветами.

Для этого надо создать две так называемые «цветовые пары». Первой будет присвоен красный цвет букв и черный для фона, а второй — белый цвет букв и черный для фона:

Теперь допустим, что есть вектор со строковыми элементами списка. Тогда нужно вывести в цикле эти элементы, устанавливая им нужные атрибуты. Разберу пример на небольшой рабочей программе (test.cpp):

Некоторые могут поинтересоваться, почему нажатие клавиши Enter отлавливается через ‘\n’, а не KEY_ENTER. Это очень тяжелый вопрос. Если при инициализации вызывать функцию nonl(), то можно отлавливать Enter вот так:

Если не вызывать nonl(), то вот так:


А константа KEY_ENTER действует и вовсе странным образом… В общем, проверка на соответствие ‘\n’ — самое верное средство для UNIX-систем.

Ввод и события мыши

Для ввода строковых значений в ncurses предусмотрены функции scanw(), getstr() и другие. Например, чтобы получить строку в массив str, можно поступить так:

Для обработки событий мыши сначала нужно провести инициализацию:

После этого в обработчике нажатий на клавиши можно поступить так:

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

Цвет фона с помощью ncurses в Linux

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

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

Основная часть моего кода, которая, по моему мнению, должна изменить цвет фона, такова:
wattron (mainWindow, COLOR_BLACK);

Любая помощь, чтобы выяснить, как изменить свой фон на черный, будет принята с благодарностью. Спасибо, парни!

Вот что у меня есть на тот случай, если это поможет дать некоторый контекст для моей проблемы:

Использование 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.

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

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

Возникли проблемы с определением значений цвета с помощью init_color (); в курсах в с

Я использую init_color(); в ncurses в C, чтобы попытаться определить новые значения цвета RGB. Однако init_color(); не влияет и не меняет цвета по умолчанию после запуска программы.

Я пытался перемещаться по операторам init_color(); до и после init_pair(); и start_color(); , но не повезло. Я также попытался использовать другие значения (ASCII и числа из других источников) вместо ex. COLOR_MAGENTA , для первого аргумента в одном из операторов init_color(); , но тоже не повезло. Мои операторы start_color(); , init_color(); и init_pair(); находятся внутри основной функции перед остальной частью программы. Мой терминал (использующий cloud9 / cs50) поддерживает 256 цветов (проверяется с помощью команд терминала). Также все определения цвета находятся над функцией ‘main’.

Я ожидал, что операторы init_color(); вступят в силу и изменят цвета по умолчанию (напр. Пурпурный, черный и т. д.) к новым назначенным конкретным значениям RGB, но они остаются неизменными при запуске программы.

Я добавил проверки для количества поддерживаемых цветов: has_colors(); и can_change_color(); . Поддержка количества цветов возвращает 8, has_colors(); возвращает true, и, наконец, can_change_color(); возвращает false. Спасибо, что предложили использовать has_colors(); и can_change_color(); , хотя кажется, что это проблема, я не уверен, куда идти дальше?

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