Основы программирования в Linux
Для определения цветовой пары номер 1, как красный на зеленом, примените следующую строку:
init_pair(1, COLOR_RED, COLOR_GREEN);Затем вы сможете получить доступ к этой цветовой паре, применив функцию
следующим образом:COLOR_PAIRwattron(window_ptr, COLOR_PAIR(1));Она установит вывод в будущем на экран красных символов на зеленом фоне.
Поскольку
— это атрибут, вы можете комбинировать его с другими атрибутами. На ПК часто можно добиться на экране цветов повышенной яркости, объединив с помощью поразрядной операцииCOLOR_PAIRатрибутORс дополнительным атрибутомCOLOR_PAIR:A_BOLDwattron(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<b>#include <curses.h></b><b>int init_color(short color_number, short red, short green, short blue);</b>Она позволяет переопределить существующий цвет (в диапазоне от 0 до
) новыми значениями яркости цвета из диапазона от 0 до 1000. Такой подход немного напоминает определение цветовых характеристик в графических файлах формата GIF.COLORSПанели
При написании более сложных программ с использованием curses порой бывает легче построить логический экран и затем позже вывести весь или часть экрана на физический экран. В некоторых случаях лучше иметь логический экран большего размера, чем физический экран и отображать только часть логического экрана в любой конкретный момент времени.
Это нелегко сделать с помощью функций библиотеки curses, с которыми вы познакомились к этому моменту, т.к. все окна должны быть не больше физического экрана. Библиотека curses предоставляет специальную структуру данных, панель (pad), для манипулирования данными логического экрана, которые не умещаются в стандартном окне.
Структура панели похожа на структуру
, и все функции библиотеки curses, написанные для работы с окнами, можно применять и к панелям. Но у панелей есть и собственные функции для создания и обновления.WINDOWПанели создаются во многом так же, как и обычные окна.
<b>#include <curses.h></b><b>WINDOW *newpad(int number_of_lines, int number_of_columns);</b>Обратите внимание на то, что возвращаемое значение — указатель на структуру типа
, такое же, как у функцииWINDOW. Удаляются панели, как и окна, функциейnewwin.delwinНо к панелям применяются другие подпрограммы обновления. Поскольку панель не привязана к конкретной точке экрана, вы должны задать область панели, которую хотите поместить на экран, и ее положение на экране. Делайте это с помощью функции prefresh.
<b>#include <сurses.h></b><b>int prefresh(WINDOW *pad_ptr, int pad_row, int pad_column, int screen_row_min, int screen_col_min, int screen_row_max, int screen_соl_max);</b>
