3
3
package xterminal
4
4
5
5
import (
6
- "context"
7
- "time"
8
-
9
- "golang.org/x/crypto/ssh/terminal"
10
6
"golang.org/x/sys/windows"
11
7
)
12
8
@@ -36,16 +32,6 @@ func makeRaw(handle windows.Handle, input bool) (uint32, error) {
36
32
return prevState , nil
37
33
}
38
34
39
- // MakeRaw sets an input terminal to raw and enables VT100 processing.
40
- func MakeRaw (handle uintptr ) (* State , error ) {
41
- prevState , err := makeRaw (windows .Handle (handle ), true )
42
- if err != nil {
43
- return nil , err
44
- }
45
-
46
- return & State {mode : prevState }, nil
47
- }
48
-
49
35
// MakeOutputRaw sets an output terminal to raw and enables VT100 processing.
50
36
func MakeOutputRaw (handle uintptr ) (* State , error ) {
51
37
prevState , err := makeRaw (windows .Handle (handle ), false )
@@ -60,71 +46,3 @@ func MakeOutputRaw(handle uintptr) (*State, error) {
60
46
func Restore (handle uintptr , state * State ) error {
61
47
return windows .SetConsoleMode (windows .Handle (handle ), state .mode )
62
48
}
63
-
64
- // ColorEnabled returns true if VT100 processing is enabled on the output
65
- // console.
66
- func ColorEnabled (handle uintptr ) (bool , error ) {
67
- var state uint32
68
- if err := windows .GetConsoleMode (windows .Handle (handle ), & state ); err != nil {
69
- return false , err
70
- }
71
-
72
- return state & windows .ENABLE_VIRTUAL_TERMINAL_PROCESSING != 0 , nil
73
- }
74
-
75
- // ResizeEvent represent the new size of the terminal.
76
- type ResizeEvent struct {
77
- Height uint16
78
- Width uint16
79
- }
80
-
81
- func (s ResizeEvent ) equal (s2 * ResizeEvent ) bool {
82
- if s2 == nil {
83
- return false
84
- }
85
- return s .Height == s2 .Height && s .Width == s2 .Width
86
- }
87
-
88
- // ResizeEvents sends terminal resize events when the dimensions change.
89
- // Windows does not have a unix.SIGWINCH equivalent, so we poll the terminal size
90
- // at a fixed interval
91
- func ResizeEvents (ctx context.Context , termFD uintptr ) chan ResizeEvent {
92
- // Use a buffered chan to avoid blocking if the main is not ready yet when we send the initial resize event.
93
- events := make (chan ResizeEvent , 1 )
94
-
95
- go func () {
96
- defer close (events )
97
-
98
- // On windows, as we don't have a signal to know the size changed, we
99
- // use a ticker and emit then event if the current size differs from last time we checked.
100
- ticker := time .NewTicker (100 * time .Millisecond )
101
- defer ticker .Stop ()
102
-
103
- var lastEvent * ResizeEvent
104
- for {
105
- select {
106
- case <- ctx .Done ():
107
- return
108
- case <- ticker .C :
109
- width , height , err := terminal .GetSize (int (windows .Handle (termFD )))
110
- if err != nil {
111
- return
112
- }
113
- event := ResizeEvent {
114
- Height : uint16 (height ),
115
- Width : uint16 (width ),
116
- }
117
- if ! event .equal (lastEvent ) {
118
- select {
119
- case <- ctx .Done ():
120
- return
121
- case events <- event :
122
- }
123
- }
124
- lastEvent = & event
125
- }
126
- }
127
- }()
128
-
129
- return events
130
- }
0 commit comments