]> Sergey Matveev's repositories - st.git/commitdiff
Fix cursor move with wide glyphs
authorQuentin Rameau <quinq@fifth.space>
Sun, 25 Feb 2024 00:31:31 +0000 (01:31 +0100)
committerHiltjo Posthuma <hiltjo@codemadness.org>
Sun, 25 Feb 2024 10:56:43 +0000 (11:56 +0100)
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

diff --git a/st.c b/st.c
index 034954d0aa83de340560498116a75930bc1b3db9..77c3e8a8d8d16e3004760a0432af437065e41fb6 100644 (file)
--- 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);