get_window_size.c revision 302408
111820Sjulian/*
211820Sjulian * Copyright (c) 1995, 1996, 1997, 1998 Kungliga Tekniska H��gskolan
311820Sjulian * (Royal Institute of Technology, Stockholm, Sweden).
411820Sjulian * All rights reserved.
511820Sjulian *
611820Sjulian * Redistribution and use in source and binary forms, with or without
711820Sjulian * modification, are permitted provided that the following conditions
811820Sjulian * are met:
911820Sjulian *
1011820Sjulian * 1. Redistributions of source code must retain the above copyright
1111820Sjulian *    notice, this list of conditions and the following disclaimer.
1211820Sjulian *
1311820Sjulian * 2. Redistributions in binary form must reproduce the above copyright
1411820Sjulian *    notice, this list of conditions and the following disclaimer in the
1511820Sjulian *    documentation and/or other materials provided with the distribution.
1611820Sjulian *
1711820Sjulian * 3. Neither the name of the Institute nor the names of its contributors
1811820Sjulian *    may be used to endorse or promote products derived from this software
1911820Sjulian *    without specific prior written permission.
2011820Sjulian *
2111820Sjulian * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
2211820Sjulian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2311820Sjulian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2411820Sjulian * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
2511820Sjulian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2611820Sjulian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2711820Sjulian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2811820Sjulian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2911820Sjulian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3011820Sjulian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3111820Sjulian * SUCH DAMAGE.
3211820Sjulian */
3311820Sjulian
3411820Sjulian#include <config.h>
3511820Sjulian
3611820Sjulian#include <stdlib.h>
3711820Sjulian#ifdef HAVE_UNISTD_H
3850479Speter#include <unistd.h>
3911820Sjulian#endif
4011820Sjulian#ifdef HAVE_SYS_TYPES_H
4111820Sjulian#include <sys/types.h>
42122760Strhodes#endif
4311820Sjulian
4411820Sjulian#if 0 /* Where were those needed? /confused */
4511820Sjulian#ifdef HAVE_SYS_PROC_H
4611820Sjulian#include <sys/proc.h>
4711820Sjulian#endif
48122760Strhodes
4911820Sjulian#ifdef HAVE_SYS_TTY_H
5011820Sjulian#include <sys/tty.h>
5111820Sjulian#endif
5211820Sjulian#endif
5311820Sjulian
5411820Sjulian#ifdef HAVE_TERMIOS_H
5511820Sjulian#include <termios.h>
5611820Sjulian#endif
5711820Sjulian
5811820Sjulian#include "roken.h"
5911820Sjulian
6011820SjulianROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
6111820Sjulianget_window_size(int fd, int *lines, int *columns)
6211820Sjulian{
6311820Sjulian    char *s;
6411820Sjulian
6511820Sjulian#if defined(TIOCGWINSZ)
6611820Sjulian    {
6711820Sjulian	struct winsize ws;
6811820Sjulian        int ret;
6911820Sjulian	ret = ioctl(fd, TIOCGWINSZ, &ws);
7011820Sjulian	if (ret != -1) {
7111820Sjulian	    if (lines)
7211820Sjulian		*lines = ws.ws_row;
7311820Sjulian	    if (columns)
7411820Sjulian		*columns = ws.ws_col;
7511820Sjulian	    return 0;
7611820Sjulian	}
7711820Sjulian    }
7811820Sjulian#elif defined(TIOCGSIZE)
7911820Sjulian    {
8011820Sjulian	struct ttysize ts;
8111820Sjulian        int ret;
8215248Sjhay	ret = ioctl(fd, TIOCGSIZE, &ts);
8311820Sjulian	if (ret != -1) {
8411820Sjulian	    if (lines)
8511820Sjulian		*lines = ts.ws_lines;
8611820Sjulian	    if (columns)
8711820Sjulian		*columns = ts.ts_cols;
8827244Sjhay	    return 0;
8927244Sjhay 	}
9011820Sjulian    }
9111840Sjulian#elif defined(HAVE__SCRSIZE)
9211820Sjulian    {
9311840Sjulian	int dst[2];
9411820Sjulian
9511820Sjulian 	_scrsize(dst);
9611820Sjulian	if (lines)
9715248Sjhay	    *lines = dst[1];
9827244Sjhay	if (columns)
9911820Sjulian	    *columns = dst[0];
10011820Sjulian	return 0;
10111820Sjulian    }
10211820Sjulian#elif defined(_WIN32)
10311820Sjulian    {
10411820Sjulian        intptr_t fh = 0;
10511820Sjulian        CONSOLE_SCREEN_BUFFER_INFO sb_info;
10611820Sjulian
10727244Sjhay        fh = _get_osfhandle(fd);
10827244Sjhay        if (fh != (intptr_t) INVALID_HANDLE_VALUE &&
10911820Sjulian            GetConsoleScreenBufferInfo((HANDLE) fh, &sb_info)) {
11011820Sjulian            if (lines)
11111820Sjulian                *lines = 1 + sb_info.srWindow.Bottom - sb_info.srWindow.Top;
11211820Sjulian            if (columns)
11311820Sjulian                *columns = 1 + sb_info.srWindow.Right - sb_info.srWindow.Left;
11411820Sjulian
11511820Sjulian            return 0;
11611820Sjulian        }
11711820Sjulian    }
11811820Sjulian#endif
11911820Sjulian    if (columns) {
12011820Sjulian    	if ((s = getenv("COLUMNS")))
12111820Sjulian	    *columns = atoi(s);
12211820Sjulian	else
12311820Sjulian	    return -1;
12411820Sjulian    }
12511820Sjulian    if (lines) {
12611820Sjulian	if ((s = getenv("LINES")))
12711820Sjulian	    *lines = atoi(s);
12811820Sjulian	else
12911820Sjulian	    return -1;
13011820Sjulian    }
13111820Sjulian    return 0;
13211820Sjulian}
13311820Sjulian