From c0b3db19d4ec06af3aac2d88f168744f46693e78 Mon Sep 17 00:00:00 2001 From: sawka Date: Thu, 20 Oct 2022 16:15:21 -0700 Subject: [PATCH] cleanups for terminal interaction --- src/main.tsx | 5 ++--- src/model.ts | 34 ++++++++++++++++++++++++++++------ src/sh2.less | 4 ++++ src/types.ts | 1 + 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/main.tsx b/src/main.tsx index 80f4b199..b194d99a 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -186,11 +186,10 @@ class Prompt extends React.Component<{rptr : RemotePtrType, rstate : RemoteState } @mobxReact.observer -class LineCmd extends React.Component<{sw : ScreenWindow, line : LineType, width : number, staticRender: boolean, visible : OV, onHeightChange : HeightChangeCallbackType}, {}> { +class LineCmd extends React.Component<{sw : ScreenWindow, line : LineType, width : number, staticRender : boolean, visible : OV, onHeightChange : HeightChangeCallbackType}, {}> { termLoaded : mobx.IObservableValue = mobx.observable.box(false); lineRef : React.RefObject = React.createRef(); - constructor(props) { super(props); } @@ -367,7 +366,7 @@ class LineCmd extends React.Component<{sw : ScreenWindow, line : LineType, width -
+
diff --git a/src/model.ts b/src/model.ts index bf6aaa00..79816a5f 100644 --- a/src/model.ts +++ b/src/model.ts @@ -40,6 +40,10 @@ function cmdStatusIsRunning(status : string) : boolean { return status == "running" || status == "detached"; } +function keyHasNoMods(e : any) { + return !e.shiftKey && !e.ctrlKey && !e.metaKey && !e.altKey; +} + type OV = mobx.IObservableValue; type OArr = mobx.IObservableArray; type OMap = mobx.ObservableMap; @@ -480,12 +484,29 @@ class ScreenWindow { } } - termCustomKeyHandler(e : any, termWrap : TermWrap) : boolean { - if (e.type != "keydown" || isModKeyPress(e)) { - return termWrap.isRunning; + isTermCapturedKey(e : any) : boolean { + let keys = ["ArrowUp", "ArrowDown", "PageUp", "PageDown"]; + if (keys.includes(e.code) && keyHasNoMods(e)) { + return true; } + return false; + } + + termCustomKeyHandler(e : any, termWrap : TermWrap) : boolean { + if (termWrap.isRunning) { + return true; + } + let isCaptured = this.isTermCapturedKey(e); + if (!isCaptured) { + return true; + } + if (e.type != "keydown" || isModKeyPress(e)) { + return false; + } + e.stopPropagation(); + e.preventDefault(); this.termCustomKeyHandlerInternal(e, termWrap); - return termWrap.isRunning; + return false; } connectElem(elem : Element, line : LineType, cmd : Cmd, width : number) { @@ -1926,8 +1947,9 @@ class Model { metacmd: "eval", args: [cmdStr], kwargs: null, - uicontext : this.getUIContext(), - interactive : interactive, + uicontext: this.getUIContext(), + interactive: interactive, + rawstr: cmdStr, }; if (!addToHistory) { pk.kwargs["nohist"] = "1"; diff --git a/src/sh2.less b/src/sh2.less index 03eec8db..8aa4d793 100644 --- a/src/sh2.less +++ b/src/sh2.less @@ -430,6 +430,10 @@ html, body, #main { .terminal { margin-right: 8px; /* needed to show scrollbar */ } + + &.cmd-done .terminal .xterm-cursor { + display: none; + } } } diff --git a/src/types.ts b/src/types.ts index 59b00a6d..076c929f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -178,6 +178,7 @@ type FeCmdPacketType = { metasubcmd? : string, args : string[], kwargs : Record; + rawstr? : string, uicontext : UIContextType, interactive : boolean, };