blob: 9c0abbc66bdaea8099012e498a3124d6501956c7 [file] [log] [blame]
//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
}