^[control-codes
live in libghostty-vt

Operating system commands

OSC 10 Text Foreground Color

View as Markdown

Set, query and reset the default foreground color.

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

OSC 10 ; Pt ST sets the default foreground, the color of text that has no SGR color of its own, and OSC 10 ; ? ST asks what it is. OSC 110 puts it back as it started.

It is the first of xterm’s ten dynamic colors, each with its own OSC number, apart from the 256 colors of the palette:

PsColorReset
10the default foreground, used by text with no SGR color110
11the default background, behind text with no SGR background color111
12the text cursor112
13the mouse pointer, while it is over the window113
14the mouse pointer’s outline, the part of an X cursor drawn in its second color114
15what is drawn in xterm’s Tektronix 4014 window115
16the background of xterm’s Tektronix 4014 window116
17the background of selected text117
18the cursor in xterm’s Tektronix 4014 window118
19selected text119

They all work alike:

  • OSC Ps ; Pt ST sets color Ps to Pt, in any form X11’s XParseColor accepts: a name such as red, #rrggbb, or rgb:rr/gg/bb.
  • Pt of ? asks for it. The answer is OSC Ps ; rgb:rrrr/gggg/bbbb, sixteen bits a part, ended with whichever of ST or BEL ended the question.
  • 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).
  • OSC 1Ps ST, that is OSC 110 ST to OSC 119 ST, puts color Ps back as it started (ResetColorsRequest).
  • Neither DECSTR nor RIS resets them, unlike the palette.

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 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. That case is a known difference.

Support

TerminalVersionSupportNotes
VT220manual, 2nd ed., 1984NoOSC is not among the controls it recognizes (§4.2)
VT510manual, 1st ed., 1993Noignores an OSC string (chapter 4)
xtermpatch 412, xterm-411aYes
libghostty-vt0f171f6Yespasses over an empty entry (OSC10-4)
Konsole26.11.70, a24c3d71Yessets and answers one color; no chain
kitty0.49.1, run in a VMYespasses the 2 cases that show it working; ends its replies with ST where xterm uses BEL
foot1.28.0, run in a VMPartlyfails OSC10-3 of the 2 cases that show it working
pyte0.8.2, run as a libraryNofails the 2 cases that show it working
xterm.js headless6.0.0, run as a libraryNofails the 2 cases that show it working
alacritty_terminal0.26.0, run as a libraryPartlyfails OSC10-3 of the 2 cases that show it working
ConEmubuild 230724, its documentationNonot in its ANSI escape codes
rxvt-unicode9.31, run in a VMPartlyfails OSC10-3 of the 2 cases that show it working; writes colors as ff00 where xterm writes ffff
VTE0.84.1, run as a libraryPartlyfails OSC10-3 of the 2 cases that show it working

Validation

OSC10-1: Ask for the foreground

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

OSC10-2: Change it

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

OSC10-3: 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-4: 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-5: 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
Every example on these pages runs in your browser, in libghostty-vt compiled to WebAssembly.