ncurses (init_extended_pair): не может создавать более 255 пар цветов - PullRequest
0 голосов
/ 03 мая 2019

В версии 6.1 ncurses вводит init_extended_pair , чтобы расширить предел возможных пар цветов выше short limit.В моем эксперименте все работает до значения 255. Для значений 256 и выше нет ошибки , но передний план и фон имеют значения по умолчанию.Для значений 32767 и выше функция возвращает error .

enter image description here

Возврат программы:

COLOR_PAIRS: 65536
                  Error: 32767

Как правильно создавать большое количество цветовых пар?В моем случае мне нужно как минимум 65536 из них. (протестировано в Ubuntu 19.04)

#include <iostream>
#include <ncurses.h>

// g++ main.cpp -l:libncursesw.so.6.1 -ltinfo

int main() {
    initscr();
    start_color();

    std::cout << "COLOR_PAIRS: " << COLOR_PAIRS << std::endl;

    init_extended_color(2, 999, 0, 0);
    init_extended_color(3, 0, 999, 0);

    int pair1 = 255;
    if (init_extended_pair(pair1, 2, 3) == ERR)
        std::cout << "Error: " << pair1 << std::endl;

    attron(COLOR_PAIR(pair1));
    mvprintw(2, 1, "pair255");
    attroff(COLOR_PAIR(pair1));

    int pair2 = 256;
    if (init_extended_pair(pair2, 2, 3) == ERR)
        std::cout << "Error: " << pair2 << std::endl;

    attron(COLOR_PAIR(pair2));
    mvprintw(3, 1, "pair256");
    attroff(COLOR_PAIR(pair2));

    int pair3 = 32767; // 2^15-1
    if (init_extended_pair(pair3, 3, 2) == ERR)
        std::cout << "Error: " << pair3 << std::endl;

    attron(COLOR_PAIR(pair3));
    mvprintw(4, 1, "pair32767");
    attroff(COLOR_PAIR(pair3));

    refresh();
    getch();
    endwin();

    return 0;
}

Редактировать: По поводу аналогичной проблемы Как включить 32k пар цветов в ncurses? .В моем случае COLOR_PAIRS возвращаемое значение 65536, а не 256, вопрос больше относится к 2015 году, и init_extended_pair был добавлен в библиотеку 2017.04.01, а выпущен в версии 6.1 27 января 2018 .Несмотря на это, я перестраиваю пакет libncursesw6 с --enable-ext-colors (--enable-widec уже был доступен), но я получаю тот же результат.

1 Ответ

0 голосов
/ 04 мая 2019

На самом деле (при работе с ncurses 6.1 development) я не вижу сбоя от init_extended_pair. На первый взгляд проблема заключалась в следующем:

attron(COLOR_PAIR(pair3));
mvprintw(4, 1, "pair32767");
attroff(COLOR_PAIR(pair3));

Те attron / attroff являются устаревшими функциями . Вы должны использовать attr_on и attr_off. Форма macro attron и attroff (которая обычно используется вместо функции ) равна

#define wattron(win,at)         wattr_on(win, NCURSES_CAST(attr_t, at), NULL)
#define wattroff(win,at)        wattr_off(win, NCURSES_CAST(attr_t, at), NULL)

Но в любом случае данные «одинаковы»: что вписывается в attr_t (32-битное значение). В некоторых других функциях цветовая пара пропускается отдельно, а ncurses 6.1 предусматривает передачу пар размером более 16 бит с помощью параметра opts . Эти конкретные функции не расширяются таким образом.

Однако ваша программа возвращает ошибку для init_extended_pair. Это может быть любой из (нескольких) возвратов от _nc_init_pair, но основной из них использует ValidPair:

#define ValidPair(sp,pair) \
((sp != 0) && (pair >= 0) && (pair < sp->_pair_limit) && sp->_coloron)

Чтобы проверить это, я запустил код для текущих ncurses6 с TERM=xterm-256color и TERM=xterm-direct. Оба работали, хотя init_extended_color в последнем отказывает (как и ожидалось). Я вижу , что не работает, скомпилировав ncurses с TRACE, и включив трассировку с NCURSES_TRACE=0x220. Вот скриншот трассировки, например:

screenshot showing ncurses traces

Текущий код доступен на домашней странице ncurses ( здесь ). Если вы можете воспроизвести проблему, используя текущий код, вы можете обсудить ее в списке рассылки bug-ncurses . В противном случае (см. Список рассылки), пакет Debian является ссылкой на версию, которую вы используете.

...