为什么终端将其背景颜色报告为 rgb:xxxx/yyyy/zzzz — 那是什么格式?

为什么终端将其背景颜色报告为 rgb:xxxx/yyyy/zzzz — 那是什么格式?

如果我将终端背景设置为颜色#1a2b3c然后用printf '\e]11;?\a'I get back查询它]11;rgb:1a74/2b98/3cb6

1a74红色、绿色2b98和蓝色的假定值是什么编码3cb6

如果我只取每个段的前两个字符 ( 1a74/ 2b98/ 3cb6),那么我会得到原始颜色- 那么、和是1a2b3c什么?7498b6

答案1

作为xterm 控制序列参考文档中所述OSC 11 ; <spec> BEL转义序列改变[这]VT100文字背景色接受标准支持的颜色规格XParseColorX11功能1,什么时候<spec>?

如果一个 ”?”给出而不是名称或 RGB 规范,xterm 回复相同形式的控制序列,可用于设置相应的动态颜色

手册XParseColor(3)页告诉我们:

RGB 设备规范由前缀标识rgb:并符合以下语法:

rgb:<red>/<green>/<blue>

<red>, <green>, <blue>:= h| hh| hhh|hhhh

h:= 单个十六进制数字(不区分大小写)

注意,分别h表示以4位缩放的值、hh以8位缩放的值、hhh以12位缩放的值和hhhh以16位缩放的值。

为了向后兼容,支持 RGB 设备的旧语法,但不鼓励继续使用它。语法是一个初始的锐号字符,后跟一个数字规范,采用以下格式之一:

#RGB (各 4 位)
#RRGGBB (各 8 位)
#RRRGGGBBB (各 12 位)
#RRRRGGGGBBBB (各 16 位)

RGB代表单个十六进制数字。当指定的每个位少于 16 位时,它们表示值的最高有效位(与rgb:对值进行缩放的语法不同)。例如,该字符串#3a7与 相同#3000a0007000

所以你确实得到了<ESC>]11;rgb:1a74/2b98/3cb6<BEL>,这意味着颜色:

  • 红色强度为十六进制 0xffff 中的 0x1a74
  • 绿色强度为十六进制 0xffff 中的 0x2b98
  • 蓝色强度为十六进制 0xffff 中的 0x3cb6

这将被#1a2b3c缩放到每个原色 16 位,尽管我不知道如何在您的终端上完成缩放。

在 Debian 和基于xterm, konsoleorvte的终端(例如 )中gnome-terminal,我得到$'\e]11;rgb:1a1a/2b2b/3c3c\a'0x1a1a 是 0x1a * 0xffff / 0xff 的位置,但这似乎仍然与上面的文本相矛盾,表明应该与我假设的#1a2b3c相同,尽管也意味着是不是最亮的白色。#1a002b003c00rgb:1a00/2b00/3c00#ffffff

在 rxvt 中,我得到$'\e]11;rgb:1a00/2b00/3c00\a'(并且$'\e]11;rgb:1a1a/2b2b/3c3c\a'在发送时$'\e]11;rgb:1a/2b/3c\a'与上面的手册页一致XParseColor)。

在 kitty 中,我得到$'\e]11;rgb:1a1a/2b2b/3c3c\e\\'ESC \ (又名ST) 分隔符而不是 BEL,但其他方面与 xterm 和 co) 中的相同。

如果我运行ltrace -e XParseColor "$terminal" -bg '#1a2b3c',添加后:

typedef XColor = struct(ulong, hex(ushort), hex(ushort), hex(ushort), hex(char), hex(char));
int XParseColor(addr, int, string, +XColor*);

~/.ltrace.conf,无论是rxvtxterm,我看到:

xterm->XParseColor(0x55df687228f0, 57, "#1a2b3c", { 0, 0x1a00, 0x2b00, 0x3c00, 0x7, 0 })          = 1

对于ltrace -e XParseColor "$terminal" -bg rgb:1a/2b/3c,我看到:

xterm->XParseColor(0x557da7d8b8f0, 57, "rgb:1a/2b/3c", { 0, 0x1a1a, 0x2b2b, 0x3c3c, 0x7, 0 })     = 1

这似乎表明rxvt这是唯一正确的,但实际上这可能不会产生任何影响,因为大多数显示设备仅支持每种原色 8 位。


¹ 这里有一个指向 Arch Linux 手册页的链接,作为手册页呈现在x.org 上的那个目前已损坏。检查您的系统上的man XParseColor或。man XQueryColor

相关内容