SCCS-vsn: lib/libcurses/curses.h 5.38
SCCS-vsn: lib/libcurses/addbytes.c 5.22
SCCS-vsn: lib/libcurses/cr_put.c 5.21
SCCS-vsn: lib/libcurses/scroll.c 5.13
SCCS-vsn: lib/libcurses/tstp.c 5.9
SCCS-vsn: lib/libcurses/initscr.c 5.16
SCCS-vsn: lib/libcurses/tty.c 5.17
-static char sccsid[] = "@(#)addbytes.c 5.21 (Berkeley) %G%";
+static char sccsid[] = "@(#)addbytes.c 5.22 (Berkeley) %G%";
#endif /* not lint */
#include <curses.h>
#endif /* not lint */
#include <curses.h>
SYNCH_OUT;
wclrtoeol(win);
SYNCH_IN;
SYNCH_OUT;
wclrtoeol(win);
SYNCH_IN;
- if (__orig_termios.c_oflag & ONLCR)
+ if (__baset.c_oflag & ONLCR)
x = 0;
goto newline;
case '\r':
x = 0;
goto newline;
case '\r':
-static char sccsid[] = "@(#)cr_put.c 5.20 (Berkeley) %G%";
+static char sccsid[] = "@(#)cr_put.c 5.21 (Berkeley) %G%";
#endif /* not lint */
#include <curses.h>
#endif /* not lint */
#include <curses.h>
* If we will later need a \n which will turn into a \r\n by the
* system or the terminal, then don't bother to try to \r.
*/
* If we will later need a \n which will turn into a \r\n by the
* system or the terminal, then don't bother to try to \r.
*/
- if ((!(__orig_termios.c_oflag & ONLCR) ||
+ if ((!(__baset.c_oflag & ONLCR) ||
!__pfast) && outline < destline)
goto dontcr;
!__pfast) && outline < destline)
goto dontcr;
plodput('\n');
if (plodcnt < 0)
goto out;
plodput('\n');
if (plodcnt < 0)
goto out;
- if (!(__orig_termios.c_oflag & ONLCR) || __pfast == 0)
+ if (!(__baset.c_oflag & ONLCR) || __pfast == 0)
*
* %sccs.include.redist.c%
*
*
* %sccs.include.redist.c%
*
- * @(#)curses.h 5.37 (Berkeley) %G%
+ * @(#)curses.h 5.38 (Berkeley) %G%
#define _putchar(c) __cputchar(c)
/* Old-style terminal modes access. */
#define _putchar(c) __cputchar(c)
/* Old-style terminal modes access. */
-#define baudrate() (cfgetospeed(&__orig_termios))
+#define baudrate() (cfgetospeed(&__baset))
#define crmode() cbreak()
#define crmode() cbreak()
-#define erasechar() (__orig_termios.c_cc[VERASE])
-#define killchar() (__orig_termios.c_cc[VKILL])
+#define erasechar() (__baset.c_cc[VERASE])
+#define killchar() (__baset.c_cc[VKILL])
#define nocrmode() nocbreak()
#define nocrmode() nocbreak()
-#define ospeed (cfgetospeed(&__orig_termios))
+#define ospeed (cfgetospeed(&__baset))
#endif /* _CURSES_PRIVATE */
extern char GT; /* Gtty indicates tabs. */
#endif /* _CURSES_PRIVATE */
extern char GT; /* Gtty indicates tabs. */
extern WINDOW *curscr; /* Current screen. */
extern WINDOW *stdscr; /* Standard screen. */
extern WINDOW *curscr; /* Current screen. */
extern WINDOW *stdscr; /* Standard screen. */
-extern struct termios __orig_termios; /* Original terminal modes. */
+extern struct termios __orig_termios; /* Terminal state before curses */
+extern struct termios __baset; /* Our base terminal state */
+extern int __tcaction; /* Controls whether tcsetattr will
+ ignore hardware settings */
extern int COLS; /* Columns on the screen. */
extern int LINES; /* Lines on the screen. */
extern int COLS; /* Columns on the screen. */
extern int LINES; /* Lines on the screen. */
u_int __hash __P((char *, int));
void __id_subwins __P((WINDOW *));
int __mvcur __P((int, int, int, int, int));
u_int __hash __P((char *, int));
void __id_subwins __P((WINDOW *));
int __mvcur __P((int, int, int, int, int));
+void __restore_stophandler __P((void));
+void __set_stophandler __P((void));
void __set_subwin __P((WINDOW *, WINDOW *));
void __startwin __P((void));
void __stop_signal_handler __P((int));
void __set_subwin __P((WINDOW *, WINDOW *));
void __startwin __P((void));
void __stop_signal_handler __P((int));
-static char sccsid[] = "@(#)initscr.c 5.15 (Berkeley) %G%";
+static char sccsid[] = "@(#)initscr.c 5.16 (Berkeley) %G%";
#endif /* not lint */
#include <curses.h>
#endif /* not lint */
#include <curses.h>
- (void)signal(SIGTSTP, __stop_signal_handler);
#ifdef DEBUG
__CTRACE("initscr: LINES = %d, COLS = %d\n", LINES, COLS);
#ifdef DEBUG
__CTRACE("initscr: LINES = %d, COLS = %d\n", LINES, COLS);
-static char sccsid[] = "@(#)scroll.c 5.12 (Berkeley) %G%";
+static char sccsid[] = "@(#)scroll.c 5.13 (Berkeley) %G%";
#endif /* not lint */
#include <curses.h>
#endif /* not lint */
#include <curses.h>
if (win == curscr) {
putchar('\n');
if (win == curscr) {
putchar('\n');
- if (__orig_termios.c_oflag & ONLCR)
+ if (__baset.c_oflag & ONLCR)
win->curx = 0;
#ifdef DEBUG
__CTRACE("scroll: win == curscr\n");
win->curx = 0;
#ifdef DEBUG
__CTRACE("scroll: win == curscr\n");
-static char sccsid[] = "@(#)tstp.c 5.8 (Berkeley) %G%";
+static char sccsid[] = "@(#)tstp.c 5.9 (Berkeley) %G%";
#endif /* not lint */
#include <curses.h>
#endif /* not lint */
#include <curses.h>
#include <termios.h>
#include <unistd.h>
#include <termios.h>
#include <unistd.h>
/*
* stop_signal_handler --
* Handle stop signals.
/*
* stop_signal_handler --
* Handle stop signals.
struct termios save;
sigset_t oset, set;
struct termios save;
sigset_t oset, set;
- /* Get the current terminal state. */
+ /* Get the current terminal state (which the user may have changed). */
if (tcgetattr(STDIN_FILENO, &save))
return;
if (tcgetattr(STDIN_FILENO, &save))
return;
(void)sigprocmask(SIG_UNBLOCK, &set, NULL);
/* Stop ourselves. */
(void)sigprocmask(SIG_UNBLOCK, &set, NULL);
/* Stop ourselves. */
- (void)signal(SIGTSTP, SIG_DFL);
+ __restore_stophandler();
(void)kill(0, SIGTSTP);
/* Time passes ... */
/* Reset the curses SIGTSTP signal handler. */
(void)kill(0, SIGTSTP);
/* Time passes ... */
/* Reset the curses SIGTSTP signal handler. */
- (void)signal(SIGTSTP, __stop_signal_handler);
+ __set_stophandler();
+
+ /* save the new "default" terminal state */
+ (void)tcgetattr(STDIN_FILENO, &__orig_termios);
- /* Reset the terminal state its mode when we stopped. */
- (void)tcsetattr(STDIN_FILENO, TCSADRAIN, &save);
+ /* Reset the terminal state to the mode just before we stopped. */
+ (void)tcsetattr(STDIN_FILENO, __tcaction, &save);
/* Restart the screen. */
__startwin();
/* Restart the screen. */
__startwin();
/* Reset the signals. */
(void)sigprocmask(SIG_SETMASK, &oset, NULL);
}
/* Reset the signals. */
(void)sigprocmask(SIG_SETMASK, &oset, NULL);
}
+
+static void (*otstpfn)() = SIG_DFL;
+
+/*
+ * Set the TSTP handler.
+ */
+void
+__set_stophandler()
+{
+ otstpfn = signal(SIGTSTP, __stop_signal_handler);
+}
+
+/*
+ * Restore the TSTP handler.
+ */
+void
+__restore_stophandler()
+{
+ (void)signal(SIGTSTP, otstpfn);
+}
-static char sccsid[] = "@(#)tty.c 5.16 (Berkeley) %G%";
+static char sccsid[] = "@(#)tty.c 5.17 (Berkeley) %G%";
#endif /* not lint */
#include <sys/ioctl.h>
#endif /* not lint */
#include <sys/ioctl.h>
* See also the comments in getterm().
*/
#ifdef TCSASOFT
* See also the comments in getterm().
*/
#ifdef TCSASOFT
-#define TCACTION (TCSASOFT | TCSADRAIN) /* ignore hardware settings */
+int __tcaction = TCSASOFT | TCSADRAIN; /* ignore hardware settings */
-#define TCACTION TCSADRAIN
+int __tcaction = TCSADRAIN;
-struct termios __orig_termios;
-static struct termios baset, cbreakt, rawt, *curt;
+/* was, pfast = rand() % HARDTABS; */
+
+struct termios __orig_termios, __baset;
+static struct termios cbreakt, rawt, *curt;
static int useraw;
#ifndef OXTABS
static int useraw;
#ifndef OXTABS
if (tcgetattr(STDIN_FILENO, &__orig_termios))
return (ERR);
if (tcgetattr(STDIN_FILENO, &__orig_termios))
return (ERR);
- GT = (__orig_termios.c_oflag & OXTABS) == 0;
- NONL = (__orig_termios.c_oflag & ONLCR) == 0;
+ __baset = __orig_termios;
+ __baset.c_oflag &= ~OXTABS;
- baset = __orig_termios;
- baset.c_oflag &= ~OXTABS;
+ GT = 0; /* historical. was used before we wired OXTABS off */
+ NONL = (__baset.c_oflag & ONLCR) == 0;
* as the VEOL element. This means that, if VEOF was ^D, the
* default VMIN is 4. Majorly stupid.
*/
* as the VEOL element. This means that, if VEOF was ^D, the
* default VMIN is 4. Majorly stupid.
*/
cbreakt.c_lflag &= ~ICANON;
cbreakt.c_cc[VMIN] = 1;
cbreakt.c_cc[VTIME] = 0;
cbreakt.c_lflag &= ~ICANON;
cbreakt.c_cc[VMIN] = 1;
cbreakt.c_cc[VTIME] = 0;
rawt.c_cflag |= CS8;
#endif
rawt.c_cflag |= CS8;
#endif
- curt = &baset;
- return (tcsetattr(STDIN_FILENO, TCACTION, &baset) ? ERR : OK);
+ curt = &__baset;
+ return (tcsetattr(STDIN_FILENO, __tcaction, &__baset) ? ERR : OK);
{
useraw = __pfast = __rawmode = 1;
curt = &rawt;
{
useraw = __pfast = __rawmode = 1;
curt = &rawt;
- return (tcsetattr(STDIN_FILENO, TCACTION, &rawt));
+ return (tcsetattr(STDIN_FILENO, __tcaction, &rawt));
}
int
noraw()
{
useraw = __pfast = __rawmode = 0;
}
int
noraw()
{
useraw = __pfast = __rawmode = 0;
- curt = &baset;
- return (tcsetattr(STDIN_FILENO, TCACTION, &baset));
+ curt = &__baset;
+ return (tcsetattr(STDIN_FILENO, __tcaction, &__baset));
__rawmode = 1;
curt = useraw ? &rawt : &cbreakt;
__rawmode = 1;
curt = useraw ? &rawt : &cbreakt;
- return (tcsetattr(STDIN_FILENO, TCACTION, curt));
+ return (tcsetattr(STDIN_FILENO, __tcaction, curt));
- curt = useraw ? &rawt : &baset;
- return (tcsetattr(STDIN_FILENO, TCACTION, curt));
+ curt = useraw ? &rawt : &__baset;
+ return (tcsetattr(STDIN_FILENO, __tcaction, curt));
{
rawt.c_lflag |= ECHO;
cbreakt.c_lflag |= ECHO;
{
rawt.c_lflag |= ECHO;
cbreakt.c_lflag |= ECHO;
+ __baset.c_lflag |= ECHO;
- return (tcsetattr(STDIN_FILENO, TCACTION, curt));
+ return (tcsetattr(STDIN_FILENO, __tcaction, curt));
{
rawt.c_lflag &= ~ECHO;
cbreakt.c_lflag &= ~ECHO;
{
rawt.c_lflag &= ~ECHO;
cbreakt.c_lflag &= ~ECHO;
- baset.c_lflag &= ~ECHO;
+ __baset.c_lflag &= ~ECHO;
- return (tcsetattr(STDIN_FILENO, TCACTION, curt));
+ return (tcsetattr(STDIN_FILENO, __tcaction, curt));
rawt.c_oflag |= ONLCR;
cbreakt.c_iflag |= ICRNL;
cbreakt.c_oflag |= ONLCR;
rawt.c_oflag |= ONLCR;
cbreakt.c_iflag |= ICRNL;
cbreakt.c_oflag |= ONLCR;
- baset.c_iflag |= ICRNL;
- baset.c_oflag |= ONLCR;
+ __baset.c_iflag |= ICRNL;
+ __baset.c_oflag |= ONLCR;
- return (tcsetattr(STDIN_FILENO, TCACTION, curt));
+ return (tcsetattr(STDIN_FILENO, __tcaction, curt));
rawt.c_oflag &= ~ONLCR;
cbreakt.c_iflag &= ~ICRNL;
cbreakt.c_oflag &= ~ONLCR;
rawt.c_oflag &= ~ONLCR;
cbreakt.c_iflag &= ~ICRNL;
cbreakt.c_oflag &= ~ONLCR;
- baset.c_iflag &= ~ICRNL;
- baset.c_oflag &= ~ONLCR;
+ __baset.c_iflag &= ~ICRNL;
+ __baset.c_oflag &= ~ONLCR;
- return (tcsetattr(STDIN_FILENO, TCACTION, curt));
+ return (tcsetattr(STDIN_FILENO, __tcaction, curt));
(void)fflush(stdout);
(void)setvbuf(stdout, NULL, _IOLBF, 0);
(void)fflush(stdout);
(void)setvbuf(stdout, NULL, _IOLBF, 0);
- return (tcsetattr(STDIN_FILENO, TCACTION, &__orig_termios));
+ return (tcsetattr(STDIN_FILENO, __tcaction, &__orig_termios));
- return (tcsetattr(STDIN_FILENO, TCACTION, &savedtty));
+ return (tcsetattr(STDIN_FILENO, __tcaction, &savedtty));