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