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 = {clivar 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, entryvar tm, date, contents
+ cli.chandirty = true
std.slpush(&chan.hist, entry)
(tm, contents) = entry
if chan.log != -1
--
⑨