From 89f2492a4f732ecba84d609ec41b2c49e13490ee Mon Sep 17 00:00:00 2001 From: Santtu Lakkala Date: Thu, 8 Aug 2019 14:55:53 +0300 Subject: [PATCH 1/2] Convert wc back to mb when handling escape codes --- vt.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/vt.c b/vt.c index 15dabc1..90b2728 100644 --- a/vt.c +++ b/vt.c @@ -1351,9 +1351,15 @@ static void put_wc(Vt *t, wchar_t wc) } if (t->escaped) { - if (t->elen + 1 < sizeof(t->ebuf)) { - t->ebuf[t->elen] = wc; - t->ebuf[++t->elen] = '\0'; + char buf[MB_CUR_MAX]; + size_t s = wcrtomb(buf, wc, NULL); + if (s == (size_t)-1) { + buf[0] = wc; + s = 1; + } + if (t->elen + s < sizeof(t->ebuf)) { + memcpy(t->ebuf + t->elen, buf, s); + t->ebuf[t->elen += s] = '\0'; try_interpret_escape_seq(t); } else { cancel_escape_sequence(t); From ee001a551477f5e7f85169e8d3c3cd88ad73dde0 Mon Sep 17 00:00:00 2001 From: Santtu Lakkala Date: Sun, 11 Aug 2019 00:32:01 +0300 Subject: [PATCH 2/2] Save cursor position on primary buffer with CSI priv 1049 --- vt.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/vt.c b/vt.c index 90b2728..cb59b8d 100644 --- a/vt.c +++ b/vt.c @@ -970,11 +970,13 @@ static void interpret_csi_priv_mode(Vt *t, int param[], int pcount, bool set) case 1047: if (!set) buffer_clear(&t->buffer_alternate); + if (set && param[i] == 1049) + cursor_save(t); t->buffer = set ? &t->buffer_alternate : &t->buffer_normal; + if (!set && param[i] == 1049) + cursor_restore(t); vt_dirty(t); - if (param[i] != 1049) - break; - /* fall through */ + break; case 1048: /* save/restore cursor */ if (set) cursor_save(t);