Цветовая окраска отличается от текста + цветовая окраска - PullRequest
0 голосов
/ 02 мая 2018

Если я печатаю символ, используя chtype, контейнерный объект ncurses для символов, задающий только цвет, такой как COLOR_PAIR(SOME_PAIR), я получаю два символа цвета. Используя ' ' | COLOR_PAIR(SOME_PAIR), то есть ИЛИ с персонажем, я получаю только один, как я и ожидал.

Попробуйте сами (сборка с -lncurses):

#include <ncurses.h>

#define RED 1

int main(void)
{
        initscr();
        start_color();
        curs_set(0);
        init_pair(RED, COLOR_RED, COLOR_RED);

        printw("Multiple: ");
        addch(COLOR_PAIR(RED));

        printw("\t\tSingle: ");
        addch(' ' | COLOR_PAIR(RED));

        getch();
        endwin();
}

Для меня это выглядит так:
Output of Program

Что там происходит? Как addch может манипулировать более чем одним персонажем?

1 Ответ

0 голосов
/ 02 мая 2018

A chtype содержит символьные и атрибутивные данные. Задав для chtype значение COLOR_PAIR(COLOR_RED), вы устанавливаете атрибутные данные, а не символьные данные, фактически инициализируя символьные данные равными 0.

В наборе символов ASCII код символа 0 соответствует символу NULL, обычно используемому для завершения строк в C.

Теперь поймите, что это непечатаемый символ, и поэтому он представлен двумя символами в текстовом представлении: ^@.

addch и друзья работают на более высоком уровне абстракции, чем простые поля, которые вы получили в своем терминале, они работают с символами, включая непечатные символы.

С man curs_addch:

Если ch является любым [не пробельным] управляющим символом, он отображается в ^X нотации. Вызов winch после добавления управляющего символа не возвращает сам символ, но вместо этого возвращает ^ -представление управляющего символа.

Поскольку ncurses видит, что COLOR_PAIR(RED) содержит код символа 0, ncurses интерпретирует его как непечатаемый символ и печатает его соответственно, один символ в двух полях.


...