From ef257cd5757fd6ae13d7639d6ed17dd779f173e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?= Date: Sat, 6 Jan 2024 23:27:22 +0100 Subject: xP: avoid expensive updates/refreshes --- xP/public/xP.js | 20 ++++++++++++++++---- 1 file 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) -- cgit v1.2.3