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_colorncurses-examples有一些样本调色板数据文件可供一些程序(ncurses,picsmap,savescreen)使用,就可以做到这一点。

以上是关于ncurses color_content()给了我错误的值的主要内容,如果未能解决你的问题,请参考以下文章

Ncurses入门-安装与使用

ncurses 到外壳并返回弄乱键

PHP ncurses窗口

鼠标向上滚动(Ncurses / C++)

ncurses交叉编译

ncurses交叉编译