在6.1版中,ncurses引入了init_extended_pair,以将可能的颜色对的限制扩展到short
之上。
在我的实验中,一切正常,直到值255。对于值256和更大的值,没有错误,但是前景和背景具有默认值。对于值32767和更大的函数,返回错误。
程序返回:
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包,但是我得到了相同的结果。
答案 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-256color
和TERM=xterm-direct
针对当前的ncurses6运行了代码。两者都起作用,尽管后者中的init_extended_color
失败了(如预期的那样)。通过使用TRACE
编译ncurses并使用NCURSES_TRACE=0x220
打开跟踪,可以看到那失败。这是跟踪的屏幕截图,例如:
当前代码可从ncurses主页(here)获得。如果您能够使用当前代码重现该问题,则可能需要在bug-ncurses邮件列表中进行讨论。否则(请参阅邮件列表),Debian package是您使用的版本的参考。