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/shotty.c') 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 homepage
path: root/README (unfollow)
Commit message (Collapse)Author
2017-09-01Revert "Add client readOnly mode"June McEnroe
This reverts commit 34f25ae40a3db9369e9d98b3814f2b93bbc21451.
2017-09-01Remove clientRemove call from clientCastJune McEnroe
If an error occurs on a client socket during a broadcast, that client will show up in the kqueue loop with EV_EOF and get removed that way. Tested by sending SIGKILL to a client and watching its cursor disappear.
2017-09-01Add client readOnly modeJune McEnroe
2017-08-31Clean up merge toolJune McEnroe
Choose the version with the most recent access if the modify times are the same.
2017-08-31Choose B for tiles with equal modify timesJune McEnroe
This way newer access counts and times will be preserved.
2017-08-31Add quick data file merge toolJune McEnroe
Hopefully I won't have to use it ever again.
2017-08-30Use only foreground color for selecting spawnJune McEnroe
2017-08-29Add four additional spawnsJune McEnroe
2017-08-28Add respawningJune McEnroe
2017-08-26Move license above includesJune McEnroe
Why was it down there?
2017-08-26Snapshot metadataJune McEnroe
2017-08-26Add meta.c to READMEJune McEnroe
2017-08-26Use MakefileJune McEnroe