gpt4 book ai didi

c++ - 使用terminfo的终端颜色?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:33 24 4
gpt4 key购买 nike

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

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

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

The termcap database is an obsolete facility for describing the capabilities of character-cell terminals and printers. It is retained only for capability with old programs; new ones should use the terminfo database and associated libraries.

所以我尝试使用 terminfo,但找不到如何执行此操作。我的系统中没有 terminfo.h(我在 Debian 上运行)。

我的问题是:

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

最佳答案

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

较长的答案:

  • 要有效地使用 TrueColor,您需要一个接口(interface)来处理 3 个参数(红色绿色蓝色)。 Termcap 不能这样做。 Terminfo 可以处理多个参数,但是...
  • 没有标准终端能力(可以是 bool 值、数字或字符串的特征名称)处理真彩色。
  • 您可以调整现有功能,但它们有局限性

查看 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_pairs max_colors。 (termcap 将所有内容都存储为字符串,但如前所述,不适用于此应用程序)。

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

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

进一步阅读:

关于c++ - 使用terminfo的终端颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36158093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com