터미널이 배경색을 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각 세그먼트의 처음 두 문자( 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>= h|hhhhhhhhh

h:= 단일 16진수(대소문자 구분 안 함)

h참고 로 4비트로 스케일링된 값, hh8비트로 스케일링된 값, hhh12비트로 스케일링된 값, hhhh16비트로 스케일링된 값이 각각 표시됩니다.

이전 버전과의 호환성을 위해 RGB 장치의 이전 구문이 지원되지만 계속 사용하는 것은 권장되지 않습니다. 구문은 다음 형식 중 하나의 숫자 사양이 뒤따르는 첫 글자의 날카로운 문자입니다.

#RGB (각 4자리)
#RRGGBB (각 8자리)
#RRRGGGBBB (각 12자리)
#RRRRGGGGBBBB (각 16자리)

, RGB단일 16진수를 나타냅니다. 비트당 16비트 미만이 지정되면 값의 최상위 비트를 나타냅니다( rgb:값 스케일링 구문과 달리). 예를 들어 이 문자열 #3a7은 와 동일합니다 #3000a0007000.

<ESC>]11;rgb:1a74/2b98/3cb6<BEL>따라서 색상을 의미하는 을 얻습니다 .

  • 빨간색 강도는 16진수 0xffff의 0x1a74입니다.
  • 녹색 강도는 16진수 0xffff의 0x2b98입니다.
  • 파란색 강도는 16진수 0xffff의 0x3cb6입니다.

#1a2b3c터미널에서 스케일링이 어떻게 수행되는지는 모르겠지만 기본 색상당 16비트로 스케일링 됩니다 .

Debian 및 xterm, konsole또는 기반 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.conf, rxvt또는 에 다음이 표시 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 XParseColor.man XQueryColor

관련 정보