ncurses是否支持TrueColor?

问题描述

我知道ncurses通过init_pair函数和朋友支持16位颜色。但是可以显示全RGB颜色(又称真彩色)的字符吗?

解决方法

“真彩色”有点用词不当-它不存在。

Ncurses使您可以重新定义标准16种颜色的值,但不支持在任意位置使用任意RBG颜色。幸运的是,如果您希望自己做的话,很多终端都支持8位RGB(有时称为“真彩色”),请注意,这意味着不使用ncurses。

顺序为:

  • ESC[ 38;2;⟨r⟩;⟨g⟩;⟨b⟩ m:选择RGB前景色
  • ESC[ 48;2;⟨r⟩;⟨g⟩;⟨b⟩ m:选择RGB背景颜色

(来自ANSI Escape Code

在这里,“ ESC”只是字符“ \ x1b”,您可以用0-255之间的值替换r,g和b。像这样:

printf("\x1b[38;2;%d,%d,%dm",r,g,b);

这不适用于所有终端,但是有很多支持它。

为什么不屈服?

为什么Ncurses不支持此功能?事实证明,Ncurses并不是仅仅是一个用于样式化文本并将其放置在终端上不同位置的库,但是它还试图变得聪明并在打开时最大程度地减少通过stdout传输的数据量。屏幕文字更改。 Ncurses通过在内部保留自己的文本缓冲区并通过stdout传输增量来实现此目的。

如果您使用的是14.4 kbit / s调制解调器或较慢的串行连接(早在1993年),那是在最初创建Ncurses时运行的,这是一个非常不错的功能。但是,Ncurses做出了不支持其他颜色的实现折衷方案。

,

ncurses常见问题解答Why only 16 (or 256) colors?进行了详细介绍,提供了此功能的历史,指出正确的术语是直接颜色(因为它基于标准,而 true color 是 direct color 的特例。同样,xterm FAQ Can I set a color by its number?在xterm中提供了有关此功能历史的相应详细信息。

ncurses 6.1(2018年1月)引入了对直接色的支持,如ncurses versus slang history的摘要所示。其中包括一个示例程序picsmap,该程序使用RGB扩展名(记录在user_caps(5)中)。

由于24位RGB中的颜色数大于原始(带符号!)16位数字(请参阅term(5))中支持的数字范围,因此有必要提供更大的数字。 ncurses 6.1通过添加到不透明的TERMINAL结构中,并添加可以操纵扩展数字的函数,以对现有应用程序的最小更改来实现此目的。无需更改ABI(自2015年8月以来,目前为6),因为没有记录的功能更改了其二进制接口。

要在ncurses中使用 RGB 功能,必须具有正确的端子描述。 xterm-direct用于xterm。此示例设置RGB标志并覆盖颜色功能(但保留前8种ANSI颜色,使其成为可行的混合色):

xterm+direct|xterm with direct-color indexing,RGB,colors#0x1000000,pairs#0x10000,CO#8,initc@,op=\E[39;49m,setab=\E[%?%p1%{8}%<%t4%p1%d%e48\:2\:\:%p1%{65536}%/%d\:%p1
              %{256}%/%{255}%&%d\:%p1%{255}%&%d%;m,setaf=\E[%?%p1%{8}%<%t3%p1%d%e38\:2\:\:%p1%{65536}%/%d\:%p1
              %{256}%/%{255}%&%d\:%p1%{255}%&%d%;m,setb@,setf@,

其他终端具有其相应的风味。由于已记录了该功能的示例,因此其他人可以根据需要自定义终端说明。

picsmap 是ncurses的测试程序之一,可以作为"ncurses-examples"单独使用。教程是题外话; source-code随时可用。