github.com/josephvusich/fdf@v0.0.0-20230522095411-9326dd32e33f/terminal_windows.go (about) 1 // +build windows 2 3 package main 4 5 import ( 6 "fmt" 7 "os" 8 9 "golang.org/x/sys/windows" 10 "golang.org/x/term" 11 ) 12 13 func terminalANSI(enabled bool) (previous bool, err error) { 14 handle := windows.Handle(os.Stdout.Fd()) 15 var mode uint32 16 if err := windows.GetConsoleMode(handle, &mode); err != nil { 17 return false, fmt.Errorf("unable to get console mode: %w", err) 18 } 19 20 previous = mode&windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING != 0 21 if previous == enabled { 22 return previous, nil 23 } 24 25 if enabled { 26 mode |= windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING 27 } else { 28 mode &= ^uint32(windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING) 29 } 30 31 if err := windows.SetConsoleMode(handle, mode); err != nil { 32 return false, fmt.Errorf("unable to set console mode: %w", err) 33 } 34 35 return previous, nil 36 } 37 38 func terminalWidth() (chars int, err error) { 39 if chars, _, err = term.GetSize(int(os.Stdout.Fd())); err != nil { 40 return -1, fmt.Errorf("unable to read info: %w", err) 41 } 42 return chars, nil 43 }