ncurses color_content()给了我错误的值

时间:2018-03-06 15:24:41

标签: c colors ncurses

我正在使用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应该输出的内容?

1 个答案:

答案 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)使用,以便做到这一点。