Mercurial > hg > xemacs-beta
comparison src/systty.h @ 428:3ecd8885ac67 r21-2-22
Import from CVS: tag r21-2-22
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:28:15 +0200 |
parents | |
children | a5df635868b2 |
comparison
equal
deleted
inserted
replaced
427:0a0253eac470 | 428:3ecd8885ac67 |
---|---|
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 | |
23 #ifndef _XEMACS_SYSTTY_H_ | |
24 #define _XEMACS_SYSTTY_H_ | |
25 | |
26 #ifdef HAVE_TERMIOS | |
27 # define HAVE_TCATTR | |
28 #endif | |
29 | |
30 /* If we defined these before and we are about to redefine them, | |
31 prevent alarming warnings. */ | |
32 #ifdef BSD_TERMIOS | |
33 #undef NL0 | |
34 #undef NL1 | |
35 #undef CR0 | |
36 #undef CR1 | |
37 #undef CR2 | |
38 #undef CR3 | |
39 #undef TAB0 | |
40 #undef TAB1 | |
41 #undef TAB2 | |
42 #undef XTABS | |
43 #undef BS0 | |
44 #undef BS1 | |
45 #undef FF0 | |
46 #undef FF1 | |
47 #undef ECHO | |
48 #undef NOFLSH | |
49 #undef TOSTOP | |
50 #undef FLUSHO | |
51 #undef PENDIN | |
52 #endif | |
53 | |
54 /* Include the proper files. */ | |
55 | |
56 #ifdef HAVE_UNISTD_H | |
57 #include <unistd.h> | |
58 #endif | |
59 | |
60 /* XEmacs: TERMIOS is mo' better than TERMIO so we use it if it's | |
61 there. Since TERMIO is backward-compatibility stuff if both it | |
62 and TERMIOS exist, it's more likely to be broken. */ | |
63 | |
64 #if defined (HAVE_TERMIOS) | |
65 | |
66 /***** (1) The TERMIOS way (POSIX style) *****/ | |
67 | |
68 # if defined (_AIX) && defined (_I386) | |
69 # include <termios.h> /* termios.h needs to be before termio.h */ | |
70 # include <termio.h> | |
71 # else | |
72 # if !defined (NO_TERMIO) | |
73 # include <termio.h> | |
74 # endif | |
75 # include <termios.h> | |
76 # endif /* _AIX && _I386 */ | |
77 # ifndef INCLUDED_FCNTL | |
78 # define INCLUDED_FCNTL | |
79 # include <fcntl.h> | |
80 # endif | |
81 | |
82 #elif defined (HAVE_TERMIO) | |
83 | |
84 /***** (2) The TERMIO way (system V style) *****/ | |
85 | |
86 # ifdef __DGUX | |
87 # include <sys/ioctl.h> | |
88 # endif | |
89 # ifndef NO_TERMIO | |
90 # include <termio.h> | |
91 # endif /* not NO_TERMIO */ | |
92 # ifndef INCLUDED_FCNTL | |
93 # define INCLUDED_FCNTL | |
94 # include <fcntl.h> | |
95 # endif | |
96 | |
97 #elif defined (DOS_NT) | |
98 | |
99 /***** (3) The MSDOS/NT way *****/ | |
100 | |
101 /* Nothing doing */ | |
102 | |
103 #else | |
104 | |
105 /***** (4) The BSD way *****/ | |
106 | |
107 # ifdef linux /* XEmacs addition -- necessary? */ | |
108 # include <bsd/sgtty.h> | |
109 # else | |
110 # include <sgtty.h> | |
111 # endif | |
112 | |
113 | |
114 #endif /* HAVE_TERMIOS */ | |
115 | |
116 /* XEmacs: I don't think we need the following crap. */ | |
117 #ifdef __GNU_LIBRARY__ | |
118 #include <termios.h> | |
119 #endif | |
120 | |
121 /* Formerly there was a conditional that included sys/filio.h if | |
122 USG5_4 was defined, but this is already included in s/usg5-4.h */ | |
123 | |
124 /* Generally useful to include this file: */ | |
125 | |
126 /* But Sun OS has broken include files and doesn't want it included */ | |
127 #if !defined (DOS_NT) && !defined (WIN32) && !defined (SUNOS4) | |
128 # include <sys/ioctl.h> | |
129 #endif | |
130 /* UNIPLUS systems may have FIONREAD. */ | |
131 #ifdef UNIPLUS | |
132 #include <sys.ioctl.h> | |
133 #endif | |
134 | |
135 | |
136 /* ----------------------------------------------------- */ | |
137 /* miscellaneous includes */ | |
138 /* ----------------------------------------------------- */ | |
139 | |
140 #ifdef AIXHFT | |
141 /* Get files for keyboard remapping */ | |
142 #define HFNKEYS 2 | |
143 #include <sys/hft.h> | |
144 #include <sys/devinfo.h> | |
145 #endif | |
146 | |
147 /* XEmacs: We don't support BSD 4.1 any more */ | |
148 | |
149 #ifdef NEED_BSDTTY | |
150 #include <sys/bsdtty.h> | |
151 #endif | |
152 | |
153 /* Include files for PTY's */ | |
154 | |
155 #if defined (HPUX) && defined (HAVE_PTYS) | |
156 #include <sys/ptyio.h> | |
157 #endif | |
158 | |
159 #ifdef AIX | |
160 #include <sys/pty.h> | |
161 #endif /* AIX */ | |
162 | |
163 #ifdef SYSV_PTYS | |
164 # include <sys/types.h> | |
165 # include <sys/tty.h> | |
166 # ifdef titan | |
167 # include <sys/ttyhw.h> | |
168 # include <sys/stream.h> | |
169 # endif | |
170 # ifndef NO_PTY_H | |
171 # include <sys/pty.h> | |
172 # endif | |
173 #endif | |
174 | |
175 /* XEmacs: removed some random if defined (pfa) crap for FASYNC (SIGIO). | |
176 We've cleaned SIGIO up. */ | |
177 | |
178 | |
179 /* ----------------------------------------------------- */ | |
180 /* inhibiting particular features */ | |
181 /* ----------------------------------------------------- */ | |
182 | |
183 | |
184 #ifdef APOLLO | |
185 #undef TIOCSTART | |
186 #endif | |
187 | |
188 #if defined (XENIX) || defined (BROKEN_TIOCGETC) | |
189 #undef TIOCGETC /* Avoid confusing some conditionals that test this. */ | |
190 #endif | |
191 | |
192 /* XEmacs: SIGIO is cleaned up so we remove the crap here that messes | |
193 with it (and FIONREAD and FASYNC, which are related). */ | |
194 | |
195 #ifdef BROKEN_TIOCGWINSZ /* XEmacs addition */ | |
196 #undef TIOCGWINSZ | |
197 #undef TIOCSWINSZ | |
198 #endif | |
199 | |
200 /* On TERMIOS systems, the tcmumbleattr calls take care of these | |
201 parameters, and it's a bad idea to use them (on AIX, it makes the | |
202 tty hang for a long time). */ | |
203 #if defined (TIOCGLTC) && !defined (HAVE_TERMIOS) | |
204 #define HAVE_LTCHARS | |
205 #endif | |
206 | |
207 #if defined (TIOCGETC) && !defined (HAVE_TERMIOS) | |
208 #define HAVE_TCHARS | |
209 #endif | |
210 | |
211 | |
212 /* ----------------------------------------------------- */ | |
213 /* disabling terminal functions */ | |
214 /* ----------------------------------------------------- */ | |
215 | |
216 /* Try to establish the correct character to disable terminal functions | |
217 in a system-independent manner. | |
218 We use the POSIX standard way to do this, and emulate on other systems. */ | |
219 | |
220 #ifndef _POSIX_VDISABLE | |
221 # if defined CDEL | |
222 # define _POSIX_VDISABLE CDEL | |
223 # else | |
224 # define _POSIX_VDISABLE 255 | |
225 # endif | |
226 #endif /* ! _POSIX_VDISABLE */ | |
227 | |
228 | |
229 /* ----------------------------------------------------- */ | |
230 /* Get the number of characters queued for output */ | |
231 /* ----------------------------------------------------- */ | |
232 | |
233 /* EMACS_OUTQSIZE(FD, int *SIZE) stores the number of characters | |
234 queued for output to the terminal FD in *SIZE, if FD is a tty. | |
235 Returns -1 if there was an error (i.e. FD is not a tty), 0 | |
236 otherwise. */ | |
237 #ifdef TIOCOUTQ | |
238 #define EMACS_OUTQSIZE(fd, size) ioctl (fd, TIOCOUTQ, size) | |
239 #endif | |
240 | |
241 #ifdef HAVE_TERMIO | |
242 #ifdef TCOUTQ | |
243 #undef EMACS_OUTQSIZE | |
244 #define EMACS_OUTQSIZE(fd, size) ioctl (fd, TCOUTQ, size) | |
245 #endif | |
246 #endif | |
247 | |
248 | |
249 /* -------------------------------------------------------------------- */ | |
250 /* Manipulate a terminal's current (foreground) process group */ | |
251 /* -------------------------------------------------------------------- */ | |
252 | |
253 /* EMACS_HAVE_TTY_PGRP is true if we can get and set the tty's current | |
254 controlling process group. | |
255 | |
256 EMACS_GET_TTY_PGRP(int FD, int *PGID) sets *PGID the terminal FD's | |
257 current process group. Return -1 if there is an error. | |
258 | |
259 EMACS_SET_TTY_PGRP(int FD, int *PGID) sets the terminal FD's | |
260 current process group to *PGID. Return -1 if there is an error. */ | |
261 | |
262 /* HPUX tty process group stuff doesn't work, says the anonymous voice | |
263 from the past. */ | |
264 /* But HPUX people say it does, so I've removed it. --ben */ | |
265 # ifdef TIOCGPGRP | |
266 # define EMACS_HAVE_TTY_PGRP | |
267 # else | |
268 # ifdef HAVE_TERMIOS | |
269 # define EMACS_HAVE_TTY_PGRP | |
270 # endif | |
271 # endif | |
272 | |
273 #ifdef EMACS_HAVE_TTY_PGRP | |
274 | |
275 #if defined (HAVE_TERMIOS) && ! defined (BSD_TERMIOS) | |
276 | |
277 /* Resist the urge to insert needless extra parentheses. */ | |
278 #define EMACS_GET_TTY_PGRP(fd, pgid) (*(pgid) = tcgetpgrp (fd)) | |
279 #define EMACS_SET_TTY_PGRP(fd, pgid) tcsetpgrp (fd, *(pgid)) | |
280 | |
281 #elif defined (TIOCSPGRP) | |
282 | |
283 #define EMACS_GET_TTY_PGRP(fd, pgid) (ioctl ((fd), TIOCGPGRP, (pgid))) | |
284 #define EMACS_SET_TTY_PGRP(fd, pgid) (ioctl ((fd), TIOCSPGRP, (pgid))) | |
285 | |
286 #endif | |
287 | |
288 #endif /* EMACS_HAVE_TTY_PGRP */ | |
289 | |
290 #ifndef EMACS_GET_TTY_PGRP | |
291 | |
292 /* Just ignore this for now and hope for the best */ | |
293 #define EMACS_GET_TTY_PGRP(fd, pgid) 0 | |
294 #define EMACS_SET_TTY_PGRP(fd, pgif) 0 | |
295 | |
296 #endif | |
297 | |
298 /* XEmacs interim backward-compatibility */ | |
299 #define EMACS_GET_TTY_PROCESS_GROUP EMACS_GET_TTY_PGRP | |
300 #define EMACS_SET_TTY_PROCESS_GROUP EMACS_SET_TTY_PGRP | |
301 | |
302 /* EMACS_GETPGRP (arg) returns the process group of the terminal. */ | |
303 | |
304 #ifdef GETPGRP_VOID | |
305 #define EMACS_GETPGRP(x) getpgrp() | |
306 #else | |
307 #define EMACS_GETPGRP(x) getpgrp(x) | |
308 #endif /* GETPGRP_VOID */ | |
309 | |
310 /* XEmacs backward-compatibility. Is 0 always a reasonable argument? */ | |
311 #define EMACS_GET_PROCESS_GROUP() EMACS_GETPGRP (0) | |
312 | |
313 /* XEmacs addition? */ | |
314 | |
315 /* EMACS_SEPARATE_PROCESS_GROUP () creates a separate process group for the | |
316 running process. */ | |
317 | |
318 /* EMACS_SET_PROCESS_GROUP () sets our process group as specified. */ | |
319 | |
320 /* POSIX calls for setpgid(), so we use it if it's available. | |
321 Otherwise use setpgrp(), in USG or BSD flavor. Note that | |
322 on newer systems, setpgrp() has unwanted effects (e.g. | |
323 creating a new session), so we want to avoid its use | |
324 if possible. | |
325 | |
326 NOTE: On some older systems, we should consider using setpgrp2() | |
327 if it exists. This is sufficiently rare, though, that there | |
328 seems no point in autodetecting it. Currently dgux.h is the | |
329 only place where this has to be munged. */ | |
330 | |
331 #if defined (HAVE_SETPGID) | |
332 # define EMACS_SEPARATE_PROCESS_GROUP() setpgid (0, 0) | |
333 # define EMACS_SET_PROCESS_GROUP(pg) setpgid (0, pg) | |
334 #elif defined (USG) | |
335 # define EMACS_SEPARATE_PROCESS_GROUP() setpgrp () | |
336 /* old (pre-SVR4) USG's don't provide any way to do this. | |
337 No big loss -- it just means that ^Z won't work right | |
338 if we're run from sh. */ | |
339 # define EMACS_SET_PROCESS_GROUP(pg) | |
340 #elif defined(__MINGW32__) | |
341 # define EMACS_SEPARATE_PROCESS_GROUP() | |
342 #else | |
343 /* Under NeXTstep, a process group of 0 is not the same as specifying | |
344 your own process ID, so we go ahead and specify it explicitly. */ | |
345 # define EMACS_SEPARATE_PROCESS_GROUP() setpgrp (0, getpid ()) | |
346 # define EMACS_SET_PROCESS_GROUP(pg) setpgrp (0, pg) | |
347 #endif | |
348 | |
349 | |
350 /* --------------------------------------------------------- */ | |
351 /* Manipulate a TTY's input/output processing parameters */ | |
352 /* --------------------------------------------------------- */ | |
353 | |
354 /* struct emacs_tty is a structure used to hold the current tty | |
355 parameters. If the terminal has several structures describing its | |
356 state, for example a struct tchars, a struct sgttyb, a struct | |
357 tchars, a struct ltchars, and a struct pagechars, struct | |
358 emacs_tty should contain an element for each parameter struct | |
359 that Emacs may change. | |
360 | |
361 EMACS_GET_TTY (int FD, struct emacs_tty *P) stores the parameters | |
362 of the tty on FD in *P. Return zero if all's well, or -1 if we ran | |
363 into an error we couldn't deal with. | |
364 | |
365 EMACS_SET_TTY (int FD, struct emacs_tty *P, int flushp) | |
366 sets the parameters of the tty on FD according to the contents of | |
367 *P. If flushp is non-zero, we discard queued input to be | |
368 written before making the change. | |
369 Return 0 if all went well, and -1 if anything failed. | |
370 | |
371 EMACS_TTY_TABS_OK (struct emacs_tty *P) is false iff the kernel | |
372 expands tabs to spaces upon output; in that case, there is no | |
373 advantage to using tabs over spaces. */ | |
374 | |
375 | |
376 /* For each tty parameter structure that Emacs might want to save and restore, | |
377 - include an element for it in this structure, and | |
378 - extend the emacs_{get,set}_tty functions in sysdep.c to deal with the | |
379 new members. */ | |
380 | |
381 struct emacs_tty { | |
382 | |
383 /* There is always one of the following elements, so there is no need | |
384 for dummy get and set definitions. */ | |
385 #ifdef HAVE_TCATTR | |
386 struct termios main; | |
387 #else /* !HAVE_TCATTR */ | |
388 #ifdef HAVE_TERMIO | |
389 struct termio main; | |
390 #else /* !HAVE_TERMIO */ | |
391 #ifdef DOS_NT | |
392 int main; | |
393 #else /* not DOS_NT */ | |
394 struct sgttyb main; | |
395 #endif /* not DOS_NT */ | |
396 #endif /* !HAVE_TERMIO */ | |
397 #endif /* !HAVE_TCATTR */ | |
398 | |
399 /* If we have TERMIOS, we don't need to do this - they're taken care of | |
400 by the tc*attr calls. */ | |
401 #ifndef HAVE_TERMIOS | |
402 #ifdef HAVE_LTCHARS | |
403 struct ltchars ltchars; | |
404 #endif /* HAVE_LTCHARS */ | |
405 | |
406 #ifdef HAVE_TCHARS | |
407 struct tchars tchars; | |
408 int lmode; | |
409 #endif /* HAVE_TCHARS */ | |
410 #endif /* HAVE_TERMIOS */ | |
411 }; | |
412 | |
413 /* Define EMACS_GET_TTY and EMACS_SET_TTY, | |
414 the macros for reading and setting parts of `struct emacs_tty'. | |
415 | |
416 These got pretty unmanageable (huge macros are hard to debug), and | |
417 finally needed some code which couldn't be done as part of an | |
418 expression, so we moved them out to their own functions in sysdep.c. */ | |
419 #define EMACS_GET_TTY(fd, p) emacs_get_tty (fd, p) | |
420 #define EMACS_SET_TTY(fd, p, waitp) emacs_set_tty (fd, p, waitp) | |
421 | |
422 | |
423 /* --------------------------------------------------------- */ | |
424 /* Define EMACS_TTY_TABS_OK */ | |
425 /* --------------------------------------------------------- */ | |
426 | |
427 #ifdef HAVE_TERMIOS | |
428 | |
429 #ifdef TABDLY | |
430 #define EMACS_TTY_TABS_OK(p) (((p)->main.c_oflag & TABDLY) != TAB3) | |
431 #else | |
432 #define EMACS_TTY_TABS_OK(p) 1 | |
433 #endif /* TABDLY */ | |
434 | |
435 #else /* not def HAVE_TERMIOS */ | |
436 #ifdef HAVE_TERMIO | |
437 | |
438 #define EMACS_TTY_TABS_OK(p) (((p)->main.c_oflag & TABDLY) != TAB3) | |
439 | |
440 #else /* neither HAVE_TERMIO nor HAVE_TERMIOS */ | |
441 #ifdef DOS_NT | |
442 #define EMACS_TTY_TABS_OK(p) 0 | |
443 #else /* not DOS_NT */ | |
444 #define EMACS_TTY_TABS_OK(p) (((p)->main.sg_flags & XTABS) != XTABS) | |
445 #endif /* not DOS_NT */ | |
446 | |
447 #endif /* not def HAVE_TERMIO */ | |
448 #endif /* not def HAVE_TERMIOS */ | |
449 | |
450 #endif /* _XEMACS_SYSTTY_H_ */ |