256种颜色,前景和背景

时间:2009-01-24 23:30:50

标签: ruby ncurses terminal 256color

这是两个脚本的故事,与previous question

相关

这两个脚本位于http://gist.github.com/50692。 ansi.rb脚本在所有256种背景颜色上显示所有256种颜色。 ncurses.rb脚本显示所有256种前景色,但背景显示基本色16,然后似乎循环浏览各种属性,如闪烁和反向视频。

那是什么给出的?这是ncurses中的错误,它使用有符号整数来表示颜色对吗? (即'tput colors'表示256但'tput对'表示32767而不是65536)似乎是这样的情况下,前半部分颜色对会正确显示,但后半部分会重复或进入属性作为int包裹物。

2 个答案:

答案 0 :(得分:7)

原因是因为ncurses在ABI 6之前,其中包括大多数发行版包括Debian和Amazon AMI使用的当前版本,COLOR_PAIR(n)无法引用256以上任何已定义的对。这是因为{{1}的参数}类型为COLOR_PAIR(n)。低8位选择颜色对,其余的被视为特定终端属性的位标cchar_t。这就是当您尝试超出示例代码中的第255对时,您会看到闪烁,反转,下划线等的原因。

这非常不幸,我计划在我的程序中使用队列来使用OR动态定义颜色,并且只是覆盖最近最少使用的对作为折衷。我写了ncurses维护者Thomas Dickey,询问是否有办法暂时离开ncurses来编写原始终端代码,然后返回ncurses。这是他的回复:

  

基本上你不得不忘记屏幕优化而且只是这样做   你自己的绘图使用terminfo(3)中列出的函数,例如,   tigetstr,mvcur,tputs。

     

您可以暂时从ncurses退出,但必须重新绘制   屏幕。否则,ncurses会对屏幕上的内容感到困惑   以及光标所在的位置。

这个解决方案似乎存在太多陷阱,但是如果你在ncurses程序中绝对需要超过256个并发对(不计算你可以使用inverse属性伪造的对),那么这就是你必须要做的。

答案 1 :(得分:2)

我根本不认识Ruby,所以不能提供一个有效的例子,但是ncurses.rb脚本应该告诉你一些东西,它比ansi.rb脚本短得多。

您没有设置颜色,因此它只是循环默认的16个调色板,其中包含由闪烁下划线,粗体等属性提供的变体。

您需要使用int init_color(short color, short r, short g, short b)初始化RGB值(0 - 1000)的颜色索引,然后在调用int init_pair(short pair, short f, short b)之前设置颜色对用于显示COLOR_PAIR(n)

为了便于携带,您应该检查bool has_colors(void)bool can_change_color(void)

在我的系统上,ncurses的手册页非常有用。