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  }