Руководство программиста для Linux


Видеоатрибуты и цвет - часть 2


Выдает текущие атрибуты для окна win. * bool has_colors()

Возвращает TRUE, если терминал имеет цвета. Перед тем, как использовать цвета, проверьте терминал has_colors()-ом, а перед этим проинициализируйте цвета start_color()-ом. * bool can_change_color()

TRUE, если терминал может переопределять цвета. * int start_color()

Цветовая инициализация. Эта функция должна быть вызвана перед использованием цветов! * int init_pair(pair, fg, bg)

Если вы используете цвета в атрибутах окна, то сначала вы должны определить цветовую пару через init_pair(...). fg и bg - это цвета переднего и заднего плана, спаренные в pair. pair принимает значения от 1 до COLORPAIRS -1. (0 - не ошибка, но зарезервирован для черного и белого.) Определенную однажды pair можно использовать как атрибут. К примеру, вам нужны красные символы на синем экране: init_pair(1,COLOR_RED,COLOR_BLUE);

Теперь вызовем wattr(...) для установки новой пары цветов для win: wattr(win,COLOR_PAIR(1));

Или соединим цветовые пары с другими атрибутами, например:

wattr(win,A_BOLD|COLOR_PAIR(1)); wattr(win1,A_STANDOUT|COLOR_PAIR(1));

Первый вызов установит цветовую пару и атрибут BOLD, второй - подключит режим STANDOUT, и вы получите светлый красный на синем экране. * int pair_content(pair, f, b)

Вернет цвета переднего и заднего плана из pair. * int init_color(color, r, g, b)

Изменит цветовые компоненты r, g и b для color. r, g и b находятся в диапазоне от 1 до COLORS -1. * int color_content(color, r, g, b)

Получение компонентов r, g и b для color.

Как комбинировать атрибуты и цвета? Некоторые терминалы, как консоли в Linux-е, имеют цвета, а некоторые - нет (xterm, vs100 и т.д.). Следующий код решит эту проблему: void CheckColor(WINDOW *win1, WINDOW *win2) { start_color(); if (has_colors()){ /* Хорошо, у нас есть цвета, определяем цветовые пары для * цветов переднего и заднего плана */ init_pair(1,COLOR_BLUE,COLOR_WHITE); init_pair(2,COLOR_WHITE,COLOR_RED); /* теперь используем уже определенные цветовые пары для окон */ wattrset(win1,COLOR_PAIR(2)); wattrset(win2,COLOR_PAIR(1)); } else{ /* Ох, нет цвета (может быть vt100 или xterm). Ладно, будем * пользоваться вместо этого черно-белыми атрибутами. */ wattrset(win1,A_REVERSE); wattrset(win2,A_BOLD); } return; }

Прежде всего, функция CheckColor проинициализирует цвета при помощи start_color(). Затем has_colors() вернет TRUE, если текущий терминал имеет цвета. После этого вызывается ini_tpair(...) для соединения цветов переднего и заднего плана, и wattrset(...) для установки этих цветов в данном окне. Впрочем, чтобы установить атрибуты для черно-белого терминала, мы можем использовать только wattrset(...).

Чтобы получить цвета на xterm, лучший способ, найденный автором, - это использовать ansi_xterm с надерганными элементами terminfo из Midnight Commander-а. Просто добудьте исходники ansi_xterm и Midnight Commander-а (mc-x.x.tar.gz). Потом скомпилируйте ansi_xterm и используйте tic с xterm.ti и vt100.ti из архива mc-x.x.tar.gz. Запустите ansi_xterm и протестируйте его.




Начало  Назад  Вперед



Книжный магазин