Чтение онлайн

на главную

Жанры

Основы программирования в Linux
Шрифт:

break;

} /* switch */

} /* else */

refresh;

key = getch;

 } /* while */

 endwin;

 exit(EXIT_SUCCESS);

}

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

Включив режим дополнительной клавиатуры, вы увидите, как можно распознать различные функциональные клавиши на дополнительной клавиатуре, генерирующие escape-последовательности. Вы, возможно, сумеете заметить, что распознавание клавиши <Esc> немного медленнее, чем других клавиш.

Применение цвета

В прошлом очень немногие терминалы ввода/вывода поддерживали цвета, поэтому у большей части самых старых версий библиотеки curses не было поддержки цветов. Цвета появились в библиотеке ncurses и других современных реализациях curses. К сожалению, на "неинтеллектуальный экран", первооснову библиотеки curses, повлиял API, и curses используют цвета очень ограниченным способом, отражающим слабые характеристики старых цветных терминалов.

Каждая символьная ячейка на экране может быть записана одним цветом из набора разных цветов на фоне одного цвета из набора различных цветов фона. Например, можно вывести зеленый текст на красном фоне.

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

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

has_colors
и
start_color
.

#include <curses.h>

bool has_colors(void);

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

Поделиться:
Популярные книги

Черный Маг Императора 12

Герда Александр
12. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 12

Император Пограничья 10

Астахов Евгений Евгеньевич
10. Император Пограничья
Фантастика:
городское фэнтези
аниме
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 10

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Гранит науки. Том 2

Зот Бакалавр
2. Героями не становятся, ими умирают
Фантастика:
фэнтези
5.00
рейтинг книги
Гранит науки. Том 2

Адепт. Том 1. Обучение

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
9.27
рейтинг книги
Адепт. Том 1. Обучение

Тактик

Земляной Андрей Борисович
2. Офицер
Фантастика:
альтернативная история
7.70
рейтинг книги
Тактик

Ст. сержант. Назад в СССР. Книга 5

Гаусс Максим
5. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ст. сержант. Назад в СССР. Книга 5

Рассвет русского царства. Книга 2

Грехов Тимофей
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
5.00
рейтинг книги
Рассвет русского царства. Книга 2

Надуй щеки! Том 2

Вишневский Сергей Викторович
2. Чеболь за партой
Фантастика:
попаданцы
дорама
фантастика: прочее
5.00
рейтинг книги
Надуй щеки! Том 2

Черный Маг Императора 18

Герда Александр
18. Черный маг императора
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 18

Последний Паладин. Том 3

Саваровский Роман
3. Путь Паладина
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 3

Воин

Бубела Олег Николаевич
2. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.25
рейтинг книги
Воин

Неправильный лекарь. Том 4

Измайлов Сергей
4. Неправильный лекарь
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Неправильный лекарь. Том 4

Кодекс Охотника. Книга VI

Винокуров Юрий
6. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VI