summaryrefslogtreecommitdiff
path: root/xP/public/xP.js
diff options
context:
space:
mode:
Diffstat (limited to 'xP/public/xP.js')
-rw-r--r--xP/public/xP.js20
1 files changed, 16 insertions, 4 deletions
diff --git a/xP/public/xP.js b/xP/public/xP.js
index ea70bbd..d34ddf8 100644
--- a/xP/public/xP.js
+++ b/xP/public/xP.js
@@ -286,7 +286,6 @@ rpcEventHandlers.set(Relay.Event.BufferLine, e => {
// Initial sync: skip all other processing, let highlights be.
if (bufferCurrent === undefined) {
b.lines.push(line)
- bufferPopExcessLines(b)
return
}
@@ -302,7 +301,13 @@ rpcEventHandlers.set(Relay.Event.BufferLine, e => {
else
b.newMessages++
}
- bufferPopExcessLines(b)
+
+ // XXX: In its unkeyed diff algorithm, Mithril.js can only efficiently
+ // deal with common prefixes, i.e., indefinitely growing buffers.
+ // But we don't want to key all children of Buffer,
+ // so only trim buffers while they are, or once they become invisible.
+ if (e.bufferName != bufferCurrent)
+ bufferPopExcessLines(b)
if (e.leakToActive) {
let bc = buffers.get(bufferCurrent)
@@ -313,7 +318,6 @@ rpcEventHandlers.set(Relay.Event.BufferLine, e => {
else
bc.newMessages++
}
- bufferPopExcessLines(bc)
}
if (line.isHighlight || (!visible && !line.isUnimportant &&
@@ -370,8 +374,16 @@ rpcEventHandlers.set(Relay.Event.BufferRemove, e => {
rpcEventHandlers.set(Relay.Event.BufferActivate, e => {
let old = buffers.get(bufferCurrent)
- if (old !== undefined)
+ if (old !== undefined) {
bufferResetStats(old)
+ bufferPopExcessLines(old)
+ }
+
+ // Initial sync: trim all buffers to our limit, just for consistency.
+ if (bufferCurrent === undefined) {
+ for (let b of buffers.values())
+ bufferPopExcessLines(b)
+ }
bufferLast = bufferCurrent
let b = buffers.get(e.bufferName)