Добавляем цвет в терминальные приложения
Во многих организациях при использовании CHUI программ
по разным причинам используют либо
чёрно-белый режим работы, либо 2х-3х цветный.
В этой статье будет рассказано, как можно
превратить Ваши одноцветные приложения
в полноцветные и приятные программы.
Дмитрий Кайдалов Проблема цвета
В былые времена программы CHUI (под CHUI подразумеваются программы, которые работают на серверах UNIX/Linux, и доступ к которым осуществляется с помощью эмулятора терминала PuTTY) работали действительно на монохромных мониторах. И просто не было физической возможности «разукрасить» приложения. Время проходит, а программы остаются, и никто не хочет или боится трогать систему для улучшения работы пользователей. Даже существовали байки, что отсутствие цветности, контрастные переходы очень способствуют производительности и безошибочности. Однако как же устают глаза! Все интерфейсы смешиваются в кучу. И можно не отличить одну программу от другой.
Однако другие программы на том же самом сервере показывают многоцветие:
Возможности терминала PuTTY
Оказывается, сам PuTTY обладает способностью показывать не много не мало, а почти 256 цветов.
Далее приведена программа на PERLе и результат её работы, для иллюстрации данных возможностей. #!/usr/bin/perl
# first the system ones:
print "System colors:\n";
for ($color = 0; $color < 8; $color++) {
print "\x1b[48;5;${color}m ";
}
print "\x1b[0m\n";
for ($color = 8; $color < 16; $color++) {
print "\x1b[48;5;${color}m ";
}
print "\x1b[0m\n\n";
# now the color cube
print "Color cube, 6x6x6:\n";
for ($green = 0; $green < 6; $green++) {
for ($red = 0; $red < 6; $red++) {
for ($blue = 0; $blue < 6; $blue++) {
$color = 16 + ($red * 36) + ($green * 6) + $blue;
print "\x1b[48;5;${color}m ";
}
print "\x1b[0m ";
}
print "\n";
}
# now the grayscale ramp
print "Grayscale ramp:\n";
for ($color = 232; $color < 256; $color++) {
print "\x1b[48;5;${color}m ";
}
print "\x1b[0m\n";
Как видно, PuTTY умеет гораздо больше, чем кажется. Первая трансформация
В ABL присутствуют изначально 3 цвета (цветовые пары), которые в самом простом варианте выглядят так:
Эти цвета имеют названия NORMAL, INPUT, MESSAGES. Преобразим эти цвета в более приятные (приятные – следует понимать просто отличные от чёрного и белого).
Для начала создадим в файле PROTERMCAP новое описание терминала. Для этого нужно в конец этого файла добавить такие строки: #
vt100pro|New color terminal:\
:tc=vt100:
#
Тем самым создаём новый терминал с названием vt100pro, который наследует все признаки терминала vt100.
Следующим шагом при запуске сессии ABL нужно установить переменную окружения TERM=vt100pro $DLC/pro
Поменяем цвет MESSAGES. Этот цвет устанавливается и сбрасывается атрибутами so и se. Эти атрибуты определяют последовательности, которые должна послать сессия ABL для переключения цвета. Так как этот цвет должен привлекать внимание, то сделаем его красным и с жёлтыми буквами. Добавляем в PROTERMCAP в описание нового терминала следующие строки: :so=\E[48;5;1m\E[38;5;11m:\
:se=\E[49m\E[39m:\
В данном случае \E[48;5;Xm - это установка фонового цвета с индексом X (цвет подбирать можно по выше приведённой программе). \E[38;5;Xm – соответственно установка цвета символов. \E[49m\E[39m – установка цветов фона и символов в начальное состояние. Все ESC-последовательности можно найти на http://invisible-island.net/xterm/ctlseqs/ctlseqs.html.
А вот как преобразился редактор:
Далее поменяем цвет INPUT. Он описывается атрибутами us и ue. Оставим его с подчёркиванием, но придадим фону окраску. :us=\E[4m\E[48;5;8m\E[38;5;14m:\
:ue=\E[49m\E[39m:\
Последовательность \E[4m – устанавливает режим подчёркивания.
И наконец дело дошло к основному цвету фона NORMAL. Этот цвет можно только установить, а сбросить – нельзя. Устанавливается он атрибутом Si. Из-за того, что сбросить его нельзя, цвет фона необходимо включать во все цвета в атрибуте сброса цвета. После преобразований описание терминала будет таким: #
vt100pro|New color terminal:\
:Si=\E[48;5;7m\E[38;5;4m:\
:so=\E[48;5;1m\E[38;5;11m:\
:se=\E[m\E[48;5;7m\E[38;5;4m:\
:us=\E[4m\E[48;5;8m\E[38;5;14m:\
:ue=\E[m\E[48;5;7m\E[38;5;4m:\
:tc=vt100:
#
А выглядит это так:
В ABL есть ещё два цвета, которые не имеют названия, и установить их можно только используя номера цветов в атрибутах DCOLOR и PFCOLOR. Это цвета с номерами 3 и 4.
Соответственно возможно и их описать с помощью атрибутов HS и HR, BB и BR соответственно.
Соглашусь, что может не красиво. Это только направление для размышлений. Вторая трансформация
Безусловно, если сделать так на живой системе, то получим полную неразбериху (хотя и цветную). Самым правильным было бы не трогать текущие программы и не изменять их функционал и внешний вид, а вводить новые возможности не затрагивая основы. И для этого шага тоже есть выход.
В файле PROTERMCAP есть описания других цветов, у которых даже кроме номера есть названия. Синтаксис описаний следующий: COLOR color-number [color-name]=start-sequence:stop-sequence:
Для примера жёлтые буквы на красном фоне будут выглядеть так: :COLOR 5 YELLOW/RED=\E[48;5;1m\E[38;5;11m:\E[49m\E[38m:\
Совсем несложно написать программу, которая сгенерирует нужный набор комбинаций цветовых пар.
К сожалению всего можно определить только 123 пары цветов. Но и этого количества уже достаточно для красивой палитры и создания красивых визуальных эффектов. Полностью реализовывать абсолютно все комбинации (а их получается около 65 тысяч) не имеет смысла, так как светло-розовые буквы на чуть более светло-розовом фоне никому не нужны. Однако возможность есть и остаётся определиться с нужной цветовой гаммой.
Для начала работы у нас были выбраны только 8 цветов с индексами 0-7. Далее составлены комбинации из двух цветов. Из этих комбинаций были изъяты комбинации с одинаковыми цветами и некоторые совсем плохие. Всего получилось 56 цветов.
Вот в итоге результат уже из ABL:
Таким образом, можно не только сделать программы нескучными, а ещё убедить пользователей в том, что они работают не только на самой лучшей платформе, но и на современной, не смотря на символьный интерфейс.
И простая на вид программа «расцвела»: def var i as integer.
repeat i = 6 to 24:
display now dcolor random(5,60) with col 6.
display "color" dcolor i.
pause 1.
end.
message color YELLOW/RED "Test Message" view-as alert-box.
Автор: Дмитрий Кайдалов
Дополнительный материал: Xterm 256color chart
|