Trailing whitespace deleted.
[bpt/emacs.git] / src / systty.h
index 662d6c0..fdd1f70 100644 (file)
@@ -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,89 @@ 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
 
 \f
 /* Include the proper files.  */
 #ifdef HAVE_TERMIO
+#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>
-#else
+#endif
+#else /* not HAVE_TERMIO */
 #ifdef HAVE_TERMIOS
+#if defined(_AIX) && defined(_I386)
+#include <termios.h>           /* termios.h needs to be before termio.h */
 #include <termio.h>
+#else /* not (_AIX && _I386) */
+#ifndef NO_TERMIO
+#include <termio.h>
+#endif
 #include <termios.h>
+#endif /* not (_AIX && _I386) */
+#define INCLUDED_FCNTL
+#include <fcntl.h>
 #else /* neither HAVE_TERMIO nor HAVE_TERMIOS */
 #ifndef VMS
+#ifndef DOS_NT
 #include <sgtty.h>
-#endif /* not VMS */
+#endif /* not DOS_NT */
+#else /* VMS */
+#include <descrip.h>
+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 <sys/ioctl.h>
+#include <termios.h>
+#endif
+
+#ifdef AIXHFT
 /* Get files for keyboard remapping */
 #define HFNKEYS 2
 #include <sys/hft.h>
@@ -53,20 +117,26 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #if defined (HPUX) && defined (HAVE_PTYS)
 #include <sys/ptyio.h>
 #endif
-  
+
 #ifdef AIX
 #include <sys/pty.h>
-#include <unistd.h>
 #endif /* AIX */
 
+#if (defined (POSIX) || defined (NEED_UNISTD_H)) && defined (HAVE_UNISTD_H)
+#include <unistd.h>
+#endif
+
 #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
 
 /* saka@pfu.fujitsu.co.JP writes:
    FASYNC defined in this file. But, FASYNC don't working.
@@ -101,11 +171,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
+
+\f
+/* 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 */
 \f
 /* Get the number of characters queued for output.  */
 
@@ -151,10 +247,10 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #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
@@ -173,6 +269,13 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #endif
 
+/* EMACS_GETPGRP (arg) returns the process group of the process.  */
+
+#if defined (GETPGRP_VOID)
+#  define EMACS_GETPGRP(x) getpgrp()
+#else
+#  define EMACS_GETPGRP(x) getpgrp(x)
+#endif /* !GETPGRP_VOID */
 \f
 /* Manipulate a TTY's input/output processing parameters.  */
 
@@ -183,35 +286,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
@@ -220,93 +319,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
 };
+\f
+/* 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))
-
+\f
+/* 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
@@ -320,7 +378,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 */