1/*
2 *  $Id: ttysize.c,v 1.2 2019/07/25 00:07:15 tom Exp $
3 *
4 *  ttysize.c -- obtain terminal-size for dialog
5 *
6 *  Copyright 2018,2019	Thomas E. Dickey
7 *
8 *  This program is free software; you can redistribute it and/or modify
9 *  it under the terms of the GNU Lesser General Public License, version 2.1
10 *  as published by the Free Software Foundation.
11 *
12 *  This program is distributed in the hope that it will be useful, but
13 *  WITHOUT ANY WARRANTY; without even the implied warranty of
14 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 *  Lesser General Public License for more details.
16 *
17 *  You should have received a copy of the GNU Lesser General Public
18 *  License along with this program; if not, write to
19 *	Free Software Foundation, Inc.
20 *	51 Franklin St., Fifth Floor
21 *	Boston, MA 02110, USA.
22 *
23 *  An earlier version of this program lists as authors
24 *	Savio Lam (lam836@cs.cuhk.hk)
25 */
26
27#include <dialog.h>
28
29/*
30 * This is based on work I did for ncurses in 1997, and improved/extended for
31 * other terminal-based programs.  The comments are from my original version -TD
32 */
33
34#ifdef HAVE_TERMIOS_H
35#include <termios.h>
36#endif
37
38#ifdef HAVE_SYS_IOCTL_H
39# include <sys/ioctl.h>
40#endif
41
42#ifdef NEED_PTEM_H
43 /* On SCO, they neglected to define struct winsize in termios.h -- it's only
44  * in termio.h and ptem.h (the former conflicts with other definitions).
45  */
46# include <sys/stream.h>
47# include <sys/ptem.h>
48#endif
49
50/*
51 * SCO defines TIOCGSIZE and the corresponding struct.  Other systems (SunOS,
52 * Solaris, IRIX) define TIOCGWINSZ and struct winsize.
53 */
54#if defined(TIOCGSIZE)
55# define IOCTL_WINSIZE TIOCGSIZE
56# define STRUCT_WINSIZE struct ttysize
57# define WINSIZE_ROWS(n) (int)n.ts_lines
58# define WINSIZE_COLS(n) (int)n.ts_cols
59#elif defined(TIOCGWINSZ)
60# define IOCTL_WINSIZE TIOCGWINSZ
61# define STRUCT_WINSIZE struct winsize
62# define WINSIZE_ROWS(n) (int)n.ws_row
63# define WINSIZE_COLS(n) (int)n.ws_col
64#else
65# undef HAVE_SIZECHANGE
66#endif
67
68int
69dlg_ttysize(int fd, int *high, int *wide)
70{
71    int rc = -1;
72#ifdef HAVE_SIZECHANGE
73    if (isatty(fd)) {
74	STRUCT_WINSIZE size;
75
76	if (ioctl(fd, IOCTL_WINSIZE, &size) >= 0) {
77	    *high = WINSIZE_ROWS(size);
78	    *wide = WINSIZE_COLS(size);
79	    rc = 0;
80	}
81    }
82#else
83    *high = 24;
84    *wide = 80;
85#endif /* HAVE_SIZECHANGE */
86    return rc;
87}
88