Skip to content

Commit 9733b18

Browse files
committed
refactor: dedupe termsize-to-pty winsize conversion
1 parent a633d88 commit 9733b18

4 files changed

Lines changed: 40 additions & 49 deletions

File tree

pkg/jobmanager/jobcmd.go

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"time"
1414

1515
"github.com/creack/pty"
16+
"github.com/wavetermdev/waveterm/pkg/util/ptyutil"
1617
"github.com/wavetermdev/waveterm/pkg/util/unixutil"
1718
"github.com/wavetermdev/waveterm/pkg/waveobj"
1819
"github.com/wavetermdev/waveterm/pkg/wshrpc"
@@ -41,27 +42,6 @@ type JobCmd struct {
4142
exitTs int64
4243
}
4344

44-
const maxUint16 = int(^uint16(0))
45-
46-
func toWinsizeDimension(v int) uint16 {
47-
if v <= 0 {
48-
return 0
49-
}
50-
if v > maxUint16 {
51-
return uint16(maxUint16)
52-
}
53-
return uint16(v)
54-
}
55-
56-
func winsizeFromTermSize(termSize waveobj.TermSize) *pty.Winsize {
57-
return &pty.Winsize{
58-
Rows: toWinsizeDimension(termSize.Rows),
59-
Cols: toWinsizeDimension(termSize.Cols),
60-
X: toWinsizeDimension(termSize.XPixel),
61-
Y: toWinsizeDimension(termSize.YPixel),
62-
}
63-
}
64-
6545
func MakeJobCmd(jobId string, cmdDef CmdDef) (*JobCmd, error) {
6646
jm := &JobCmd{
6747
jobId: jobId,
@@ -80,7 +60,7 @@ func MakeJobCmd(jobId string, cmdDef CmdDef) (*JobCmd, error) {
8060
ecmd.Env = append(ecmd.Env, fmt.Sprintf("%s=%s", key, val))
8161
}
8262
}
83-
cmdPty, err := pty.StartWithSize(ecmd, winsizeFromTermSize(cmdDef.TermSize))
63+
cmdPty, err := pty.StartWithSize(ecmd, ptyutil.WinsizeFromTermSize(cmdDef.TermSize))
8464
if err != nil {
8565
return nil, fmt.Errorf("failed to start command: %w", err)
8666
}
@@ -183,7 +163,7 @@ func (jm *JobCmd) setTermSize_withlock(termSize waveobj.TermSize) error {
183163
jm.termSize.YPixel == termSize.YPixel {
184164
return nil
185165
}
186-
err := pty.Setsize(jm.cmdPty, winsizeFromTermSize(termSize))
166+
err := pty.Setsize(jm.cmdPty, ptyutil.WinsizeFromTermSize(termSize))
187167
if err != nil {
188168
return fmt.Errorf("error setting terminal size: %w", err)
189169
}

pkg/shellexec/conninterface.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"github.com/creack/pty"
1616
"github.com/wavetermdev/waveterm/pkg/panichandler"
17+
"github.com/wavetermdev/waveterm/pkg/util/ptyutil"
1718
"github.com/wavetermdev/waveterm/pkg/util/unixutil"
1819
"github.com/wavetermdev/waveterm/pkg/waveobj"
1920
"github.com/wavetermdev/waveterm/pkg/wsl"
@@ -135,7 +136,7 @@ func (cw CmdWrap) StderrPipe() (io.ReadCloser, error) {
135136
}
136137

137138
func (cw CmdWrap) SetSize(termSize waveobj.TermSize) error {
138-
err := pty.Setsize(cw.Pty, winsizeFromTermSize(termSize))
139+
err := pty.Setsize(cw.Pty, ptyutil.WinsizeFromTermSize(termSize))
139140
if err != nil {
140141
return err
141142
}

pkg/shellexec/shellexec.go

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/wavetermdev/waveterm/pkg/panichandler"
2626
"github.com/wavetermdev/waveterm/pkg/remote/conncontroller"
2727
"github.com/wavetermdev/waveterm/pkg/util/pamparse"
28+
"github.com/wavetermdev/waveterm/pkg/util/ptyutil"
2829
"github.com/wavetermdev/waveterm/pkg/util/shellutil"
2930
"github.com/wavetermdev/waveterm/pkg/wavebase"
3031
"github.com/wavetermdev/waveterm/pkg/waveobj"
@@ -54,27 +55,6 @@ type ShellProc struct {
5455
WaitErr error // WaitErr is synchronized by DoneCh (written before DoneCh is closed) and CloseOnce
5556
}
5657

57-
const maxUint16 = int(^uint16(0))
58-
59-
func toWinsizeDimension(v int) uint16 {
60-
if v <= 0 {
61-
return 0
62-
}
63-
if v > maxUint16 {
64-
return uint16(maxUint16)
65-
}
66-
return uint16(v)
67-
}
68-
69-
func winsizeFromTermSize(termSize waveobj.TermSize) *pty.Winsize {
70-
return &pty.Winsize{
71-
Rows: toWinsizeDimension(termSize.Rows),
72-
Cols: toWinsizeDimension(termSize.Cols),
73-
X: toWinsizeDimension(termSize.XPixel),
74-
Y: toWinsizeDimension(termSize.YPixel),
75-
}
76-
}
77-
7858
func (sp *ShellProc) Close() {
7959
sp.Cmd.KillGraceful(DefaultGracefulKillWait)
8060
go func() {
@@ -186,7 +166,7 @@ func StartWslShellProcNoWsh(ctx context.Context, termSize waveobj.TermSize, cmdS
186166
if termSize.Rows <= 0 || termSize.Cols <= 0 {
187167
return nil, fmt.Errorf("invalid term size: %v", termSize)
188168
}
189-
cmdPty, err := pty.StartWithSize(ecmd, winsizeFromTermSize(termSize))
169+
cmdPty, err := pty.StartWithSize(ecmd, ptyutil.WinsizeFromTermSize(termSize))
190170
if err != nil {
191171
return nil, err
192172
}
@@ -304,7 +284,7 @@ func StartWslShellProc(ctx context.Context, termSize waveobj.TermSize, cmdStr st
304284
return nil, fmt.Errorf("invalid term size: %v", termSize)
305285
}
306286
shellutil.AddTokenSwapEntry(cmdOpts.SwapToken)
307-
cmdPty, err := pty.StartWithSize(ecmd, winsizeFromTermSize(termSize))
287+
cmdPty, err := pty.StartWithSize(ecmd, ptyutil.WinsizeFromTermSize(termSize))
308288
if err != nil {
309289
return nil, err
310290
}
@@ -705,7 +685,7 @@ func StartLocalShellProc(logCtx context.Context, termSize waveobj.TermSize, cmdS
705685
return nil, fmt.Errorf("invalid term size: %v", termSize)
706686
}
707687
shellutil.AddTokenSwapEntry(cmdOpts.SwapToken)
708-
cmdPty, err := pty.StartWithSize(ecmd, winsizeFromTermSize(termSize))
688+
cmdPty, err := pty.StartWithSize(ecmd, ptyutil.WinsizeFromTermSize(termSize))
709689
if err != nil {
710690
return nil, err
711691
}
@@ -723,7 +703,7 @@ func RunSimpleCmdInPty(ecmd *exec.Cmd, termSize waveobj.TermSize) ([]byte, error
723703
if termSize.Rows <= 0 || termSize.Cols <= 0 {
724704
return nil, fmt.Errorf("invalid term size: %v", termSize)
725705
}
726-
cmdPty, err := pty.StartWithSize(ecmd, winsizeFromTermSize(termSize))
706+
cmdPty, err := pty.StartWithSize(ecmd, ptyutil.WinsizeFromTermSize(termSize))
727707
if err != nil {
728708
cmdPty.Close()
729709
return nil, err

pkg/util/ptyutil/ptyutil.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright 2025, Command Line Inc.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package ptyutil
5+
6+
import (
7+
"github.com/creack/pty"
8+
"github.com/wavetermdev/waveterm/pkg/waveobj"
9+
)
10+
11+
const maxUint16 = int(^uint16(0))
12+
13+
func toWinsizeDimension(v int) uint16 {
14+
if v <= 0 {
15+
return 0
16+
}
17+
if v > maxUint16 {
18+
return uint16(maxUint16)
19+
}
20+
return uint16(v)
21+
}
22+
23+
func WinsizeFromTermSize(termSize waveobj.TermSize) *pty.Winsize {
24+
return &pty.Winsize{
25+
Rows: toWinsizeDimension(termSize.Rows),
26+
Cols: toWinsizeDimension(termSize.Cols),
27+
X: toWinsizeDimension(termSize.XPixel),
28+
Y: toWinsizeDimension(termSize.YPixel),
29+
}
30+
}

0 commit comments

Comments
 (0)