//go:build !windows // +build !windows package terminal import ( "os" "golang.org/x/term" ) // This is the implementation for all operating systems except Windows, where // we don't expect to need to do any special initialization to get a working // Virtual Terminal. // // For this implementation we just delegate everything upstream to // golang.org/x/term, since it already has a variety of different // implementations for quirks of more esoteric operating systems like plan9, // and will hopefully grow to include others as Go is ported to other platforms // in future. // // For operating systems that golang.org/x/term doesn't support either, it // defaults to indicating that nothing is a terminal and returns an error when // asked for a size, which we'll handle below. func configureOutputHandle(f *os.File) (*OutputStream, error) { return &OutputStream{ File: f, isTerminal: isTerminalGolangXTerm, getColumns: getColumnsGolangXTerm, }, nil } func configureInputHandle(f *os.File) (*InputStream, error) { return &InputStream{ File: f, isTerminal: isTerminalGolangXTerm, }, nil } func isTerminalGolangXTerm(f *os.File) bool { return term.IsTerminal(int(f.Fd())) } func getColumnsGolangXTerm(f *os.File) int { width, _, err := term.GetSize(int(f.Fd())) if err != nil { // Suggests that it's either not a terminal at all or that we're on // a platform that golang.org/x/term doesn't support. In both cases // we'll just return the placeholder default value. return defaultColumns } return width }