4

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

  • 在支持它的终端上以真彩色(24 位)打印,
  • 在支持它的终端上使用 256 色 (6x6x6),
  • 否则有基本的 16 种颜色。

我曾经使用 termcap 编写过 C 函数,我想在这种情况下使用它。但是,手册页说:

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

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

我的问题是:

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

4

1 回答 1

5

简短的回答是,在 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

与那些(例如 16、88 和 256 色)兼容的 ANSI 颜色和方案假定您正在成对地为前景和背景着色。原因是很久以前,硬件终端就是这样工作的。该initialize_color功能适用​​于不同的方案(泰克),这似乎很有用。

但是,terminfo 已编译,生成的二进制文件仅存储有符号的 16 位整数。您不能使用终端描述来存储合适的max_pairs max_colors24 位颜色。(termcap 将所有内容存储为字符串,但如上所述不适合此应用程序)。

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

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

进一步阅读:

于 2016-03-22T19:39:46.390 回答