@@ -17,6 +17,7 @@ import (
17
17
"go.coder.com/flog"
18
18
19
19
"cdr.dev/coder-cli/internal/activity"
20
+ "cdr.dev/coder-cli/internal/xterminal"
20
21
"cdr.dev/wsep"
21
22
)
22
23
@@ -31,19 +32,6 @@ func (cmd *shellCmd) Spec() cli.CommandSpec {
31
32
}
32
33
}
33
34
34
- func enableTerminal (fd int ) (restore func (), err error ) {
35
- state , err := terminal .MakeRaw (fd )
36
- if err != nil {
37
- return restore , xerrors .Errorf ("make raw term: %w" , err )
38
- }
39
- return func () {
40
- err := terminal .Restore (fd , state )
41
- if err != nil {
42
- flog .Error ("restore term state: %v" , err )
43
- }
44
- }, nil
45
- }
46
-
47
35
type resizeEvent struct {
48
36
height , width uint16
49
37
}
@@ -55,25 +43,6 @@ func (s resizeEvent) equal(s2 *resizeEvent) bool {
55
43
return s .height == s2 .height && s .width == s2 .width
56
44
}
57
45
58
- func sendResizeEvents (ctx context.Context , termfd int , process wsep.Process ) {
59
- events := resizeEvents (ctx , termfd )
60
-
61
- // Limit the frequency of resizes to prevent a stuttering effect.
62
- resizeLimiter := rate .NewLimiter (rate .Every (time .Millisecond * 100 ), 1 )
63
- for {
64
- select {
65
- case newsize := <- events :
66
- err := process .Resize (ctx , newsize .height , newsize .width )
67
- if err != nil {
68
- return
69
- }
70
- _ = resizeLimiter .Wait (ctx )
71
- case <- ctx .Done ():
72
- return
73
- }
74
- }
75
- }
76
-
77
46
func (cmd * shellCmd ) Run (fl * pflag.FlagSet ) {
78
47
if len (fl .Args ()) < 1 {
79
48
exitUsage (fl )
@@ -101,21 +70,45 @@ func (cmd *shellCmd) Run(fl *pflag.FlagSet) {
101
70
}
102
71
}
103
72
73
+ func sendResizeEvents (ctx context.Context , termfd uintptr , process wsep.Process ) {
74
+ events := resizeEvents (ctx , termfd )
75
+
76
+ // Limit the frequency of resizes to prevent a stuttering effect.
77
+ resizeLimiter := rate .NewLimiter (rate .Every (time .Millisecond * 100 ), 1 )
78
+ for {
79
+ select {
80
+ case newsize := <- events :
81
+ err := process .Resize (ctx , newsize .height , newsize .width )
82
+ if err != nil {
83
+ return
84
+ }
85
+ _ = resizeLimiter .Wait (ctx )
86
+ case <- ctx .Done ():
87
+ return
88
+ }
89
+ }
90
+ }
91
+
104
92
func runCommand (ctx context.Context , envName string , command string , args []string ) error {
105
93
var (
106
94
entClient = requireAuth ()
107
95
env = findEnv (entClient , envName )
108
96
)
109
97
110
- termfd := int ( os .Stdin .Fd () )
98
+ termfd := os .Stdin .Fd ()
111
99
112
- tty := terminal .IsTerminal (termfd )
100
+ tty := terminal .IsTerminal (int ( termfd ) )
113
101
if tty {
114
- restore , err := enableTerminal (termfd )
102
+ state , err := xterminal . MakeRaw (termfd )
115
103
if err != nil {
116
104
return err
117
105
}
118
- defer restore ()
106
+ defer func () {
107
+ err := xterminal .Restore (termfd , state )
108
+ if err != nil {
109
+ flog .Error ("restore term state: %v" , err )
110
+ }
111
+ }()
119
112
}
120
113
121
114
ctx , cancel := context .WithCancel (ctx )
0 commit comments