Compare commits

..

5 Commits

Author SHA1 Message Date
Hiltjo Posthuma 5ce9716281 bump version to 0.9.1 2024-03-19 12:13:42 +01:00
Hiltjo Posthuma f20e169a20 config.def.h: improve latency for the default configuration 2024-03-17 14:42:44 +01:00
Tommi Hirvola 95f22c5305 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.
2024-03-04 23:50:58 +01:00
Quentin Rameau 7473a8d1a5 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.
2024-02-25 11:56:43 +01:00
Tim Culverhouse a3f7420310 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.
2024-02-18 16:14:26 +01:00
3 changed files with 11 additions and 6 deletions

View File

@ -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;
/*

View File

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

13
st.c
View File

@ -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;
@ -1643,7 +1643,7 @@ csihandle(void)
ttywrite(vtiden, strlen(vtiden), 0);
break;
case 'b': /* REP -- if last char is printable print it <n> more times */
DEFAULT(csiescseq.arg[0], 1);
LIMIT(csiescseq.arg[0], 1, 65535);
if (term.lastc)
while (csiescseq.arg[0]-- > 0)
tputc(term.lastc);
@ -1728,6 +1728,7 @@ csihandle(void)
}
break;
case 'S': /* SU -- Scroll <n> line up */
if (csiescseq.priv) break;
DEFAULT(csiescseq.arg[0], 1);
tscrollup(term.top, csiescseq.arg[0]);
break;
@ -2174,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);