xterm_io.h revision 5307cd1a
1/* $XTermId: xterm_io.h,v 1.65 2018/06/28 21:35:01 tom Exp $ */
2
3/*
4 * Copyright 2000-2018,2020 by Thomas E. Dickey
5 *
6 *                         All Rights Reserved
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the
10 * "Software"), to deal in the Software without restriction, including
11 * without limitation the rights to use, copy, modify, merge, publish,
12 * distribute, sublicense, and/or sell copies of the Software, and to
13 * permit persons to whom the Software is furnished to do so, subject to
14 * the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22 * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
23 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 *
27 * Except as contained in this notice, the name(s) of the above copyright
28 * holders shall not be used in advertising or otherwise to promote the
29 * sale, use or other dealings in this Software without prior written
30 * authorization.
31 */
32
33#ifndef	included_xterm_io_h
34#define	included_xterm_io_h
35
36#include <xterm.h>
37
38/*
39 * System-specific definitions (keep these chunks one-per-system!).
40 *
41 * FIXME:  some, such as those defining USE_TERMIOS should be moved to xterm.h
42 * as they are integrated with the configure script.
43 */
44#if defined(__minix)
45#define USE_POSIX_TERMIOS 1
46#undef HAVE_POSIX_OPENPT	/* present, does not work */
47#endif
48
49#ifdef CSRG_BASED
50#define USE_TERMIOS
51#endif
52
53#ifdef __CYGWIN__
54#define ATT
55#define SVR4
56#define SYSV
57#define USE_SYSV_TERMIO
58#endif
59
60#if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__INTERIX) || defined(__APPLE__) || defined(__UNIXWARE__) || defined(__hpux)
61#ifndef USE_POSIX_TERMIOS
62#define USE_POSIX_TERMIOS
63#endif
64#endif
65
66#if defined(AIXV4)
67#define USE_POSIX_TERMIOS
68#ifndef SYSV
69#define SYSV
70#endif
71#endif
72
73#ifdef linux
74#define USE_TERMIOS
75#define HAVE_POSIX_OPENPT 1
76#define HAVE_PTSNAME 1
77#define HAVE_GRANTPT_PTY_ISATTY 1
78#endif
79
80#ifdef __SCO__
81#define USE_TERMIOS
82#ifndef _SVID3
83#define _SVID3
84#endif
85#endif
86
87#ifdef Lynx
88#define USE_SYSV_TERMIO
89#endif
90
91#ifdef macII
92#undef SYSV			/* pretend to be bsd (sgtty.h) */
93#endif /* macII */
94
95#ifdef __GNU__
96#define USE_POSIX_TERMIOS
97#define HAVE_POSIX_OPENPT 1
98#define HAVE_PTSNAME 1
99#define HAVE_GRANTPT_PTY_ISATTY 1
100#endif
101
102#if defined(__GLIBC__) && !(defined(linux) || defined(__GNU__))
103#define USE_POSIX_TERMIOS	/* GNU/KFreeBSD and GNU/KNetBSD */
104#endif
105
106#ifdef __MVS__
107#define SVR4
108#define USE_POSIX_TERMIOS
109#endif
110
111#ifdef __QNX__
112#define USE_POSIX_TERMIOS
113#endif
114
115#if defined(__osf__)
116#define USE_POSIX_TERMIOS
117#undef SYSV
118#endif
119
120/*
121 * Indirect system dependencies
122 */
123#if defined(SVR4) && !defined(__sgi)
124#define USE_TERMIOS
125#endif
126
127#ifdef SYSV
128#define USE_SYSV_TERMIO
129#endif
130
131#if defined(USE_POSIX_TERMIOS) && !defined(USE_TERMIOS)
132#define USE_TERMIOS
133#endif
134
135/*
136 * Low-level ioctl, where it is needed or non-conflicting with termio/etc.
137 */
138#ifdef __QNX__
139#include <ioctl.h>
140#else
141#include <sys/ioctl.h>
142#endif
143
144/*
145 * Terminal I/O includes (termio, termios, sgtty headers).
146 */
147#if defined(USE_POSIX_TERMIOS) && !defined(__hpux)
148#include <termios.h>
149#elif defined(USE_TERMIOS)
150#include <termios.h>
151/* this hacked termios support only works on SYSV */
152#define USE_ANY_SYSV_TERMIO
153#define termio termios
154#ifndef __CYGWIN__
155#undef  TCGETA
156#define TCGETA TCGETS
157#undef  TCSETA
158#define TCSETA TCSETS
159#undef  TCSETAW
160#define TCSETAW TCSETSW
161#endif
162#elif defined(USE_SYSV_TERMIO)
163# define USE_ANY_SYSV_TERMIO
164# ifdef Lynx
165#  include <termio.h>
166# else
167#  include <sys/termio.h>
168# endif
169#elif defined(SYSV) || defined(ISC)
170# include <sys/termio.h>
171#elif !defined(VMS)
172# include <sgtty.h>
173#endif /* USE_POSIX_TERMIOS */
174
175/*
176 * Stream includes, which declare struct winsize or ttysize.
177 */
178#ifdef SYSV
179#ifdef USE_USG_PTYS
180#include <sys/stream.h>		/* get typedef used in ptem.h */
181#ifdef HAVE_SYS_PTEM_H
182#include <sys/ptem.h>		/* get struct winsize */
183#endif
184#endif /* USE_USG_PTYS */
185#endif /* SYSV */
186
187/*
188 * Special cases (structures and definitions that have to be adjusted).
189 */
190#if defined(__CYGWIN__) && !defined(TIOCSPGRP)
191#include <termios.h>
192#define TIOCSPGRP (_IOW('t', 118, pid_t))
193#endif
194
195#ifdef __hpux
196#include <sys/bsdtty.h>		/* defines TIOCSLTC */
197#endif
198
199#ifdef ISC
200#define TIOCGPGRP TCGETPGRP
201#define TIOCSPGRP TCSETPGRP
202#endif
203
204#ifdef Lynx
205#include <resource.h>
206#elif !(defined(SYSV) || defined(linux) || defined(VMS) || (defined(__QNX__)&&!defined(__QNXNTO__)))
207#include <sys/resource.h>
208#endif
209
210#ifdef macII
211#undef FIOCLEX
212#undef FIONCLEX
213#endif /* macII */
214
215#if defined(__QNX__) || defined(__GNU__) || defined(__MVS__) || defined(__osf__)
216#undef TIOCSLTC			/* <sgtty.h> conflicts with <termios.h> */
217#undef TIOCSLTC
218#endif
219
220#if defined (__sgi) || (defined(__linux__) && defined(__sparc__)) || defined(__UNIXWARE__)
221#undef TIOCLSET			/* defined, but not usable */
222#endif
223
224#if defined(sun) || defined(__UNIXWARE__)
225#include <sys/filio.h>
226#endif
227
228#if defined(TIOCSLTC) && ! (defined(linux) || defined(__MVS__) || defined(Lynx) || defined(SVR4))
229#define HAS_LTCHARS
230#endif
231
232#if !defined(TTYSIZE_STRUCT)
233#if defined(TIOCSWINSZ)
234#define USE_STRUCT_WINSIZE 1
235#define TTYSIZE_STRUCT struct winsize
236#define GET_TTYSIZE(fd, data) ioctl(fd, TIOCGWINSZ, (char *) &data)
237#define SET_TTYSIZE(fd, data) ioctl(fd, TIOCSWINSZ, (char *) &data)
238#define TTYSIZE_COLS(data) data.ws_col
239#define TTYSIZE_ROWS(data) data.ws_row
240#endif /* TIOCSWINSZ */
241#endif /* TTYSIZE_STRUCT */
242
243#ifndef USE_STRUCT_WINSIZE
244#error "There is a configuration error with struct winsize ifdef"
245#endif
246
247/* "resize" depends upon order of assignments in this macro */
248#ifdef USE_STRUCT_WINSIZE
249#define setup_winsize(ts, rows, cols, height, width) \
250    (ts).ws_xpixel = (ttySize_t) (width), \
251    (ts).ws_ypixel = (ttySize_t) (height), \
252    TTYSIZE_ROWS(ts) = (ttySize_t) (rows), \
253    TTYSIZE_COLS(ts) = (ttySize_t) (cols)
254#else
255#define setup_winsize(ts, rows, cols, height, width) \
256    TTYSIZE_ROWS(ts) = (ttySize_t) (rows), \
257    TTYSIZE_COLS(ts) = (ttySize_t) (cols)
258#endif
259
260#if OPT_TRACE
261
262#ifdef USE_STRUCT_WINSIZE
263#define trace_winsize(ts, id) \
264    TRACE(("%s@%d, TTYSIZE %s chars %dx%d pixels %dx%d\n", \
265    	   __FILE__, __LINE__, id, \
266	   TTYSIZE_ROWS(ts), TTYSIZE_COLS(ts), (ts).ws_ypixel, (ts).ws_xpixel))
267#else
268#define trace_winsize(ts, id) \
269    TRACE(("%s@%d, TTYSIZE %s chars %dx%d\n", __FILE__, __LINE__, id, \
270    	   TTYSIZE_ROWS(ts), TTYSIZE_COLS(ts)))
271#endif
272
273#define TRACE_GET_TTYSIZE(fd, id) { \
274	    TTYSIZE_STRUCT debug_ttysize; \
275	    if (GET_TTYSIZE(fd, debug_ttysize) == 0) \
276		trace_winsize(debug_ttysize, id); \
277	    else \
278		TRACE(("%s@%d, TTYSIZE failed %s\n", __FILE__, __LINE__, strerror(errno))); \
279	}
280#else
281#define trace_winsize(ts, id)	/* nothing */
282#define TRACE_GET_TTYSIZE(fd, id)	/* nothing */
283#endif
284
285typedef unsigned short ttySize_t;
286
287#endif /* included_xterm_io_h */
288