XEmacs 21.2-b1
[chise/xemacs-chise.git.1] / src / systty.h
1 /* systty.h - System-dependent definitions for terminals.
2    Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
3
4 This file is part of XEmacs.
5
6 XEmacs is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
9 later version.
10
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with XEmacs; see the file COPYING.  If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21 /* Synched up with: FSF 19.30. */
22
23 #ifndef _XEMACS_SYSTTY_H_
24 #define _XEMACS_SYSTTY_H_
25
26 #ifdef HAVE_TERMIOS
27 # define HAVE_TCATTR
28 #endif
29
30 /* If we defined these before and we are about to redefine them,
31    prevent alarming warnings.  */
32 #ifdef BSD_TERMIOS
33 #undef NL0
34 #undef NL1
35 #undef CR0
36 #undef CR1
37 #undef CR2
38 #undef CR3
39 #undef TAB0
40 #undef TAB1
41 #undef TAB2
42 #undef XTABS
43 #undef BS0
44 #undef BS1
45 #undef FF0
46 #undef FF1
47 #undef ECHO
48 #undef NOFLSH
49 #undef TOSTOP
50 #undef FLUSHO
51 #undef PENDIN
52 #endif
53 \f
54 /* Include the proper files.  */
55
56 /* XEmacs: TERMIOS is mo' better than TERMIO so we use it if it's
57    there.  Since TERMIO is backward-compatibility stuff if both it
58    and TERMIOS exist, it's more likely to be broken. */
59
60 #if defined (HAVE_TERMIOS)
61
62 /*****     (1) The TERMIOS way (POSIX style)     *****/
63
64 # if defined (_AIX) && defined (_I386)
65 #  include <termios.h>          /* termios.h needs to be before termio.h */
66 #  include <termio.h>
67 # else
68 #  if !defined (NO_TERMIO)
69 #   include <termio.h>
70 #  endif
71 #  include <termios.h>
72 # endif /* _AIX && _I386 */
73 # ifndef INCLUDED_FCNTL
74 #  define INCLUDED_FCNTL
75 #  include <fcntl.h>
76 # endif
77
78 #elif defined (HAVE_TERMIO)
79
80 /*****    (2) The TERMIO way (system V style)    *****/
81
82 # ifdef __DGUX
83 #  include <sys/ioctl.h>
84 # endif
85 # ifndef NO_TERMIO
86 #  include <termio.h>
87 # endif /* not NO_TERMIO */
88 # ifndef INCLUDED_FCNTL
89 #  define INCLUDED_FCNTL
90 #  include <fcntl.h>
91 # endif
92
93 #elif defined (DOS_NT)
94
95 /*****             (3) The MSDOS/NT way              *****/
96
97 /* Nothing doing */
98
99 #else
100
101 /*****              (4) The BSD way              *****/
102
103 # ifdef linux /* XEmacs addition -- necessary? */
104 #  include <bsd/sgtty.h>
105 # else
106 #  include <sgtty.h>
107 # endif
108
109
110 #endif /* HAVE_TERMIOS */
111
112 /* XEmacs: I don't think we need the following crap. */
113 #ifdef __GNU_LIBRARY__
114 #include <termios.h>
115 #endif
116
117 /* Formerly there was a conditional that included sys/filio.h if
118    USG5_4 was defined, but this is already included in s/usg5-4.h */
119
120 /* Generally useful to include this file: */
121
122 /* But Sun OS has broken include files and doesn't want it included */
123 #if !defined (DOS_NT) && !defined (WIN32) && !defined (SUNOS4)
124 # include <sys/ioctl.h>
125 #endif
126 /* UNIPLUS systems may have FIONREAD.  */
127 #ifdef UNIPLUS
128 #include <sys.ioctl.h>
129 #endif
130
131 \f
132 /* ----------------------------------------------------- */
133 /*                 miscellaneous includes                */
134 /* ----------------------------------------------------- */
135
136 #ifdef AIXHFT
137 /* Get files for keyboard remapping */
138 #define HFNKEYS 2
139 #include <sys/hft.h>
140 #include <sys/devinfo.h>
141 #endif
142
143 /* XEmacs: We don't support BSD 4.1 any more */
144
145 #ifdef NEED_BSDTTY
146 #include <sys/bsdtty.h>
147 #endif
148
149 /* Include files for PTY's */
150
151 #if defined (HPUX) && defined (HAVE_PTYS)
152 #include <sys/ptyio.h>
153 #endif
154
155 #ifdef AIX
156 #include <sys/pty.h>
157 #endif /* AIX */
158
159 #ifdef SYSV_PTYS
160 # include <sys/types.h>
161 # include <sys/tty.h>
162 # ifdef titan
163 #  include <sys/ttyhw.h>
164 #  include <sys/stream.h>
165 # endif
166 # ifndef NO_PTY_H
167 #  include <sys/pty.h>
168 # endif
169 #endif
170
171 /* XEmacs: removed some random if defined (pfa) crap for FASYNC (SIGIO).
172    We've cleaned SIGIO up. */
173
174 \f
175 /* ----------------------------------------------------- */
176 /*           inhibiting particular features              */
177 /* ----------------------------------------------------- */
178
179
180 #ifdef APOLLO
181 #undef TIOCSTART
182 #endif
183
184 #if defined (XENIX) || defined (BROKEN_TIOCGETC)
185 #undef TIOCGETC  /* Avoid confusing some conditionals that test this.  */
186 #endif
187
188 /* XEmacs: SIGIO is cleaned up so we remove the crap here that messes
189    with it (and FIONREAD and FASYNC, which are related). */
190
191 #ifdef BROKEN_TIOCGWINSZ /* XEmacs addition */
192 #undef TIOCGWINSZ
193 #undef TIOCSWINSZ
194 #endif
195
196 #ifdef BROKEN_O_NONBLOCK /* XEmacs addition */
197 # undef O_NONBLOCK
198 #endif /* BROKEN_O_NONBLOCK */
199
200 /* On TERMIOS systems, the tcmumbleattr calls take care of these
201    parameters, and it's a bad idea to use them (on AIX, it makes the
202    tty hang for a long time).  */
203 #if defined (TIOCGLTC) && !defined (HAVE_TERMIOS)
204 #define HAVE_LTCHARS
205 #endif
206
207 #if defined (TIOCGETC) && !defined (HAVE_TERMIOS)
208 #define HAVE_TCHARS
209 #endif
210
211 \f
212 /* ----------------------------------------------------- */
213 /*             disabling terminal functions              */
214 /* ----------------------------------------------------- */
215
216 /* Try to establish the correct character to disable terminal functions
217    in a system-independent manner.  Note that USG (at least) define
218    _POSIX_VDISABLE as 0!  */
219
220 #ifdef _POSIX_VDISABLE
221 #define CDISABLE _POSIX_VDISABLE
222 #else /* not _POSIX_VDISABLE */
223 #ifdef CDEL
224 #undef CDISABLE
225 #define CDISABLE CDEL
226 #else /* not CDEL */
227 #define CDISABLE 255
228 #endif /* not CDEL */
229 #endif /* not _POSIX_VDISABLE */
230
231 \f
232 /* ----------------------------------------------------- */
233 /*    Get the number of characters queued for output     */
234 /* ----------------------------------------------------- */
235
236 /* EMACS_OUTQSIZE(FD, int *SIZE) stores the number of characters
237    queued for output to the terminal FD in *SIZE, if FD is a tty.
238    Returns -1 if there was an error (i.e. FD is not a tty), 0
239    otherwise.  */
240 #ifdef TIOCOUTQ
241 #define EMACS_OUTQSIZE(fd, size) ioctl (fd, TIOCOUTQ, size)
242 #endif
243
244 #ifdef HAVE_TERMIO
245 #ifdef TCOUTQ
246 #undef EMACS_OUTQSIZE
247 #define EMACS_OUTQSIZE(fd, size) ioctl (fd, TCOUTQ, size)
248 #endif
249 #endif
250
251 \f
252 /* -------------------------------------------------------------------- */
253 /*       Manipulate a terminal's current (foreground) process group     */
254 /* -------------------------------------------------------------------- */
255
256 /* EMACS_HAVE_TTY_PGRP is true if we can get and set the tty's current
257    controlling process group.
258
259    EMACS_GET_TTY_PGRP(int FD, int *PGID) sets *PGID the terminal FD's
260    current process group.  Return -1 if there is an error.
261
262    EMACS_SET_TTY_PGRP(int FD, int *PGID) sets the terminal FD's
263    current process group to *PGID.  Return -1 if there is an error.  */
264
265 /* HPUX tty process group stuff doesn't work, says the anonymous voice
266    from the past.  */
267 /* But HPUX people say it does, so I've removed it.  --ben */
268 # ifdef TIOCGPGRP
269 #  define EMACS_HAVE_TTY_PGRP
270 # else
271 #  ifdef HAVE_TERMIOS
272 #   define EMACS_HAVE_TTY_PGRP
273 #  endif
274 # endif
275
276 #ifdef EMACS_HAVE_TTY_PGRP
277
278 #if defined (HAVE_TERMIOS) && ! defined (BSD_TERMIOS)
279
280 /* Resist the urge to insert needless extra parentheses. */
281 #define EMACS_GET_TTY_PGRP(fd, pgid) (*(pgid) = tcgetpgrp (fd))
282 #define EMACS_SET_TTY_PGRP(fd, pgid) tcsetpgrp (fd, *(pgid))
283
284 #elif defined (TIOCSPGRP)
285
286 #define EMACS_GET_TTY_PGRP(fd, pgid) (ioctl ((fd), TIOCGPGRP, (pgid)))
287 #define EMACS_SET_TTY_PGRP(fd, pgid) (ioctl ((fd), TIOCSPGRP, (pgid)))
288
289 #endif
290
291 #endif /* EMACS_HAVE_TTY_PGRP */
292
293 #ifndef EMACS_GET_TTY_PGRP
294
295 /* Just ignore this for now and hope for the best */
296 #define EMACS_GET_TTY_PGRP(fd, pgid) 0
297 #define EMACS_SET_TTY_PGRP(fd, pgif) 0
298
299 #endif
300
301 /* XEmacs interim backward-compatibility */
302 #define EMACS_GET_TTY_PROCESS_GROUP EMACS_GET_TTY_PGRP
303 #define EMACS_SET_TTY_PROCESS_GROUP EMACS_SET_TTY_PGRP
304
305 /* EMACS_GETPGRP (arg) returns the process group of the terminal.  */
306
307 #ifdef GETPGRP_VOID
308 #define EMACS_GETPGRP(x) getpgrp()
309 #else
310 #define EMACS_GETPGRP(x) getpgrp(x)
311 #endif /* GETPGRP_VOID */
312
313 /* XEmacs backward-compatibility.  Is 0 always a reasonable argument? */
314 #define EMACS_GET_PROCESS_GROUP() EMACS_GETPGRP (0)
315
316 /* XEmacs addition? */
317
318 /* EMACS_SEPARATE_PROCESS_GROUP () creates a separate process group for the
319    running process. */
320
321 /* EMACS_SET_PROCESS_GROUP () sets our process group as specified. */
322
323 /* POSIX calls for setpgid(), so we use it if it's available.
324    Otherwise use setpgrp(), in USG or BSD flavor.  Note that
325    on newer systems, setpgrp() has unwanted effects (e.g.
326    creating a new session), so we want to avoid its use
327    if possible.
328
329    NOTE: On some older systems, we should consider using setpgrp2()
330    if it exists.  This is sufficiently rare, though, that there
331    seems no point in autodetecting it.  Currently dgux.h is the
332    only place where this has to be munged. */
333
334 #if defined (HAVE_SETPGID)
335 #  define EMACS_SEPARATE_PROCESS_GROUP() setpgid (0, 0)
336 #  define EMACS_SET_PROCESS_GROUP(pg) setpgid (0, pg)
337 #elif defined (USG)
338 #  define EMACS_SEPARATE_PROCESS_GROUP() setpgrp ()
339 /* old (pre-SVR4) USG's don't provide any way to do this.
340    No big loss -- it just means that ^Z won't work right
341    if we're run from sh. */
342 #  define EMACS_SET_PROCESS_GROUP(pg)
343 #else
344 /* Under NeXTstep, a process group of 0 is not the same as specifying
345    your own process ID, so we go ahead and specify it explicitly. */
346 #  define EMACS_SEPARATE_PROCESS_GROUP() setpgrp (0, getpid ())
347 #  define EMACS_SET_PROCESS_GROUP(pg) setpgrp (0, pg)
348 #endif
349
350 \f
351 /* --------------------------------------------------------- */
352 /*   Manipulate a TTY's input/output processing parameters   */
353 /* --------------------------------------------------------- */
354
355 /* struct emacs_tty is a structure used to hold the current tty
356    parameters.  If the terminal has several structures describing its
357    state, for example a struct tchars, a struct sgttyb, a struct
358    tchars, a struct ltchars, and a struct pagechars, struct
359    emacs_tty should contain an element for each parameter struct
360    that Emacs may change.
361
362    EMACS_GET_TTY (int FD, struct emacs_tty *P) stores the parameters
363    of the tty on FD in *P.  Return zero if all's well, or -1 if we ran
364    into an error we couldn't deal with.
365
366    EMACS_SET_TTY (int FD, struct emacs_tty *P, int flushp)
367    sets the parameters of the tty on FD according to the contents of
368    *P.  If flushp is non-zero, we discard queued input to be
369    written before making the change.
370    Return 0 if all went well, and -1 if anything failed.
371
372    EMACS_TTY_TABS_OK (struct emacs_tty *P) is false iff the kernel
373    expands tabs to spaces upon output; in that case, there is no
374    advantage to using tabs over spaces.  */
375
376
377 /* For each tty parameter structure that Emacs might want to save and restore,
378    - include an element for it in this structure, and
379    - extend the emacs_{get,set}_tty functions in sysdep.c to deal with the
380      new members.  */
381
382 struct emacs_tty {
383
384 /* There is always one of the following elements, so there is no need
385    for dummy get and set definitions.  */
386 #ifdef HAVE_TCATTR
387   struct termios main;
388 #else /* !HAVE_TCATTR */
389 #ifdef HAVE_TERMIO
390   struct termio main;
391 #else /* !HAVE_TERMIO */
392 #ifdef DOS_NT
393   int main;
394 #else  /* not DOS_NT */
395   struct sgttyb main;
396 #endif /* not DOS_NT */
397 #endif /* !HAVE_TERMIO */
398 #endif /* !HAVE_TCATTR */
399
400 /* If we have TERMIOS, we don't need to do this - they're taken care of
401    by the tc*attr calls.  */
402 #ifndef HAVE_TERMIOS
403 #ifdef HAVE_LTCHARS
404   struct ltchars ltchars;
405 #endif /* HAVE_LTCHARS */
406
407 #ifdef HAVE_TCHARS
408   struct tchars tchars;
409   int lmode;
410 #endif /* HAVE_TCHARS */
411 #endif /* HAVE_TERMIOS */
412 };
413 \f
414 /* Define EMACS_GET_TTY and EMACS_SET_TTY,
415    the macros for reading and setting parts of `struct emacs_tty'.
416
417    These got pretty unmanageable (huge macros are hard to debug), and
418    finally needed some code which couldn't be done as part of an
419    expression, so we moved them out to their own functions in sysdep.c.  */
420 #define EMACS_GET_TTY(fd, p)        emacs_get_tty (fd, p)
421 #define EMACS_SET_TTY(fd, p, waitp) emacs_set_tty (fd, p, waitp)
422
423 \f
424 /* --------------------------------------------------------- */
425 /*                Define EMACS_TTY_TABS_OK                   */
426 /* --------------------------------------------------------- */
427
428 #ifdef HAVE_TERMIOS
429
430 #ifdef TABDLY
431 #define EMACS_TTY_TABS_OK(p) (((p)->main.c_oflag & TABDLY) != TAB3)
432 #else
433 #define EMACS_TTY_TABS_OK(p) 1
434 #endif /* TABDLY */
435
436 #else /* not def HAVE_TERMIOS */
437 #ifdef HAVE_TERMIO
438
439 #define EMACS_TTY_TABS_OK(p) (((p)->main.c_oflag & TABDLY) != TAB3)
440
441 #else /* neither HAVE_TERMIO nor HAVE_TERMIOS */
442 #ifdef DOS_NT
443 #define EMACS_TTY_TABS_OK(p) 0
444 #else /* not DOS_NT */
445 #define EMACS_TTY_TABS_OK(p) (((p)->main.sg_flags & XTABS) != XTABS)
446 #endif /* not DOS_NT */
447
448 #endif /* not def HAVE_TERMIO */
449 #endif /* not def HAVE_TERMIOS */
450
451 #endif /* _XEMACS_SYSTTY_H_ */