^[control-codes live in libghostty-vt

Operating system commands

OSC 10 Change Dynamic Colors

Set, query and reset the default foreground and background, the cursor's color, and others.

OSC 10 ; Pt ST
ECMA-48
§8.3.89 OSC – Operating System Command, p. 51
xterm
Operating System Commands

Besides the palette, xterm has a set of dynamic colors, each with its own OSC number:

PsColor
10the default foreground, used by text with no SGR color
11the default background
12the cursor
13, 14the mouse pointer’s foreground and background
15, 16, 18the Tektronix window’s foreground, background and cursor
17, 19the background and foreground of selected text

OSC Ps ; Pt ST sets color Ps to Pt, in any form X11’s XParseColor accepts, and Pt of ? asks for it; the answer is OSC Ps ; rgb:rrrr/gggg/bbbb, ended as the question was. OSC 1Ps ST, that is OSC 110 ST to OSC 119 ST, puts color Ps back as it started.

A sequence can carry more than one color: each further ; moves on to the next number, so OSC 10 ; red ; blue ST sets the foreground and the background, and OSC 10 ; ? ; ? ST asks for both. An empty one is skipped, so OSC 10 ; ; blue ST sets only the background (ChangeColorsRequest, ReportColorRequest, ResetColorsRequest). Unlike the palette, neither DECSTR nor RIS resets them.

A program asks for the background, OSC 11 ; ? ST, to find out whether it is running on a light or a dark terminal and choose its own colors to suit.

Where these colors start is the host’s choice. The cases are run in a terminal given a default xterm’s: black text on white, with the cursor and the mouse pointer in the foreground color (charproc.c). That is what the answers below report; it is not how this site draws the screens.

libghostty-vt has 10, 11 and 12, and 110 to 112. It ignores the rest, so a question about the mouse pointer goes unanswered, and a chain of questions that runs past 12 stops there. It also passes over an empty color without moving on to the next number, so OSC 10 ; ; blue ST sets its foreground. Those cases are known differences.

Validation

OSC10-1: Ask for the default colors

\e]10;?\a
\e]11;?\e\\
|____|
reply \e]10;rgb:0000/0000/0000\a\e]11;rgb:ffff/ffff/ffff\e\\

OSC10-2: And the cursor’s

\e]12;?\a
|____|
reply \e]12;rgb:0000/0000/0000\a

OSC10-3: Change the foreground

\e]10;#ff8000\a
\e]10;?\a
|____|
reply \e]10;rgb:ffff/8080/0000\a

OSC10-4: Each ; moves to the next color

\e]10;red;blue\a
\e]10;?;?\a
|____|
reply \e]10;rgb:ffff/0000/0000\a\e]11;rgb:0000/0000/ffff\a

OSC10-5: An empty one is skipped

\e]10;;blue\a
\e]10;?;?\a
|____|
reply \e]10;rgb:0000/0000/0000\a\e]11;rgb:0000/0000/ffff\a

OSC10-6: Questions and changes together

\e]10;?;red\a  # ask for 10, set 11
\e]11;?\a
|____|
reply \e]10;rgb:0000/0000/0000\a\e]11;rgb:ffff/0000/0000\a

OSC10-7: Reset

\e]10;red;blue;green\a
\e]110\a
\e]112\a
\e]10;?;?;?\a
|____|
reply \e]10;rgb:0000/0000/0000\a\e]11;rgb:0000/0000/ffff\a\e]12;rgb:0000/0000/0000\a

OSC10-8: RIS leaves them alone

\e]11;red\a
\ec
\e]11;?\a
|____|
reply \e]11;rgb:ffff/0000/0000\a

OSC10-9: The mouse pointer

\e]13;?\a
|____|
reply \e]13;rgb:0000/0000/0000\a

OSC10-10: A chain past the cursor

\e]12;?;?\a  # the cursor, then the pointer
|____|
reply \e]12;rgb:0000/0000/0000\a\e]13;rgb:0000/0000/0000\a