15104ee6eSmrg/* $XTermId: xterm_io.h,v 1.71 2024/09/30 08:03:20 tom Exp $ */
2d522f475Smrg
3d522f475Smrg/*
404b94745Smrg * Copyright 2000-2023,2024 by Thomas E. Dickey
5d522f475Smrg *
6d522f475Smrg *                         All Rights Reserved
7d522f475Smrg *
8d522f475Smrg * Permission is hereby granted, free of charge, to any person obtaining a
9d522f475Smrg * copy of this software and associated documentation files (the
10d522f475Smrg * "Software"), to deal in the Software without restriction, including
11d522f475Smrg * without limitation the rights to use, copy, modify, merge, publish,
12d522f475Smrg * distribute, sublicense, and/or sell copies of the Software, and to
13d522f475Smrg * permit persons to whom the Software is furnished to do so, subject to
14d522f475Smrg * the following conditions:
15d522f475Smrg *
16d522f475Smrg * The above copyright notice and this permission notice shall be included
17d522f475Smrg * in all copies or substantial portions of the Software.
18d522f475Smrg *
19d522f475Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20d522f475Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21d522f475Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22d522f475Smrg * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
23d522f475Smrg * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24d522f475Smrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25d522f475Smrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26d522f475Smrg *
27d522f475Smrg * Except as contained in this notice, the name(s) of the above copyright
28d522f475Smrg * holders shall not be used in advertising or otherwise to promote the
29d522f475Smrg * sale, use or other dealings in this Software without prior written
30d522f475Smrg * authorization.
31d522f475Smrg */
32d522f475Smrg
33d522f475Smrg#ifndef	included_xterm_io_h
34d522f475Smrg#define	included_xterm_io_h
35d522f475Smrg
36d522f475Smrg#include <xterm.h>
37d522f475Smrg
38d522f475Smrg/*
39d522f475Smrg * System-specific definitions (keep these chunks one-per-system!).
40d522f475Smrg *
41d522f475Smrg * FIXME:  some, such as those defining USE_TERMIOS should be moved to xterm.h
42d522f475Smrg * as they are integrated with the configure script.
43d522f475Smrg */
4401037d57Smrg#if defined(__minix)
4501037d57Smrg#define USE_POSIX_TERMIOS 1
4601037d57Smrg#undef HAVE_POSIX_OPENPT	/* present, does not work */
4701037d57Smrg#endif
4801037d57Smrg
49d522f475Smrg#ifdef CSRG_BASED
50d522f475Smrg#define USE_TERMIOS
51d522f475Smrg#endif
52d522f475Smrg
53d522f475Smrg#ifdef __CYGWIN__
54d522f475Smrg#define ATT
55d522f475Smrg#define SVR4
56d522f475Smrg#define SYSV
57d522f475Smrg#define USE_SYSV_TERMIO
58d522f475Smrg#endif
59d522f475Smrg
60e39b573cSmrg#if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__INTERIX) || defined(__APPLE__) || defined(__UNIXWARE__) || defined(__hpux)
61d522f475Smrg#ifndef USE_POSIX_TERMIOS
62d522f475Smrg#define USE_POSIX_TERMIOS
63d522f475Smrg#endif
64d522f475Smrg#endif
65d522f475Smrg
66d522f475Smrg#if defined(AIXV4)
67d522f475Smrg#define USE_POSIX_TERMIOS
68d522f475Smrg#ifndef SYSV
69d522f475Smrg#define SYSV
70d522f475Smrg#endif
71d522f475Smrg#endif
72d522f475Smrg
7304b94745Smrg#ifdef __linux__
74d522f475Smrg#define USE_TERMIOS
75f2e35a3aSmrg#define HAVE_POSIX_OPENPT 1
76f2e35a3aSmrg#define HAVE_PTSNAME 1
77f2e35a3aSmrg#define HAVE_GRANTPT_PTY_ISATTY 1
78d522f475Smrg#endif
79d522f475Smrg
80d522f475Smrg#ifdef __SCO__
81d522f475Smrg#define USE_TERMIOS
82d522f475Smrg#ifndef _SVID3
83d522f475Smrg#define _SVID3
84d522f475Smrg#endif
85d522f475Smrg#endif
86d522f475Smrg
87d522f475Smrg#ifdef Lynx
88d522f475Smrg#define USE_SYSV_TERMIO
89d522f475Smrg#endif
90d522f475Smrg
91d522f475Smrg#ifdef macII
92d522f475Smrg#undef SYSV			/* pretend to be bsd (sgtty.h) */
93d522f475Smrg#endif /* macII */
94d522f475Smrg
95f2e35a3aSmrg#ifdef __GNU__
96f2e35a3aSmrg#define USE_POSIX_TERMIOS
97f2e35a3aSmrg#define HAVE_POSIX_OPENPT 1
98f2e35a3aSmrg#define HAVE_PTSNAME 1
99f2e35a3aSmrg#define HAVE_GRANTPT_PTY_ISATTY 1
100f2e35a3aSmrg#endif
101f2e35a3aSmrg
10204b94745Smrg#if defined(__GLIBC__) && !(defined(__linux__) || defined(__GNU__))
103f2e35a3aSmrg#define USE_POSIX_TERMIOS	/* GNU/KFreeBSD and GNU/KNetBSD */
104d522f475Smrg#endif
105d522f475Smrg
106d522f475Smrg#ifdef __QNX__
107d522f475Smrg#define USE_POSIX_TERMIOS
108d522f475Smrg#endif
109d522f475Smrg
110d522f475Smrg#if defined(__osf__)
111d522f475Smrg#define USE_POSIX_TERMIOS
112d522f475Smrg#undef SYSV
113d522f475Smrg#endif
114d522f475Smrg
115d522f475Smrg/*
116d522f475Smrg * Indirect system dependencies
117d522f475Smrg */
118d522f475Smrg#if defined(SVR4) && !defined(__sgi)
119d522f475Smrg#define USE_TERMIOS
120d522f475Smrg#endif
121d522f475Smrg
122d522f475Smrg#ifdef SYSV
123d522f475Smrg#define USE_SYSV_TERMIO
124d522f475Smrg#endif
125d522f475Smrg
126d522f475Smrg#if defined(USE_POSIX_TERMIOS) && !defined(USE_TERMIOS)
127d522f475Smrg#define USE_TERMIOS
128d522f475Smrg#endif
129d522f475Smrg
130d522f475Smrg/*
131d522f475Smrg * Low-level ioctl, where it is needed or non-conflicting with termio/etc.
132d522f475Smrg */
133d522f475Smrg#ifdef __QNX__
134d522f475Smrg#include <ioctl.h>
135d522f475Smrg#else
136d522f475Smrg#include <sys/ioctl.h>
137d522f475Smrg#endif
138d522f475Smrg
139d522f475Smrg/*
140d522f475Smrg * Terminal I/O includes (termio, termios, sgtty headers).
141d522f475Smrg */
142e39b573cSmrg#if defined(USE_POSIX_TERMIOS) && !defined(__hpux)
143d522f475Smrg#include <termios.h>
144d522f475Smrg#elif defined(USE_TERMIOS)
145d522f475Smrg#include <termios.h>
146d522f475Smrg/* this hacked termios support only works on SYSV */
147d522f475Smrg#define USE_ANY_SYSV_TERMIO
148d522f475Smrg#define termio termios
149d522f475Smrg#ifndef __CYGWIN__
150d522f475Smrg#undef  TCGETA
151d522f475Smrg#define TCGETA TCGETS
152d522f475Smrg#undef  TCSETA
153d522f475Smrg#define TCSETA TCSETS
154d522f475Smrg#undef  TCSETAW
155d522f475Smrg#define TCSETAW TCSETSW
156d522f475Smrg#endif
157d522f475Smrg#elif defined(USE_SYSV_TERMIO)
158d522f475Smrg# define USE_ANY_SYSV_TERMIO
159d522f475Smrg# ifdef Lynx
160d522f475Smrg#  include <termio.h>
161d522f475Smrg# else
162d522f475Smrg#  include <sys/termio.h>
163d522f475Smrg# endif
164d522f475Smrg#elif defined(SYSV) || defined(ISC)
165d522f475Smrg# include <sys/termio.h>
166d522f475Smrg#endif /* USE_POSIX_TERMIOS */
167d522f475Smrg
168d522f475Smrg/*
169d522f475Smrg * Stream includes, which declare struct winsize or ttysize.
170d522f475Smrg */
171d522f475Smrg#ifdef SYSV
172d522f475Smrg#ifdef USE_USG_PTYS
17301037d57Smrg#include <sys/stream.h>		/* get typedef used in ptem.h */
1740bd37d32Smrg#ifdef HAVE_SYS_PTEM_H
17501037d57Smrg#include <sys/ptem.h>		/* get struct winsize */
176d522f475Smrg#endif
177d522f475Smrg#endif /* USE_USG_PTYS */
178d522f475Smrg#endif /* SYSV */
179d522f475Smrg
180d522f475Smrg/*
181d522f475Smrg * Special cases (structures and definitions that have to be adjusted).
182d522f475Smrg */
183d522f475Smrg#if defined(__CYGWIN__) && !defined(TIOCSPGRP)
184d522f475Smrg#include <termios.h>
185d522f475Smrg#define TIOCSPGRP (_IOW('t', 118, pid_t))
186d522f475Smrg#endif
187d522f475Smrg
188d522f475Smrg#ifdef __hpux
189d522f475Smrg#include <sys/bsdtty.h>		/* defines TIOCSLTC */
190d522f475Smrg#endif
191d522f475Smrg
192d522f475Smrg#ifdef ISC
193d522f475Smrg#define TIOCGPGRP TCGETPGRP
194d522f475Smrg#define TIOCSPGRP TCSETPGRP
195d522f475Smrg#endif
196d522f475Smrg
197d522f475Smrg#ifdef Lynx
198d522f475Smrg#include <resource.h>
1995104ee6eSmrg#elif !(defined(SYSV) || defined(__linux__) || (defined(__QNX__)&&!defined(__QNXNTO__)))
200d522f475Smrg#include <sys/resource.h>
201d522f475Smrg#endif
202d522f475Smrg
203d522f475Smrg#ifdef macII
204d522f475Smrg#undef FIOCLEX
205d522f475Smrg#undef FIONCLEX
206d522f475Smrg#endif /* macII */
207d522f475Smrg
2085104ee6eSmrg#if defined(__QNX__) || defined(__GNU__) || defined(__osf__)
209d522f475Smrg#undef TIOCSLTC			/* <sgtty.h> conflicts with <termios.h> */
210d522f475Smrg#undef TIOCSLTC
211d522f475Smrg#endif
212d522f475Smrg
213d522f475Smrg#if defined (__sgi) || (defined(__linux__) && defined(__sparc__)) || defined(__UNIXWARE__)
214f2e35a3aSmrg#undef TIOCLSET			/* defined, but not usable */
215d522f475Smrg#endif
216d522f475Smrg
217d522f475Smrg#if defined(sun) || defined(__UNIXWARE__)
218d522f475Smrg#include <sys/filio.h>
219d522f475Smrg#endif
220d522f475Smrg
2215104ee6eSmrg#if defined(TIOCSLTC) && ! (defined(__linux__) || defined(Lynx) || defined(SVR4))
222d522f475Smrg#define HAS_LTCHARS
223d522f475Smrg#endif
224d522f475Smrg
225d522f475Smrg#if !defined(TTYSIZE_STRUCT)
2260bd37d32Smrg#if defined(TIOCSWINSZ)
227d522f475Smrg#define USE_STRUCT_WINSIZE 1
228d522f475Smrg#define TTYSIZE_STRUCT struct winsize
2290bd37d32Smrg#define GET_TTYSIZE(fd, data) ioctl(fd, TIOCGWINSZ, (char *) &data)
230d522f475Smrg#define SET_TTYSIZE(fd, data) ioctl(fd, TIOCSWINSZ, (char *) &data)
231d522f475Smrg#define TTYSIZE_COLS(data) data.ws_col
232d522f475Smrg#define TTYSIZE_ROWS(data) data.ws_row
2330bd37d32Smrg#endif /* TIOCSWINSZ */
2340bd37d32Smrg#endif /* TTYSIZE_STRUCT */
2350bd37d32Smrg
2360bd37d32Smrg#ifndef USE_STRUCT_WINSIZE
2370bd37d32Smrg#error "There is a configuration error with struct winsize ifdef"
2380bd37d32Smrg#endif
2390bd37d32Smrg
240913cc679Smrg/* "resize" depends upon order of assignments in this macro */
241913cc679Smrg#ifdef USE_STRUCT_WINSIZE
242913cc679Smrg#define setup_winsize(ts, rows, cols, height, width) \
243913cc679Smrg    (ts).ws_xpixel = (ttySize_t) (width), \
244913cc679Smrg    (ts).ws_ypixel = (ttySize_t) (height), \
245913cc679Smrg    TTYSIZE_ROWS(ts) = (ttySize_t) (rows), \
246913cc679Smrg    TTYSIZE_COLS(ts) = (ttySize_t) (cols)
247913cc679Smrg#else
248913cc679Smrg#define setup_winsize(ts, rows, cols, height, width) \
249913cc679Smrg    TTYSIZE_ROWS(ts) = (ttySize_t) (rows), \
250913cc679Smrg    TTYSIZE_COLS(ts) = (ttySize_t) (cols)
251913cc679Smrg#endif
252913cc679Smrg
2530bd37d32Smrg#if OPT_TRACE
254913cc679Smrg
255913cc679Smrg#ifdef USE_STRUCT_WINSIZE
256913cc679Smrg#define trace_winsize(ts, id) \
257913cc679Smrg    TRACE(("%s@%d, TTYSIZE %s chars %dx%d pixels %dx%d\n", \
258913cc679Smrg    	   __FILE__, __LINE__, id, \
259913cc679Smrg	   TTYSIZE_ROWS(ts), TTYSIZE_COLS(ts), (ts).ws_ypixel, (ts).ws_xpixel))
260913cc679Smrg#else
261913cc679Smrg#define trace_winsize(ts, id) \
262913cc679Smrg    TRACE(("%s@%d, TTYSIZE %s chars %dx%d\n", __FILE__, __LINE__, id, \
263913cc679Smrg    	   TTYSIZE_ROWS(ts), TTYSIZE_COLS(ts)))
264913cc679Smrg#endif
265913cc679Smrg
266913cc679Smrg#define TRACE_GET_TTYSIZE(fd, id) { \
2670bd37d32Smrg	    TTYSIZE_STRUCT debug_ttysize; \
2680bd37d32Smrg	    if (GET_TTYSIZE(fd, debug_ttysize) == 0) \
269913cc679Smrg		trace_winsize(debug_ttysize, id); \
2700bd37d32Smrg	    else \
2710bd37d32Smrg		TRACE(("%s@%d, TTYSIZE failed %s\n", __FILE__, __LINE__, strerror(errno))); \
2720bd37d32Smrg	}
2730bd37d32Smrg#else
274913cc679Smrg#define trace_winsize(ts, id)	/* nothing */
275913cc679Smrg#define TRACE_GET_TTYSIZE(fd, id)	/* nothing */
276d522f475Smrg#endif
277d522f475Smrg
27820d2c4d2Smrgtypedef unsigned short ttySize_t;
27920d2c4d2Smrg
28004b94745Smrg#ifdef USE_ANY_SYSV_TERMIO
28104b94745Smrg#define TERMIO_STRUCT struct termio
28204b94745Smrg#define ttySetAttr(fd, datap) ioctl(fd, TCSETA, datap)
28304b94745Smrg#define ttyGetAttr(fd, datap) ioctl(fd, TCGETA, datap)
28404b94745Smrg#define ttyFlush(fd)          ioctl(fd, TCFLSH, 1)
28504b94745Smrg#elif defined(USE_POSIX_TERMIOS)
28604b94745Smrg#define TERMIO_STRUCT struct termios
28704b94745Smrg#define ttySetAttr(fd, datap) tcsetattr(fd, TCSANOW, datap)
28804b94745Smrg#define ttyGetAttr(fd, datap) tcgetattr(fd, datap)
28904b94745Smrg#define ttyFlush(fd)          tcflush(fd, TCOFLUSH)
29004b94745Smrg#else
29104b94745Smrg#error Neither termio or termios is enabled
29204b94745Smrg#endif /* USE_ANY_SYSV_TERMIO */
29304b94745Smrg
294913cc679Smrg#endif /* included_xterm_io_h */
295