49 lines
933 B
Go
49 lines
933 B
Go
//go:build !windows
|
|
|
|
package cell_size
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
type winsize struct {
|
|
Rows uint16
|
|
Cols uint16
|
|
Xpixels uint16
|
|
Ypixels uint16
|
|
}
|
|
|
|
func GetTerminalCellSizePixels() (widthPx int, heightPx int, err error) {
|
|
ws := &winsize{}
|
|
_, _, errno := syscall.Syscall(
|
|
syscall.SYS_IOCTL,
|
|
os.Stdout.Fd(),
|
|
uintptr(syscall.TIOCGWINSZ),
|
|
uintptr(unsafe.Pointer(ws)),
|
|
)
|
|
if errno != 0 {
|
|
return 0, 0, errno
|
|
}
|
|
if ws.Cols == 0 || ws.Rows == 0 {
|
|
return 0, 0, fmt.Errorf("terminal rows or columns is zero")
|
|
}
|
|
widthPx = int(ws.Xpixels) / int(ws.Cols)
|
|
heightPx = int(ws.Ypixels) / int(ws.Rows)
|
|
return
|
|
}
|
|
|
|
func GetConsoleSize() (int, int) {
|
|
var sz struct {
|
|
rows uint16
|
|
cols uint16
|
|
xpixels uint16
|
|
ypixels uint16
|
|
}
|
|
_, _, _ = syscall.Syscall(syscall.SYS_IOCTL,
|
|
uintptr(syscall.Stdout), uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(&sz)))
|
|
return int(sz.cols), int(sz.rows)
|
|
}
|