使用terminfo的端子颜色



我正在编写一个允许在终端中使用颜色的C++类。我希望它能在每个终端上工作:

  • 在支持真彩色(24位)的终端上打印
  • 在支持它的终端上具有256色(6x6x6)
  • 其他是基本的16种颜色

我曾经用termcap写过一次C函数,我想在这种情况下使用它。然而,手册页上写着:

termcap数据库是一种过时的工具,用于描述字符单元终端和打印机的功能。它只保留用于旧程序的功能;新的应该使用terminfo数据库和相关的库。

所以我尝试使用terminfo,但我找不到如何做到这一点。我的系统中没有terminfo.h(我在Debian上运行)。

我的问题是:

我如何使用最新的工具(即根据手册页,不是termcap)在C/C++中获得当前终端的颜色可能性?

简短的回答是,在2018年1月发布ncurses 6.1之前,您无法从terminfo获取信息。

更长的答案:

  • 为了有效地使用TrueColor,您需要一个处理3个参数的接口(对于红色绿色蓝色)。Termcap无法做到这一点。Terminfo可以处理多个参数,但是
  • 没有标准的终端功能(功能的名称,可以是布尔值、数字或字符串)来处理TrueColor
  • 您可以调整现有的功能,但它们有局限性

查看terminfo(5)手册,您可能会看到以下(字符串):

   initialize_color          initc  Ic   initialize color #1
                                         to (#2,#3,#4)
   initialize_pair           initp  Ip   Initialize color
                                         pair #1 to
                                         fg=(#2,#3,#4),
                                         bg=(#5,#6,#7)

与这些(数字)相关:

   max_colors                colors Co   maximum number of
                                         colors on screen
   max_pairs                 pairs  pa   maximum number of
                                         color-pairs on the
                                         screen

ANSI颜色和与之兼容的方案(如16色、88色和256色)假设您在中为前景和背景着色。原因是很久以前,硬件终端就是这样工作的。initialize_color功能适用于不同的方案(Tektronix),这似乎很有用。

然而,terminfo是编译的,生成的二进制文件只存储有符号的16位整数。您无法使用终端描述来存储适合24位颜色的max_pairsmax_colors。(termcap将所有内容存储为字符串,但如前所述,不适合此应用程序)。

在这个问答首次编写几年后,terminfo被更新为使用一种新的文件格式,该格式使用有符号的32位整数,这足以用24位RGB颜色表示颜色的数量。

更多详细信息可以在ncurses 6.1的发布公告和更新的term(5)手册页中找到,后者指出,一些直接访问terminfo数据的应用程序使用的旧API中仍然存在限制。

进一步阅读:

  • 为什么只有16(或256)种颜色?(ncurses常见问题解答)
  • 我可以根据数字设置颜色吗?(xterm常见问题解答)
  • ncurses terminfo与我的系统兼容吗?(ncurses常见问题解答)

相关内容

  • 没有找到相关文章

最新更新