Codebase list golang-github-vbauerster-mpb / 38bce7e
get width of provided output Vladimir Bauer 7 years ago
6 changed file(s) with 29 addition(s) and 37 deletion(s). Raw diff Collapse all Expand all
329329 func (s *bState) draw(termWidth int, pSyncer, aSyncer *widthSyncer) io.Reader {
330330 defer s.bufA.WriteByte('\n')
331331
332 if termWidth <= 0 {
333 termWidth = s.width
334 }
335
336332 if s.panicMsg != "" {
337333 return strings.NewReader(fmt.Sprintf(fmt.Sprintf("%%.%ds\n", termWidth), s.panicMsg))
338334 }
11
22 import (
33 "bytes"
4 "errors"
45 "fmt"
56 "io"
7 "os"
8
9 isatty "github.com/mattn/go-isatty"
10 "golang.org/x/crypto/ssh/terminal"
611 )
712
813 // ESC is the ASCII code for escape character
914 const ESC = 27
15
16 var NotATTY = errors.New("not a terminal")
1017
1118 var (
1219 cursorUp = fmt.Sprintf("%c[%dA", ESC, 1)
5259 func (w *Writer) ReadFrom(r io.Reader) (n int64, err error) {
5360 return w.buf.ReadFrom(r)
5461 }
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 }
44 import (
55 "io"
66 "strings"
7 "syscall"
8 "unsafe"
97 )
108
119 func (w *Writer) clearLines() error {
1210 _, err := io.WriteString(w.out, strings.Repeat(clearCursorAndLine, w.lineCount))
1311 return err
1412 }
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 }
7474 }
7575 return nil
7676 }
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 }
66 "os/signal"
77 "syscall"
88 "time"
9
10 "github.com/vbauerster/mpb/cwriter"
119 )
1210
1311 func (p *Progress) serve(s *pState) {
3836 numA = s.bHeap.maxNumA()
3937 s.heapUpdated = false
4038 }
41 tw, _, _ := cwriter.TermSize()
39 tw, err := s.cw.GetWidth()
40 if err != nil {
41 tw = s.width
42 }
4243 s.render(tw, numP, numA)
4344 case <-winch:
4445 if s.heapUpdated {
4647 numA = s.bHeap.maxNumA()
4748 s.heapUpdated = false
4849 }
49 tw, _, _ := cwriter.TermSize()
50 tw, err := s.cw.GetWidth()
51 if err != nil {
52 tw = s.width
53 }
5054 s.render(tw-tw/8, numP, numA)
5155 if timer != nil && timer.Reset(resumeDelay) {
5256 break
00 // +build windows
11
22 package mpb
3
4 import (
5 "github.com/vbauerster/mpb/cwriter"
6 )
73
84 func (p *Progress) serve(s *pState) {
95 var numP, numA int
2521 numA = s.bHeap.maxNumA()
2622 s.heapUpdated = false
2723 }
28 tw, _, _ := cwriter.TermSize()
24 tw, err := s.cw.GetWidth()
25 if err != nil {
26 tw = s.width
27 }
2928 s.render(tw, numP, numA)
3029 }
3130 }