shithub: irc.myr

Download patch

ref: 85e0e28baed5b6e97319aaaae564491f62af33b5
parent: c54c921e3df50784fd308fa6d6c7032b36991b52
author: Ori Bernstein <ori@eigenstate.org>
date: Fri Nov 17 11:52:46 EST 2017

Scroll overly long input lines.

--- a/irc.myr
+++ b/irc.myr
@@ -1000,17 +1000,53 @@
 }
 
 const drawinput = {irc, x0, y0, x1, y1, c
-	var t, chan, ln
+	var t, chan, ln, cx, dx
 
+	dx = x1 - x0
 	t = irc.term
-	ln = getstr(irc.cmd)
 	chan = std.fmt("[{}] ", c.name)
+	ln = inputstr(irc, chan, dx)
+	cx = x0 + (std.strcellwidth(chan) + irc.off : int)
+	if cx > dx
+		cx = dx
+	;;
 	termdraw.setbg(t, termdraw.Default)
 	termdraw.move(t, x0, y0)
 	termdraw.clear(t, x0, y0, x1, y1)
 	termdraw.put(t, "{}{}", chan, ln)
-	termdraw.cursorpos(t, x0 + (std.strcellwidth(chan) + irc.off : int), y0)
+	termdraw.cursorpos(t, cx, y0)
 	std.slfree(ln)
+}
+
+const inputstr = {irc, chan, dx
+	var w, s, o
+	var start, end
+
+	s = irc.cmd
+	o = (irc.off : int)
+	dx -= termdraw.strwidth(irc.term, chan)
+	w = 0
+	start = 0
+	end = 0
+	for var i = 0; i < s.len; i++
+		w += std.cellwidth(s[i])
+		if w >= dx
+			break
+		;;
+		end++
+	;;
+	while end < s.len && irc.off >= (w : std.size)
+		start++
+		while std.cellwidth(s[end]) == 0
+			start++
+		;;
+		w += std.cellwidth(s[end])
+		end++
+		while end < s.len && std.cellwidth(s[end]) == 0
+			end++
+		;;
+	;;
+	-> getstr(s[start:end])
 }
 
 const srvmsg = {irc, args
--