Mercurial > hg > xemacs-beta
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/systty.h Mon Aug 13 11:28:15 2007 +0200 @@ -0,0 +1,450 @@ +/* systty.h - System-dependent definitions for terminals. + Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. + +This file is part of XEmacs. + +XEmacs 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 2, or (at your option) any +later version. + +XEmacs is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with XEmacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* Synched up with: FSF 19.30. */ + +#ifndef _XEMACS_SYSTTY_H_ +#define _XEMACS_SYSTTY_H_ + +#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_UNISTD_H +#include <unistd.h> +#endif + +/* XEmacs: TERMIOS is mo' better than TERMIO so we use it if it's + there. Since TERMIO is backward-compatibility stuff if both it + and TERMIOS exist, it's more likely to be broken. */ + +#if defined (HAVE_TERMIOS) + +/***** (1) The TERMIOS way (POSIX style) *****/ + +# if defined (_AIX) && defined (_I386) +# include <termios.h> /* termios.h needs to be before termio.h */ +# include <termio.h> +# else +# if !defined (NO_TERMIO) +# include <termio.h> +# endif +# include <termios.h> +# endif /* _AIX && _I386 */ +# ifndef INCLUDED_FCNTL +# define INCLUDED_FCNTL +# include <fcntl.h> +# endif + +#elif defined (HAVE_TERMIO) + +/***** (2) The TERMIO way (system V style) *****/ + +# ifdef __DGUX +# include <sys/ioctl.h> +# endif +# ifndef NO_TERMIO +# include <termio.h> +# endif /* not NO_TERMIO */ +# ifndef INCLUDED_FCNTL +# define INCLUDED_FCNTL +# include <fcntl.h> +# endif + +#elif defined (DOS_NT) + +/***** (3) The MSDOS/NT way *****/ + +/* Nothing doing */ + +#else + +/***** (4) The BSD way *****/ + +# ifdef linux /* XEmacs addition -- necessary? */ +# include <bsd/sgtty.h> +# else +# include <sgtty.h> +# endif + + +#endif /* HAVE_TERMIOS */ + +/* XEmacs: I don't think we need the following crap. */ +#ifdef __GNU_LIBRARY__ +#include <termios.h> +#endif + +/* Formerly there was a conditional that included sys/filio.h if + USG5_4 was defined, but this is already included in s/usg5-4.h */ + +/* Generally useful to include this file: */ + +/* But Sun OS has broken include files and doesn't want it included */ +#if !defined (DOS_NT) && !defined (WIN32) && !defined (SUNOS4) +# include <sys/ioctl.h> +#endif +/* UNIPLUS systems may have FIONREAD. */ +#ifdef UNIPLUS +#include <sys.ioctl.h> +#endif + + +/* ----------------------------------------------------- */ +/* miscellaneous includes */ +/* ----------------------------------------------------- */ + +#ifdef AIXHFT +/* Get files for keyboard remapping */ +#define HFNKEYS 2 +#include <sys/hft.h> +#include <sys/devinfo.h> +#endif + +/* XEmacs: We don't support BSD 4.1 any more */ + +#ifdef NEED_BSDTTY +#include <sys/bsdtty.h> +#endif + +/* Include files for PTY's */ + +#if defined (HPUX) && defined (HAVE_PTYS) +#include <sys/ptyio.h> +#endif + +#ifdef AIX +#include <sys/pty.h> +#endif /* AIX */ + +#ifdef SYSV_PTYS +# include <sys/types.h> +# include <sys/tty.h> +# ifdef titan +# include <sys/ttyhw.h> +# include <sys/stream.h> +# endif +# ifndef NO_PTY_H +# include <sys/pty.h> +# endif +#endif + +/* XEmacs: removed some random if defined (pfa) crap for FASYNC (SIGIO). + We've cleaned SIGIO up. */ + + +/* ----------------------------------------------------- */ +/* inhibiting particular features */ +/* ----------------------------------------------------- */ + + +#ifdef APOLLO +#undef TIOCSTART +#endif + +#if defined (XENIX) || defined (BROKEN_TIOCGETC) +#undef TIOCGETC /* Avoid confusing some conditionals that test this. */ +#endif + +/* XEmacs: SIGIO is cleaned up so we remove the crap here that messes + with it (and FIONREAD and FASYNC, which are related). */ + +#ifdef BROKEN_TIOCGWINSZ /* XEmacs addition */ +#undef TIOCGWINSZ +#undef TIOCSWINSZ +#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 + + +/* ----------------------------------------------------- */ +/* disabling terminal functions */ +/* ----------------------------------------------------- */ + +/* Try to establish the correct character to disable terminal functions + in a system-independent manner. + We use the POSIX standard way to do this, and emulate on other systems. */ + +#ifndef _POSIX_VDISABLE +# if defined CDEL +# define _POSIX_VDISABLE CDEL +# else +# define _POSIX_VDISABLE 255 +# endif +#endif /* ! _POSIX_VDISABLE */ + + +/* ----------------------------------------------------- */ +/* Get the number of characters queued for output */ +/* ----------------------------------------------------- */ + +/* EMACS_OUTQSIZE(FD, int *SIZE) stores the number of characters + queued for output to the terminal FD in *SIZE, if FD is a tty. + Returns -1 if there was an error (i.e. FD is not a tty), 0 + otherwise. */ +#ifdef TIOCOUTQ +#define EMACS_OUTQSIZE(fd, size) ioctl (fd, TIOCOUTQ, size) +#endif + +#ifdef HAVE_TERMIO +#ifdef TCOUTQ +#undef EMACS_OUTQSIZE +#define EMACS_OUTQSIZE(fd, size) ioctl (fd, TCOUTQ, size) +#endif +#endif + + +/* -------------------------------------------------------------------- */ +/* Manipulate a terminal's current (foreground) process group */ +/* -------------------------------------------------------------------- */ + +/* EMACS_HAVE_TTY_PGRP is true if we can get and set the tty's current + controlling process group. + + EMACS_GET_TTY_PGRP(int FD, int *PGID) sets *PGID the terminal FD's + current process group. Return -1 if there is an error. + + 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. */ + +/* HPUX tty process group stuff doesn't work, says the anonymous voice + from the past. */ +/* But HPUX people say it does, so I've removed it. --ben */ +# ifdef TIOCGPGRP +# define EMACS_HAVE_TTY_PGRP +# else +# ifdef HAVE_TERMIOS +# define EMACS_HAVE_TTY_PGRP +# endif +# endif + +#ifdef EMACS_HAVE_TTY_PGRP + +#if defined (HAVE_TERMIOS) && ! defined (BSD_TERMIOS) + +/* Resist the urge to insert needless extra parentheses. */ +#define EMACS_GET_TTY_PGRP(fd, pgid) (*(pgid) = tcgetpgrp (fd)) +#define EMACS_SET_TTY_PGRP(fd, pgid) tcsetpgrp (fd, *(pgid)) + +#elif defined (TIOCSPGRP) + +#define EMACS_GET_TTY_PGRP(fd, pgid) (ioctl ((fd), TIOCGPGRP, (pgid))) +#define EMACS_SET_TTY_PGRP(fd, pgid) (ioctl ((fd), TIOCSPGRP, (pgid))) + +#endif + +#endif /* EMACS_HAVE_TTY_PGRP */ + +#ifndef EMACS_GET_TTY_PGRP + +/* 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 + +/* XEmacs interim backward-compatibility */ +#define EMACS_GET_TTY_PROCESS_GROUP EMACS_GET_TTY_PGRP +#define EMACS_SET_TTY_PROCESS_GROUP EMACS_SET_TTY_PGRP + +/* EMACS_GETPGRP (arg) returns the process group of the terminal. */ + +#ifdef GETPGRP_VOID +#define EMACS_GETPGRP(x) getpgrp() +#else +#define EMACS_GETPGRP(x) getpgrp(x) +#endif /* GETPGRP_VOID */ + +/* XEmacs backward-compatibility. Is 0 always a reasonable argument? */ +#define EMACS_GET_PROCESS_GROUP() EMACS_GETPGRP (0) + +/* XEmacs addition? */ + +/* EMACS_SEPARATE_PROCESS_GROUP () creates a separate process group for the + running process. */ + +/* EMACS_SET_PROCESS_GROUP () sets our process group as specified. */ + +/* POSIX calls for setpgid(), so we use it if it's available. + Otherwise use setpgrp(), in USG or BSD flavor. Note that + on newer systems, setpgrp() has unwanted effects (e.g. + creating a new session), so we want to avoid its use + if possible. + + NOTE: On some older systems, we should consider using setpgrp2() + if it exists. This is sufficiently rare, though, that there + seems no point in autodetecting it. Currently dgux.h is the + only place where this has to be munged. */ + +#if defined (HAVE_SETPGID) +# define EMACS_SEPARATE_PROCESS_GROUP() setpgid (0, 0) +# define EMACS_SET_PROCESS_GROUP(pg) setpgid (0, pg) +#elif defined (USG) +# define EMACS_SEPARATE_PROCESS_GROUP() setpgrp () +/* old (pre-SVR4) USG's don't provide any way to do this. + No big loss -- it just means that ^Z won't work right + if we're run from sh. */ +# define EMACS_SET_PROCESS_GROUP(pg) +#elif defined(__MINGW32__) +# define EMACS_SEPARATE_PROCESS_GROUP() +#else +/* Under NeXTstep, a process group of 0 is not the same as specifying + your own process ID, so we go ahead and specify it explicitly. */ +# define EMACS_SEPARATE_PROCESS_GROUP() setpgrp (0, getpid ()) +# define EMACS_SET_PROCESS_GROUP(pg) setpgrp (0, pg) +#endif + + +/* --------------------------------------------------------- */ +/* Manipulate a TTY's input/output processing parameters */ +/* --------------------------------------------------------- */ + +/* struct emacs_tty is a structure used to hold the current tty + parameters. If the terminal has several structures describing its + state, for example a struct tchars, a struct sgttyb, a struct + tchars, a struct ltchars, and a struct pagechars, struct + 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. 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 flushp) + sets the parameters of the tty on FD according to the contents of + *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, 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_TCATTR + struct termios main; +#else /* !HAVE_TCATTR */ +#ifdef HAVE_TERMIO + struct termio main; +#else /* !HAVE_TERMIO */ +#ifdef DOS_NT + int main; +#else /* not DOS_NT */ + struct sgttyb main; +#endif /* not DOS_NT */ +#endif /* !HAVE_TERMIO */ +#endif /* !HAVE_TCATTR */ + +/* 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 /* HAVE_LTCHARS */ + +#ifdef HAVE_TCHARS + struct tchars tchars; + int lmode; +#endif /* HAVE_TCHARS */ +#endif /* HAVE_TERMIOS */ +}; + +/* 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) + + +/* --------------------------------------------------------- */ +/* 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 /* TABDLY */ + +#else /* not def HAVE_TERMIOS */ +#ifdef HAVE_TERMIO + +#define EMACS_TTY_TABS_OK(p) (((p)->main.c_oflag & TABDLY) != TAB3) + +#else /* neither HAVE_TERMIO nor HAVE_TERMIOS */ +#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 HAVE_TERMIO */ +#endif /* not def HAVE_TERMIOS */ + +#endif /* _XEMACS_SYSTTY_H_ */