summary refs log tree commit diff
path: root/bin
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2019-07-20 17:05:14 -0400
committerJune McEnroe <june@causal.agency>2019-07-20 17:05:14 -0400
commit697685d7954474e046afc4477a3ea24f628314e0 (patch)
tree900aa15b0952cb1eae9bd4254c99b7e0843bf443 /bin
parentHandle shotty output options more centrally (diff)
downloadsrc-697685d7954474e046afc4477a3ea24f628314e0.tar.gz
src-697685d7954474e046afc4477a3ea24f628314e0.zip
Handle media copy sequence in shotty
This all still feels a bit gross for some reason.
Diffstat (limited to '')
-rw-r--r--bin/man1/shotty.14
-rw-r--r--bin/shotty.c16
2 files changed, 17 insertions, 3 deletions
diff --git a/bin/man1/shotty.1 b/bin/man1/shotty.1
index 1f747ee8..3ca3ef4b 100644
--- a/bin/man1/shotty.1
+++ b/bin/man1/shotty.1
@@ -35,6 +35,10 @@ and
 .Ev TERM Ns = Ns Cm xterm-256color
 as used by
 .Xr ncurses 3 .
+A snapshot of the terminal
+is output each time
+a media copy sequence occurs,
+or once at the end of the capture.
 .
 .Pp
 HTML output uses the classes
diff --git a/bin/shotty.c b/bin/shotty.c
index fac1e044..41cb4e97 100644
--- a/bin/shotty.c
+++ b/bin/shotty.c
@@ -74,7 +74,10 @@ static void move(struct Cell *dst, struct Cell *src, uint len) {
 }
 
 static struct {
-	bool debug, cursor, bright;
+	bool debug;
+	bool cursor;
+	bool bright;
+	bool done;
 } opts;
 
 static void span(const struct Style *prev, const struct Cell *cell) {
@@ -186,6 +189,7 @@ static char updateNUL(wchar_t ch) {
 	X(']', OSC) \
 	X('d', VPA) \
 	X('h', SM)  \
+	X('i', MC)  \
 	X('l', RM)  \
 	X('m', SGR) \
 	X('r', DECSTBM)
@@ -211,6 +215,7 @@ static char updateESC(wchar_t ch) {
 	switch (ch) {
 		case '(': discard = true; return ESC;
 		case '=': return NUL;
+		case '>': return NUL;
 		case CSI: return CSI;
 		case OSC: return OSC;
 		default: warnx("unhandled ESC %lc", ch); return NUL;
@@ -338,8 +343,13 @@ static char updateCSI(wchar_t ch) {
 			scroll.bot = (n > 1 ? ps[1] - 1 : rows - 1);
 		}
 
-		break; case 't': // ignore
+		break; case MC: {
+			if (ps[0] != 10) break;
+			opts.done = true;
+			html();
+		}
 
+		break; case 't': // ignore
 		break; default: warnx("unhandled CSI %lc", ch);
 	}
 
@@ -432,5 +442,5 @@ int main(int argc, char *argv[]) {
 	}
 	if (ferror(file)) err(EX_IOERR, "getwc");
 
-	html();
+	if (!opts.done) html();
 }