* lisp.h (struct Lisp_Symbol): Replace field "name" with a lisp
[bpt/emacs.git] / src / systty.h
CommitLineData
a04c9535 1/* systty.h - System-dependent definitions for terminals.
3a22ee35 2 Copyright (C) 1993, 1994 Free Software Foundation, Inc.
d0d6b7c5
JB
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
101adcb5 8the Free Software Foundation; either version 2, or (at your option)
d0d6b7c5
JB
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
3b7ad313
EN
18the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
d0d6b7c5 20
2182d459
RS
21#ifdef HAVE_TERMIOS
22#define HAVE_TCATTR
23#endif
7f6d476f
RS
24
25/* If we defined these before and we are about to redefine them,
26 prevent alarming warnings. */
27#ifdef BSD_TERMIOS
28#undef NL0
29#undef NL1
30#undef CR0
31#undef CR1
32#undef CR2
33#undef CR3
34#undef TAB0
35#undef TAB1
36#undef TAB2
37#undef XTABS
38#undef BS0
39#undef BS1
40#undef FF0
41#undef FF1
42#undef ECHO
43#undef NOFLSH
44#undef TOSTOP
45#undef FLUSHO
46#undef PENDIN
47#endif
d0d6b7c5
JB
48\f
49/* Include the proper files. */
50#ifdef HAVE_TERMIO
0674a1f9
JB
51#ifdef __DGUX
52#include <sys/ioctl.h>
53#endif
d2d846a3 54#ifndef NO_TERMIO
d0d6b7c5 55#include <termio.h>
d2d846a3 56#endif /* not NO_TERMIO */
92ea836d 57#ifndef INCLUDED_FCNTL
b65e3dd7 58#define INCLUDED_FCNTL
d0d6b7c5 59#include <fcntl.h>
92ea836d
RS
60#endif
61#else /* not HAVE_TERMIO */
d0d6b7c5 62#ifdef HAVE_TERMIOS
3580badc
RS
63#if defined(_AIX) && defined(_I386)
64#include <termios.h> /* termios.h needs to be before termio.h */
65#include <termio.h>
ab9ba9ea 66#else /* not (_AIX && _I386) */
c62e9958 67#ifndef NO_TERMIO
d0d6b7c5 68#include <termio.h>
c62e9958 69#endif
d0d6b7c5 70#include <termios.h>
ab9ba9ea 71#endif /* not (_AIX && _I386) */
b65e3dd7 72#define INCLUDED_FCNTL
1aaaff21 73#include <fcntl.h>
d0d6b7c5
JB
74#else /* neither HAVE_TERMIO nor HAVE_TERMIOS */
75#ifndef VMS
101adcb5 76#ifndef DOS_NT
d0d6b7c5 77#include <sgtty.h>
101adcb5 78#endif /* not DOS_NT */
a04c9535
JB
79#else /* VMS */
80#include <descrip.h>
81static struct iosb
82{
83 short status;
84 short offset;
85 short termlen;
86 short term;
87} input_iosb;
88
89extern int waiting_for_ast;
90extern int stop_input;
210b2b4f
JB
91extern int input_ef;
92extern int timer_ef;
93extern int process_ef;
a04c9535
JB
94extern int input_eflist;
95extern int timer_eflist;
96
97static $DESCRIPTOR (input_dsc, "TT");
98static int terminator_mask[2] = { 0, 0 };
99
100static struct sensemode {
101 short status;
102 unsigned char xmit_baud;
103 unsigned char rcv_baud;
104 unsigned char crfill;
105 unsigned char lffill;
106 unsigned char parity;
107 unsigned char unused;
108 char class;
109 char type;
110 short scr_wid;
111 unsigned long tt_char : 24, scr_len : 8;
112 unsigned long tt2_char;
113} sensemode_iosb;
114#endif /* VMS */
d0d6b7c5
JB
115#endif /* not HAVE_TERMIOS */
116#endif /* not HAVE_TERMIO */
117
c9b67b7b 118#ifdef __GNU_LIBRARY__
c3ff76c4 119#include <sys/ioctl.h>
c9b67b7b
RM
120#include <termios.h>
121#endif
122
8e0ecd77 123#ifdef AIXHFT
4746118a
JB
124/* Get files for keyboard remapping */
125#define HFNKEYS 2
126#include <sys/hft.h>
127#include <sys/devinfo.h>
128#endif
129
130/* Get rid of LLITOUT in 4.1, since it is said to stimulate kernel bugs. */
131#ifdef BSD4_1
132#undef LLITOUT
133#define LLITOUT 0
134#endif /* 4.1 */
135
136#ifdef NEED_BSDTTY
137#include <sys/bsdtty.h>
138#endif
139
140#if defined (HPUX) && defined (HAVE_PTYS)
141#include <sys/ptyio.h>
142#endif
378ac314 143
4746118a
JB
144#ifdef AIX
145#include <sys/pty.h>
4746118a
JB
146#endif /* AIX */
147
378ac314 148#if (defined (POSIX) || defined (NEED_UNISTD_H)) && defined (HAVE_UNISTD_H)
9825c716 149#include <unistd.h>
5ab57b9f
RS
150#endif
151
4746118a 152#ifdef SYSV_PTYS
8243aa4e 153#include <sys/types.h>
4746118a 154#include <sys/tty.h>
ffd56f97
JB
155#ifdef titan
156#include <sys/ttyhw.h>
157#include <sys/stream.h>
158#endif
372d3c2e 159#ifndef NO_PTY_H
4746118a
JB
160#include <sys/pty.h>
161#endif
372d3c2e 162#endif
4746118a
JB
163
164/* saka@pfu.fujitsu.co.JP writes:
165 FASYNC defined in this file. But, FASYNC don't working.
166 so no problem, because unrequest_sigio only need. */
167#if defined (pfa)
168#include <sys/file.h>
169#endif
170
d0d6b7c5
JB
171\f
172/* Special cases - inhibiting the use of certain features. */
173
174#ifdef APOLLO
175#undef TIOCSTART
176#endif
177
ffd56f97
JB
178#ifdef XENIX
179#undef TIOCGETC /* Avoid confusing some conditionals that test this. */
180#endif
181
d0d6b7c5
JB
182#ifdef BROKEN_TIOCGETC
183#undef TIOCGETC /* Avoid confusing some conditionals that test this. */
184#endif
185
186/* UNIPLUS systems may have FIONREAD. */
187#ifdef UNIPLUS
188#include <sys.ioctl.h>
189#endif
190
191/* Allow m- file to inhibit use of FIONREAD. */
192#ifdef BROKEN_FIONREAD
193#undef FIONREAD
194#undef ASYNC
195#endif
196
eb8c3be9 197/* Interrupt input is not used if there is no FIONREAD. */
d0d6b7c5
JB
198#ifndef FIONREAD
199#undef SIGIO
200#endif
201
50b8cf60
JB
202/* On TERMIOS systems, the tcmumbleattr calls take care of these
203 parameters, and it's a bad idea to use them (on AIX, it makes the
c39d651c 204 tty hang for a long time). */
50b8cf60
JB
205#if defined (TIOCGLTC) && !defined (HAVE_TERMIOS)
206#define HAVE_LTCHARS
207#endif
208
209#if defined (TIOCGETC) && !defined (HAVE_TERMIOS)
210#define HAVE_TCHARS
211#endif
212
d0d6b7c5 213\f
2102829e
RS
214/* Try to establish the correct character to disable terminal functions
215 in a system-independent manner. Note that USG (at least) define
216 _POSIX_VDISABLE as 0! */
217
218#ifdef _POSIX_VDISABLE
219#define CDISABLE _POSIX_VDISABLE
220#else /* not _POSIX_VDISABLE */
221#ifdef CDEL
d04e8e46 222#undef CDISABLE
2102829e
RS
223#define CDISABLE CDEL
224#else /* not CDEL */
225#define CDISABLE 255
226#endif /* not CDEL */
227#endif /* not _POSIX_VDISABLE */
228\f
d0d6b7c5
JB
229/* Get the number of characters queued for output. */
230
231/* EMACS_OUTQSIZE(FD, int *SIZE) stores the number of characters
232 queued for output to the terminal FD in *SIZE, if FD is a tty.
233 Returns -1 if there was an error (i.e. FD is not a tty), 0
234 otherwise. */
235#ifdef TIOCOUTQ
236#define EMACS_OUTQSIZE(fd, size) (ioctl ((fd), TIOCOUTQ, (size)))
237#endif
238
239#ifdef HAVE_TERMIO
240#ifdef TCOUTQ
241#undef EMACS_OUTQSIZE
242#define EMACS_OUTQSIZE(fd, size) (ioctl ((fd), TCOUTQ, (size)))
243#endif
244#endif
245
246\f
247/* Manipulate a terminal's current process group. */
248
249/* EMACS_HAVE_TTY_PGRP is true if we can get and set the tty's current
250 controlling process group.
251
252 EMACS_GET_TTY_PGRP(int FD, int *PGID) sets *PGID the terminal FD's
253 current process group. Return -1 if there is an error.
254
255 EMACS_SET_TTY_PGRP(int FD, int *PGID) sets the terminal FD's
256 current process group to *PGID. Return -1 if there is an error. */
257
ffd56f97
JB
258#ifdef HPUX
259/* HPUX tty process group stuff doesn't work, says the anonymous voice
260 from the past. */
261#else
d0d6b7c5
JB
262#ifdef TIOCGPGRP
263#define EMACS_HAVE_TTY_PGRP
264#else
265#ifdef HAVE_TERMIOS
266#define EMACS_HAVE_TTY_PGRP
267#endif
268#endif
ffd56f97 269#endif
d0d6b7c5
JB
270
271#ifdef EMACS_HAVE_TTY_PGRP
272
75bb6750 273#if defined (HAVE_TERMIOS) && ! defined (BSD_TERMIOS)
d0d6b7c5
JB
274
275#define EMACS_GET_TTY_PGRP(fd, pgid) (*(pgid) = tcgetpgrp ((fd)))
161aa2f8 276#define EMACS_SET_TTY_PGRP(fd, pgid) (tcsetpgrp ((fd), *(pgid)))
d0d6b7c5
JB
277
278#else
279#ifdef TIOCSPGRP
280
281#define EMACS_GET_TTY_PGRP(fd, pgid) (ioctl ((fd), TIOCGPGRP, (pgid)))
282#define EMACS_SET_TTY_PGRP(fd, pgid) (ioctl ((fd), TIOCSPGRP, (pgid)))
283
284#endif
285#endif
286
287#else
288
289/* Just ignore this for now and hope for the best */
290#define EMACS_GET_TTY_PGRP(fd, pgid) 0
ef15f270 291#define EMACS_SET_TTY_PGRP(fd, pgif) 0
d0d6b7c5
JB
292
293#endif
294
281bbdfb 295/* EMACS_GETPGRP (arg) returns the process group of the process. */
727b007c 296
281bbdfb 297#ifdef __GNU_LIBRARY__
afcaa503 298/* GNU libc by default defines getpgrp with no args on all systems. */
e0b5b76c
RS
299#if __GLIBC__ >= 2
300/* glibc-2.1 adds the BSD compatibility getpgrp function
55a2e19e
AS
301 if you use _BSD_SOURCE, which Emacs does on GNU/Linux systems. */
302#if __GLIBC_MINOR__ < 1 || ! defined (__FAVOR_BSD)
281bbdfb 303#define GETPGRP_NO_ARG
e0b5b76c
RS
304#endif
305#else /* __GLIBC__ < 2 */
306#define GETPGRP_NO_ARG
307#endif /* __GLIBC__ < 2 */
281bbdfb 308#else /* not __GNU_LIBRARY__ */
727b007c
RS
309#if defined (USG) && !defined (GETPGRP_NEEDS_ARG)
310# if !defined (GETPGRP_NO_ARG)
311# define GETPGRP_NO_ARG
312# endif
313#endif
281bbdfb 314#endif /* not __GNU_LIBRARY__ */
727b007c
RS
315
316#if defined (GETPGRP_NO_ARG)
317# define EMACS_GETPGRP(x) getpgrp()
318#else
319# define EMACS_GETPGRP(x) getpgrp(x)
320#endif /* !GETPGRP_NO_ARG */
d0d6b7c5
JB
321\f
322/* Manipulate a TTY's input/output processing parameters. */
323
324/* struct emacs_tty is a structure used to hold the current tty
325 parameters. If the terminal has several structures describing its
326 state, for example a struct tchars, a struct sgttyb, a struct
327 tchars, a struct ltchars, and a struct pagechars, struct
328 emacs_tty should contain an element for each parameter struct
329 that Emacs may change.
330
1334b321
JB
331 EMACS_GET_TTY (int FD, struct emacs_tty *P) stores the parameters
332 of the tty on FD in *P. Return zero if all's well, or -1 if we ran
333 into an error we couldn't deal with.
d0d6b7c5 334
1bf61ff9 335 EMACS_SET_TTY (int FD, struct emacs_tty *P, int flushp)
d0d6b7c5 336 sets the parameters of the tty on FD according to the contents of
1bf61ff9
RS
337 *P. If flushp is non-zero, we discard queued input to be
338 written before making the change.
1334b321 339 Return 0 if all went well, and -1 if anything failed.
d0d6b7c5
JB
340
341 EMACS_TTY_TABS_OK (struct emacs_tty *P) is false iff the kernel
342 expands tabs to spaces upon output; in that case, there is no
343 advantage to using tabs over spaces. */
344
345
d0d6b7c5 346/* For each tty parameter structure that Emacs might want to save and restore,
1334b321
JB
347 - include an element for it in this structure, and
348 - extend the emacs_{get,set}_tty functions in sysdep.c to deal with the
349 new members. */
d0d6b7c5
JB
350
351struct emacs_tty {
352
353/* There is always one of the following elements, so there is no need
354 for dummy get and set definitions. */
2182d459 355#ifdef HAVE_TCATTR
d0d6b7c5
JB
356 struct termios main;
357#else
358#ifdef HAVE_TERMIO
359 struct termio main;
360#else
361#ifdef VMS
362 struct sensemode main;
8e99c732 363#else
101adcb5 364#ifdef DOS_NT
8e99c732 365 int main;
101adcb5 366#else /* not DOS_NT */
d0d6b7c5 367 struct sgttyb main;
101adcb5 368#endif /* not DOS_NT */
d0d6b7c5
JB
369#endif
370#endif
8e99c732 371#endif
50b8cf60
JB
372
373/* If we have TERMIOS, we don't need to do this - they're taken care of
374 by the tc*attr calls. */
375#ifndef HAVE_TERMIOS
376#ifdef HAVE_LTCHARS
2182d459
RS
377 struct ltchars ltchars;
378#endif
50b8cf60
JB
379
380#ifdef HAVE_TCHARS
2182d459
RS
381 struct tchars tchars;
382 int lmode;
d0d6b7c5 383#endif
50b8cf60 384#endif
2182d459
RS
385};
386\f
387/* Define EMACS_GET_TTY and EMACS_SET_TTY,
c2e4f49a 388 the macros for reading and setting parts of `struct emacs_tty'.
d0d6b7c5 389
c2e4f49a
JB
390 These got pretty unmanageable (huge macros are hard to debug), and
391 finally needed some code which couldn't be done as part of an
392 expression, so we moved them out to their own functions in sysdep.c. */
393#define EMACS_GET_TTY(fd, p) (emacs_get_tty ((fd), (p)))
394#define EMACS_SET_TTY(fd, p, waitp) (emacs_set_tty ((fd), (p), (waitp)))
4c571d09
AS
395#ifdef P_ /* Unfortunately this file is sometimes included before lisp.h */
396extern int emacs_get_tty P_ ((int, struct emacs_tty *));
397extern int emacs_set_tty P_ ((int, struct emacs_tty *, int));
398#endif
d0d6b7c5 399
2182d459
RS
400\f
401/* Define EMACS_TTY_TABS_OK. */
d0d6b7c5
JB
402
403#ifdef HAVE_TERMIOS
404
c7040669 405#ifdef TABDLY
d0d6b7c5 406#define EMACS_TTY_TABS_OK(p) (((p)->main.c_oflag & TABDLY) != TAB3)
c7040669
RS
407#else
408#define EMACS_TTY_TABS_OK(p) 1
409#endif
d0d6b7c5
JB
410
411#else /* not def HAVE_TERMIOS */
412#ifdef HAVE_TERMIO
413
414#define EMACS_TTY_TABS_OK(p) (((p)->main.c_oflag & TABDLY) != TAB3)
415
416#else /* neither HAVE_TERMIO nor HAVE_TERMIOS */
417#ifdef VMS
418
419#define EMACS_TTY_TABS_OK(p) (((p)->main.tt_char & TT$M_MECHTAB) != 0)
420
421#else
422
101adcb5 423#ifdef DOS_NT
8e99c732 424#define EMACS_TTY_TABS_OK(p) 0
101adcb5 425#else /* not DOS_NT */
d0d6b7c5 426#define EMACS_TTY_TABS_OK(p) (((p)->main.sg_flags & XTABS) != XTABS)
101adcb5 427#endif /* not DOS_NT */
d0d6b7c5
JB
428
429#endif /* not def VMS */
430#endif /* not def HAVE_TERMIO */
431#endif /* not def HAVE_TERMIOS */