Функция has_colors
возвращает true
, если терминал поддерживает цвета. Далее следует вызвать функцию start_color
, которая вернет OK
, если цветовая поддержка успешно инициализирована. После вызова start_color
и инициализации цветов переменная COLOR_PAIRS
принимает значение, равное максимальному количеству цветовых пар, которые может поддерживать терминал. Переменная COLORS
определяет максимальное число доступных цветов, которых, как правило, восемь. Внутри компьютера числа от 0 до 63 действуют как уникальные ID для каждого из доступных цветов.
Прежде чем применять цвета как атрибуты, вы должны инициализировать цветовые пары, которые хотите использовать. Делается это с помощью функции init_pair
. Обратиться к атрибутам, задающим цвет, можно с помощью функции COLOR_PAIR
.
#include
int init_pair(short pair_number, short foreground, short background);
int COLOR_PAIR(int pair_number);
int pair_content(short pair_number, short *foreground, short *background);
В файле curses.h обычно определены некоторые базовые цвета, начинающиеся с префикса COLOR_
. Дополнительная функция pair_content
позволяет извлечь сведения о ранее определенной цветовой паре.
Для определения цветовой пары номер 1, как красный на зеленом, примените следующую строку:
init_pair(1, COLOR_RED, COLOR_GREEN);
Затем вы сможете получить доступ к этой цветовой паре, применив функцию COLOR_PAIR
следующим образом:
wattron(window_ptr, COLOR_PAIR(1));
Она установит вывод в будущем на экран красных символов на зеленом фоне.
Поскольку COLOR_PAIR
— это атрибут, вы можете комбинировать его с другими атрибутами. На ПК часто можно добиться на экране цветов повышенной яркости, объединив с помощью поразрядной операции OR
атрибут COLOR_PAIR
с дополнительным атрибутом A_BOLD
:
wattron(window_ptr, COLOR_PAIR(1) | A_BOLD);
Давайте проверим эти функции в примере color.c (упражнение 6.7).
1. Сначала проверьте, поддерживает ли цвета терминал, используемый программой. Если да, то инициализируйте отображение цветов:
#include
#include
#include
#include
int main {
int i;
initscr;
if (!has_colors) {
endwin;
fprintf(stderr, "Error — no color support on this terminal\n");
exit(1);
}
if (start_color != OK) {
endwin;
fprintf(stderr, "Error — could not initialize colors\n");
exit(2);
}
2. Теперь можно вывести допустимое количество цветов и цветовые пары. Создайте семь цветовых пар и выведите их по очереди на экран:
clear;
mvprintw(5, 5, "There are %d COLORS, and %d COLOR_PAIRS available", COLORS, COLOR_PAIRS);
refresh;
init_pair(1, COLOR_RED, COLOR_BLACK);
init_pair(2, COLOR_RED, COLOR_GREEN);
init_pair(3, COLOR_GREEN, COLOR_RED);
init_pair(4, COLOR_YELLOW, COLOR_BLUE);
init_pair(5, COLOR_BLACK, COLOR_WHITE);
init_pair(6, COLOR_MAGENTA, COLOR_BLUE);
init_pair(7, COLOR_CYAN, COLOR_WHITE);
for (i = 1; i <= 7; i++) {
attroff(A_BOLD);
attrset(COLOR_PAIR(i));
mvprintw(5 + i, 5, "Color pair %d", i);
attrset(COLOR_PAIR(i) | A_BOLD);
mwprintw(5 + i, 25, "Bold color pair %d", i);
refresh;
sleep(1);
}
endwin;
exit(EXIT_SUCCESS);
}
Выполнение примера приведет к выводу, показанному на рис. 6.7, за вычетом реальных цветов, которые не отображаются на черно-белом снимке экрана.
Рис. 6.7
Как это работает
После проверки того, что экран поддерживает управление цветами, программа инициализирует цветовую обработку и определяет ряд цветовых пар. Далее на экран выводится текст с использованием цветовых пар для того, чтобы продемонстрировать комбинации разных цветов на экране.
Переопределение цветов