(x_set_alpha): Set alpha to -1 if nil given.
[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
c62e9958 36#ifndef NO_TERMIO
d0d6b7c5 37#include <termio.h>
c62e9958 38#endif
d0d6b7c5 39#include <termios.h>
b65e3dd7 40#define INCLUDED_FCNTL
1aaaff21 41#include <fcntl.h>
d0d6b7c5 42#else /* neither HAVE_TERMIO nor HAVE_TERMIOS */
101adcb5 43#ifndef DOS_NT
d0d6b7c5 44#include <sgtty.h>
101adcb5 45#endif /* not DOS_NT */
d0d6b7c5
JB
46#endif /* not HAVE_TERMIOS */
47#endif /* not HAVE_TERMIO */
48
c9b67b7b 49#ifdef __GNU_LIBRARY__
c3ff76c4 50#include <sys/ioctl.h>
c9b67b7b
RM
51#include <termios.h>
52#endif
53
4746118a
JB
54#ifdef NEED_BSDTTY
55#include <sys/bsdtty.h>
177c0ea7 56#endif
4746118a
JB
57
58#if defined (HPUX) && defined (HAVE_PTYS)
59#include <sys/ptyio.h>
60#endif
378ac314 61
4746118a
JB
62#ifdef AIX
63#include <sys/pty.h>
4746118a
JB
64#endif /* AIX */
65
378ac314 66#if (defined (POSIX) || defined (NEED_UNISTD_H)) && defined (HAVE_UNISTD_H)
9825c716 67#include <unistd.h>
5ab57b9f
RS
68#endif
69
d0d6b7c5
JB
70\f
71/* Special cases - inhibiting the use of certain features. */
72
d0d6b7c5
JB
73/* Allow m- file to inhibit use of FIONREAD. */
74#ifdef BROKEN_FIONREAD
75#undef FIONREAD
76#undef ASYNC
77#endif
78
eb8c3be9 79/* Interrupt input is not used if there is no FIONREAD. */
d0d6b7c5
JB
80#ifndef FIONREAD
81#undef SIGIO
82#endif
83
50b8cf60
JB
84/* On TERMIOS systems, the tcmumbleattr calls take care of these
85 parameters, and it's a bad idea to use them (on AIX, it makes the
c39d651c 86 tty hang for a long time). */
50b8cf60
JB
87#if defined (TIOCGLTC) && !defined (HAVE_TERMIOS)
88#define HAVE_LTCHARS
89#endif
90
91#if defined (TIOCGETC) && !defined (HAVE_TERMIOS)
92#define HAVE_TCHARS
93#endif
94
d0d6b7c5 95\f
2102829e
RS
96/* Try to establish the correct character to disable terminal functions
97 in a system-independent manner. Note that USG (at least) define
98 _POSIX_VDISABLE as 0! */
99
100#ifdef _POSIX_VDISABLE
101#define CDISABLE _POSIX_VDISABLE
102#else /* not _POSIX_VDISABLE */
103#ifdef CDEL
d04e8e46 104#undef CDISABLE
2102829e
RS
105#define CDISABLE CDEL
106#else /* not CDEL */
107#define CDISABLE 255
108#endif /* not CDEL */
109#endif /* not _POSIX_VDISABLE */
110\f
d0d6b7c5
JB
111/* Get the number of characters queued for output. */
112
113/* EMACS_OUTQSIZE(FD, int *SIZE) stores the number of characters
114 queued for output to the terminal FD in *SIZE, if FD is a tty.
115 Returns -1 if there was an error (i.e. FD is not a tty), 0
116 otherwise. */
117#ifdef TIOCOUTQ
118#define EMACS_OUTQSIZE(fd, size) (ioctl ((fd), TIOCOUTQ, (size)))
119#endif
120
121#ifdef HAVE_TERMIO
122#ifdef TCOUTQ
123#undef EMACS_OUTQSIZE
124#define EMACS_OUTQSIZE(fd, size) (ioctl ((fd), TCOUTQ, (size)))
125#endif
126#endif
127
128\f
129/* Manipulate a terminal's current process group. */
130
131/* EMACS_HAVE_TTY_PGRP is true if we can get and set the tty's current
132 controlling process group.
133
134 EMACS_GET_TTY_PGRP(int FD, int *PGID) sets *PGID the terminal FD's
135 current process group. Return -1 if there is an error.
136
137 EMACS_SET_TTY_PGRP(int FD, int *PGID) sets the terminal FD's
138 current process group to *PGID. Return -1 if there is an error. */
139
ffd56f97
JB
140/* HPUX tty process group stuff doesn't work, says the anonymous voice
141 from the past. */
9d9a7716 142#ifndef HPUX
d0d6b7c5
JB
143#ifdef TIOCGPGRP
144#define EMACS_HAVE_TTY_PGRP
145#else
146#ifdef HAVE_TERMIOS
147#define EMACS_HAVE_TTY_PGRP
9d9a7716
DN
148#endif /* HAVE_TERMIOS */
149#endif /* TIOCGPGRP */
150#endif /* not HPUX */
d0d6b7c5
JB
151
152#ifdef EMACS_HAVE_TTY_PGRP
153
27ec92c9
DN
154#if defined (HAVE_TERMIOS)
155
156#define EMACS_GET_TTY_PGRP(fd, pgid) (*(pgid) = tcgetpgrp ((fd)))
157#define EMACS_SET_TTY_PGRP(fd, pgid) (tcsetpgrp ((fd), *(pgid)))
158
159#else /* not HAVE_TERMIOS */
d0d6b7c5
JB
160#ifdef TIOCSPGRP
161
162#define EMACS_GET_TTY_PGRP(fd, pgid) (ioctl ((fd), TIOCGPGRP, (pgid)))
163#define EMACS_SET_TTY_PGRP(fd, pgid) (ioctl ((fd), TIOCSPGRP, (pgid)))
164
9d9a7716 165#endif /* TIOCSPGRP */
27ec92c9 166#endif /* HAVE_TERMIOS */
d0d6b7c5 167
9d9a7716 168#else /* not EMACS_SET_TTY_PGRP */
d0d6b7c5
JB
169
170/* Just ignore this for now and hope for the best */
171#define EMACS_GET_TTY_PGRP(fd, pgid) 0
ef15f270 172#define EMACS_SET_TTY_PGRP(fd, pgif) 0
d0d6b7c5 173
9d9a7716 174#endif /* not EMACS_SET_TTY_PGRP */
d0d6b7c5 175
281bbdfb 176/* EMACS_GETPGRP (arg) returns the process group of the process. */
727b007c 177
f7ff70e8 178#if defined (GETPGRP_VOID)
727b007c 179# define EMACS_GETPGRP(x) getpgrp()
27ec92c9 180#else /* !GETPGRP_VOID */
727b007c 181# define EMACS_GETPGRP(x) getpgrp(x)
f7ff70e8 182#endif /* !GETPGRP_VOID */
d0d6b7c5
JB
183\f
184/* Manipulate a TTY's input/output processing parameters. */
185
186/* struct emacs_tty is a structure used to hold the current tty
187 parameters. If the terminal has several structures describing its
188 state, for example a struct tchars, a struct sgttyb, a struct
189 tchars, a struct ltchars, and a struct pagechars, struct
190 emacs_tty should contain an element for each parameter struct
191 that Emacs may change.
192
1334b321
JB
193 EMACS_GET_TTY (int FD, struct emacs_tty *P) stores the parameters
194 of the tty on FD in *P. Return zero if all's well, or -1 if we ran
195 into an error we couldn't deal with.
d0d6b7c5 196
1bf61ff9 197 EMACS_SET_TTY (int FD, struct emacs_tty *P, int flushp)
d0d6b7c5 198 sets the parameters of the tty on FD according to the contents of
1bf61ff9
RS
199 *P. If flushp is non-zero, we discard queued input to be
200 written before making the change.
1334b321 201 Return 0 if all went well, and -1 if anything failed.
d0d6b7c5 202
e0f24100 203 EMACS_TTY_TABS_OK (struct emacs_tty *P) is false if the kernel
d0d6b7c5
JB
204 expands tabs to spaces upon output; in that case, there is no
205 advantage to using tabs over spaces. */
206
207
d0d6b7c5 208/* For each tty parameter structure that Emacs might want to save and restore,
1334b321
JB
209 - include an element for it in this structure, and
210 - extend the emacs_{get,set}_tty functions in sysdep.c to deal with the
211 new members. */
d0d6b7c5
JB
212
213struct emacs_tty {
214
215/* There is always one of the following elements, so there is no need
216 for dummy get and set definitions. */
2182d459 217#ifdef HAVE_TCATTR
d0d6b7c5 218 struct termios main;
27ec92c9 219#else /* not HAVE_TCATTR */
d0d6b7c5
JB
220#ifdef HAVE_TERMIO
221 struct termio main;
27ec92c9 222#else /* not HAVE_TERMIO */
101adcb5 223#ifdef DOS_NT
8e99c732 224 int main;
101adcb5 225#else /* not DOS_NT */
d0d6b7c5 226 struct sgttyb main;
101adcb5 227#endif /* not DOS_NT */
27ec92c9
DN
228#endif /* not HAVE_TERMIO */
229#endif /* not HAVE_TCATTR */
50b8cf60
JB
230
231/* If we have TERMIOS, we don't need to do this - they're taken care of
232 by the tc*attr calls. */
233#ifndef HAVE_TERMIOS
234#ifdef HAVE_LTCHARS
2182d459 235 struct ltchars ltchars;
27ec92c9 236#endif /* HAVE_LTCHARS */
50b8cf60
JB
237
238#ifdef HAVE_TCHARS
2182d459
RS
239 struct tchars tchars;
240 int lmode;
27ec92c9
DN
241#endif /* HAVE_TCHARS */
242#endif /* not defined HAVE_TERMIOS */
2182d459
RS
243};
244\f
245/* Define EMACS_GET_TTY and EMACS_SET_TTY,
c2e4f49a 246 the macros for reading and setting parts of `struct emacs_tty'.
d0d6b7c5 247
c2e4f49a
JB
248 These got pretty unmanageable (huge macros are hard to debug), and
249 finally needed some code which couldn't be done as part of an
250 expression, so we moved them out to their own functions in sysdep.c. */
251#define EMACS_GET_TTY(fd, p) (emacs_get_tty ((fd), (p)))
252#define EMACS_SET_TTY(fd, p, waitp) (emacs_set_tty ((fd), (p), (waitp)))
4c571d09
AS
253#ifdef P_ /* Unfortunately this file is sometimes included before lisp.h */
254extern int emacs_get_tty P_ ((int, struct emacs_tty *));
255extern int emacs_set_tty P_ ((int, struct emacs_tty *, int));
256#endif
d0d6b7c5 257
2182d459
RS
258\f
259/* Define EMACS_TTY_TABS_OK. */
d0d6b7c5
JB
260
261#ifdef HAVE_TERMIOS
262
c7040669 263#ifdef TABDLY
d0d6b7c5 264#define EMACS_TTY_TABS_OK(p) (((p)->main.c_oflag & TABDLY) != TAB3)
27ec92c9 265#else /* not TABDLY */
c7040669 266#define EMACS_TTY_TABS_OK(p) 1
27ec92c9 267#endif /* not TABDLY */
d0d6b7c5
JB
268
269#else /* not def HAVE_TERMIOS */
270#ifdef HAVE_TERMIO
271
272#define EMACS_TTY_TABS_OK(p) (((p)->main.c_oflag & TABDLY) != TAB3)
273
274#else /* neither HAVE_TERMIO nor HAVE_TERMIOS */
d0d6b7c5 275
101adcb5 276#ifdef DOS_NT
8e99c732 277#define EMACS_TTY_TABS_OK(p) 0
101adcb5 278#else /* not DOS_NT */
d0d6b7c5 279#define EMACS_TTY_TABS_OK(p) (((p)->main.sg_flags & XTABS) != XTABS)
101adcb5 280#endif /* not DOS_NT */
d0d6b7c5 281
d0d6b7c5
JB
282#endif /* not def HAVE_TERMIO */
283#endif /* not def HAVE_TERMIOS */
ab5796a9
MB
284
285/* arch-tag: cf4b90bc-be41-401c-be98-40619178a712
286 (do not change this comment) */