256 种颜色,前景和背景

问题描述 投票:0回答:2

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

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

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

ruby ncurses terminal 256color
2个回答
8
投票

原因是因为 ncurses pre ABI 6(其中包括大多数发行版(包括 Debian 和 Amazon AMI)使用的当前版本),

COLOR_PAIR(n)
无法引用任何高于 256 的定义对。这是因为
COLOR_PAIR(n)
的参数属于
chtype 类型
。较低的 8 位选择颜色对,其余的被视为用于特定终端属性的位标志
OR
。这就是为什么当您尝试超出示例代码中的对号 255 时,您会看到闪烁、反色、下划线等。

这是非常不幸的,我计划在程序中使用队列来使用

init_pair()
动态定义颜色,并作为妥协覆盖最近最少使用的对。我写信给 ncurses 维护者 Thomas Dickey,询问是否有办法暂时跳出 ncurses 编写原始终端代码,然后返回 ncurses。这是他的回复:

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

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

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


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 的手册页非常宝贵。

© www.soinside.com 2019 - 2024. All rights reserved.