// SaveState saves the state of the terminal connected to the given file descriptor. func SaveState(fd uintptr) (*State, error) { mode, e := winterm.GetConsoleMode(fd) if e != nil { return nil, e } return &State{mode}, nil }
// SaveState saves the state of the terminal connected to the given file descriptor. func SaveState(fd uintptr) (*State, error) { if usingNativeConsole { state, err := getNativeConsole() if err != nil { return nil, err } return &state, nil } mode, e := winterm.GetConsoleMode(fd) if e != nil { return nil, e } return &State{outMode: mode}, nil }
// StdStreams returns the standard streams (stdin, stdout, stedrr). func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { // Turn on VT handling on all std handles, if possible. This might // fail, in which case we will fall back to terminal emulation. var emulateStdin, emulateStdout, emulateStderr bool fd := os.Stdin.Fd() if mode, err := winterm.GetConsoleMode(fd); err == nil { // Validate that enableVirtualTerminalInput is supported, but do not set it. if err = winterm.SetConsoleMode(fd, mode|enableVirtualTerminalInput); err != nil { emulateStdin = true } else { vtInputSupported = true } // Unconditionally set the console mode back even on failure because SetConsoleMode // remembers invalid bits on input handles. winterm.SetConsoleMode(fd, mode) } fd = os.Stdout.Fd() if mode, err := winterm.GetConsoleMode(fd); err == nil { // Validate disableNewlineAutoReturn is supported, but do not set it. if err = winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing|disableNewlineAutoReturn); err != nil { emulateStdout = true } else { winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing) } } fd = os.Stderr.Fd() if mode, err := winterm.GetConsoleMode(fd); err == nil { // Validate disableNewlineAutoReturn is supported, but do not set it. if err = winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing|disableNewlineAutoReturn); err != nil { emulateStderr = true } else { winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing) } } if os.Getenv("ConEmuANSI") == "ON" { // The ConEmu terminal emulates ANSI on output streams well. emulateStdin = true emulateStdout = false emulateStderr = false } if emulateStdin { stdIn = windows.NewAnsiReader(syscall.STD_INPUT_HANDLE) } else { stdIn = os.Stdin } if emulateStdout { stdOut = windows.NewAnsiWriter(syscall.STD_OUTPUT_HANDLE) } else { stdOut = os.Stdout } if emulateStderr { stdErr = windows.NewAnsiWriter(syscall.STD_ERROR_HANDLE) } else { stdErr = os.Stderr } return }
// IsConsole returns true if the given file descriptor is a Windows Console. // The code assumes that GetConsoleMode will return an error for file descriptors that are not a console. func IsConsole(fd uintptr) bool { _, e := winterm.GetConsoleMode(fd) return e == nil }