xterm_io.h revision 04b94745
104b94745Smrg/* $XTermId: xterm_io.h,v 1.69 2024/05/03 23:32:26 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 __MVS__ 107d522f475Smrg#define SVR4 108d522f475Smrg#define USE_POSIX_TERMIOS 109d522f475Smrg#endif 110d522f475Smrg 111d522f475Smrg#ifdef __QNX__ 112d522f475Smrg#define USE_POSIX_TERMIOS 113d522f475Smrg#endif 114d522f475Smrg 115d522f475Smrg#if defined(__osf__) 116d522f475Smrg#define USE_POSIX_TERMIOS 117d522f475Smrg#undef SYSV 118d522f475Smrg#endif 119d522f475Smrg 120d522f475Smrg/* 121d522f475Smrg * Indirect system dependencies 122d522f475Smrg */ 123d522f475Smrg#if defined(SVR4) && !defined(__sgi) 124d522f475Smrg#define USE_TERMIOS 125d522f475Smrg#endif 126d522f475Smrg 127d522f475Smrg#ifdef SYSV 128d522f475Smrg#define USE_SYSV_TERMIO 129d522f475Smrg#endif 130d522f475Smrg 131d522f475Smrg#if defined(USE_POSIX_TERMIOS) && !defined(USE_TERMIOS) 132d522f475Smrg#define USE_TERMIOS 133d522f475Smrg#endif 134d522f475Smrg 135d522f475Smrg/* 136d522f475Smrg * Low-level ioctl, where it is needed or non-conflicting with termio/etc. 137d522f475Smrg */ 138d522f475Smrg#ifdef __QNX__ 139d522f475Smrg#include <ioctl.h> 140d522f475Smrg#else 141d522f475Smrg#include <sys/ioctl.h> 142d522f475Smrg#endif 143d522f475Smrg 144d522f475Smrg/* 145d522f475Smrg * Terminal I/O includes (termio, termios, sgtty headers). 146d522f475Smrg */ 147e39b573cSmrg#if defined(USE_POSIX_TERMIOS) && !defined(__hpux) 148d522f475Smrg#include <termios.h> 149d522f475Smrg#elif defined(USE_TERMIOS) 150d522f475Smrg#include <termios.h> 151d522f475Smrg/* this hacked termios support only works on SYSV */ 152d522f475Smrg#define USE_ANY_SYSV_TERMIO 153d522f475Smrg#define termio termios 154d522f475Smrg#ifndef __CYGWIN__ 155d522f475Smrg#undef TCGETA 156d522f475Smrg#define TCGETA TCGETS 157d522f475Smrg#undef TCSETA 158d522f475Smrg#define TCSETA TCSETS 159d522f475Smrg#undef TCSETAW 160d522f475Smrg#define TCSETAW TCSETSW 161d522f475Smrg#endif 162d522f475Smrg#elif defined(USE_SYSV_TERMIO) 163d522f475Smrg# define USE_ANY_SYSV_TERMIO 164d522f475Smrg# ifdef Lynx 165d522f475Smrg# include <termio.h> 166d522f475Smrg# else 167d522f475Smrg# include <sys/termio.h> 168d522f475Smrg# endif 169d522f475Smrg#elif defined(SYSV) || defined(ISC) 170d522f475Smrg# include <sys/termio.h> 171d522f475Smrg#elif !defined(VMS) 172d522f475Smrg# include <sgtty.h> 173d522f475Smrg#endif /* USE_POSIX_TERMIOS */ 174d522f475Smrg 175d522f475Smrg/* 176d522f475Smrg * Stream includes, which declare struct winsize or ttysize. 177d522f475Smrg */ 178d522f475Smrg#ifdef SYSV 179d522f475Smrg#ifdef USE_USG_PTYS 18001037d57Smrg#include <sys/stream.h> /* get typedef used in ptem.h */ 1810bd37d32Smrg#ifdef HAVE_SYS_PTEM_H 18201037d57Smrg#include <sys/ptem.h> /* get struct winsize */ 183d522f475Smrg#endif 184d522f475Smrg#endif /* USE_USG_PTYS */ 185d522f475Smrg#endif /* SYSV */ 186d522f475Smrg 187d522f475Smrg/* 188d522f475Smrg * Special cases (structures and definitions that have to be adjusted). 189d522f475Smrg */ 190d522f475Smrg#if defined(__CYGWIN__) && !defined(TIOCSPGRP) 191d522f475Smrg#include <termios.h> 192d522f475Smrg#define TIOCSPGRP (_IOW('t', 118, pid_t)) 193d522f475Smrg#endif 194d522f475Smrg 195d522f475Smrg#ifdef __hpux 196d522f475Smrg#include <sys/bsdtty.h> /* defines TIOCSLTC */ 197d522f475Smrg#endif 198d522f475Smrg 199d522f475Smrg#ifdef ISC 200d522f475Smrg#define TIOCGPGRP TCGETPGRP 201d522f475Smrg#define TIOCSPGRP TCSETPGRP 202d522f475Smrg#endif 203d522f475Smrg 204d522f475Smrg#ifdef Lynx 205d522f475Smrg#include <resource.h> 20604b94745Smrg#elif !(defined(SYSV) || defined(__linux__) || defined(VMS) || (defined(__QNX__)&&!defined(__QNXNTO__))) 207d522f475Smrg#include <sys/resource.h> 208d522f475Smrg#endif 209d522f475Smrg 210d522f475Smrg#ifdef macII 211d522f475Smrg#undef FIOCLEX 212d522f475Smrg#undef FIONCLEX 213d522f475Smrg#endif /* macII */ 214d522f475Smrg 215913cc679Smrg#if defined(__QNX__) || defined(__GNU__) || defined(__MVS__) || defined(__osf__) 216d522f475Smrg#undef TIOCSLTC /* <sgtty.h> conflicts with <termios.h> */ 217d522f475Smrg#undef TIOCSLTC 218d522f475Smrg#endif 219d522f475Smrg 220d522f475Smrg#if defined (__sgi) || (defined(__linux__) && defined(__sparc__)) || defined(__UNIXWARE__) 221f2e35a3aSmrg#undef TIOCLSET /* defined, but not usable */ 222d522f475Smrg#endif 223d522f475Smrg 224d522f475Smrg#if defined(sun) || defined(__UNIXWARE__) 225d522f475Smrg#include <sys/filio.h> 226d522f475Smrg#endif 227d522f475Smrg 22804b94745Smrg#if defined(TIOCSLTC) && ! (defined(__linux__) || defined(__MVS__) || defined(Lynx) || defined(SVR4)) 229d522f475Smrg#define HAS_LTCHARS 230d522f475Smrg#endif 231d522f475Smrg 232d522f475Smrg#if !defined(TTYSIZE_STRUCT) 2330bd37d32Smrg#if defined(TIOCSWINSZ) 234d522f475Smrg#define USE_STRUCT_WINSIZE 1 235d522f475Smrg#define TTYSIZE_STRUCT struct winsize 2360bd37d32Smrg#define GET_TTYSIZE(fd, data) ioctl(fd, TIOCGWINSZ, (char *) &data) 237d522f475Smrg#define SET_TTYSIZE(fd, data) ioctl(fd, TIOCSWINSZ, (char *) &data) 238d522f475Smrg#define TTYSIZE_COLS(data) data.ws_col 239d522f475Smrg#define TTYSIZE_ROWS(data) data.ws_row 2400bd37d32Smrg#endif /* TIOCSWINSZ */ 2410bd37d32Smrg#endif /* TTYSIZE_STRUCT */ 2420bd37d32Smrg 2430bd37d32Smrg#ifndef USE_STRUCT_WINSIZE 2440bd37d32Smrg#error "There is a configuration error with struct winsize ifdef" 2450bd37d32Smrg#endif 2460bd37d32Smrg 247913cc679Smrg/* "resize" depends upon order of assignments in this macro */ 248913cc679Smrg#ifdef USE_STRUCT_WINSIZE 249913cc679Smrg#define setup_winsize(ts, rows, cols, height, width) \ 250913cc679Smrg (ts).ws_xpixel = (ttySize_t) (width), \ 251913cc679Smrg (ts).ws_ypixel = (ttySize_t) (height), \ 252913cc679Smrg TTYSIZE_ROWS(ts) = (ttySize_t) (rows), \ 253913cc679Smrg TTYSIZE_COLS(ts) = (ttySize_t) (cols) 254913cc679Smrg#else 255913cc679Smrg#define setup_winsize(ts, rows, cols, height, width) \ 256913cc679Smrg TTYSIZE_ROWS(ts) = (ttySize_t) (rows), \ 257913cc679Smrg TTYSIZE_COLS(ts) = (ttySize_t) (cols) 258913cc679Smrg#endif 259913cc679Smrg 2600bd37d32Smrg#if OPT_TRACE 261913cc679Smrg 262913cc679Smrg#ifdef USE_STRUCT_WINSIZE 263913cc679Smrg#define trace_winsize(ts, id) \ 264913cc679Smrg TRACE(("%s@%d, TTYSIZE %s chars %dx%d pixels %dx%d\n", \ 265913cc679Smrg __FILE__, __LINE__, id, \ 266913cc679Smrg TTYSIZE_ROWS(ts), TTYSIZE_COLS(ts), (ts).ws_ypixel, (ts).ws_xpixel)) 267913cc679Smrg#else 268913cc679Smrg#define trace_winsize(ts, id) \ 269913cc679Smrg TRACE(("%s@%d, TTYSIZE %s chars %dx%d\n", __FILE__, __LINE__, id, \ 270913cc679Smrg TTYSIZE_ROWS(ts), TTYSIZE_COLS(ts))) 271913cc679Smrg#endif 272913cc679Smrg 273913cc679Smrg#define TRACE_GET_TTYSIZE(fd, id) { \ 2740bd37d32Smrg TTYSIZE_STRUCT debug_ttysize; \ 2750bd37d32Smrg if (GET_TTYSIZE(fd, debug_ttysize) == 0) \ 276913cc679Smrg trace_winsize(debug_ttysize, id); \ 2770bd37d32Smrg else \ 2780bd37d32Smrg TRACE(("%s@%d, TTYSIZE failed %s\n", __FILE__, __LINE__, strerror(errno))); \ 2790bd37d32Smrg } 2800bd37d32Smrg#else 281913cc679Smrg#define trace_winsize(ts, id) /* nothing */ 282913cc679Smrg#define TRACE_GET_TTYSIZE(fd, id) /* nothing */ 283d522f475Smrg#endif 284d522f475Smrg 28520d2c4d2Smrgtypedef unsigned short ttySize_t; 28620d2c4d2Smrg 28704b94745Smrg#ifdef USE_ANY_SYSV_TERMIO 28804b94745Smrg#define TERMIO_STRUCT struct termio 28904b94745Smrg#define ttySetAttr(fd, datap) ioctl(fd, TCSETA, datap) 29004b94745Smrg#define ttyGetAttr(fd, datap) ioctl(fd, TCGETA, datap) 29104b94745Smrg#define ttyFlush(fd) ioctl(fd, TCFLSH, 1) 29204b94745Smrg#elif defined(USE_POSIX_TERMIOS) 29304b94745Smrg#define TERMIO_STRUCT struct termios 29404b94745Smrg#define ttySetAttr(fd, datap) tcsetattr(fd, TCSANOW, datap) 29504b94745Smrg#define ttyGetAttr(fd, datap) tcgetattr(fd, datap) 29604b94745Smrg#define ttyFlush(fd) tcflush(fd, TCOFLUSH) 29704b94745Smrg#else 29804b94745Smrg#error Neither termio or termios is enabled 29904b94745Smrg#endif /* USE_ANY_SYSV_TERMIO */ 30004b94745Smrg 301913cc679Smrg#endif /* included_xterm_io_h */ 302