6

这是两个脚本的故事,与上一个问题有关

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

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

4

2 回答 2

7

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

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

从本质上讲,您必须忘记屏幕优化,而只需使用 terminfo(3) 中列出的函数(例如 tigetstr、mvcur、tputs)进行自己的绘图。

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

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

于 2012-12-13T19:40:56.790 回答
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 的手册页非常宝贵。

于 2009-10-18T23:03:18.047 回答