Line data Source code
1 : /* 2 : * Copyright (c) 1995, 1996, 1997, 1998 Kungliga Tekniska Högskolan 3 : * (Royal Institute of Technology, Stockholm, Sweden). 4 : * All rights reserved. 5 : * 6 : * Redistribution and use in source and binary forms, with or without 7 : * modification, are permitted provided that the following conditions 8 : * are met: 9 : * 10 : * 1. Redistributions of source code must retain the above copyright 11 : * notice, this list of conditions and the following disclaimer. 12 : * 13 : * 2. Redistributions in binary form must reproduce the above copyright 14 : * notice, this list of conditions and the following disclaimer in the 15 : * documentation and/or other materials provided with the distribution. 16 : * 17 : * 3. Neither the name of the Institute nor the names of its contributors 18 : * may be used to endorse or promote products derived from this software 19 : * without specific prior written permission. 20 : * 21 : * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22 : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 : * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25 : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 : * SUCH DAMAGE. 32 : */ 33 : 34 : #include <config.h> 35 : 36 : #include <stdlib.h> 37 : #ifdef HAVE_UNISTD_H 38 : #include <unistd.h> 39 : #endif 40 : #ifdef HAVE_SYS_TYPES_H 41 : #include <sys/types.h> 42 : #endif 43 : 44 : #if 0 /* Where were those needed? /confused */ 45 : #ifdef HAVE_SYS_PROC_H 46 : #include <sys/proc.h> 47 : #endif 48 : 49 : #ifdef HAVE_SYS_TTY_H 50 : #include <sys/tty.h> 51 : #endif 52 : #endif 53 : 54 : #ifdef HAVE_TERMIOS_H 55 : #include <termios.h> 56 : #endif 57 : 58 : #include "roken.h" 59 : 60 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL 61 0 : get_window_size(int fd, int *lines, int *columns) 62 : { 63 0 : char *s; 64 : 65 : #if defined(TIOCGWINSZ) 66 : { 67 0 : struct winsize ws; 68 0 : int ret; 69 0 : ret = ioctl(fd, TIOCGWINSZ, &ws); 70 0 : if (ret != -1) { 71 0 : if (lines) 72 0 : *lines = ws.ws_row; 73 0 : if (columns) 74 0 : *columns = ws.ws_col; 75 0 : return 0; 76 : } 77 : } 78 : #elif defined(TIOCGSIZE) 79 : { 80 : struct ttysize ts; 81 : int ret; 82 : ret = ioctl(fd, TIOCGSIZE, &ts); 83 : if (ret != -1) { 84 : if (lines) 85 : *lines = ts.ws_lines; 86 : if (columns) 87 : *columns = ts.ts_cols; 88 : return 0; 89 : } 90 : } 91 : #elif defined(HAVE__SCRSIZE) 92 : { 93 : int dst[2]; 94 : 95 : _scrsize(dst); 96 : if (lines) 97 : *lines = dst[1]; 98 : if (columns) 99 : *columns = dst[0]; 100 : return 0; 101 : } 102 : #elif defined(_WIN32) 103 : { 104 : intptr_t fh = 0; 105 : CONSOLE_SCREEN_BUFFER_INFO sb_info; 106 : 107 : fh = _get_osfhandle(fd); 108 : if (fh != (intptr_t) INVALID_HANDLE_VALUE && 109 : GetConsoleScreenBufferInfo((HANDLE) fh, &sb_info)) { 110 : if (lines) 111 : *lines = 1 + sb_info.srWindow.Bottom - sb_info.srWindow.Top; 112 : if (columns) 113 : *columns = 1 + sb_info.srWindow.Right - sb_info.srWindow.Left; 114 : 115 : return 0; 116 : } 117 : } 118 : #endif 119 0 : if (columns) { 120 0 : if ((s = getenv("COLUMNS"))) 121 0 : *columns = atoi(s); 122 : else 123 0 : return -1; 124 : } 125 0 : if (lines) { 126 0 : if ((s = getenv("LINES"))) 127 0 : *lines = atoi(s); 128 : else 129 0 : return -1; 130 : } 131 0 : return 0; 132 : }