pkg.re/essentialkaos/ek@v12.36.0+incompatible/terminal/window/size_posix.go (about) 1 // +build !windows 2 3 // Package window provides methods for working terminal window 4 package window 5 6 // ////////////////////////////////////////////////////////////////////////////////// // 7 // // 8 // Copyright (c) 2021 ESSENTIAL KAOS // 9 // Apache License, Version 2.0 <https://www.apache.org/licenses/LICENSE-2.0> // 10 // // 11 // ////////////////////////////////////////////////////////////////////////////////// // 12 13 import ( 14 "os" 15 "syscall" 16 "unsafe" 17 ) 18 19 // ////////////////////////////////////////////////////////////////////////////////// // 20 21 type winsize struct { 22 rows uint16 23 cols uint16 24 xpixels uint16 25 ypixels uint16 26 } 27 28 // ////////////////////////////////////////////////////////////////////////////////// // 29 30 // tty is a path to TTY device file 31 var tty = "/dev/tty" 32 33 // ////////////////////////////////////////////////////////////////////////////////// // 34 35 // GetSize returns window width and height 36 func GetSize() (int, int) { 37 t, err := os.OpenFile(tty, syscall.O_RDONLY, 0) 38 39 if err != nil { 40 return -1, -1 41 } 42 43 var sz winsize 44 45 _, _, _ = syscall.Syscall( 46 syscall.SYS_IOCTL, t.Fd(), 47 uintptr(syscall.TIOCGWINSZ), 48 uintptr(unsafe.Pointer(&sz)), 49 ) 50 51 return int(sz.cols), int(sz.rows) 52 } 53 54 // GetWidth returns window width 55 func GetWidth() int { 56 w, _ := GetSize() 57 return w 58 } 59 60 // GetHeight returns window height 61 func GetHeight() int { 62 _, h := GetSize() 63 return h 64 }