-/* systerm.h - System-dependent definitions for terminals.
- Copyright (C) 1992 Free Software Foundation, Inc.
+/* systty.h - System-dependent definitions for terminals.
+ Copyright (C) 1993 Free Software Foundation, Inc.
This file is part of GNU Emacs.
along with GNU Emacs; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, 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
\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 */
#include <fcntl.h>
#else
#ifdef HAVE_TERMIOS
+#if defined(_AIX) && defined(_I386)
+#include <termios.h> /* termios.h needs to be before termio.h */
+#include <termio.h>
+#else
+#ifndef NO_TERMIO
#include <termio.h>
+#endif
#include <termios.h>
+#endif /* _AIX && _I386 */
+#include <fcntl.h>
#else /* neither HAVE_TERMIO nor HAVE_TERMIOS */
#ifndef VMS
#include <sgtty.h>
-#endif /* not VMS */
+#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;
+#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;
+
+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
#include <sys/pty.h>
#include <unistd.h>
+#define UNISTD_H_INCLUDED
#endif /* AIX */
+#ifdef IRIX4
+/* Get _getpty prototype */
+#include <unistd.h>
+#define UNISTD_H_INCLUDED
+#endif
+
+#if defined (POSIX) && !defined (UNISTD_H_INCLUDED) && defined (HAVE_UNISTD_H)
+#include <unistd.h>
+#define UNISTD_H_INCLUDED
+#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.
#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. */
#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
#endif
+/* EMACS_GETPGRP (arg) returns the process group of the terminal. */
+
+#if defined (USG) && !defined (GETPGRP_NEEDS_ARG)
+# if !defined (GETPGRP_NO_ARG)
+# define GETPGRP_NO_ARG
+# endif
+#endif
+
+#if defined (GETPGRP_NO_ARG)
+# define EMACS_GETPGRP(x) getpgrp()
+#else
+# define EMACS_GETPGRP(x) getpgrp(x)
+#endif /* !GETPGRP_NO_ARG */
\f
/* Manipulate a TTY's input/output processing parameters. */
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)
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.
+ 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
#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'.
-/* 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))
+ 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)))
+\f
+/* Define EMACS_TTY_TABS_OK. */
#ifdef HAVE_TERMIOS