aboutsummaryrefslogtreecommitdiff
path: root/internal/cli/termwidth_unix.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/cli/termwidth_unix.go')
-rw-r--r--internal/cli/termwidth_unix.go23
1 files changed, 23 insertions, 0 deletions
diff --git a/internal/cli/termwidth_unix.go b/internal/cli/termwidth_unix.go
new file mode 100644
index 0000000..9d1b47d
--- /dev/null
+++ b/internal/cli/termwidth_unix.go
@@ -0,0 +1,23 @@
+//go:build unix
+
+package cli
+
+import (
+ "os"
+ "syscall"
+ "unsafe"
+)
+
+// ttyWidth returns f's terminal column width via the TIOCGWINSZ ioctl, or 0
+// if f isn't a terminal (redirected to a file/pipe, as in tests) or the
+// ioctl fails.
+func ttyWidth(f *os.File) int {
+ var ws struct {
+ Row, Col, Xpixel, Ypixel uint16
+ }
+ _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, f.Fd(), syscall.TIOCGWINSZ, uintptr(unsafe.Pointer(&ws)))
+ if errno != 0 || ws.Col == 0 {
+ return 0
+ }
+ return int(ws.Col)
+}