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