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