diff --git a/kittens/icat/main.go b/kittens/icat/main.go index a67bd443b..0617618c9 100644 --- a/kittens/icat/main.go +++ b/kittens/icat/main.go @@ -146,11 +146,15 @@ func main(cmd *cli.Command, o *Options, args []string) (rc int, err error) { if err != nil { return 1, err } - t, err := tty.OpenControllingTerm() - if err != nil { - return 1, fmt.Errorf("Failed to open controlling terminal with error: %w", err) + if tty.IsTerminal(os.Stdout.Fd()) { + screen_size, err = tty.GetSize(int(os.Stdout.Fd())) + } else { + t, oerr := tty.OpenControllingTerm() + if oerr != nil { + return 1, fmt.Errorf("Failed to open controlling terminal with error: %w", err) + } + screen_size, err = t.GetSize() } - screen_size, err = t.GetSize() if err != nil { return 1, fmt.Errorf("Failed to query terminal using TIOCGWINSZ with error: %w", err) } diff --git a/tools/tty/tty.go b/tools/tty/tty.go index 89b2ba197..e3d4d4f71 100644 --- a/tools/tty/tty.go +++ b/tools/tty/tty.go @@ -334,15 +334,19 @@ func (self *Term) DebugPrintln(a ...any) { } } -func (self *Term) GetSize() (*unix.Winsize, error) { +func GetSize(fd int) (*unix.Winsize, error) { for { - sz, err := unix.IoctlGetWinsize(self.Fd(), unix.TIOCGWINSZ) + sz, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) if err != unix.EINTR { return sz, err } } } +func (self *Term) GetSize() (*unix.Winsize, error) { + return GetSize(self.Fd()) +} + // go doesn't have a wrapper for ctermid() func Ctermid() string { return "/dev/tty" }