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);