From ac9f4093c4b0638ee522c9dda410ca221231857d Mon Sep 17 00:00:00 2001 From: June McEnroe Date: Fri, 12 Jul 2019 18:41:04 -0400 Subject: Support insert mode in shotty This is how curses puts characters into the bottom-right cell of the terminal. --- bin/shotty.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'bin') diff --git a/bin/shotty.c b/bin/shotty.c index 66651af8..d7814a91 100644 --- a/bin/shotty.c +++ b/bin/shotty.c @@ -51,6 +51,7 @@ static struct Style def = { .fg = 7 }; static uint rows, cols; static uint y, x; +static bool insert; static struct Style style; static struct Cell *cells; @@ -65,6 +66,10 @@ static void clear(struct Cell *a, struct Cell *b) { } } +static void move(struct Cell *dst, struct Cell *src, uint len) { + memmove(dst, src, sizeof(*dst) * len); +} + static char updateNUL(wchar_t ch) { switch (ch) { case BS: if (x) x--; return NUL; @@ -82,7 +87,14 @@ static char updateNUL(wchar_t ch) { warnx("unhandled \\u%X", ch); return NUL; } + if (x + width > cols) { + warnx("cannot fit '%lc'", ch); + return NUL; + } + if (insert) { + move(cell(y, x + width), cell(y, x), cols - x - width); + } cell(y, x)->style = style; cell(y, x)->ch = ch; @@ -177,8 +189,20 @@ static char updateCSI(wchar_t ch) { clear(a, b); } - break; case SM: // ignore - break; case RM: // ignore + break; case SM: { + if (dec) break; + switch (ps[0]) { + break; case 4: insert = true; + break; default: warnx("unhandled SM %u", ps[0]); + } + } + break; case RM: { + if (dec) break; + switch (ps[0]) { + break; case 4: insert = false; + break; default: warnx("unhandled RM %u", ps[0]); + } + } break; case SGR: { if (ps[0] == 38 && ps[1] == 5) { -- cgit 1.4.1 '>committer
path: root/compat.h (unfollow)
Commit message (Expand)Author
2019-11-09Avoid the reserved _A names with BIT macroJune McEnroe
2019-11-09Define macro for bit flag enumsJune McEnroe
2019-11-08Check that password is hashedJune McEnroe
2019-11-08Avoid calling getopt_long again after it returns -1June McEnroe
2019-11-08Only change AWAY status for registered clientsJune McEnroe
2019-11-07Just write the example normallyJune McEnroe
2019-11-07Include path in readlinkat errorJune McEnroe
2019-11-07Call clientConsume before clientRecvJune McEnroe
2019-11-06Use -l:filename in Linux.mkJune McEnroe
2019-11-06Fix compat.h for #defined strlcpyJune McEnroe
2019-11-06Allow unsetting LIBRESSL_PREFIXJune McEnroe
2019-11-06Document calico service configurationJune McEnroe
2019-11-06Document SASL EXTERNAL configuration in more detailJune McEnroe
2019-11-06Document pounce service configurationJune McEnroe
2019-11-06Mention Darwin and GNU/Linux in READMEJune McEnroe
2019-11-06Assume LibreSSL from brew on DarwinJune McEnroe
2019-11-06Remove -DNO_EXPLICIT_BZERO from Darwin.mkJune McEnroe
2019-11-06Don't install rc scripts or dirs on LinuxJune McEnroe