github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/pkg/bindings/containers/term_windows.go (about) 1 package containers 2 3 import ( 4 "context" 5 "os" 6 "time" 7 8 sig "github.com/hanks177/podman/v4/pkg/signal" 9 "golang.org/x/sys/windows" 10 "golang.org/x/term" 11 ) 12 13 func makeRawTerm(stdin *os.File) (*term.State, error) { 14 state, err := term.MakeRaw(int(stdin.Fd())) 15 if err != nil { 16 return nil, err 17 } 18 19 // Attempt VT if supported (recent versions of Windows 10+) 20 var raw uint32 21 handle := windows.Handle(stdin.Fd()) 22 if err := windows.GetConsoleMode(handle, &raw); err != nil { 23 return nil, err 24 } 25 26 tryVT := raw | windows.ENABLE_VIRTUAL_TERMINAL_INPUT 27 28 if err := windows.SetConsoleMode(handle, tryVT); err != nil { 29 if err := windows.SetConsoleMode(handle, raw); err != nil { 30 return nil, err 31 } 32 } 33 34 return state, nil 35 } 36 37 func notifyWinChange(ctx context.Context, winChange chan os.Signal, stdin *os.File, stdout *os.File) { 38 // Simulate WINCH with polling 39 go func() { 40 var lastW int 41 var lastH int 42 43 d := time.Millisecond * 250 44 timer := time.NewTimer(d) 45 defer timer.Stop() 46 for ; ; timer.Reset(d) { 47 select { 48 case <-ctx.Done(): 49 return 50 case <-timer.C: 51 break 52 } 53 54 w, h, err := term.GetSize(int(stdout.Fd())) 55 if err != nil { 56 continue 57 } 58 if w != lastW || h != lastH { 59 winChange <- sig.SIGWINCH 60 lastW, lastH = w, h 61 } 62 } 63 }() 64 65 } 66 67 func getTermSize(stdin *os.File, stdout *os.File) (width, height int, err error) { 68 return term.GetSize(int(stdout.Fd())) 69 }