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