这是两个脚本的故事,与previous question。
相关这两个脚本位于http://gist.github.com/50692。 ansi.rb脚本在所有256种背景颜色上显示所有256种颜色。 ncurses.rb脚本显示所有256种前景色,但背景显示基本色16,然后似乎循环浏览各种属性,如闪烁和反向视频。
那是什么给出的?这是ncurses中的错误,它使用有符号整数来表示颜色对吗? (即'tput colors'表示256但'tput对'表示32767而不是65536)似乎是这样的情况下,前半部分颜色对会正确显示,但后半部分会重复或进入属性作为int包裹物。
答案 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的手册页非常有用。