From 38b7bbfff28bf714475413b0cebbaa16c714f63e Mon Sep 17 00:00:00 2001 From: sawka Date: Wed, 1 Feb 2023 00:27:59 -0800 Subject: [PATCH] setTUR will now set the usedrows into the backend. linetype sends used rows so the screen updates better on first load (perf as well) --- src/main.tsx | 4 +++- src/model.ts | 27 ++++++++++++++++++--------- src/term.ts | 30 +++++++++++------------------- src/types.ts | 10 +++++++++- 4 files changed, 41 insertions(+), 30 deletions(-) diff --git a/src/main.tsx b/src/main.tsx index 946156ba..b1104be2 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -441,7 +441,7 @@ class LineCmd extends React.Component<{sw : ScreenWindow, line : LineType, width ); } let termLoaded = this.termLoaded.get(); - let usedRows = sw.getUsedRows(cmd, width); + let usedRows = sw.getUsedRows(line, cmd, width); let termHeight = termHeightFromRows(usedRows); let remote = model.getRemote(cmd.remoteId); let status = cmd.getStatus(); @@ -1952,6 +1952,7 @@ class LinesView extends React.Component<{sw : ScreenWindow, width : number, line let containerTop = linesElem.scrollTop - LinesVisiblePadding; let containerBot = linesElem.scrollTop + linesElem.clientHeight + LinesVisiblePadding; let newMap = new Map(); + // console.log("computevismap", linesElem.scrollTop, linesElem.clientHeight, containerTop + "-" + containerBot); for (let i=0; i { for (let [k, v] of newMap) { diff --git a/src/model.ts b/src/model.ts index 377ee024..565ea6c1 100644 --- a/src/model.ts +++ b/src/model.ts @@ -5,7 +5,7 @@ import {debounce} from "throttle-debounce"; import {handleJsonFetchResponse, base64ToArray, genMergeData, genMergeSimpleData, boundInt, isModKeyPress} from "./util"; import {TermWrap} from "./term"; import {v4 as uuidv4} from "uuid"; -import type {SessionDataType, WindowDataType, LineType, RemoteType, HistoryItem, RemoteInstanceType, RemotePtrType, CmdDataType, FeCmdPacketType, TermOptsType, RemoteStateType, ScreenDataType, ScreenWindowType, ScreenOptsType, LayoutType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, UIContextType, HistoryInfoType, HistoryQueryOpts, FeInputPacketType, TermWinSize, RemoteInputPacketType, FeStateType, ContextMenuOpts} from "./types"; +import type {SessionDataType, WindowDataType, LineType, RemoteType, HistoryItem, RemoteInstanceType, RemotePtrType, CmdDataType, FeCmdPacketType, TermOptsType, RemoteStateType, ScreenDataType, ScreenWindowType, ScreenOptsType, LayoutType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, UIContextType, HistoryInfoType, HistoryQueryOpts, FeInputPacketType, TermWinSize, RemoteInputPacketType, FeStateType, ContextMenuOpts, NormalTermContext} from "./types"; import {WSControl} from "./ws"; var GlobalUser = "sawka"; @@ -554,6 +554,9 @@ class ScreenWindow { } let cols = widthToCols(width); let usedRows = GlobalModel.getTUR(this.sessionId, cmdId, cols); + if (line.contentheight != null && line.contentheight != -1) { + usedRows = line.contentheight; + } let termContext = {sessionId: this.sessionId, screenId: this.screenId, windowId: this.windowId, cmdId: cmdId, lineNum: line.linenum}; termWrap = new TermWrap(elem, { termContext: termContext, @@ -580,7 +583,7 @@ class ScreenWindow { } } - getUsedRows(cmd : Cmd, width : number) : number { + getUsedRows(line : LineType, cmd : Cmd, width : number) : number { let termOpts = cmd.getTermOpts(); if (!termOpts.flexrows) { return termOpts.rows; @@ -592,6 +595,9 @@ class ScreenWindow { if (usedRows != null) { return usedRows; } + if (line.contentheight != null && line.contentheight != -1) { + return line.contentheight; + } return (cmd.isRunning() ? 1 : 0); } return termWrap.usedRows.get(); @@ -1662,9 +1668,10 @@ class Model { return this.termUsedRowsCache[key]; } - setTUR(sessionId : string, cmdId : string, size : TermWinSize, usedRows : number) : void { - let key = sessionId + "/" + cmdId + "/" + size.cols; + setTUR(termContext : NormalTermContext, size : TermWinSize, usedRows : number) : void { + let key = termContext.sessionId + "/" + termContext.cmdId + "/" + size.cols; this.termUsedRowsCache[key] = usedRows; + GlobalCommandRunner.setTermUsedRows(termContext, usedRows); } contextScreen(e : any, screenId : string) { @@ -1753,7 +1760,7 @@ class Model { let term = sw.getTermWrap(cmdId); if (term != null) { term.setIsRunning(cmdStatusIsRunning(newStatus)); - term.updateUsedRows(true); + term.updateUsedRows(true, "cmd-status"); // setTimeout(() => term.updateUsedRows(true), 500); } } @@ -2354,12 +2361,14 @@ class CommandRunner { GlobalModel.submitCommand("sw", "set", null, kwargs, true); } - setLineHeight(lineArg : string, height : number) { + setTermUsedRows(termContext : NormalTermContext, height : number) { let kwargs : Record = {}; - kwargs["line"] = lineArg; - kwargs["height"] = String(height); + kwargs["session"] = termContext.sessionId; + kwargs["screen"] = termContext.screenId; + kwargs["window"] = termContext.windowId; kwargs["hohist"] = "1"; - GlobalModel.submitCommand("line", "setheight", null, kwargs, false); + let posargs = [String(termContext.lineNum), String(height)]; + GlobalModel.submitCommand("line", "setheight", posargs, kwargs, false); } swSetAnchor(sessionId : string, screenId : string, windowId : string, anchorVal : string) : void { diff --git a/src/term.ts b/src/term.ts index 08acc7de..b4785d2f 100644 --- a/src/term.ts +++ b/src/term.ts @@ -5,7 +5,7 @@ import {boundMethod} from "autobind-decorator"; import {v4 as uuidv4} from "uuid"; import {GlobalModel, widthToCols, GlobalCommandRunner} from "./model"; import {boundInt} from "./util"; -import type {TermOptsType, TermWinSize} from "./types"; +import type {TermOptsType, TermWinSize, NormalTermContext} from "./types"; type DataUpdate = { data : Uint8Array, @@ -20,7 +20,6 @@ type WindowSize = { const MinTermCols = 10; const MaxTermCols = 1024; -type NormalTermContext = {sessionId : string, screenId : string, windowId : string, cmdId : string, lineNum : number}; type RemoteTermContext = {remoteId : string}; type TermContext = NormalTermContext | RemoteTermContext; @@ -185,7 +184,7 @@ class TermWrap { return usedRows; } - updateUsedRows(forceFull : boolean) { + updateUsedRows(forceFull : boolean, reason : string) { if (this.terminal == null) { return; } @@ -211,20 +210,11 @@ class TermWrap { if (!forceFull && tur <= oldUsedRows) { return; } - this.usedRows.set(tur); - GlobalModel.setTUR(termContext.sessionId, termContext.cmdId, this.termSize, tur); - if (this.connectedElem) { - let resizeEvent = new CustomEvent("termresize", { - bubbles: true, - detail: { - cmdId: termContext.cmdId, - oldUsedRows: oldUsedRows, - newUsedRows: tur, - }, - }); - // console.log("resize-event", resizeEvent); - this.connectedElem.dispatchEvent(resizeEvent); + if (tur == oldUsedRows) { + return; } + this.usedRows.set(tur); + GlobalModel.setTUR(termContext, this.termSize, tur); })(); } @@ -243,7 +233,7 @@ class TermWrap { } this.termSize = newSize; this.terminal.resize(newSize.cols, newSize.rows); - this.updateUsedRows(true); + this.updateUsedRows(true, "resize"); } _getReloadUrl() : string { @@ -283,7 +273,9 @@ class TermWrap { this.updatePtyData(this.dataUpdates[i].pos, this.dataUpdates[i].data, "reload-update-" + i); } this.dataUpdates = []; - this.updateUsedRows(true); + this.terminal.write(new Uint8Array(), () => { + this.updateUsedRows(true, "reload"); + }); }, delayMs); }).catch((e) => { console.log("error reloading terminal", e); @@ -317,7 +309,7 @@ class TermWrap { } this.ptyPos += data.length; this.terminal.write(data, () => { - this.updateUsedRows(false); + this.updateUsedRows(false, "updatePtyData"); }); } diff --git a/src/types.ts b/src/types.ts index 06a4e974..58c93c90 100644 --- a/src/types.ts +++ b/src/types.ts @@ -333,4 +333,12 @@ type ContextMenuOpts = { type UpdateMessage = PtyDataUpdateType | ModelUpdateType; -export type {SessionDataType, LineType, RemoteType, RemoteStateType, RemoteInstanceType, WindowDataType, HistoryItem, CmdRemoteStateType, FeCmdPacketType, TermOptsType, CmdStartPacketType, CmdDataType, ScreenDataType, ScreenOptsType, ScreenWindowType, LayoutType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, RemotePtrType, UIContextType, HistoryInfoType, HistoryQueryOpts, WatchScreenPacketType, TermWinSize, FeInputPacketType, RemoteInputPacketType, RemoteEditType, FeStateType, ContextMenuOpts}; +type NormalTermContext = { + sessionId : string, + screenId : string, + windowId : string, + cmdId : string, + lineNum : number, +}; + +export type {SessionDataType, LineType, RemoteType, RemoteStateType, RemoteInstanceType, WindowDataType, HistoryItem, CmdRemoteStateType, FeCmdPacketType, TermOptsType, CmdStartPacketType, CmdDataType, ScreenDataType, ScreenOptsType, ScreenWindowType, LayoutType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, RemotePtrType, UIContextType, HistoryInfoType, HistoryQueryOpts, WatchScreenPacketType, TermWinSize, FeInputPacketType, RemoteInputPacketType, RemoteEditType, FeStateType, ContextMenuOpts, NormalTermContext};