Видеоатрибуты и цвет
Атрибуты - это специальные возможности терминала, применяемые во время печати символов на экран. Символы могут быть напечататы жирно, могут быть подчеркнуты, могут мигать и т.д. В ncurses вы имеете возможность включать или отключать атрибуты для достижения наилучшего внешнего вида вывода. Возможные атрибуты перечислены в нижеследующей таблице.
Определение | Цвет --------------|----------- COLOR_BLACK | черный COLOR_RED | красный COLOR_GREEN | зеленый COLOR_YELLOW | желтый COLOR_BLUE | синий COLOR_MAGENTA | пурпурный COLOR_CYAN | голубой COLOR_WHITE | белый
Ncurses определяет 8 цветов, которыми вы можете пользоваться на терминале с цветовой поддержкой. Сначала проинициализируйте цветовые структуры данных посредством start_color(), затем проверьте возможности терминала при помощи has_colors(). start_color() будет инициализировать COLORS, наибольшее количество цветов, поддерживаемых терминалом, и COLOR_PAIR, максимальное число цветовых пар, которые вы можете определить.
Атрибуты могут быть совмещены '|' (OR), поэтому вы можете получить четкий мерцающий вывод при помощи A_BOLD|A_BLINK
Если вы установите окно с атрибутом attr, все символы, напечатанные в этом окне, приобретут это свойство и будут его сохранять до изменения вами атрибута. Это не будет утеряно при прокрутке или движении окна и т.п.
Будьте осторожны с цветами, если вы пишете программы для ncurses и BSD curses, так как BSD curses не имеет цветовой поддержки. (Точно так же не имеют цветовой поддержки старые версии SYS V). Поэтому, если вы компилируете для обеих библиотек, вам придется использовать операции #ifdef. * int attroff(attr) int wattroff(win, attr) int attron(attr) int wattron(win, attr)
Включают или отключают указанный атрибут attr, не влияя на другие атрибуты в окне (stdscr или win). * int attrset(attr) int wattrset(win, attr)
Установка атрибута в attr в stdscr или win. * int standout() int standend() int wstandout(win) int wstandend(win)
Включают атрибут наиболее яркого режима для окна (stdscr или win). * chtype getattrs(win)
Выдает текущие атрибуты для окна 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 и протестируйте его.