ncurses(init_extended_pa​​ir):不能创建超过255个颜色对

时间:2019-05-03 14:37:30

标签: c++ colors terminal console ncurses

在6.1版中,ncurses引入了init_extended_pair,以将可能的颜色对的限制扩展到short之上。 在我的实验中,一切正常,直到值255。对于值256和更大的值,没有错误,但是前景和背景具有默认值。对于值32767和更大的函数,返回错误

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

编辑: 关于类似的问题How to enable 32k color pairs in ncurses?。在我的情况下,COLOR_PAIRS返回值65536而不是256,更多的问题是从2015年开始的,并且init_extended_pair分别于2017.04.01和released in version 6.1 January 27, 2018添加到了库中。尽管如此,我还是用--enable-ext-colors--enable-widec已经可用)重建libncursesw6包,但是我得到了相同的结果。

1 个答案:

答案 0 :(得分:0)

实际上(针对ncurses 6.1开发运行),我没有看到init_extended_pair出现故障。乍一看,问题似乎出在此方面:

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

attron / attroff legacy functions。您应该使用 attr_on attr_off 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通过 opts 参数提供传递大于16位的颜色对。这些特定功能不会以这种方式扩展。

但是,您的程序返回了init_extended_pair的错误。这可能是_nc_init_pair的(少数)任何回报,但主要的是使用ValidPair

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

要进行检查,我使用TERM=xterm-256colorTERM=xterm-direct针对当前的ncurses6运行了代码。两者都起作用,尽管后者中的init_extended_color失败了(如预期的那样)。通过使用TRACE编译ncurses并使用NCURSES_TRACE=0x220打开跟踪,可以看到失败。这是跟踪的屏幕截图,例如:

screenshot showing ncurses traces

当前代码可从ncurses主页(here)获得。如果您能够使用当前代码重现该问题,则可能需要在bug-ncurses邮件列表中进行讨论。否则(请参阅邮件列表),Debian package是您使用的版本的参考。