github.com/meulengracht/snapd@v0.0.0-20210719210640-8bde69bcc84e/osutil/winsize.go (about) 1 // -*- Mode: Go; indent-tabs-mode: t -*- 2 3 /* 4 * Copyright (C) 2014-2015 Canonical Ltd 5 * 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 3 as 8 * published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 * 18 */ 19 20 package osutil 21 22 import ( 23 "syscall" 24 "unsafe" 25 ) 26 27 // Winsize is from tty_ioctl(4) 28 type Winsize struct { 29 Row uint16 30 Col uint16 31 xpixel uint16 // unused 32 Ypixel uint16 // unused 33 } 34 35 // GetTermWinsize performs the TIOCGWINSZ ioctl on stdout 36 func GetTermWinsize() (*Winsize, error) { 37 ws := &Winsize{} 38 x, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(syscall.Stdout), uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(ws))) 39 40 if int(x) == -1 { 41 // returning ws on error lets people that don't care 42 // about the error get on with querying the struct 43 // (which will be empty on error). 44 return ws, errno 45 } 46 47 return ws, nil 48 }