aboutsummaryrefslogtreecommitdiff
path: root/st.c
diff options
context:
space:
mode:
authorQuentin Rameau <quinq@fifth.space>2024-02-25 01:31:31 +0100
committerHiltjo Posthuma <hiltjo@codemadness.org>2024-02-25 11:56:43 +0100
commit7473a8d1a57e5f9aba41b953f4e498c35e1c9dc5 (patch)
tree58b0baa2424b1e26c7661048ba2e429b52876067 /st.c
parenta3f7420310be0fd778ef9fe2abf20edc2d8dc81a (diff)
downloadst-7473a8d1a57e5f9aba41b953f4e498c35e1c9dc5.tar.gz
st-7473a8d1a57e5f9aba41b953f4e498c35e1c9dc5.tar.bz2
st-7473a8d1a57e5f9aba41b953f4e498c35e1c9dc5.zip
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 (limited to 'st.c')
-rw-r--r--st.c10
1 files 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);