cwriter fix for windows
Vladimir Bauer
3 years ago
| 22 | 22 | out io.Writer |
| 23 | 23 | buf bytes.Buffer |
| 24 | 24 | lines int // how much lines to clear before flushing new ones |
| 25 | termSize func() (int, int, error) | |
| 26 | } | |
| 27 | ||
| 28 | func prepareTermSizeFunc(out io.Writer) func() (int, int, error) { | |
| 29 | fn := func() (int, int, error) { | |
| 30 | return -1, -1, ErrNotTTY | |
| 31 | } | |
| 32 | if f, ok := out.(*os.File); ok { | |
| 33 | fd := int(f.Fd()) | |
| 34 | if IsTerminal(fd) { | |
| 35 | fn = func() (int, int, error) { | |
| 36 | return GetSize(fd) | |
| 37 | } | |
| 38 | } | |
| 39 | } | |
| 40 | return fn | |
| 25 | fd int | |
| 26 | terminal bool | |
| 27 | termSize func(int) (int, int, error) | |
| 41 | 28 | } |
| 42 | 29 | |
| 43 | 30 | // New returns a new Writer with defaults. |
| 44 | 31 | func New(out io.Writer) *Writer { |
| 45 | 32 | w := &Writer{ |
| 46 | out: out, | |
| 47 | termSize: prepareTermSizeFunc(out), | |
| 33 | out: out, | |
| 34 | termSize: func(_ int) (int, int, error) { | |
| 35 | return -1, -1, ErrNotTTY | |
| 36 | }, | |
| 37 | } | |
| 38 | if f, ok := out.(*os.File); ok { | |
| 39 | w.fd = int(f.Fd()) | |
| 40 | if IsTerminal(w.fd) { | |
| 41 | w.terminal = true | |
| 42 | w.termSize = func(fd int) (int, int, error) { | |
| 43 | return GetSize(fd) | |
| 44 | } | |
| 45 | } | |
| 48 | 46 | } |
| 49 | 47 | return w |
| 50 | 48 | } |
| 81 | 79 | |
| 82 | 80 | // GetTermSize returns WxH of underlying terminal. |
| 83 | 81 | func (w *Writer) GetTermSize() (width, height int, err error) { |
| 84 | return w.termSize() | |
| 82 | return w.termSize(w.fd) | |
| 85 | 83 | } |
| 86 | 84 | |
| 87 | 85 | func (w *Writer) ansiCuuAndEd() error { |