diff --git a/cwriter/writer.go b/cwriter/writer.go index fac15b3..ee717df 100644 --- a/cwriter/writer.go +++ b/cwriter/writer.go @@ -20,19 +20,32 @@ // Writer is a buffered the writer that updates the terminal. The // contents of writer will be flushed when Flush is called. type Writer struct { - out io.Writer - buf bytes.Buffer - lines int - fd int - isTerminal bool + out io.Writer + buf bytes.Buffer + lines int // how much lines to clear before flushing new ones + termSize func() (int, int, error) +} + +func prepareTermSizeFunc(out io.Writer) func() (int, int, error) { + fn := func() (int, int, error) { + return -1, -1, ErrNotTTY + } + if f, ok := out.(*os.File); ok { + fd := int(f.Fd()) + if IsTerminal(fd) { + fn = func() (int, int, error) { + return GetSize(fd) + } + } + } + return fn } // New returns a new Writer with defaults. func New(out io.Writer) *Writer { - w := &Writer{out: out} - if f, ok := out.(*os.File); ok { - w.fd = int(f.Fd()) - w.isTerminal = IsTerminal(w.fd) + w := &Writer{ + out: out, + termSize: prepareTermSizeFunc(out), } return w } @@ -67,13 +80,9 @@ return w.buf.ReadFrom(r) } -// GetWidth returns width of underlying terminal. -func (w *Writer) GetWidth() (int, error) { - if !w.isTerminal { - return -1, ErrNotTTY - } - tw, _, err := GetSize(w.fd) - return tw, err +// GetTermSize returns WxH of underlying terminal. +func (w *Writer) GetTermSize() (width, height int, err error) { + return w.termSize() } func (w *Writer) ansiCuuAndEd() error {