Колір

Основи

Життя здається сірим без кольорів. Curses включає хороший механізм для обробки кольорів. Давайте ознайомимось з загальними поняттями про кольори за допомогою невеликої програми.

Приклад 9. Просте використання кольорів

#include <ncurses.h>

void print_in_middle(WINDOW *win, int starty, int startx, int width, 
                     char *string);
int main(int argc, char *argv[])
{       
    initscr();                      /* Start curses mode */
    if (has_colors() == FALSE)
    {       
        endwin();
        printf("Your terminal does not support color\n");
        exit(1);
    }
    start_color();                  /* Start color */
    init_pair(1, COLOR_RED, COLOR_BLACK);

    attron(COLOR_PAIR(1));
    print_in_middle(stdscr, LINES / 2, 0, 0, "Viola! In color...");
    attroff(COLOR_PAIR(1));
    getch();
    endwin();
}

void print_in_middle(WINDOW *win, int starty, int startx, 
                     int width, char *string)
{       
    int length, x, y;
    float temp;

    if (win == NULL)
        win = stdscr;
    getyx(win, y, x);
    if (startx != 0)
        x = startx;
    if (starty != 0)
        y = starty;
    if (width == 0)
        width = 80;

    length = strlen(string);
    temp = (width - length) / 2;
    x = startx + (int)temp;
    mvwprintw(win, y, x, "%s", string);
    refresh();
}

Як бачите, щоб розпочати використання кольорів, вам необхідно спершу викликати функцію start_color(). Після цього, ви можете користуватися кольоровою здатністю вашого терміналу, використовуючи різні функції. Щоб дізнатися, чи термінал включає кольорову здатність, можете звернутися до has_colors(), яка поверне FALSE, якщо термінал не підтримує кольору.

Curses ініціалізує всі, властиві терміналу, кольори під час виклику start_color(). До них можна звернутися за визначеними константами, такими як COLOR_BLACK, COLOR_GREEN тощо. Тепер, щоб, власне, розпочати використання кольорів, вам необхідно означити кольорові пари. Кольори в curses завжди використовуються як пара. Це означає, що необхідно звернутися до функції init_pair() для визначення кольору переднього плану і кольору тла, позначаючи цю пару певним номером. Після цього, номер кольорової пари можна вживати як звичайний атрибут завдяки функції COLOR_PAIR(). Це може здатися обтяжливим спочатку, але насправді, таке елегантне рішення дозволяє легке керування кольоровими парами. Щоб оцінити його, ви можете заглянути до вихідних текстів програми dialog(1), - знаряддя для виводу вікон зі скриптів оболонки. Розробники цієї програми визначили всі кольори переднього плану і фону, які їм можуть знадобитися, ініціалізуючи їх напочатку. Це значно полегшує встановлення атрибутів, просто шляхом вказування кольорової пари, яку ми означили як стале.

В curses.h визначено наступні кольори. Ви можете використовувати ці назви як параметри різноманітних кольорових функцій.

Назва Значення
COLOR_BLACK 0
COLOR_RED 1
COLOR_GREEN 2
COLOR_YELLOW 3
COLOR_BLUE 4
COLOR_MAGENTA 5
COLOR_CYAN 6
COLOR_WHITE 7

Зміна визначень кольору

Щоб поміняти RGB-значення кольорів, визначене curses, можна використати ту саму функцію init_color(). Скажімо, ви хотіли би приглушити яскравість червоного кольору. В такому разі можна вказати

init_color(COLOR_RED, 700, 0, 0);
/* параметр 1: назва кольору
 * параметри 2, 3, 4: rgb-значення, мінімальне = 0, максимальне = 1000 */

Якщо ваш термінал не спроможний міняти визначення кольорів, ця функція поверне ERR. Можна попередньо використати функцію can_change_color(), щоб дізнатися, чи термінал дозволяє міняти означення кольорів, чи ні. RGB-начення кольору знаходяться в діапазоні між 0 і 1000. Початкове значення COLOR_RED, наприклад є рівним 1000 (червоний), 0 (зелений), 0 (синій).

Вміст кольору

Функції color_content() та pair_content() можна використати для того, щоб з'ясувати вміст кольору та комбінацію кольору переднього плану й фону кольорової пари.