get width of provided output
Vladimir Bauer
7 years ago
| 329 | 329 |
func (s *bState) draw(termWidth int, pSyncer, aSyncer *widthSyncer) io.Reader {
|
| 330 | 330 |
defer s.bufA.WriteByte('\n')
|
| 331 | 331 |
|
| 332 | |
if termWidth <= 0 {
|
| 333 | |
termWidth = s.width
|
| 334 | |
}
|
| 335 | |
|
| 336 | 332 |
if s.panicMsg != "" {
|
| 337 | 333 |
return strings.NewReader(fmt.Sprintf(fmt.Sprintf("%%.%ds\n", termWidth), s.panicMsg))
|
| 338 | 334 |
}
|
| 1 | 1 |
|
| 2 | 2 |
import (
|
| 3 | 3 |
"bytes"
|
|
4 |
"errors"
|
| 4 | 5 |
"fmt"
|
| 5 | 6 |
"io"
|
|
7 |
"os"
|
|
8 |
|
|
9 |
isatty "github.com/mattn/go-isatty"
|
|
10 |
"golang.org/x/crypto/ssh/terminal"
|
| 6 | 11 |
)
|
| 7 | 12 |
|
| 8 | 13 |
// ESC is the ASCII code for escape character
|
| 9 | 14 |
const ESC = 27
|
|
15 |
|
|
16 |
var NotATTY = errors.New("not a terminal")
|
| 10 | 17 |
|
| 11 | 18 |
var (
|
| 12 | 19 |
cursorUp = fmt.Sprintf("%c[%dA", ESC, 1)
|
|
| 52 | 59 |
func (w *Writer) ReadFrom(r io.Reader) (n int64, err error) {
|
| 53 | 60 |
return w.buf.ReadFrom(r)
|
| 54 | 61 |
}
|
|
62 |
|
|
63 |
func (w *Writer) GetWidth() (int, error) {
|
|
64 |
if f, ok := w.out.(*os.File); ok {
|
|
65 |
if isatty.IsTerminal(f.Fd()) {
|
|
66 |
tw, _, err := terminal.GetSize(int(f.Fd()))
|
|
67 |
return tw, err
|
|
68 |
}
|
|
69 |
}
|
|
70 |
return -1, NotATTY
|
|
71 |
}
|
| 4 | 4 |
import (
|
| 5 | 5 |
"io"
|
| 6 | 6 |
"strings"
|
| 7 | |
"syscall"
|
| 8 | |
"unsafe"
|
| 9 | 7 |
)
|
| 10 | 8 |
|
| 11 | 9 |
func (w *Writer) clearLines() error {
|
| 12 | 10 |
_, err := io.WriteString(w.out, strings.Repeat(clearCursorAndLine, w.lineCount))
|
| 13 | 11 |
return err
|
| 14 | 12 |
}
|
| 15 | |
|
| 16 | |
// TermSize returns the dimensions of the given terminal.
|
| 17 | |
// the code is stolen from "golang.org/x/crypto/ssh/terminal"
|
| 18 | |
func TermSize() (width, height int, err error) {
|
| 19 | |
var dimensions [4]uint16
|
| 20 | |
|
| 21 | |
if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(syscall.Stdout), uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(&dimensions)), 0, 0, 0); err != 0 {
|
| 22 | |
return -1, -1, err
|
| 23 | |
}
|
| 24 | |
return int(dimensions[1]), int(dimensions[0]), nil
|
| 25 | |
}
|
| 74 | 74 |
}
|
| 75 | 75 |
return nil
|
| 76 | 76 |
}
|
| 77 | |
|
| 78 | |
// TermSize returns the dimensions of the given terminal.
|
| 79 | |
// the code is stolen from "golang.org/x/crypto/ssh/terminal"
|
| 80 | |
func TermSize() (width, height int, err error) {
|
| 81 | |
var info consoleScreenBufferInfo
|
| 82 | |
_, _, e := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, uintptr(syscall.Stdout), uintptr(unsafe.Pointer(&info)), 0)
|
| 83 | |
if e != 0 {
|
| 84 | |
return 0, 0, error(e)
|
| 85 | |
}
|
| 86 | |
return int(info.size.x), int(info.size.y), nil
|
| 87 | |
}
|
| 6 | 6 |
"os/signal"
|
| 7 | 7 |
"syscall"
|
| 8 | 8 |
"time"
|
| 9 | |
|
| 10 | |
"github.com/vbauerster/mpb/cwriter"
|
| 11 | 9 |
)
|
| 12 | 10 |
|
| 13 | 11 |
func (p *Progress) serve(s *pState) {
|
|
| 38 | 36 |
numA = s.bHeap.maxNumA()
|
| 39 | 37 |
s.heapUpdated = false
|
| 40 | 38 |
}
|
| 41 | |
tw, _, _ := cwriter.TermSize()
|
|
39 |
tw, err := s.cw.GetWidth()
|
|
40 |
if err != nil {
|
|
41 |
tw = s.width
|
|
42 |
}
|
| 42 | 43 |
s.render(tw, numP, numA)
|
| 43 | 44 |
case <-winch:
|
| 44 | 45 |
if s.heapUpdated {
|
|
| 46 | 47 |
numA = s.bHeap.maxNumA()
|
| 47 | 48 |
s.heapUpdated = false
|
| 48 | 49 |
}
|
| 49 | |
tw, _, _ := cwriter.TermSize()
|
|
50 |
tw, err := s.cw.GetWidth()
|
|
51 |
if err != nil {
|
|
52 |
tw = s.width
|
|
53 |
}
|
| 50 | 54 |
s.render(tw-tw/8, numP, numA)
|
| 51 | 55 |
if timer != nil && timer.Reset(resumeDelay) {
|
| 52 | 56 |
break
|
| 0 | 0 |
// +build windows
|
| 1 | 1 |
|
| 2 | 2 |
package mpb
|
| 3 | |
|
| 4 | |
import (
|
| 5 | |
"github.com/vbauerster/mpb/cwriter"
|
| 6 | |
)
|
| 7 | 3 |
|
| 8 | 4 |
func (p *Progress) serve(s *pState) {
|
| 9 | 5 |
var numP, numA int
|
|
| 25 | 21 |
numA = s.bHeap.maxNumA()
|
| 26 | 22 |
s.heapUpdated = false
|
| 27 | 23 |
}
|
| 28 | |
tw, _, _ := cwriter.TermSize()
|
|
24 |
tw, err := s.cw.GetWidth()
|
|
25 |
if err != nil {
|
|
26 |
tw = s.width
|
|
27 |
}
|
| 29 | 28 |
s.render(tw, numP, numA)
|
| 30 | 29 |
}
|
| 31 | 30 |
}
|