Вход в личный кабинет:

Забыли пароль? | Регистрация

Адреса компании:

Санкт-Петербург

196158, Санкт-Петербург,
Пулковское шоссе, д. 30,
корп. 4, Лит. А, офис 203

Тел: +7 812 414 95 41

Москва

129085, г. Москва, проезд Ольминского, д. 3а, стр. 3, офис 706

Тел: +7 495 616 00 53

Блог

26.08.2015

Progress OpenEdge: промышленные средства репликации данных в Oracle и MS-SQL

Progress OpenEdge Pro2 Replication

Читать далее →




Десять причин перехода на новые версии OpenEdge (Progress)


Добавляем цвет в терминальные приложения

Вернуться к списку постов

11.07.2012

Во многих организациях при использовании 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


4 комментария to “Добавляем цвет в терминальные приложения”

Комментарии (4)

Fine, but we must try even better…

Прошу прощения, что я Вас прерываю, но, по-моему, эта тема уже не актуальна.

Валерий Башкатов:

Вы будете удивлены, но приложения с CHUI всё еще используются 😉

Рассказы:

Извиняюсь, но это мне не подходит. Кто еще, что может подсказать?

Добавить свой комментарий

Ваше имя*:
Ваш E-mail*:
Ваш комментарий*:

Компьютерные системы для бизнеса
© 2010 - 2017 Все права на материалы, находящиеся на этом сайте, охраняются в соответствии с законодательством РФ, в том числе, об авторском праве и смежных правах. При любом использовании материалов сайта ссылка на источник обязательна.