From 9846a56bd7fdc86bf788db04bbbcbde7b7eb9952 Mon Sep 17 00:00:00 2001 From: Peter Hofmann Date: Sat, 7 Oct 2023 07:41:02 +0200 Subject: [PATCH 01/10] Add terminfo entries for bracketed paste mode Helps Vim (and hopefully others) to discover that this feature exists without further user configuration. --- st.info | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/st.info b/st.info index 8201ad6..efab2cf 100644 --- a/st.info +++ b/st.info @@ -184,6 +184,10 @@ st-mono| simpleterm monocolor, # XTerm extensions rmxx=\E[29m, smxx=\E[9m, + BE=\E[?2004h, + BD=\E[?2004l, + PS=\E[200~, + PE=\E[201~, # disabled rep for now: causes some issues with older ncurses versions. # rep=%p1%c\E[%p2%{1}%-%db, # tmux extensions, see TERMINFO EXTENSIONS in tmux(1) From a3f7420310be0fd778ef9fe2abf20edc2d8dc81a Mon Sep 17 00:00:00 2001 From: Tim Culverhouse Date: Sun, 18 Feb 2024 06:56:49 -0600 Subject: [PATCH 02/10] csi: check for private marker in 'S' case The handler for 'S' final character does not check for a private marker. This can cause a conflict with a sequence called 'XTSMGRAPHICS' which also has an 'S' final character, but uses the private marker '?'. Without checking for a private marker, st will perform a scroll up operation when XTSMGRAPHICS is seen, which can cause unexpected display artifacts. --- st.c | 1 + 1 file changed, 1 insertion(+) diff --git a/st.c b/st.c index d6478f5..034954d 100644 --- a/st.c +++ b/st.c @@ -1728,6 +1728,7 @@ csihandle(void) } break; case 'S': /* SU -- Scroll line up */ + if (csiescseq.priv) break; DEFAULT(csiescseq.arg[0], 1); tscrollup(term.top, csiescseq.arg[0]); break; From 7473a8d1a57e5f9aba41b953f4e498c35e1c9dc5 Mon Sep 17 00:00:00 2001 From: Quentin Rameau Date: Sun, 25 Feb 2024 01:31:31 +0100 Subject: [PATCH 03/10] Fix cursor move with wide glyphs st would always move back 1 column, even with wide glyhps (using more than a single column). The glyph rune is set on its first column, and the other ones are to 0, so loop until we detect the start of the previous glyph. --- st.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/st.c b/st.c index 034954d..77c3e8a 100644 --- a/st.c +++ b/st.c @@ -86,8 +86,8 @@ enum escape_state { typedef struct { Glyph attr; /* current char attributes */ - int x; - int y; + int x; /* terminal column */ + int y; /* terminal row */ char state; } TCursor; @@ -2175,12 +2175,16 @@ tstrsequence(uchar c) void tcontrolcode(uchar ascii) { + size_t i; + switch (ascii) { case '\t': /* HT */ tputtab(1); return; case '\b': /* BS */ - tmoveto(term.c.x-1, term.c.y); + for (i = 1; term.c.x && term.line[term.c.y][term.c.x - i].u == 0; ++i) + ; + tmoveto(term.c.x - i, term.c.y); return; case '\r': /* CR */ tmoveto(0, term.c.y); From 95f22c53059ccd60ee701ccf2659dacd95e4e89a Mon Sep 17 00:00:00 2001 From: Tommi Hirvola Date: Mon, 4 Mar 2024 12:56:30 +0200 Subject: [PATCH 04/10] set upper limit for REP escape sequence argument Previously, printf 'L\033[2147483647b' would call tputc('L') 2^31 times, making st unresponsive. This commit allows repeating the last character at most 65535 times in order to prevent freezing and DoS attacks. --- st.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/st.c b/st.c index 77c3e8a..683493d 100644 --- a/st.c +++ b/st.c @@ -1643,7 +1643,7 @@ csihandle(void) ttywrite(vtiden, strlen(vtiden), 0); break; case 'b': /* REP -- if last char is printable print it more times */ - DEFAULT(csiescseq.arg[0], 1); + LIMIT(csiescseq.arg[0], 1, 65535); if (term.lastc) while (csiescseq.arg[0]-- > 0) tputc(term.lastc); From f20e169a20f3ee761f7e09714f1d4c10916cf4c6 Mon Sep 17 00:00:00 2001 From: Hiltjo Posthuma Date: Sun, 17 Mar 2024 14:42:44 +0100 Subject: [PATCH 05/10] config.def.h: improve latency for the default configuration --- config.def.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.def.h b/config.def.h index 91ab8ca..2cd740a 100644 --- a/config.def.h +++ b/config.def.h @@ -53,7 +53,7 @@ int allowwindowops = 0; * near minlatency, but it waits longer for slow updates to avoid partial draw. * low minlatency will tear/flicker more, as it can "detect" idle too early. */ -static double minlatency = 8; +static double minlatency = 2; static double maxlatency = 33; /* From 5ce971628106fb767ef91bf4386227423f5fdf98 Mon Sep 17 00:00:00 2001 From: Hiltjo Posthuma Date: Tue, 19 Mar 2024 12:13:42 +0100 Subject: [PATCH 06/10] bump version to 0.9.1 --- config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.mk b/config.mk index 1e306f8..7f35f71 100644 --- a/config.mk +++ b/config.mk @@ -1,5 +1,5 @@ # st version -VERSION = 0.9 +VERSION = 0.9.1 # Customize below to fit your system From 8c68ec52419f3f965164cafcf589b87e8961348d Mon Sep 17 00:00:00 2001 From: Hiltjo Posthuma Date: Sat, 30 Mar 2024 12:30:49 +0100 Subject: [PATCH 07/10] Revert "Fix cursor move with wide glyphs" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 7473a8d1a57e5f9aba41b953f4e498c35e1c9dc5. This patch needs some more work. It caused regressions with programs that use GNU readline, etc. Original test-case example from Tim Culverhouse : printf " 😀" && sleep 2 && printf "\e[D" && sleep 2 && printf "\e[D" && sleep 2 After the patch it caused regressions, example test-case: printf "A歗\bB\n" --- st.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/st.c b/st.c index 683493d..b9f66e7 100644 --- a/st.c +++ b/st.c @@ -86,8 +86,8 @@ enum escape_state { typedef struct { Glyph attr; /* current char attributes */ - int x; /* terminal column */ - int y; /* terminal row */ + int x; + int y; char state; } TCursor; @@ -2175,16 +2175,12 @@ tstrsequence(uchar c) void tcontrolcode(uchar ascii) { - size_t i; - switch (ascii) { case '\t': /* HT */ tputtab(1); return; case '\b': /* BS */ - for (i = 1; term.c.x && term.line[term.c.y][term.c.x - i].u == 0; ++i) - ; - tmoveto(term.c.x - i, term.c.y); + tmoveto(term.c.x-1, term.c.y); return; case '\r': /* CR */ tmoveto(0, term.c.y); From 497a75638291454875ba1ec8d484c7f3d6f41d66 Mon Sep 17 00:00:00 2001 From: DOGMAN Date: Wed, 3 Apr 2024 19:48:11 +0200 Subject: [PATCH 08/10] Reset title when an empty title string is given With this patch, st will reset its window title when an empty string is given as the terminal title. For example: printf "\033]0;\007" Some applications, like termdown, expect this functionality. xterm implements it, but it seems that most other terminal emulators don't. In any case, I don't see why there should ever be a case where the st window doesn't have a title property. --- x.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/x.c b/x.c index b36fb8c..bd23686 100644 --- a/x.c +++ b/x.c @@ -1617,6 +1617,9 @@ xseticontitle(char *p) XTextProperty prop; DEFAULT(p, opt_title); + if (p[0] == '\0') + p = opt_title; + if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, &prop) != Success) return; @@ -1631,6 +1634,9 @@ xsettitle(char *p) XTextProperty prop; DEFAULT(p, opt_title); + if (p[0] == '\0') + p = opt_title; + if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, &prop) != Success) return; From d63b9eb90245926b531bd54b1d591adb96613e70 Mon Sep 17 00:00:00 2001 From: Hiltjo Posthuma Date: Fri, 5 Apr 2024 12:18:41 +0200 Subject: [PATCH 09/10] bump version to 0.9.2 --- config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.mk b/config.mk index 7f35f71..fdc29a7 100644 --- a/config.mk +++ b/config.mk @@ -1,5 +1,5 @@ # st version -VERSION = 0.9.1 +VERSION = 0.9.2 # Customize below to fit your system From 5dbcca49263be094fc38159c297458ae323ef647 Mon Sep 17 00:00:00 2001 From: Hiltjo Posthuma Date: Wed, 1 May 2024 20:45:39 +0200 Subject: [PATCH 10/10] support colons in SGR character attributes Patch by Mikhail Kot With some modifications to behave more like xterm (see note below). Example: printf '\033[48;2;255:0:0mtest\n' https://invisible-island.net/xterm/ctlseqs/ctlseqs.html Some notes: "CSI Pm m Character Attributes (SGR). [...] o xterm allows either colons (standard) or semicolons (legacy) to separate the subparameters (but after the first colon, colons must be used). --- st.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/st.c b/st.c index b9f66e7..57c6e96 100644 --- a/st.c +++ b/st.c @@ -1132,6 +1132,7 @@ csiparse(void) { char *p = csiescseq.buf, *np; long int v; + int sep = ';'; /* colon or semi-colon, but not both */ csiescseq.narg = 0; if (*p == '?') { @@ -1149,7 +1150,9 @@ csiparse(void) v = -1; csiescseq.arg[csiescseq.narg++] = v; p = np; - if (*p != ';' || csiescseq.narg == ESC_ARG_SIZ) + if (sep == ';' && *p == ':') + sep = ':'; /* allow override to colon once */ + if (*p != sep || csiescseq.narg == ESC_ARG_SIZ) break; p++; }