implement screen:set name

This commit is contained in:
sawka
2022-08-26 17:51:28 -07:00
parent 9b6d4e928d
commit 1997b9ea44
3 changed files with 60 additions and 11 deletions
+37 -9
View File
@@ -56,6 +56,7 @@ func init() {
registerCmdFn("screen:close", ScreenCloseCommand)
registerCmdFn("screen:open", ScreenOpenCommand)
registerCmdAlias("screen:new", ScreenOpenCommand)
registerCmdFn("screen:set", ScreenSetCommand)
registerCmdAlias("remote", RemoteCommand)
registerCmdFn("remote:show", RemoteShowCommand)
@@ -232,6 +233,40 @@ func ScreenOpenCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (s
return update, nil
}
func ScreenSetCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) {
ids, err := resolveIds(ctx, pk, R_Session|R_Screen)
if err != nil {
return nil, err
}
var varsUpdated []string
if pk.Kwargs["name"] != "" {
newName := pk.Kwargs["name"]
err = validateName(newName, "screen")
if err != nil {
return nil, err
}
err = sstore.SetScreenName(ctx, ids.SessionId, ids.ScreenId, newName)
if err != nil {
return nil, fmt.Errorf("setting screen name: %v", err)
}
varsUpdated = append(varsUpdated, "name")
}
if len(varsUpdated) == 0 {
return nil, fmt.Errorf("/screen:set no updates, can set %s", formatStrs([]string{"name", "pos"}, "or", false))
}
screenObj, err := sstore.GetScreenById(ctx, ids.SessionId, ids.ScreenId)
if err != nil {
return nil, err
}
update, session := sstore.MakeSingleSessionUpdate(ids.SessionId)
session.Screens = append(session.Screens, screenObj)
update.Info = &sstore.InfoMsgType{
InfoMsg: fmt.Sprintf("screen updated %s", formatStrs(varsUpdated, "and", false)),
TimeoutMs: 2000,
}
return update, nil
}
func ScreenCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) {
ids, err := resolveIds(ctx, pk, R_Session)
if err != nil {
@@ -765,13 +800,6 @@ func SessionSetCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (s
if err != nil {
return nil, err
}
bareSession, err := sstore.GetBareSessionById(ctx, ids.SessionId)
if err != nil {
return nil, err
}
if bareSession == nil {
return nil, fmt.Errorf("session '%s' not found", ids.SessionId)
}
var varsUpdated []string
if pk.Kwargs["name"] != "" {
newName := pk.Kwargs["name"]
@@ -791,11 +819,11 @@ func SessionSetCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (s
if len(varsUpdated) == 0 {
return nil, fmt.Errorf("/session:set no updates, can set %s", formatStrs([]string{"name", "pos"}, "or", false))
}
bareSession, err = sstore.GetBareSessionById(ctx, ids.SessionId)
bareSession, err := sstore.GetBareSessionById(ctx, ids.SessionId)
update := sstore.ModelUpdate{
Sessions: []*sstore.SessionType{bareSession},
Info: &sstore.InfoMsgType{
InfoMsg: fmt.Sprintf("[%s]: session updated %s", bareSession.Name, formatStrs(varsUpdated, "and", false)),
InfoMsg: fmt.Sprintf("session updated %s", formatStrs(varsUpdated, "and", false)),
TimeoutMs: 2000,
},
}
+22 -1
View File
@@ -726,7 +726,7 @@ func SetSessionName(ctx context.Context, sessionId string, name string) error {
if dupSessionId == sessionId {
return nil
}
if tx.Exists(query, name) {
if dupSessionId != "" {
return fmt.Errorf("invalid duplicate session name '%s'", name)
}
query = `UPDATE session SET name = ? WHERE sessionid = ?`
@@ -735,3 +735,24 @@ func SetSessionName(ctx context.Context, sessionId string, name string) error {
})
return txErr
}
func SetScreenName(ctx context.Context, sessionId string, screenId string, name string) error {
txErr := WithTx(ctx, func(tx *TxWrap) error {
query := `SELECT screenid FROM screen WHERE sessionid = ? AND screenid = ?`
if !tx.Exists(query, sessionId, screenId) {
return fmt.Errorf("screen does not exist")
}
query = `SELECT screenid FROM screen WHERE sessionid = ? AND name = ?`
dupScreenId := tx.GetString(query, sessionId, name)
if dupScreenId == screenId {
return nil
}
if dupScreenId != "" {
return fmt.Errorf("invalid duplicate screen name '%s'", name)
}
query = `UPDATE screen SET name = ? WHERE sessionid = ? AND screenid = ?`
tx.ExecWrap(query, name, sessionId, screenId)
return nil
})
return txErr
}
+1 -1
View File
@@ -224,7 +224,7 @@ type ScreenType struct {
ScreenIdx int64 `json:"screenidx"`
Name string `json:"name"`
ActiveWindowId string `json:"activewindowid"`
ScreenOpts ScreenOptsType `json:"screenopts"`
ScreenOpts *ScreenOptsType `json:"screenopts"`
OwnerId string `json:"ownerid"`
ShareMode string `json:"sharemode"`
Windows []*ScreenWindowType `json:"windows"`