X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/4746118aca2d5cbdd054b4af4814d56550dfbc79..0c2338d8195e8e2eb4b14b3ba35d2e15ccbb0504:/src/systty.h diff --git a/src/systty.h b/src/systty.h index 4bbf021595..6aeb2f65a4 100644 --- a/src/systty.h +++ b/src/systty.h @@ -1,11 +1,11 @@ -/* systerm.h - System-dependent definitions for terminals. - Copyright (C) 1992 Free Software Foundation, Inc. +/* systty.h - System-dependent definitions for terminals. + Copyright (C) 1993, 1994 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) +the Free Software Foundation; either version 2, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, @@ -15,25 +15,112 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ +#ifdef HAVE_TERMIOS +#define HAVE_TCATTR +#endif + +/* If we defined these before and we are about to redefine them, + prevent alarming warnings. */ +#ifdef BSD_TERMIOS +#undef NL0 +#undef NL1 +#undef CR0 +#undef CR1 +#undef CR2 +#undef CR3 +#undef TAB0 +#undef TAB1 +#undef TAB2 +#undef XTABS +#undef BS0 +#undef BS1 +#undef FF0 +#undef FF1 +#undef ECHO +#undef NOFLSH +#undef TOSTOP +#undef FLUSHO +#undef PENDIN +#endif /* Include the proper files. */ #ifdef HAVE_TERMIO +#ifdef __DGUX +#include +#endif +#ifndef NO_TERMIO #include +#endif /* not NO_TERMIO */ +#ifndef INCLUDED_FCNTL +#define INCLUDED_FCNTL #include -#else +#endif +#else /* not HAVE_TERMIO */ #ifdef HAVE_TERMIOS +#if defined(_AIX) && defined(_I386) +#include /* termios.h needs to be before termio.h */ #include +#else /* not (_AIX && _I386) */ +#ifndef NO_TERMIO +#include +#endif #include +#endif /* not (_AIX && _I386) */ +#define INCLUDED_FCNTL +#include #else /* neither HAVE_TERMIO nor HAVE_TERMIOS */ #ifndef VMS +#ifndef DOS_NT #include -#endif /* not VMS */ +#endif /* not DOS_NT */ +#else /* VMS */ +#include +static struct iosb +{ + short status; + short offset; + short termlen; + short term; +} input_iosb; + +extern int waiting_for_ast; +extern int stop_input; +extern int input_ef; +extern int timer_ef; +extern int process_ef; +extern int input_eflist; +extern int timer_eflist; + +static $DESCRIPTOR (input_dsc, "TT"); +static int terminator_mask[2] = { 0, 0 }; + +static struct sensemode { + short status; + unsigned char xmit_baud; + unsigned char rcv_baud; + unsigned char crfill; + unsigned char lffill; + unsigned char parity; + unsigned char unused; + char class; + char type; + short scr_wid; + unsigned long tt_char : 24, scr_len : 8; + unsigned long tt2_char; +} sensemode_iosb; +#endif /* VMS */ #endif /* not HAVE_TERMIOS */ #endif /* not HAVE_TERMIO */ -#ifdef AIX +#ifdef __GNU_LIBRARY__ +#include +#include +#endif + +#ifdef AIXHFT /* Get files for keyboard remapping */ #define HFNKEYS 2 #include @@ -53,16 +140,26 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #if defined (HPUX) && defined (HAVE_PTYS) #include #endif - + #ifdef AIX #include -#include #endif /* AIX */ +#if (defined (POSIX) || defined (NEED_UNISTD_H)) && defined (HAVE_UNISTD_H) +#include +#endif + #ifdef SYSV_PTYS +#include #include +#ifdef titan +#include +#include +#endif +#ifndef NO_PTY_H #include #endif +#endif /* saka@pfu.fujitsu.co.JP writes: FASYNC defined in this file. But, FASYNC don't working. @@ -78,6 +175,10 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #undef TIOCSTART #endif +#ifdef XENIX +#undef TIOCGETC /* Avoid confusing some conditionals that test this. */ +#endif + #ifdef BROKEN_TIOCGETC #undef TIOCGETC /* Avoid confusing some conditionals that test this. */ #endif @@ -93,11 +194,37 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #undef ASYNC #endif -/* Interupt input is not used if there is no FIONREAD. */ +/* Interrupt input is not used if there is no FIONREAD. */ #ifndef FIONREAD #undef SIGIO #endif +/* On TERMIOS systems, the tcmumbleattr calls take care of these + parameters, and it's a bad idea to use them (on AIX, it makes the + tty hang for a long time). */ +#if defined (TIOCGLTC) && !defined (HAVE_TERMIOS) +#define HAVE_LTCHARS +#endif + +#if defined (TIOCGETC) && !defined (HAVE_TERMIOS) +#define HAVE_TCHARS +#endif + + +/* Try to establish the correct character to disable terminal functions + in a system-independent manner. Note that USG (at least) define + _POSIX_VDISABLE as 0! */ + +#ifdef _POSIX_VDISABLE +#define CDISABLE _POSIX_VDISABLE +#else /* not _POSIX_VDISABLE */ +#ifdef CDEL +#undef CDISABLE +#define CDISABLE CDEL +#else /* not CDEL */ +#define CDISABLE 255 +#endif /* not CDEL */ +#endif /* not _POSIX_VDISABLE */ /* Get the number of characters queued for output. */ @@ -128,6 +255,10 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ EMACS_SET_TTY_PGRP(int FD, int *PGID) sets the terminal FD's current process group to *PGID. Return -1 if there is an error. */ +#ifdef HPUX +/* HPUX tty process group stuff doesn't work, says the anonymous voice + from the past. */ +#else #ifdef TIOCGPGRP #define EMACS_HAVE_TTY_PGRP #else @@ -135,13 +266,14 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #define EMACS_HAVE_TTY_PGRP #endif #endif +#endif #ifdef EMACS_HAVE_TTY_PGRP -#ifdef HAVE_TERMIOS +#if defined (HAVE_TERMIOS) && ! defined (BSD_TERMIOS) #define EMACS_GET_TTY_PGRP(fd, pgid) (*(pgid) = tcgetpgrp ((fd))) -#define EMACS_SET_TTY_PGRP(fd, pgid) (*(pgid) = tcsetpgrp ((fd))) +#define EMACS_SET_TTY_PGRP(fd, pgid) (tcsetpgrp ((fd), *(pgid))) #else #ifdef TIOCSPGRP @@ -156,9 +288,36 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Just ignore this for now and hope for the best */ #define EMACS_GET_TTY_PGRP(fd, pgid) 0 +#define EMACS_SET_TTY_PGRP(fd, pgif) 0 #endif +/* EMACS_GETPGRP (arg) returns the process group of the process. */ + +#ifdef __GNU_LIBRARY__ +/* GNU libc by default defines getpgrp with no args on all systems. */ +#if __GLIBC__ >= 2 +/* glibc-2.1 adds the BSD compatibility getpgrp function + if you use _BSD_SOURCE, which Emacs does on GNU/Linux systems. */ +#if __GLIBC_MINOR__ < 1 || ! defined (__FAVOR_BSD) +#define GETPGRP_NO_ARG +#endif +#else /* __GLIBC__ < 2 */ +#define GETPGRP_NO_ARG +#endif /* __GLIBC__ < 2 */ +#else /* not __GNU_LIBRARY__ */ +#if defined (USG) && !defined (GETPGRP_NEEDS_ARG) +# if !defined (GETPGRP_NO_ARG) +# define GETPGRP_NO_ARG +# endif +#endif +#endif /* not __GNU_LIBRARY__ */ + +#if defined (GETPGRP_NO_ARG) +# define EMACS_GETPGRP(x) getpgrp() +#else +# define EMACS_GETPGRP(x) getpgrp(x) +#endif /* !GETPGRP_NO_ARG */ /* Manipulate a TTY's input/output processing parameters. */ @@ -169,35 +328,31 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ emacs_tty should contain an element for each parameter struct that Emacs may change. - EMACS_GET_TTY (int FD, struct emacs_tty *P) stores the - parameters of the tty on FD in *P. + EMACS_GET_TTY (int FD, struct emacs_tty *P) stores the parameters + of the tty on FD in *P. Return zero if all's well, or -1 if we ran + into an error we couldn't deal with. - EMACS_SET_TTY (int FD, struct emacs_tty *P, int waitp) + EMACS_SET_TTY (int FD, struct emacs_tty *P, int flushp) sets the parameters of the tty on FD according to the contents of - *P. If waitp is non-zero, we wait for all queued output to be - written before making the change; otherwise, we forget any queued - input and make the change immediately. + *P. If flushp is non-zero, we discard queued input to be + written before making the change. + Return 0 if all went well, and -1 if anything failed. EMACS_TTY_TABS_OK (struct emacs_tty *P) is false iff the kernel expands tabs to spaces upon output; in that case, there is no advantage to using tabs over spaces. */ - /* For each tty parameter structure that Emacs might want to save and restore, - - include an element for it in this structure, - - define a pair of numbered macros to get and set it and return - true iff the call succeeded, - - give alternative definitions for when the component is not implemented - which always succeed, and - - extend the definition of EMACS_{GET,SET}_TTY_CHARS to include the - new macros. */ + - include an element for it in this structure, and + - extend the emacs_{get,set}_tty functions in sysdep.c to deal with the + new members. */ struct emacs_tty { /* There is always one of the following elements, so there is no need for dummy get and set definitions. */ -#ifdef HAVE_TERMIOS +#ifdef HAVE_TCATTR struct termios main; #else #ifdef HAVE_TERMIO @@ -206,93 +361,52 @@ struct emacs_tty { #ifdef VMS struct sensemode main; #else +#ifdef DOS_NT + int main; +#else /* not DOS_NT */ struct sgttyb main; +#endif /* not DOS_NT */ #endif #endif #endif -#ifdef HAVE_TERMIOS -#define HAVE_TCATTR -#endif - -#ifdef HAVE_TCATTR - -#define EMACS_GET_TTY_1(fd, p) (tcgetattr ((fd), &(p)->main) != -1) -#define EMACS_SET_TTY_1(fd, p, waitp) \ - (tcsetattr ((fd), (waitp) ? TCSAFLUSH : TCSADRAIN, &(p)->main) != -1) - -#else -#ifdef HAVE_TERMIO - -#define EMACS_GET_TTY_1(fd, p) (ioctl ((fd), TCGETA, &(p)->main) != -1) -#define EMACS_SET_TTY_1(fd, p, waitp) \ - (ioctl ((fd), (waitp) ? TCSETAW : TCSETAF, &(p)->main) != -1) - -#else -#ifdef VMS - -/* These definitions will really only work in sysdep.c, because of their - use of input_iosb. I don't know enough about VMS QIO to fix this. */ -#define EMACS_GET_TTY_1(fd, p) \ - SYS$QIOW (0, (fd), IO$_SENSEMODE, (p), 0, 0, \ - &(p)->main.class, 12, 0, 0, 0, 0); -#define EMACS_SET_TTY_1(fd, p, waitp) \ - SYS$QIOW (0, (fd), IO$_SETMODE, &input_iosb, 0, 0, \ - &(p)->main.class, 12, 0, 0, 0, 0); - -#else - -#define EMACS_GET_TTY_1(fd, p) (ioctl ((fd), TIOCGETP, &(p)->main) != -1) -#define EMACS_SET_TTY_1(fd, p, waitp) \ - (ioctl ((fd), (waitp) ? TIOCSETP : TIOCSETN, &(p)->main) != -1) - -#endif -#endif -#endif - -#ifdef TIOCGLTC +/* If we have TERMIOS, we don't need to do this - they're taken care of + by the tc*attr calls. */ +#ifndef HAVE_TERMIOS +#ifdef HAVE_LTCHARS struct ltchars ltchars; -#define EMACS_GET_TTY_2(fd, p) \ - (ioctl ((fd), TIOCGLTC, &(p)->ltchars) != -1) -#define EMACS_SET_TTY_2(fd, p, waitp) \ - (ioctl ((fd), TIOCSLTC, &(p)->ltchars) != -1) -#else -#define EMACS_GET_TTY_2(fd, p) 1 -#define EMACS_SET_TTY_2(fd, p, waitp) 1 -#endif /* TIOCGLTC */ +#endif -#ifdef TIOCGETC +#ifdef HAVE_TCHARS struct tchars tchars; int lmode; -#define EMACS_GET_TTY_3(fd, p) \ - (ioctl ((fd), TIOCGETC, &(p)->tchars) != -1 \ - && ioctl ((fd), TIOCLGET, &(p)->lmode) != -1) -#define EMACS_SET_TTY_3(fd, p, waitp) \ - (ioctl ((fd), TIOCSETC, &(p)->tchars) != -1 \ - && ioctl ((fd), TIOCLSET, &(p)->lmode) != -1) -#else -#define EMACS_GET_TTY_3(fd, p) 1 -#define EMACS_SET_TTY_3(fd, p, waitp) 1 -#endif /* TIOCGLTC */ - +#endif +#endif }; + +/* Define EMACS_GET_TTY and EMACS_SET_TTY, + the macros for reading and setting parts of `struct emacs_tty'. + + These got pretty unmanageable (huge macros are hard to debug), and + finally needed some code which couldn't be done as part of an + expression, so we moved them out to their own functions in sysdep.c. */ +#define EMACS_GET_TTY(fd, p) (emacs_get_tty ((fd), (p))) +#define EMACS_SET_TTY(fd, p, waitp) (emacs_set_tty ((fd), (p), (waitp))) +#ifdef P_ /* Unfortunately this file is sometimes included before lisp.h */ +extern int emacs_get_tty P_ ((int, struct emacs_tty *)); +extern int emacs_set_tty P_ ((int, struct emacs_tty *, int)); +#endif -/* Define these to be a concatenation of all the EMACS_{GET,SET}_TTY - macros. */ -#define EMACS_GET_TTY(fd, tc) \ - (EMACS_GET_TTY_1 (fd, tc) \ - && EMACS_GET_TTY_2 (fd, tc) \ - && EMACS_GET_TTY_3 (fd, tc)) - -#define EMACS_SET_TTY(fd, tc, waitp) \ - (EMACS_SET_TTY_1 (fd, tc, waitp) \ - && EMACS_SET_TTY_2 (fd, tc, waitp) \ - && EMACS_SET_TTY_3 (fd, tc, waitp)) - + +/* Define EMACS_TTY_TABS_OK. */ #ifdef HAVE_TERMIOS +#ifdef TABDLY #define EMACS_TTY_TABS_OK(p) (((p)->main.c_oflag & TABDLY) != TAB3) +#else +#define EMACS_TTY_TABS_OK(p) 1 +#endif #else /* not def HAVE_TERMIOS */ #ifdef HAVE_TERMIO @@ -306,7 +420,11 @@ struct emacs_tty { #else +#ifdef DOS_NT +#define EMACS_TTY_TABS_OK(p) 0 +#else /* not DOS_NT */ #define EMACS_TTY_TABS_OK(p) (((p)->main.sg_flags & XTABS) != XTABS) +#endif /* not DOS_NT */ #endif /* not def VMS */ #endif /* not def HAVE_TERMIO */