Fix cursor move with wide glyphs - st - simple terminal
(HTM) git clone git://git.suckless.org/st
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 7473a8d1a57e5f9aba41b953f4e498c35e1c9dc5
(DIR) parent a3f7420310be0fd778ef9fe2abf20edc2d8dc81a
(HTM) Author: Quentin Rameau <quinq@fifth.space>
Date: Sun, 25 Feb 2024 01:31:31 +0100
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.
Diffstat:
M st.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
---
(DIR) diff --git 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);