diff --git a/bar.go b/bar.go index fea6f97..e094e78 100644 --- a/bar.go +++ b/bar.go @@ -330,10 +330,6 @@ func (s *bState) draw(termWidth int, pSyncer, aSyncer *widthSyncer) io.Reader { defer s.bufA.WriteByte('\n') - if termWidth <= 0 { - termWidth = s.width - } - if s.panicMsg != "" { return strings.NewReader(fmt.Sprintf(fmt.Sprintf("%%.%ds\n", termWidth), s.panicMsg)) } diff --git a/cwriter/writer.go b/cwriter/writer.go index 050f93e..8caeae1 100644 --- a/cwriter/writer.go +++ b/cwriter/writer.go @@ -2,12 +2,19 @@ import ( "bytes" + "errors" "fmt" "io" + "os" + + isatty "github.com/mattn/go-isatty" + "golang.org/x/crypto/ssh/terminal" ) // ESC is the ASCII code for escape character const ESC = 27 + +var NotATTY = errors.New("not a terminal") var ( cursorUp = fmt.Sprintf("%c[%dA", ESC, 1) @@ -53,3 +60,13 @@ func (w *Writer) ReadFrom(r io.Reader) (n int64, err error) { return w.buf.ReadFrom(r) } + +func (w *Writer) GetWidth() (int, error) { + if f, ok := w.out.(*os.File); ok { + if isatty.IsTerminal(f.Fd()) { + tw, _, err := terminal.GetSize(int(f.Fd())) + return tw, err + } + } + return -1, NotATTY +} diff --git a/cwriter/writer_posix.go b/cwriter/writer_posix.go index 7d5c1f7..05e31c4 100644 --- a/cwriter/writer_posix.go +++ b/cwriter/writer_posix.go @@ -5,22 +5,9 @@ import ( "io" "strings" - "syscall" - "unsafe" ) func (w *Writer) clearLines() error { _, err := io.WriteString(w.out, strings.Repeat(clearCursorAndLine, w.lineCount)) return err } - -// TermSize returns the dimensions of the given terminal. -// the code is stolen from "golang.org/x/crypto/ssh/terminal" -func TermSize() (width, height int, err error) { - var dimensions [4]uint16 - - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(syscall.Stdout), uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(&dimensions)), 0, 0, 0); err != 0 { - return -1, -1, err - } - return int(dimensions[1]), int(dimensions[0]), nil -} diff --git a/cwriter/writer_windows.go b/cwriter/writer_windows.go index 951933d..dad7f50 100644 --- a/cwriter/writer_windows.go +++ b/cwriter/writer_windows.go @@ -75,14 +75,3 @@ } return nil } - -// TermSize returns the dimensions of the given terminal. -// the code is stolen from "golang.org/x/crypto/ssh/terminal" -func TermSize() (width, height int, err error) { - var info consoleScreenBufferInfo - _, _, e := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, uintptr(syscall.Stdout), uintptr(unsafe.Pointer(&info)), 0) - if e != 0 { - return 0, 0, error(e) - } - return int(info.size.x), int(info.size.y), nil -} diff --git a/progress_posix.go b/progress_posix.go index b40c670..71df100 100644 --- a/progress_posix.go +++ b/progress_posix.go @@ -7,8 +7,6 @@ "os/signal" "syscall" "time" - - "github.com/vbauerster/mpb/cwriter" ) func (p *Progress) serve(s *pState) { @@ -39,7 +37,10 @@ numA = s.bHeap.maxNumA() s.heapUpdated = false } - tw, _, _ := cwriter.TermSize() + tw, err := s.cw.GetWidth() + if err != nil { + tw = s.width + } s.render(tw, numP, numA) case <-winch: if s.heapUpdated { @@ -47,7 +48,10 @@ numA = s.bHeap.maxNumA() s.heapUpdated = false } - tw, _, _ := cwriter.TermSize() + tw, err := s.cw.GetWidth() + if err != nil { + tw = s.width + } s.render(tw-tw/8, numP, numA) if timer != nil && timer.Reset(resumeDelay) { break diff --git a/progress_windows.go b/progress_windows.go index 65cbfd8..81f324f 100644 --- a/progress_windows.go +++ b/progress_windows.go @@ -1,10 +1,6 @@ // +build windows package mpb - -import ( - "github.com/vbauerster/mpb/cwriter" -) func (p *Progress) serve(s *pState) { var numP, numA int @@ -26,7 +22,10 @@ numA = s.bHeap.maxNumA() s.heapUpdated = false } - tw, _, _ := cwriter.TermSize() + tw, err := s.cw.GetWidth() + if err != nil { + tw = s.width + } s.render(tw, numP, numA) } }