github.com/markusbkk/elvish@v0.0.0-20231204143114-91dc52438621/pkg/cli/term/setup_windows.go (about) 1 package term 2 3 import ( 4 "os" 5 6 "golang.org/x/sys/windows" 7 "github.com/markusbkk/elvish/pkg/diag" 8 ) 9 10 const ( 11 wantedInMode = windows.ENABLE_WINDOW_INPUT | 12 windows.ENABLE_MOUSE_INPUT | windows.ENABLE_PROCESSED_INPUT 13 wantedOutMode = windows.ENABLE_PROCESSED_OUTPUT | 14 windows.ENABLE_WRAP_AT_EOL_OUTPUT | 15 windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING 16 wantedGlobalOutMode = windows.ENABLE_PROCESSED_OUTPUT | 17 windows.ENABLE_WRAP_AT_EOL_OUTPUT | 18 windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING 19 ) 20 21 func setup(in, out *os.File) (func() error, error) { 22 hIn := windows.Handle(in.Fd()) 23 hOut := windows.Handle(out.Fd()) 24 25 var oldInMode, oldOutMode uint32 26 err := windows.GetConsoleMode(hIn, &oldInMode) 27 if err != nil { 28 return nil, err 29 } 30 err = windows.GetConsoleMode(hOut, &oldOutMode) 31 if err != nil { 32 return nil, err 33 } 34 35 errSetIn := windows.SetConsoleMode(hIn, wantedInMode) 36 errSetOut := windows.SetConsoleMode(hOut, wantedOutMode) 37 errVT := setupVT(out) 38 39 return func() error { 40 return diag.Errors( 41 restoreVT(out), 42 windows.SetConsoleMode(hOut, oldOutMode), 43 windows.SetConsoleMode(hIn, oldInMode)) 44 }, diag.Errors(errSetIn, errSetOut, errVT) 45 } 46 47 func setupGlobal() func() { 48 hOut := windows.Handle(os.Stderr.Fd()) 49 var oldOutMode uint32 50 err := windows.GetConsoleMode(hOut, &oldOutMode) 51 if err != nil { 52 return func() {} 53 } 54 err = windows.SetConsoleMode(hOut, wantedGlobalOutMode) 55 if err != nil { 56 return func() {} 57 } 58 return func() { windows.SetConsoleMode(hOut, oldOutMode) } 59 } 60 61 func sanitize(in, out *os.File) {}