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