simplify screen focus types (remove cmd-fg). send all screen focus updates. fix display issue with rtnstate (prompt vars)

This commit is contained in:
sawka
2023-04-13 12:53:15 -07:00
parent 1ac1051205
commit 398be03324
6 changed files with 68 additions and 24 deletions
+3 -3
View File
@@ -671,8 +671,8 @@ func ScreenSetCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (ss
}
if pk.Kwargs["focus"] != "" {
focusVal := pk.Kwargs["focus"]
if focusVal != sstore.ScreenFocusInput && focusVal != sstore.ScreenFocusCmd && focusVal != sstore.ScreenFocusCmdFg {
return nil, fmt.Errorf("/screen:set invalid focus argument %q, must be %s", focusVal, formatStrs([]string{sstore.ScreenFocusInput, sstore.ScreenFocusCmd, sstore.ScreenFocusCmdFg}, "or", false))
if focusVal != sstore.ScreenFocusInput && focusVal != sstore.ScreenFocusCmd {
return nil, fmt.Errorf("/screen:set invalid focus argument %q, must be %s", focusVal, formatStrs([]string{sstore.ScreenFocusInput, sstore.ScreenFocusCmd}, "or", false))
}
varsUpdated = append(varsUpdated, "focus")
updateMap[sstore.ScreenField_Focus] = focusVal
@@ -1367,7 +1367,7 @@ func addLineForCmd(ctx context.Context, metaCmd string, shouldFocus bool, ids re
updateMap := make(map[string]interface{})
updateMap[sstore.ScreenField_SelectedLine] = rtnLine.LineNum
if shouldFocus {
updateMap[sstore.ScreenField_Focus] = sstore.ScreenFocusCmdFg
updateMap[sstore.ScreenField_Focus] = sstore.ScreenFocusCmd
}
screen, err = sstore.UpdateScreen(ctx, ids.ScreenId, updateMap)
if err != nil {
+23 -7
View File
@@ -1106,7 +1106,6 @@ func (msh *MShellProc) ReInit(ctx context.Context) (*packet.InitPacketType, erro
msh.StateMap[hval] = initPk.State
})
msh.updateRemoteStateVars(ctx, msh.RemoteId, initPk)
return initPk, nil
}
@@ -1144,6 +1143,7 @@ func stripScVarsFromStateDiff(stateDiff *packet.ShellStateDiff) *packet.ShellSta
var mapDiff statediff.MapDiffType
err := mapDiff.Decode(stateDiff.VarsDiff)
if err != nil {
log.Printf("error decoding statediff in stripScVarsFromStateDiff: %v\n", err)
return stateDiff
}
delete(mapDiff.ToAdd, "PROMPT")
@@ -1645,9 +1645,9 @@ func (msh *MShellProc) handleCmdDonePacket(donePk *packet.CmdDonePacketType) {
msh.WriteToPtyBuffer("*error updating cmddone: %v\n", err)
return
}
screen, err := sstore.UpdateScreenWithCmdFg(context.Background(), donePk.CK.GetGroupId(), donePk.CK.GetCmdId())
screen, err := sstore.UpdateScreenFocusForDoneCmd(context.Background(), donePk.CK.GetGroupId(), donePk.CK.GetCmdId())
if err != nil {
msh.WriteToPtyBuffer("*error trying to update cmd-fg screens: %v\n", err)
msh.WriteToPtyBuffer("*error trying to update screen focus type: %v\n", err)
// fall-through (nothing to do)
}
if screen != nil {
@@ -1692,7 +1692,7 @@ func (msh *MShellProc) handleCmdDonePacket(donePk *packet.CmdDonePacketType) {
// fall-through (nothing to do)
}
}
sstore.MainBus.SendScreenUpdate(donePk.CK.GetGroupId(), update)
sstore.MainBus.SendUpdate(update)
return
}
@@ -1707,7 +1707,11 @@ func (msh *MShellProc) handleCmdFinalPacket(finalPk *packet.CmdFinalPacketType)
return
}
log.Printf("finalpk %s (hangup): %s\n", finalPk.CK, finalPk.Error)
sstore.HangupCmd(context.Background(), finalPk.CK)
screen, err := sstore.HangupCmd(context.Background(), finalPk.CK)
if err != nil {
log.Printf("error in hangup-cmd in handleCmdFinalPacket: %v\n", err)
return
}
rtnCmd, err = sstore.GetCmdByScreenId(context.Background(), finalPk.CK.GetGroupId(), finalPk.CK.GetCmdId())
if err != nil {
log.Printf("error getting cmd(2) in handleCmdFinalPacket: %v\n", err)
@@ -1718,7 +1722,10 @@ func (msh *MShellProc) handleCmdFinalPacket(finalPk *packet.CmdFinalPacketType)
return
}
update := &sstore.ModelUpdate{Cmd: rtnCmd}
sstore.MainBus.SendScreenUpdate(finalPk.CK.GetGroupId(), update)
if screen != nil {
update.Screens = []*sstore.ScreenType{screen}
}
sstore.MainBus.SendUpdate(update)
}
// TODO notify FE about cmd errors
@@ -1777,17 +1784,26 @@ func (msh *MShellProc) makeHandleCmdFinalPacketClosure(finalPk *packet.CmdFinalP
}
}
func sendScreenUpdates(screens []*sstore.ScreenType) {
for _, screen := range screens {
sstore.MainBus.SendUpdate(&sstore.ModelUpdate{Screens: []*sstore.ScreenType{screen}})
}
}
func (msh *MShellProc) ProcessPackets() {
defer msh.WithLock(func() {
if msh.Status == StatusConnected {
msh.Status = StatusDisconnected
}
err := sstore.HangupRunningCmdsByRemoteId(context.Background(), msh.Remote.RemoteId)
screens, err := sstore.HangupRunningCmdsByRemoteId(context.Background(), msh.Remote.RemoteId)
if err != nil {
msh.writeToPtyBuffer_nolock("error calling HUP on cmds %v\n", err)
}
msh.notifyHangups_nolock()
go msh.NotifyRemoteUpdate()
if len(screens) > 0 {
go sendScreenUpdates(screens)
}
})
dataPosMap := make(map[base.CommandKey]int64)
for pk := range msh.ServerProc.Output.MainCh {
+8
View File
@@ -102,6 +102,8 @@ func ParseFuncs(funcs string) (map[string]string, error) {
const MaxDiffKeyLen = 40
const MaxDiffValLen = 50
var IgnoreVars = map[string]bool{"PROMPT": true, "PROMPT_VERSION": true, "MSHELL": true}
func displayStateUpdateDiff(buf *bytes.Buffer, oldState packet.ShellState, newState packet.ShellState) {
if newState.Cwd != oldState.Cwd {
buf.WriteString(fmt.Sprintf("cwd %s\n", newState.Cwd))
@@ -110,6 +112,9 @@ func displayStateUpdateDiff(buf *bytes.Buffer, oldState packet.ShellState, newSt
newEnvMap := shexec.DeclMapFromState(&newState)
oldEnvMap := shexec.DeclMapFromState(&oldState)
for key, newVal := range newEnvMap {
if IgnoreVars[key] {
continue
}
oldVal, found := oldEnvMap[key]
if !found || !shexec.DeclsEqual(false, oldVal, newVal) {
var exportStr string
@@ -120,6 +125,9 @@ func displayStateUpdateDiff(buf *bytes.Buffer, oldState packet.ShellState, newSt
}
}
for key, _ := range oldEnvMap {
if IgnoreVars[key] {
continue
}
_, found := newEnvMap[key]
if !found {
buf.WriteString(fmt.Sprintf("unset %s\n", utilfn.EllipsisStr(key, MaxDiffKeyLen)))
+33 -12
View File
@@ -940,32 +940,52 @@ func HangupAllRunningCmds(ctx context.Context) error {
query = `UPDATE cmd SET status = ? WHERE status = ?`
tx.Exec(query, CmdStatusHangup, CmdStatusRunning)
for _, cmdPtr := range cmdPtrs {
insertScreenCmdUpdate(tx, cmdPtr.ScreenId, cmdPtr.CmdId, UpdateType_CmdStatus)
if isWebShare(tx, cmdPtr.ScreenId) {
insertScreenCmdUpdate(tx, cmdPtr.ScreenId, cmdPtr.CmdId, UpdateType_CmdStatus)
}
}
return nil
})
}
func HangupRunningCmdsByRemoteId(ctx context.Context, remoteId string) error {
return WithTx(ctx, func(tx *TxWrap) error {
// TODO send update
func HangupRunningCmdsByRemoteId(ctx context.Context, remoteId string) ([]*ScreenType, error) {
return WithTxRtn(ctx, func(tx *TxWrap) ([]*ScreenType, error) {
var cmdPtrs []CmdPtr
query := `SELECT screenid, cmdid FROM cmd WHERE status = ? AND remoteid = ?`
tx.Select(&cmdPtrs, query, CmdStatusRunning, remoteId)
query = `UPDATE cmd SET status = ? WHERE status = ? AND remoteid = ?`
tx.Exec(query, CmdStatusHangup, CmdStatusRunning, remoteId)
var rtn []*ScreenType
for _, cmdPtr := range cmdPtrs {
insertScreenCmdUpdate(tx, cmdPtr.ScreenId, cmdPtr.CmdId, UpdateType_CmdStatus)
if isWebShare(tx, cmdPtr.ScreenId) {
insertScreenCmdUpdate(tx, cmdPtr.ScreenId, cmdPtr.CmdId, UpdateType_CmdStatus)
}
screen, err := UpdateScreenFocusForDoneCmd(tx.Context(), cmdPtr.ScreenId, cmdPtr.CmdId)
if err != nil {
return nil, err
}
if screen != nil {
rtn = append(rtn, screen)
}
}
return nil
return rtn, nil
})
}
func HangupCmd(ctx context.Context, ck base.CommandKey) error {
return WithTx(ctx, func(tx *TxWrap) error {
// TODO send update
func HangupCmd(ctx context.Context, ck base.CommandKey) (*ScreenType, error) {
return WithTxRtn(ctx, func(tx *TxWrap) (*ScreenType, error) {
query := `UPDATE cmd SET status = ? WHERE screenid = ? AND cmdid = ?`
tx.Exec(query, CmdStatusHangup, ck.GetGroupId(), ck.GetCmdId())
insertScreenCmdUpdate(tx, ck.GetGroupId(), ck.GetCmdId(), UpdateType_CmdStatus)
return nil
if isWebShare(tx, ck.GetGroupId()) {
insertScreenCmdUpdate(tx, ck.GetGroupId(), ck.GetCmdId(), UpdateType_CmdStatus)
}
screen, err := UpdateScreenFocusForDoneCmd(tx.Context(), ck.GetGroupId(), ck.GetCmdId())
if err != nil {
return nil, err
}
return screen, nil
})
}
@@ -1777,14 +1797,14 @@ func GetLineResolveItems(ctx context.Context, screenId string) ([]ResolveItem, e
return rtn, nil
}
func UpdateScreenWithCmdFg(ctx context.Context, screenId string, cmdId string) (*ScreenType, error) {
func UpdateScreenFocusForDoneCmd(ctx context.Context, screenId string, cmdId string) (*ScreenType, error) {
return WithTxRtn(ctx, func(tx *TxWrap) (*ScreenType, error) {
query := `SELECT screenid
FROM screen s
WHERE s.screenid = ? AND s.focustype = 'cmd-fg'
WHERE s.screenid = ? AND s.focustype = ?
AND s.selectedline IN (SELECT linenum FROM line l WHERE l.screenid = s.screenid AND l.cmdid = ?)
`
if !tx.Exists(query, screenId, cmdId) {
if !tx.Exists(query, screenId, ScreenFocusCmd, cmdId) {
return nil, nil
}
editMap := make(map[string]interface{})
@@ -1803,6 +1823,7 @@ func StoreStateBase(ctx context.Context, state *packet.ShellState) error {
Ts: time.Now().UnixMilli(),
}
stateBase.BaseHash, stateBase.Data = state.EncodeAndHash()
// envMap := shexec.DeclMapFromState(state)
txErr := WithTx(ctx, func(tx *TxWrap) error {
query := `SELECT basehash FROM state_base WHERE basehash = ?`
if tx.Exists(query, stateBase.BaseHash) {
+1 -1
View File
@@ -173,6 +173,6 @@ func DeleteScreenDir(ctx context.Context, screenId string) error {
if err != nil {
return fmt.Errorf("error getting screendir: %w", err)
}
fmt.Printf("remove-all %s\n", screenDir)
log.Printf("remove-all %s\n", screenDir)
return os.RemoveAll(screenDir)
}
-1
View File
@@ -82,7 +82,6 @@ const (
const (
ScreenFocusInput = "input"
ScreenFocusCmd = "cmd"
ScreenFocusCmdFg = "cmd-fg"
)
const (