ncurses color_content()给了我错误的值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ncurses color_content()给了我错误的值相关的知识,希望对你有一定的参考价值。
我正在使用xterm-256color
。这是我的简短程序片段:
mvwprintw(stdscr,1,1,"You have %d colors",COLORS);
mvwprintw(stdscr,2,1,"You have %d color pairs",COLOR_PAIRS);
wprintw(stdscr,"
");
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 %d %d %d
",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
应该输出什么?
答案
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)使用,就可以做到这一点。
以上是关于ncurses color_content()给了我错误的值的主要内容,如果未能解决你的问题,请参考以下文章