shithub: irc.myr

Download patch

ref: 229f4548e2b2a652a6752158479bea49fdd8a0e8
parent: 97d88ac96bfbfddec2ce1dcfd8664c8607f49c03
author: Ori Bernstein <ori@markovcorp.com>
date: Tue Nov 7 08:40:48 EST 2017

Improve terminal redraw.

--- a/irc.myr
+++ b/irc.myr
@@ -21,6 +21,8 @@
 	input	: byte[:]
 	cmdhist	: byte[:][:]
 	histidx	: std.size
+	chandirty	: bool
+	cmddirty	: bool
 ;;
 
 type server = struct
@@ -259,7 +261,9 @@
 		.nick = std.sldup(nick),
 		.focus = -1,
 		.term = t,
-		.logdir = std.pathcat(home, ".irclogs")
+		.logdir = std.pathcat(home, ".irclogs"),
+		.chandirty = true,
+		.cmddirty = true,
 	])
 	cli.self = mkchan(cli, "status", "status")
 
@@ -644,6 +648,11 @@
 		| `std.Some `termdraw.Ctrl 'u':
 			std.slfree(cli.input)
 			cli.input = ""
+		| `std.Some `termdraw.Ctrl 'l':
+			/* force redraw of everything */
+			termdraw.cls(cli.term)
+			cli.chandirty = true
+			cli.cmddirty = true
 		| `std.Some `termdraw.Kup:
 			if chan.scroll < curchan(cli).hist.len
 				curchan(cli).scroll++
@@ -656,6 +665,8 @@
 			s = std.fmt("{}", r)
 			puthist(cli, cli.self, (std.now(), `Status s))
 		;;
+		cli.cmddirty = true
+		redraw(cli)
 	;;
 }
 
@@ -667,7 +678,6 @@
 const redraw = {cli
 	var c, x, y, w, h
 
-	termdraw.cls(cli.term)
 	if cli.term.width < 10 || cli.term.height < 5
 		-> void
 	;;
@@ -677,10 +687,16 @@
 	w = cli.term.width
 	h = cli.term.height
 	c = curchan(cli)
-	drawbanner(cli, 0, 0, w, 1, c)
-	drawtext(cli, 0, 1, w, h - 2, c)
-	drawlist(cli, 0, h - 2, w, h - 1, c)
-	drawinput(cli, 0, h - 1, w, h, c)
+	if cli.chandirty
+		drawbanner(cli, 0, 0, w, 1, c)
+		drawtext(cli, 0, 1, w, h - 2, c)
+		drawlist(cli, 0, h - 2, w, h - 1, c)
+		cli.chandirty = false
+	;;
+	if cli.cmddirty
+		drawinput(cli, 0, h - 1, w, h, c)
+		cli.cmddirty = false
+	;;
 	termdraw.flush(cli.term)
 }
 
@@ -931,6 +947,7 @@
 const puthist = {cli, chan, entry
 	var tm, date, contents
 
+	cli.chandirty = true
 	std.slpush(&chan.hist, entry)
 	(tm, contents) = entry
 	if chan.log != -1
--