* Copyright (c) 1992, 1993, 1994
* The Regents of the University of California. All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
static char sccsid
[] = "@(#)tty.c 8.5 (Berkeley) 8/13/94";
* In general, curses should leave tty hardware settings alone (speed, parity,
* word size). This is most easily done in BSD by using TCSASOFT on all
* tcsetattr calls. On other systems, it would be better to get and restore
* those attributes at each change, or at least when stopped and restarted.
* See also the comments in getterm().
int __tcaction
= 1; /* Ignore hardware settings. */
struct termios __orig_termios
, __baset
;
static struct termios cbreakt
, rawt
, *curt
;
#ifdef XTABS /* SMI uses XTABS. */
* Do terminal type initialization.
if (tcgetattr(STDIN_FILENO
, &__orig_termios
))
__baset
= __orig_termios
;
__baset
.c_oflag
&= ~OXTABS
;
GT
= 0; /* historical. was used before we wired OXTABS off */
NONL
= (__baset
.c_oflag
& ONLCR
) == 0;
* System V and SMI systems overload VMIN and VTIME, such that
* VMIN is the same as the VEOF element, and VTIME is the same
* as the VEOL element. This means that, if VEOF was ^D, the
* default VMIN is 4. Majorly stupid.
cbreakt
.c_lflag
&= ~ICANON
;
rawt
.c_iflag
&= ~(IGNBRK
|BRKINT
|PARMRK
|INLCR
|IGNCR
|ICRNL
|IXON
);
rawt
.c_lflag
&= ~(ECHO
|ECHONL
|ICANON
|ISIG
|IEXTEN
);
* In general, curses should leave hardware-related settings alone.
* This includes parity and word size. Older versions set the tty
* to 8 bits, no parity in raw(), but this is considered to be an
* artifact of the old tty interface. If it's desired to change
* parity and word size, the TCSASOFT bit has to be removed from the
* calls that switch to/from "raw" mode.
rawt
.c_cflag
&= ~(CSIZE
|PARENB
);
return (tcsetattr(STDIN_FILENO
, __tcaction
?
TCSASOFT
| TCSADRAIN
: TCSADRAIN
, curt
) ? ERR
: OK
);
useraw
= __pfast
= __rawmode
= 1;
return (tcsetattr(STDIN_FILENO
, __tcaction
?
TCSASOFT
| TCSADRAIN
: TCSADRAIN
, curt
) ? ERR
: OK
);
useraw
= __pfast
= __rawmode
= 0;
return (tcsetattr(STDIN_FILENO
, __tcaction
?
TCSASOFT
| TCSADRAIN
: TCSADRAIN
, curt
) ? ERR
: OK
);
curt
= useraw
? &rawt
: &cbreakt
;
return (tcsetattr(STDIN_FILENO
, __tcaction
?
TCSASOFT
| TCSADRAIN
: TCSADRAIN
, curt
) ? ERR
: OK
);
curt
= useraw
? &rawt
: &__baset
;
return (tcsetattr(STDIN_FILENO
, __tcaction
?
TCSASOFT
| TCSADRAIN
: TCSADRAIN
, curt
) ? ERR
: OK
);
return (tcsetattr(STDIN_FILENO
, __tcaction
?
TCSASOFT
| TCSADRAIN
: TCSADRAIN
, curt
) ? ERR
: OK
);
cbreakt
.c_lflag
&= ~ECHO
;
__baset
.c_lflag
&= ~ECHO
;
return (tcsetattr(STDIN_FILENO
, __tcaction
?
TCSASOFT
| TCSADRAIN
: TCSADRAIN
, curt
) ? ERR
: OK
);
cbreakt
.c_iflag
|= ICRNL
;
cbreakt
.c_oflag
|= ONLCR
;
__baset
.c_iflag
|= ICRNL
;
__baset
.c_oflag
|= ONLCR
;
return (tcsetattr(STDIN_FILENO
, __tcaction
?
TCSASOFT
| TCSADRAIN
: TCSADRAIN
, curt
) ? ERR
: OK
);
cbreakt
.c_iflag
&= ~ICRNL
;
cbreakt
.c_oflag
&= ~ONLCR
;
__baset
.c_iflag
&= ~ICRNL
;
__baset
.c_oflag
&= ~ONLCR
;
return (tcsetattr(STDIN_FILENO
, __tcaction
?
TCSASOFT
| TCSADRAIN
: TCSADRAIN
, curt
) ? ERR
: OK
);
* Some C libraries default to a 1K buffer when talking to a tty.
* With a larger screen, especially across a network, we'd like
* to get it to all flush in a single write. Make it twice as big
* as just the characters (so that we have room for cursor motions
* and standout information) but no more than 8K.
if ((len
= LINES
* COLS
* 2) > 8192)
if ((stdbuf
= malloc(len
)) == NULL
)
(void)setvbuf(stdout
, stdbuf
, _IOFBF
, len
);
tputs(TI
, 0, __cputchar
);
tputs(VS
, 0, __cputchar
);
if (curscr
->flags
& __WSTANDOUT
) {
tputs(SE
, 0, __cputchar
);
curscr
->flags
&= ~__WSTANDOUT
;
__mvcur(curscr
->cury
, curscr
->cury
, curscr
->maxy
- 1, 0, 0);
(void)tputs(VE
, 0, __cputchar
);
(void)tputs(TE
, 0, __cputchar
);
(void)setvbuf(stdout
, NULL
, _IOLBF
, 0);
return (tcsetattr(STDIN_FILENO
, __tcaction
?
TCSASOFT
| TCSADRAIN
: TCSADRAIN
, &__orig_termios
) ? ERR
: OK
);
* The following routines, savetty and resetty are completely useless and
* are left in only as stubs. If people actually use them they will almost
* certainly screw up the state of the world.
static struct termios savedtty
;
return (tcgetattr(STDIN_FILENO
, &savedtty
) ? ERR
: OK
);
return (tcsetattr(STDIN_FILENO
, __tcaction
?
TCSASOFT
| TCSADRAIN
: TCSADRAIN
, &savedtty
) ? ERR
: OK
);