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