github.com/kolbycrouch/elvish@v0.14.1-0.20210614162631-215b9ac1c423/cmd/examples/win_tty/main_windows.go (about) 1 package main 2 3 import ( 4 "log" 5 "os" 6 7 "golang.org/x/sys/windows" 8 "src.elv.sh/pkg/sys" 9 ) 10 11 func main() { 12 restore := setup(os.Stdin, os.Stdout) 13 defer restore() 14 15 log.Println("ready") 16 console, err := windows.GetStdHandle(windows.STD_INPUT_HANDLE) 17 if err != nil { 18 log.Fatalf("GetStdHandle(STD_INPUT_HANDLE): %v", err) 19 } 20 for { 21 event, err := sys.ReadInputEvent(console) 22 if err != nil { 23 log.Fatal(err) 24 } 25 log.Printf("input: %#v", event) 26 } 27 } 28 29 const ( 30 wantedInMode = windows.ENABLE_WINDOW_INPUT | 31 windows.ENABLE_MOUSE_INPUT | windows.ENABLE_PROCESSED_INPUT 32 wantedOutMode = windows.ENABLE_PROCESSED_OUTPUT | 33 windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING 34 ) 35 36 func setup(in, out *os.File) func() { 37 hIn := windows.Handle(in.Fd()) 38 hOut := windows.Handle(out.Fd()) 39 40 var oldInMode, oldOutMode uint32 41 err := windows.GetConsoleMode(hIn, &oldInMode) 42 if err != nil { 43 log.Fatal(err) 44 } 45 err = windows.GetConsoleMode(hOut, &oldOutMode) 46 if err != nil { 47 log.Fatal(err) 48 } 49 50 err = windows.SetConsoleMode(hIn, wantedInMode) 51 if err != nil { 52 log.Fatal(err) 53 } 54 err = windows.SetConsoleMode(hOut, wantedOutMode) 55 if err != nil { 56 log.Fatal(err) 57 } 58 59 return func() { 60 err := windows.SetConsoleMode(hIn, oldInMode) 61 if err != nil { 62 log.Fatal(err) 63 } 64 err = windows.SetConsoleMode(hOut, oldOutMode) 65 if err != nil { 66 log.Fatal(err) 67 } 68 } 69 }