我正在使用xterm-256color
。这是我的简短程序片段:
mvwprintw(stdscr,1,1,"You have %d colors",COLORS);
mvwprintw(stdscr,2,1,"You have %d color pairs",COLOR_PAIRS);
wprintw(stdscr,"\n\n");
for (i=1;i<10;i++)
{
short r,g,b;
short thiscolor=i+70;
init_pair(i,thiscolor,COLOR_BLACK);
color_content(thiscolor,&r,&g,&b);
wattron(stdscr,COLOR_PAIR(i));
wprintw(stdscr,"This is color %d\t%d %d %d\n",thiscolor,r,g,b);
wattroff(stdscr,COLOR_PAIR(i));
}
refresh();
打印出10种不同的绿色,但color_content
的输出与正在打印的绿色不匹配:
You have 256 colors
You have 256 color pairs
This is color 71 1000 1000 1000
This is color 72 0 0 0
This is color 73 1000 0 0
This is color 74 0 1000 0
This is color 75 1000 1000 0
This is color 76 0 0 1000
This is color 77 1000 0 1000
This is color 78 0 1000 1000
This is color 79 1000 1000 1000
我原本希望看到中间值(G)总是一个相当高的数字。我不预计会看到0。
我做错了吗?或者我误解了color_content
应该输出的内容?
答案 0 :(得分:0)
ncurses没有预先知道给定终端仿真器使用的调色板。除非您初始化颜色(init_color
),否则它只有内置表。没有可移植的方法来确定终端的调色板。
手册中start_color
部分说
如果终端支持
initc
(initialize_color)功能,start_color
初始化表示红色的内部表格, 调色板的绿色和蓝色组件。组件取决于终端是否使用CGA(又名“ANSI”) 或HLS(即hls(hue_lightness_saturation)能力是 组)。该表首先初始化为八种基本颜色 (黑色,红色,绿色,黄色,蓝色,洋红色,青色和白色),和 之后(如果终端支持八种以上的颜色) 组件 初始化为1000 。
start_color
不会尝试将终端的调色板设置为 匹配其内置表格。应用程序可以使用init_color
来更改内部表格以及终端的颜色。
“初始化为1000”可能更清晰。该库使用8种ANSI颜色的红色/绿色/蓝色图案作为重复的东西(使用1000表示非零值)在前8种颜色之后重复(参见source-code ...)。
这是内置于库中的默认。如果你想要不同的东西,你必须使用init_color
告诉它是什么。 ncurses-examples有一些样本调色板数据文件可供一些程序(ncurses,picsmap,savescreen)使用,以便做到这一点。