1
0
mirror of git://git.suckless.org/st synced 2025-10-16 14:26:31 +01:00

Compare commits

...

3 Commits

Author SHA1 Message Date
Hiltjo Posthuma
6e97047474 bump version to 0.9.3 2025-08-09 14:35:14 +02:00
Hiltjo Posthuma
5a4666c19e add a few comments 2025-08-09 14:22:28 +02:00
Ayman Bagabas
d6c431859c Support OSC 110, 111, and 112 for resetting colors
This adds support for OSC 110, 111, and 112 escape sequences to reset
the foreground, background, and cursor colors in the terminal. The
changes include handling these sequences in the `strhandle` function of
`st.c`, allowing applications to reset colors to their default values.

The OSC sequences originated from Xterm control sequences and are now
widely used in terminal applications and supported by many terminal
emulators. For applications, this allows them to reset colors to
default values without needing to know the colors beforehand.

Signed-off-by: Ayman Bagabas <ayman.bagabas@gmail.com>
2025-08-09 12:34:01 +02:00
2 changed files with 24 additions and 11 deletions

View File

@ -1,5 +1,5 @@
# st version
VERSION = 0.9.2
VERSION = 0.9.3
# Customize below to fit your system

33
st.c
View File

@ -1420,14 +1420,14 @@ tsetattr(const int *attr, int l)
if ((idx = tdefcolor(attr, &i, l)) >= 0)
term.c.attr.fg = idx;
break;
case 39:
case 39: /* set foreground color to default */
term.c.attr.fg = defaultfg;
break;
case 48:
if ((idx = tdefcolor(attr, &i, l)) >= 0)
term.c.attr.bg = idx;
break;
case 49:
case 49: /* set background color to default */
term.c.attr.bg = defaultbg;
break;
case 58:
@ -1532,7 +1532,7 @@ tsetmode(int priv, int set, const int *args, int narg)
case 1006: /* 1006: extended reporting mode */
xsetmode(set, MODE_MOUSESGR);
break;
case 1034:
case 1034: /* 1034: enable 8-bit mode for keyboard input */
xsetmode(set, MODE_8BIT);
break;
case 1049: /* swap screen & set/restore cursor as xterm */
@ -1540,8 +1540,8 @@ tsetmode(int priv, int set, const int *args, int narg)
break;
tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD);
/* FALLTHROUGH */
case 47: /* swap screen */
case 1047:
case 47: /* swap screen buffer */
case 1047: /* swap screen buffer */
if (!allowaltscreen)
break;
alt = IS_SET(MODE_ALTSCREEN);
@ -1554,7 +1554,7 @@ tsetmode(int priv, int set, const int *args, int narg)
if (*args != 1049)
break;
/* FALLTHROUGH */
case 1048:
case 1048: /* save/restore cursor (like DECSC/DECRC) */
tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD);
break;
case 2004: /* 2004: bracketed paste mode */
@ -1913,7 +1913,7 @@ strhandle(void)
if (narg > 1)
xsettitle(strescseq.args[1]);
return;
case 52:
case 52: /* manipulate selection data */
if (narg > 2 && allowwindowops) {
dec = base64dec(strescseq.args[2]);
if (dec) {
@ -1924,9 +1924,9 @@ strhandle(void)
}
}
return;
case 10:
case 11:
case 12:
case 10: /* set dynamic VT100 text foreground color */
case 11: /* set dynamic VT100 text background color */
case 12: /* set dynamic text cursor color */
if (narg < 2)
break;
p = strescseq.args[1];
@ -1967,6 +1967,19 @@ strhandle(void)
tfulldirt();
}
return;
case 110: /* reset dynamic VT100 text foreground color */
case 111: /* reset dynamic VT100 text background color */
case 112: /* reset dynamic text cursor color */
if (narg != 1)
break;
if ((j = par - 110) < 0 || j >= LEN(osc_table))
break; /* shouldn't be possible */
if (xsetcolorname(osc_table[j].idx, NULL)) {
fprintf(stderr, "erresc: %s color not found\n", osc_table[j].str);
} else {
tfulldirt();
}
return;
}
break;
case 'k': /* old title set compatibility */