Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УПРАВЛЕНИЕ ЦВЕТОМ В СИСТЕМЕ LINUX.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
338.26 Кб
Скачать

Int start_color(void);

Функция

has_colors

возвращает

true

, если терминал поддерживает цвета. Далее следует вызвать функцию

start_color

, которая вернет

OK

, если цветовая поддержка успешно инициализирована. После вызова

start_color

и инициализации цветов переменная

COLOR_PAIRS

принимает значение, равное максимальному количеству цветовых пар, которые может поддерживать терминал. Переменная

COLORS

определяет максимальное число доступных цветов, которых, как правило, восемь. Внутри компьютера числа от 0 до 63 действуют как уникальные ID для каждого из доступных цветов.

Прежде чем применять цвета как атрибуты, вы должны инициализировать цветовые пары, которые хотите использовать. Делается это с помощью функции

init_pair

. Обратиться к атрибутам, задающим цвет, можно с помощью функции

COLOR_PAIR

.

#include <curses.h>

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).

Упражнение 6.7. Цвета

1. Сначала проверьте, поддерживает ли цвета терминал, используемый программой. Если да, то инициализируйте отображение цветов:

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <curses.h>

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

Как это работает

После проверки того, что экран поддерживает управление цветами, программа инициализирует цветовую обработку и определяет ряд цветовых пар. Далее на экран выводится текст с использованием цветовых пар для того, чтобы продемонстрировать комбинации разных цветов на экране.

Переопределение цветов

Как пережиток, оставшийся от старых неинтеллектуальных терминалов, которые могли отображать очень немного цветов в каждый момент времени, но позволяли настраивать текущую цветовую палитру, в библиотеке curses сохранилась возможность переопределения цветов с помощью функции

init_color

:

#include <curses.h>