github.com/kolbycrouch/elvish@v0.14.1-0.20210614162631-215b9ac1c423/pkg/cli/term/setup_windows.go (about) 1 package term 2 3 import ( 4 "os" 5 6 "golang.org/x/sys/windows" 7 "src.elv.sh/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_VIRTUAL_TERMINAL_PROCESSING 15 wantedGlobalOutMode = windows.ENABLE_PROCESSED_OUTPUT | 16 windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING 17 ) 18 19 func setup(in, out *os.File) (func() error, error) { 20 hIn := windows.Handle(in.Fd()) 21 hOut := windows.Handle(out.Fd()) 22 23 var oldInMode, oldOutMode uint32 24 err := windows.GetConsoleMode(hIn, &oldInMode) 25 if err != nil { 26 return nil, err 27 } 28 err = windows.GetConsoleMode(hOut, &oldOutMode) 29 if err != nil { 30 return nil, err 31 } 32 33 errSetIn := windows.SetConsoleMode(hIn, wantedInMode) 34 errSetOut := windows.SetConsoleMode(hOut, wantedOutMode) 35 errVT := setupVT(out) 36 37 return func() error { 38 return diag.Errors( 39 restoreVT(out), 40 windows.SetConsoleMode(hOut, oldOutMode), 41 windows.SetConsoleMode(hIn, oldInMode)) 42 }, diag.Errors(errSetIn, errSetOut, errVT) 43 } 44 45 func setupGlobal() func() { 46 hOut := windows.Handle(os.Stderr.Fd()) 47 var oldOutMode uint32 48 err := windows.GetConsoleMode(hOut, &oldOutMode) 49 if err != nil { 50 return func() {} 51 } 52 err = windows.SetConsoleMode(hOut, wantedGlobalOutMode) 53 if err != nil { 54 return func() {} 55 } 56 return func() { windows.SetConsoleMode(hOut, oldOutMode) } 57 } 58 59 func sanitize(in, out *os.File) {}