X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/210b2b4f058671a18e3f087fd696766ea8a23025..0c2338d8195e8e2eb4b14b3ba35d2e15ccbb0504:/src/systty.h diff --git a/src/systty.h b/src/systty.h index 7e5efa0946..6aeb2f65a4 100644 --- a/src/systty.h +++ b/src/systty.h @@ -1,11 +1,11 @@ /* systty.h - System-dependent definitions for terminals. - Copyright (C) 1992 Free Software Foundation, Inc. + 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,24 +15,67 @@ 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 DOS_NT */ #else /* VMS */ #include static struct iosb @@ -45,15 +88,9 @@ static struct iosb extern int waiting_for_ast; extern int stop_input; -#if 0 /* VAX C doeasn't understand initializing declarations */ -extern int input_ef = 0; -extern int timer_ef = 0; -extern int process_ef = 0; -#else extern int input_ef; extern int timer_ef; extern int process_ef; -#endif extern int input_eflist; extern int timer_eflist; @@ -78,7 +115,12 @@ static struct sensemode { #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 @@ -98,20 +140,26 @@ static struct sensemode { #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. @@ -146,11 +194,22 @@ static struct sensemode { #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 @@ -160,6 +219,7 @@ static struct sensemode { #define CDISABLE _POSIX_VDISABLE #else /* not _POSIX_VDISABLE */ #ifdef CDEL +#undef CDISABLE #define CDISABLE CDEL #else /* not CDEL */ #define CDISABLE 255 @@ -210,10 +270,10 @@ static struct sensemode { #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 @@ -232,6 +292,32 @@ static struct sensemode { #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. */ @@ -242,14 +328,15 @@ static struct sensemode { 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 @@ -257,13 +344,9 @@ static struct sensemode { /* 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 { @@ -278,96 +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 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; #endif -#ifdef TIOCGETC + +#ifdef HAVE_TCHARS struct tchars tchars; int lmode; #endif +#endif }; /* Define EMACS_GET_TTY and EMACS_SET_TTY, - the macros for reading and setting parts of `struct emacs_tty'. */ - -#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) \ - (1 & 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) \ - (1 & 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 + 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 -#ifdef TIOCGLTC -#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 */ - -#ifdef TIOCGETC -#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 */ - -/* Define these to be a concatenation of all the EMACS_{GET,SET}_TTY_n - 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 @@ -381,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 */