On Mar 5, 2007, at 11:25 AM, Greg Hurrell wrote:

> I'd like to be able to determine the width of the terminal in which my
> command-line tool is running.
>
> I made a quick program to find out the value of TIOCGWINSZ on my
> system (Mac OS X 10.4.8, running on Intel):
>
> #include <sys/ioctl.h>
> #include <unistd.h>
>
> int main(int argc, char *argv[])
> {
>   printf("%d\n", TIOCGWINSZ);
>   return 0;
> }
>
> The value is 1074295912 (0x40087468). Then I used the following Ruby
> code based on something I found in the archives:
>
> TIOCGWINSZ = 0x40087468
> str = [0, 0, 0, 0].pack('SSSS')
> if STDIN.ioctl(TIOCGWINSZ, str) >= 0
>   rows, cols, xpixels, ypixels = str.unpack("SSSS")
>   p rows, cols, xpixels, ypixels
> else
>   puts "Unable to get window size"
> end
>
> This returns the correct values:
>
> [55, 132, 792, 770]
>
> That is, 55 rows, 132 columns. I'd like to know if there's a more
> portable way of doing this... About the only semi-portable way I can
> think of is wrapping this up in a C extension; at least that way
> (most) people can compile it locally. Suggestions?

HighLine can do this:

require "highline/system_extensions.rb"
cols, rows = HighLine::SystemExtensions.terminal_size

Hope that helps.

James Edward Gray II