Как сменить цвет для элемента типа chtype из curses

200
09 апреля 2018, 01:09

При создании элемента типа chtype задаю цвет:

chtype a = ' ' | COLOR_PAIR(COLOR);

Но, что делать, если мне нужно поменять цвет? Для этого я использую приведение типов, вроде:

a = static_cast<char>(a) | COLOR_PAIR(NEW_COLOR);

Но выглядит достаточно громоздко. Есть ли способ получше?

Answer 1

Для доступа к отдельным частям chtype у ncurses есть свои битовые маски: A_ATTRIBUTES, A_CHARTEXT, A_COLOR (см. man curs_inch).

Таким образом сброс цвета будет выглядеть следующим образом:

a = (a & ~A_COLOR) | COLOR_PAIR(NEW_COLOR);

Можно тоже самое записать в две строчки:

a &= ~A_COLOR;
a |= COLOR_PAIR(NEW_COLOR);

Исходное выражение сбрасывает одновременно и цвет, и атрибуты (мигание, яркость, подчёркивание итп), если это действительно желаемый результата, то можно пользоваться A_CHARTEXT:

a = (a & A_CHARTEXT) | COLOR_PAIR(NEW_COLOR);

Замечания:

  • A_ATTRIBUTES также включает в себя цвет.
  • Для работы с широкими символами есть аналогичные маски WA_ATTRIBUTES, WA_CHARTEXT и WA_COLOR. В реализации ncurses они тождественны обычным.
READ ALSO
Как узнать тип элементов вектора?

Как узнать тип элементов вектора?

К примеру есть вектор:

223
Извлечение zip архива

Извлечение zip архива

В с++ не силен от слова совсем, но понадобился именно этот языкНужно извлечь zip архив и положить рядом с самим архивом

208
Сравнение вещественных чисел

Сравнение вещественных чисел

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

180
Timeout срабатывает после остановки QTimer

Timeout срабатывает после остановки QTimer

В основном классе MainWidnow определён Qtimer* timerВнутри одного из методов класса timeout связывается с публичным слотом:

175