Mercurial > hg > xemacs-beta
annotate src/systty.h @ 5210:23f00bfd78a4
Merge.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Fri, 07 May 2010 14:35:00 +0100 |
parents | aa5ed11f473b |
children | 308d34e9f07d |
rev | line source |
---|---|
428 | 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 | |
440 | 23 #ifndef INCLUDED_systty_h_ |
24 #define INCLUDED_systty_h_ | |
428 | 25 |
26 #ifdef HAVE_TERMIOS | |
27 # define HAVE_TCATTR | |
28 #endif | |
29 | |
30 | |
31 /* Include the proper files. */ | |
32 | |
33 #ifdef HAVE_UNISTD_H | |
34 #include <unistd.h> | |
35 #endif | |
36 | |
37 /* XEmacs: TERMIOS is mo' better than TERMIO so we use it if it's | |
38 there. Since TERMIO is backward-compatibility stuff if both it | |
39 and TERMIOS exist, it's more likely to be broken. */ | |
40 | |
41 #if defined (HAVE_TERMIOS) | |
42 | |
43 /***** (1) The TERMIOS way (POSIX style) *****/ | |
44 | |
45 # if defined (_AIX) && defined (_I386) | |
46 # include <termios.h> /* termios.h needs to be before termio.h */ | |
47 # include <termio.h> | |
48 # else | |
49 # if !defined (NO_TERMIO) | |
50 # include <termio.h> | |
51 # endif | |
52 # include <termios.h> | |
53 # endif /* _AIX && _I386 */ | |
54 # ifndef INCLUDED_FCNTL | |
55 # define INCLUDED_FCNTL | |
56 # include <fcntl.h> | |
57 # endif | |
58 | |
59 #elif defined (HAVE_TERMIO) | |
60 | |
61 /***** (2) The TERMIO way (system V style) *****/ | |
62 | |
63 # ifndef NO_TERMIO | |
64 # include <termio.h> | |
65 # endif /* not NO_TERMIO */ | |
66 # ifndef INCLUDED_FCNTL | |
67 # define INCLUDED_FCNTL | |
68 # include <fcntl.h> | |
69 # endif | |
70 | |
442 | 71 #elif defined (WIN32_NATIVE) |
428 | 72 |
442 | 73 /***** (3) The WIN32_NATIVE way *****/ |
428 | 74 |
75 /* Nothing doing */ | |
76 | |
77 #else | |
78 | |
79 /***** (4) The BSD way *****/ | |
80 | |
81 # ifdef linux /* XEmacs addition -- necessary? */ | |
82 # include <bsd/sgtty.h> | |
83 # else | |
84 # include <sgtty.h> | |
85 # endif | |
86 | |
87 | |
88 #endif /* HAVE_TERMIOS */ | |
89 | |
90 /* XEmacs: I don't think we need the following crap. */ | |
91 #ifdef __GNU_LIBRARY__ | |
92 #include <termios.h> | |
93 #endif | |
94 | |
95 /* Formerly there was a conditional that included sys/filio.h if | |
96 USG5_4 was defined, but this is already included in s/usg5-4.h */ | |
97 | |
98 /* Generally useful to include this file: */ | |
99 | |
4759
aa5ed11f473b
Remove support for obsolete systems. See xemacs-patches message with ID
Jerry James <james@xemacs.org>
parents:
771
diff
changeset
|
100 #if !defined (WIN32_NATIVE) |
428 | 101 # include <sys/ioctl.h> |
102 #endif | |
103 | |
104 | |
105 /* ----------------------------------------------------- */ | |
106 /* miscellaneous includes */ | |
107 /* ----------------------------------------------------- */ | |
108 | |
109 /* Include files for PTY's */ | |
110 | |
535 | 111 #if defined (HAVE_SYS_PTYIO_H) /* HP-UX */ |
428 | 112 #include <sys/ptyio.h> |
113 #endif | |
114 | |
535 | 115 #if defined (HAVE_PTY_H) |
116 #include <pty.h> | |
117 #elif defined (HAVE_SYS_PTY_H) | |
428 | 118 #include <sys/pty.h> |
119 #endif | |
120 | |
121 /* XEmacs: removed some random if defined (pfa) crap for FASYNC (SIGIO). | |
122 We've cleaned SIGIO up. */ | |
123 | |
124 | |
125 /* ----------------------------------------------------- */ | |
126 /* inhibiting particular features */ | |
127 /* ----------------------------------------------------- */ | |
128 | |
129 | |
4759
aa5ed11f473b
Remove support for obsolete systems. See xemacs-patches message with ID
Jerry James <james@xemacs.org>
parents:
771
diff
changeset
|
130 #if defined (BROKEN_TIOCGETC) |
428 | 131 #undef TIOCGETC /* Avoid confusing some conditionals that test this. */ |
132 #endif | |
133 | |
134 /* XEmacs: SIGIO is cleaned up so we remove the crap here that messes | |
135 with it (and FIONREAD and FASYNC, which are related). */ | |
136 | |
137 /* On TERMIOS systems, the tcmumbleattr calls take care of these | |
138 parameters, and it's a bad idea to use them (on AIX, it makes the | |
139 tty hang for a long time). */ | |
140 #if defined (TIOCGLTC) && !defined (HAVE_TERMIOS) | |
141 #define HAVE_LTCHARS | |
142 #endif | |
143 | |
144 #if defined (TIOCGETC) && !defined (HAVE_TERMIOS) | |
145 #define HAVE_TCHARS | |
146 #endif | |
147 | |
148 | |
149 /* ----------------------------------------------------- */ | |
150 /* disabling terminal functions */ | |
151 /* ----------------------------------------------------- */ | |
152 | |
153 /* Try to establish the correct character to disable terminal functions | |
154 in a system-independent manner. | |
155 We use the POSIX standard way to do this, and emulate on other systems. */ | |
156 | |
157 #ifndef _POSIX_VDISABLE | |
158 # if defined CDEL | |
159 # define _POSIX_VDISABLE CDEL | |
160 # else | |
161 # define _POSIX_VDISABLE 255 | |
162 # endif | |
163 #endif /* ! _POSIX_VDISABLE */ | |
164 | |
165 | |
166 /* ----------------------------------------------------- */ | |
167 /* Get the number of characters queued for output */ | |
168 /* ----------------------------------------------------- */ | |
169 | |
170 /* EMACS_OUTQSIZE(FD, int *SIZE) stores the number of characters | |
171 queued for output to the terminal FD in *SIZE, if FD is a tty. | |
172 Returns -1 if there was an error (i.e. FD is not a tty), 0 | |
173 otherwise. */ | |
174 #ifdef TIOCOUTQ | |
175 #define EMACS_OUTQSIZE(fd, size) ioctl (fd, TIOCOUTQ, size) | |
176 #endif | |
177 | |
178 #ifdef HAVE_TERMIO | |
179 #ifdef TCOUTQ | |
180 #undef EMACS_OUTQSIZE | |
181 #define EMACS_OUTQSIZE(fd, size) ioctl (fd, TCOUTQ, size) | |
182 #endif | |
183 #endif | |
184 | |
185 | |
186 /* -------------------------------------------------------------------- */ | |
187 /* Manipulate a terminal's current (foreground) process group */ | |
188 /* -------------------------------------------------------------------- */ | |
189 | |
442 | 190 /* EMACS_GET_TTY_PGRP(int FD, pid_t *PGID) sets *PGID to the terminal |
191 FD's current foreground process group. Return -1 if there is an error. | |
192 | |
193 EMACS_SET_TTY_PGRP(int FD, pid_t *PGID) sets the terminal FD's current | |
194 foreground process group to *PGID. Return -1 if there is an error. | |
428 | 195 |
442 | 196 We prefer using the ioctl (BSD) interface instead of its Posix |
197 replacement tgetpgrp/tcsetpgrp since that is documented as being | |
198 restricted to processes sharing the same controlling tty. */ | |
428 | 199 |
442 | 200 #if defined (TIOCGPGRP) |
428 | 201 |
442 | 202 #define EMACS_GET_TTY_PROCESS_GROUP(fd, pgid) ioctl (fd, TIOCGPGRP, pgid) |
203 #define EMACS_SET_TTY_PROCESS_GROUP(fd, pgid) ioctl (fd, TIOCSPGRP, pgid) | |
204 | |
205 #elif defined (HAVE_TCGETPGRP) | |
428 | 206 |
442 | 207 #define EMACS_GET_TTY_PROCESS_GROUP(fd, pgid) (*(pgid) = tcgetpgrp (fd)) |
208 #define EMACS_SET_TTY_PROCESS_GROUP(fd, pgid) tcsetpgrp (fd, *(pgid)) | |
428 | 209 |
442 | 210 #else |
428 | 211 |
442 | 212 /* Just ignore this for now and hope for the best */ |
213 #define EMACS_GET_TTY_PROCESS_GROUP(fd, pgid) 0 | |
214 #define EMACS_SET_TTY_PROCESS_GROUP(fd, pgif) 0 | |
428 | 215 |
216 #endif | |
217 | |
218 /* EMACS_GETPGRP (arg) returns the process group of the terminal. */ | |
219 | |
220 #ifdef GETPGRP_VOID | |
221 #define EMACS_GETPGRP(x) getpgrp() | |
222 #else | |
223 #define EMACS_GETPGRP(x) getpgrp(x) | |
224 #endif /* GETPGRP_VOID */ | |
225 | |
226 /* XEmacs backward-compatibility. Is 0 always a reasonable argument? */ | |
227 #define EMACS_GET_PROCESS_GROUP() EMACS_GETPGRP (0) | |
228 | |
229 /* XEmacs addition? */ | |
230 | |
231 /* EMACS_SEPARATE_PROCESS_GROUP () creates a separate process group for the | |
232 running process. */ | |
233 | |
234 /* EMACS_SET_PROCESS_GROUP () sets our process group as specified. */ | |
235 | |
236 /* POSIX calls for setpgid(), so we use it if it's available. | |
237 Otherwise use setpgrp(), in USG or BSD flavor. Note that | |
238 on newer systems, setpgrp() has unwanted effects (e.g. | |
239 creating a new session), so we want to avoid its use | |
240 if possible. | |
241 | |
242 NOTE: On some older systems, we should consider using setpgrp2() | |
243 if it exists. This is sufficiently rare, though, that there | |
244 seems no point in autodetecting it. Currently dgux.h is the | |
245 only place where this has to be munged. */ | |
246 | |
247 #if defined (HAVE_SETPGID) | |
248 # define EMACS_SEPARATE_PROCESS_GROUP() setpgid (0, 0) | |
249 # define EMACS_SET_PROCESS_GROUP(pg) setpgid (0, pg) | |
250 #elif defined (USG) | |
251 # define EMACS_SEPARATE_PROCESS_GROUP() setpgrp () | |
252 /* old (pre-SVR4) USG's don't provide any way to do this. | |
253 No big loss -- it just means that ^Z won't work right | |
254 if we're run from sh. */ | |
255 # define EMACS_SET_PROCESS_GROUP(pg) | |
771 | 256 #elif defined (WIN32_NATIVE) |
432 | 257 # define EMACS_SEPARATE_PROCESS_GROUP() |
428 | 258 #else |
259 /* Under NeXTstep, a process group of 0 is not the same as specifying | |
260 your own process ID, so we go ahead and specify it explicitly. */ | |
261 # define EMACS_SEPARATE_PROCESS_GROUP() setpgrp (0, getpid ()) | |
262 # define EMACS_SET_PROCESS_GROUP(pg) setpgrp (0, pg) | |
263 #endif | |
264 | |
265 | |
266 /* --------------------------------------------------------- */ | |
267 /* Manipulate a TTY's input/output processing parameters */ | |
268 /* --------------------------------------------------------- */ | |
269 | |
270 /* struct emacs_tty is a structure used to hold the current tty | |
271 parameters. If the terminal has several structures describing its | |
272 state, for example a struct tchars, a struct sgttyb, a struct | |
273 tchars, a struct ltchars, and a struct pagechars, struct | |
274 emacs_tty should contain an element for each parameter struct | |
275 that Emacs may change. | |
276 | |
430 | 277 emacs_get_tty (int FD, struct emacs_tty *P) stores the parameters |
428 | 278 of the tty on FD in *P. Return zero if all's well, or -1 if we ran |
279 into an error we couldn't deal with. | |
280 | |
430 | 281 emacs_set_tty (int FD, struct emacs_tty *P, int flushp) |
428 | 282 sets the parameters of the tty on FD according to the contents of |
283 *P. If flushp is non-zero, we discard queued input to be | |
284 written before making the change. | |
285 Return 0 if all went well, and -1 if anything failed. | |
286 | |
287 EMACS_TTY_TABS_OK (struct emacs_tty *P) is false iff the kernel | |
288 expands tabs to spaces upon output; in that case, there is no | |
289 advantage to using tabs over spaces. */ | |
290 | |
291 | |
292 /* For each tty parameter structure that Emacs might want to save and restore, | |
293 - include an element for it in this structure, and | |
294 - extend the emacs_{get,set}_tty functions in sysdep.c to deal with the | |
295 new members. */ | |
296 | |
297 struct emacs_tty { | |
298 | |
299 /* There is always one of the following elements, so there is no need | |
300 for dummy get and set definitions. */ | |
301 #ifdef HAVE_TCATTR | |
302 struct termios main; | |
303 #else /* !HAVE_TCATTR */ | |
304 #ifdef HAVE_TERMIO | |
305 struct termio main; | |
306 #else /* !HAVE_TERMIO */ | |
442 | 307 #ifdef WIN32_NATIVE |
428 | 308 int main; |
442 | 309 #else /* not WIN32_NATIVE */ |
428 | 310 struct sgttyb main; |
442 | 311 #endif /* not WIN32_NATIVE */ |
428 | 312 #endif /* !HAVE_TERMIO */ |
313 #endif /* !HAVE_TCATTR */ | |
314 | |
315 /* If we have TERMIOS, we don't need to do this - they're taken care of | |
316 by the tc*attr calls. */ | |
317 #ifndef HAVE_TERMIOS | |
318 #ifdef HAVE_LTCHARS | |
319 struct ltchars ltchars; | |
320 #endif /* HAVE_LTCHARS */ | |
321 | |
322 #ifdef HAVE_TCHARS | |
323 struct tchars tchars; | |
324 int lmode; | |
325 #endif /* HAVE_TCHARS */ | |
326 #endif /* HAVE_TERMIOS */ | |
327 }; | |
328 | |
430 | 329 int emacs_get_tty (int fd, struct emacs_tty *settings); |
330 int emacs_set_tty (int fd, struct emacs_tty *settings, int flushp); | |
428 | 331 |
332 | |
333 /* --------------------------------------------------------- */ | |
334 /* Define EMACS_TTY_TABS_OK */ | |
335 /* --------------------------------------------------------- */ | |
336 | |
513 | 337 #if defined (TABDLY) && defined (TAB3) |
338 # define EMACS_TTY_TABS_OK(p) (((p)->main.c_oflag & TABDLY) != TAB3) | |
339 #elif defined (OXTABS) | |
340 # define EMACS_TTY_TABS_OK(p) (((p)->main.c_oflag & OXTABS) != OXTABS) | |
428 | 341 #else |
513 | 342 # define EMACS_TTY_TABS_OK(p) 1 |
343 #endif | |
428 | 344 |
440 | 345 #endif /* INCLUDED_systty_h_ */ |