ターミナルが背景色をrgb:xxxx / yyyy / zzzzとして報告するのはなぜですか?これはどんな形式ですか?

ターミナルが背景色をrgb:xxxx / yyyy / zzzzとして報告するのはなぜですか?これはどんな形式ですか?

端末の背景を色に設定すると#1a2b3cその後、printf '\e]11;?\a'I get backを使用してクエリします。]11;rgb:1a74/2b98/3cb6

1a74赤、緑、青2b98の仮定値はどのエンコードですか3cb6

1a各セグメントの最初の2文字(74 / 2b98 / b6)のみを選択すると、3c元の色が得られます。それでは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>= |hhhhhhhhhh

h:=単一の16進数(大文字と小文字を区別しない)

h注:4ビットにスケーリングされた値、hh8ビットにスケーリングされた値、hhh12ビットにスケーリングされた値、およびhhhh16ビットにスケーリングされた値がそれぞれ表示されます。

以前のバージョンとの互換性のために、RGBデバイスの古い構文はサポートされていますが、引き続き使用することはお勧めできません。構文は、次の形式のいずれかの数値指定が続く最初の文字の鋭い文字です。

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

RおよびGB単一の16進数を表します。ビットあたり16ビット未満が指定されている場合は、値の最上位ビットを表します(値のrgb:スケーリング構文とは異なり)。たとえば、この文字列#3a7はと同じです#3000a0007000

<ESC>]11;rgb:1a74/2b98/3cb6<BEL>したがって、色を意味するものを取得します。

  • 赤色の強度は、16進数0xffffの0x1a74です。
  • 緑色の強度は、16進数0xffffの0x2b98です。
  • 青色の強度は、16進数0xffffの0x3cb6です。

#1a2b3c端末でスケーリングがどのように実行されるかはわかりませんが、デフォルトの色ごとに16ビットにスケーリングされます。

Debianやxtermkonsoleまたはベースのvte端末(たとえば)では、0x1a1aが0x1a * 0xffff / 0xffの場所であることがgnome-terminalわかりますが、$'\e]11;rgb:1a1a/2b2b/3c3c\a'これはまだ上記のテキストと矛盾しているように見えます。これ#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

キティでは$'\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.confrxvtまたはに次のように表示されxtermます。

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ビットしかサポートしていないため、あまり違いはありません。


¹ 以下は、Man ページとして提供される Arch Linux のマニュアルページへのリンクです。x.orgにあるもの現在破損しています。システムでまたはを確認してくださいman XParseColorman XQueryColor

おすすめ記事