It allows for getting and setting the background color. Notably, Vim uses OSC 11 to learn whether it's running on a light or dark colored terminal and choose a color scheme accordingly.
Tested with gnome-terminal and xterm. When called with "?" argument the current background color is returned: $ echo -ne "\e]11;?\e\\" $ 11;rgb:2323/2727/2929 Signed-off-by: Lubomir Rintel <lkund...@v3.sk> --- Changed in v2: * Reordered the type condition by their numeric value * Updated the places that iterate oscs[] with correct array length * Backed out the change of the OSC terminator sequence src/ansi.c | 16 +++++++++------- src/display.c | 3 ++- src/process.c | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/ansi.c b/src/ansi.c index 8f3ddd6..b3e3889 100644 --- a/src/ansi.c +++ b/src/ansi.c @@ -1250,22 +1250,24 @@ static int StringEnd(Window *win) } break; } - if (typ == 0 || typ == 1 || typ == 2 || typ == 20 || typ == 39 || typ == 49) { + if (typ == 0 || typ == 1 || typ == 2 || typ == 11 || typ == 20 || typ == 39 || typ == 49) { int typ2; typ2 = typ / 10; - if (--typ2 < 0) - typ2 = 0; if (strcmp(win->w_xtermosc[typ2], p)) { - strncpy(win->w_xtermosc[typ2], p, ARRAY_SIZE(win->w_xtermosc[typ2]) - 1); - win->w_xtermosc[typ2][ARRAY_SIZE(win->w_xtermosc[typ2]) - 1] = 0; + if (typ != 11 || strcmp("?", p)) { + strncpy(win->w_xtermosc[typ2], p, ARRAY_SIZE(win->w_xtermosc[typ2]) - 1); + win->w_xtermosc[typ2][ARRAY_SIZE(win->w_xtermosc[typ2]) - 1] = 0; + } for (display = displays; display; display = display->d_next) { if (!D_CXT) continue; if (D_forecv->c_layer->l_bottom == &win->w_layer) - SetXtermOSC(typ2, win->w_xtermosc[typ2]); - if ((typ2 == 2 || typ2 == 3) && D_xtermosc[typ2]) + SetXtermOSC(typ2, p); + if ((typ2 == 3 || typ2 == 4) && D_xtermosc[typ2]) Redisplay(0); + if (typ == 11 && !strcmp("?", p)) + break; } } } diff --git a/src/display.c b/src/display.c index 94eb2e5..43546b0 100644 --- a/src/display.c +++ b/src/display.c @@ -2128,6 +2128,7 @@ void SetXtermOSC(int i, char *s) { static char *oscs[][2] = { {WT_FLAG ";", "screen"}, /* set window title */ + {"11;", ""}, /* background RGB */ {"20;", ""}, /* background */ {"39;", "black"}, /* default foreground (black?) */ {"49;", "white"} /* default background (white?) */ @@ -2153,7 +2154,7 @@ void SetXtermOSC(int i, char *s) void ClearAllXtermOSC() { int i; - for (i = 3; i >= 0; i--) + for (i = 4; i >= 0; i--) SetXtermOSC(i, 0); if (D_xtermosc[0]) AddStr("\033[23;" WT_FLAG "t"); /* unstack titles (xterm patch #251) */ diff --git a/src/process.c b/src/process.c index d99c6be..d8794cd 100644 --- a/src/process.c +++ b/src/process.c @@ -5668,7 +5668,7 @@ void RefreshXtermOSC() Window *p; p = Layer2Window(D_forecv->c_layer); - for (i = 3; i >= 0; i--) + for (i = 4; i >= 0; i--) SetXtermOSC(i, p ? p->w_xtermosc[i] : 0); } -- 2.13.5