From 677a60d7352c8e3739875e99e419e9c0436ef927 Mon Sep 17 00:00:00 2001 From: sawka Date: Thu, 8 Sep 2022 13:44:24 -0700 Subject: [PATCH] unload terminals when they go out of view to save memory --- src/main.tsx | 23 ++++++++++++++++++++--- src/model.ts | 2 +- src/term.ts | 5 +++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/main.tsx b/src/main.tsx index 21b6ae3b..1b6cb2ac 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -216,11 +216,12 @@ class LineCmd extends React.Component<{sw : ScreenWindow, line : LineType, width } visibilityChanged(vis : boolean) : void { - if (vis && !this.termLoaded.get()) { + let curVis = this.termLoaded.get(); + if (vis && !curVis) { this.loadTerminal(); } - else if (!vis && this.termLoaded.get()) { - let {line} = this.props; + else if (!vis && curVis) { + this.unloadTerminal(); } } @@ -240,6 +241,22 @@ class LineCmd extends React.Component<{sw : ScreenWindow, line : LineType, width sw.connectElem(termElem, cmd, this.props.width); mobx.action(() => this.termLoaded.set(true))(); } + + unloadTerminal() : void { + let {sw, line} = this.props; + let model = GlobalModel; + let cmd = model.getCmd(line); + if (cmd == null) { + return; + } + let termId = "term-" + getLineId(line); + sw.disconnectElem(line.cmdid); + mobx.action(() => this.termLoaded.set(false))(); + let termElem = document.getElementById(termId); + if (termElem != null) { + termElem.replaceChildren(); + } + } componentDidMount() { let {line} = this.props; diff --git a/src/model.ts b/src/model.ts index de996845..cde8f2b4 100644 --- a/src/model.ts +++ b/src/model.ts @@ -329,7 +329,7 @@ class ScreenWindow { disconnectElem(cmdId : string) { let termWrap = this.terms[cmdId]; - if (cmdId != null) { + if (termWrap != null) { termWrap.dispose(); delete this.terms[cmdId]; } diff --git a/src/term.ts b/src/term.ts index 464a1787..6a081b39 100644 --- a/src/term.ts +++ b/src/term.ts @@ -219,10 +219,15 @@ class TermWrap { } this.dataUpdates = []; }, delayMs); + }).catch((e) => { + console.log("error reloading terminal", e); }); } updatePtyData(pos : number, data : Uint8Array) { + if (this.terminal == null) { + return; + } if (this.loadError.get()) { return; }