1*0c3ae37fSLionel Sambuc /* $NetBSD: tty.c,v 1.43 2011/08/29 11:07:38 christos Exp $ */
251ffecc1SBen Gras
351ffecc1SBen Gras /*-
451ffecc1SBen Gras * Copyright (c) 1992, 1993, 1994
551ffecc1SBen Gras * The Regents of the University of California. All rights reserved.
651ffecc1SBen Gras *
751ffecc1SBen Gras * Redistribution and use in source and binary forms, with or without
851ffecc1SBen Gras * modification, are permitted provided that the following conditions
951ffecc1SBen Gras * are met:
1051ffecc1SBen Gras * 1. Redistributions of source code must retain the above copyright
1151ffecc1SBen Gras * notice, this list of conditions and the following disclaimer.
1251ffecc1SBen Gras * 2. Redistributions in binary form must reproduce the above copyright
1351ffecc1SBen Gras * notice, this list of conditions and the following disclaimer in the
1451ffecc1SBen Gras * documentation and/or other materials provided with the distribution.
1551ffecc1SBen Gras * 3. Neither the name of the University nor the names of its contributors
1651ffecc1SBen Gras * may be used to endorse or promote products derived from this software
1751ffecc1SBen Gras * without specific prior written permission.
1851ffecc1SBen Gras *
1951ffecc1SBen Gras * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2051ffecc1SBen Gras * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2151ffecc1SBen Gras * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2251ffecc1SBen Gras * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2351ffecc1SBen Gras * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2451ffecc1SBen Gras * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2551ffecc1SBen Gras * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2651ffecc1SBen Gras * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2751ffecc1SBen Gras * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2851ffecc1SBen Gras * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2951ffecc1SBen Gras * SUCH DAMAGE.
3051ffecc1SBen Gras */
3151ffecc1SBen Gras
3251ffecc1SBen Gras #include <sys/cdefs.h>
3351ffecc1SBen Gras #ifndef lint
3451ffecc1SBen Gras #if 0
3551ffecc1SBen Gras static char sccsid[] = "@(#)tty.c 8.6 (Berkeley) 1/10/95";
3651ffecc1SBen Gras #else
37*0c3ae37fSLionel Sambuc __RCSID("$NetBSD: tty.c,v 1.43 2011/08/29 11:07:38 christos Exp $");
3851ffecc1SBen Gras #endif
3951ffecc1SBen Gras #endif /* not lint */
4051ffecc1SBen Gras
4151ffecc1SBen Gras #include <sys/types.h>
4251ffecc1SBen Gras
4351ffecc1SBen Gras #include <stdlib.h>
4451ffecc1SBen Gras #include <termios.h>
4551ffecc1SBen Gras #include <unistd.h>
4651ffecc1SBen Gras #include <sys/fcntl.h>
4751ffecc1SBen Gras #include <sys/ioctl.h>
4851ffecc1SBen Gras
4951ffecc1SBen Gras #include "curses.h"
5051ffecc1SBen Gras #include "curses_private.h"
5151ffecc1SBen Gras
5251ffecc1SBen Gras /*
5351ffecc1SBen Gras * In general, curses should leave tty hardware settings alone (speed, parity,
5451ffecc1SBen Gras * word size). This is most easily done in BSD by using TCSASOFT on all
5551ffecc1SBen Gras * tcsetattr calls. On other systems, it would be better to get and restore
5651ffecc1SBen Gras * those attributes at each change, or at least when stopped and restarted.
5751ffecc1SBen Gras * See also the comments in getterm().
5851ffecc1SBen Gras */
59*0c3ae37fSLionel Sambuc #ifndef TCSASOFT
6051ffecc1SBen Gras #define TCSASOFT 0
6151ffecc1SBen Gras #endif
6251ffecc1SBen Gras
63*0c3ae37fSLionel Sambuc int __tcaction = TCSASOFT != 0; /* Ignore hardware settings */
64*0c3ae37fSLionel Sambuc
6551ffecc1SBen Gras #ifndef OXTABS
6651ffecc1SBen Gras #ifdef XTABS /* SMI uses XTABS. */
6751ffecc1SBen Gras #define OXTABS XTABS
6851ffecc1SBen Gras #else
6951ffecc1SBen Gras #define OXTABS 0
7051ffecc1SBen Gras #endif
7151ffecc1SBen Gras #endif
7251ffecc1SBen Gras
7351ffecc1SBen Gras /*
7451ffecc1SBen Gras * baudrate --
7551ffecc1SBen Gras * Return the current baudrate
7651ffecc1SBen Gras */
7751ffecc1SBen Gras int
baudrate(void)7851ffecc1SBen Gras baudrate(void)
7951ffecc1SBen Gras {
8051ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
8151ffecc1SBen Gras return 0;
8251ffecc1SBen Gras
8351ffecc1SBen Gras return cfgetospeed(&_cursesi_screen->baset);
8451ffecc1SBen Gras }
8551ffecc1SBen Gras
8651ffecc1SBen Gras /*
8751ffecc1SBen Gras * gettmode --
8851ffecc1SBen Gras * Do terminal type initialization.
8951ffecc1SBen Gras */
9051ffecc1SBen Gras int
gettmode(void)9151ffecc1SBen Gras gettmode(void)
9251ffecc1SBen Gras {
9351ffecc1SBen Gras if (_cursesi_gettmode(_cursesi_screen) == ERR)
9451ffecc1SBen Gras return ERR;
9551ffecc1SBen Gras
9651ffecc1SBen Gras __GT = _cursesi_screen->GT;
9751ffecc1SBen Gras __NONL = _cursesi_screen->NONL;
9851ffecc1SBen Gras return OK;
9951ffecc1SBen Gras }
10051ffecc1SBen Gras
10151ffecc1SBen Gras /*
10251ffecc1SBen Gras * _cursesi_gettmode --
10351ffecc1SBen Gras * Do the terminal type initialisation for the tty attached to the
10451ffecc1SBen Gras * given screen.
10551ffecc1SBen Gras */
10651ffecc1SBen Gras int
_cursesi_gettmode(SCREEN * screen)10751ffecc1SBen Gras _cursesi_gettmode(SCREEN *screen)
10851ffecc1SBen Gras {
10951ffecc1SBen Gras screen->useraw = 0;
11051ffecc1SBen Gras
11151ffecc1SBen Gras if (tcgetattr(fileno(screen->infd), &screen->orig_termios)) {
11251ffecc1SBen Gras /* if the input fd is not a tty try the output */
11351ffecc1SBen Gras if (tcgetattr(fileno(screen->infd), &screen->orig_termios)) {
11451ffecc1SBen Gras /* not a tty ... we will disable tty related stuff */
11551ffecc1SBen Gras screen->notty = TRUE;
11651ffecc1SBen Gras __GT = 0;
11751ffecc1SBen Gras __NONL = 0;
118*0c3ae37fSLionel Sambuc return OK;
11951ffecc1SBen Gras }
12051ffecc1SBen Gras }
12151ffecc1SBen Gras
12251ffecc1SBen Gras screen->baset = screen->orig_termios;
12351ffecc1SBen Gras screen->baset.c_oflag &= ~OXTABS;
12451ffecc1SBen Gras
12551ffecc1SBen Gras screen->GT = 0; /* historical. was used before we wired OXTABS off */
12651ffecc1SBen Gras screen->NONL = (screen->baset.c_oflag & ONLCR) == 0;
12751ffecc1SBen Gras
12851ffecc1SBen Gras /*
12951ffecc1SBen Gras * XXX
13051ffecc1SBen Gras * System V and SMI systems overload VMIN and VTIME, such that
13151ffecc1SBen Gras * VMIN is the same as the VEOF element, and VTIME is the same
13251ffecc1SBen Gras * as the VEOL element. This means that, if VEOF was ^D, the
13351ffecc1SBen Gras * default VMIN is 4. Majorly stupid.
13451ffecc1SBen Gras */
13551ffecc1SBen Gras screen->cbreakt = screen->baset;
13651ffecc1SBen Gras screen->cbreakt.c_lflag &= ~(ECHO | ECHONL | ICANON);
13751ffecc1SBen Gras screen->cbreakt.c_cc[VMIN] = 1;
13851ffecc1SBen Gras screen->cbreakt.c_cc[VTIME] = 0;
13951ffecc1SBen Gras
14051ffecc1SBen Gras screen->rawt = screen->cbreakt;
14151ffecc1SBen Gras screen->rawt.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | INLCR | IGNCR |
14251ffecc1SBen Gras ICRNL | IXON);
14351ffecc1SBen Gras screen->rawt.c_oflag &= ~OPOST;
14451ffecc1SBen Gras screen->rawt.c_lflag &= ~(ISIG | IEXTEN);
14551ffecc1SBen Gras
146*0c3ae37fSLionel Sambuc #if TCSASOFT == 0
14751ffecc1SBen Gras /*
14851ffecc1SBen Gras * In general, curses should leave hardware-related settings alone.
14951ffecc1SBen Gras * This includes parity and word size. Older versions set the tty
15051ffecc1SBen Gras * to 8 bits, no parity in raw(), but this is considered to be an
15151ffecc1SBen Gras * artifact of the old tty interface. If it's desired to change
15251ffecc1SBen Gras * parity and word size, the TCSASOFT bit has to be removed from the
15351ffecc1SBen Gras * calls that switch to/from "raw" mode.
15451ffecc1SBen Gras */
15551ffecc1SBen Gras screen->rawt.c_iflag &= ~ISTRIP;
15651ffecc1SBen Gras screen->rawt.c_cflag &= ~(CSIZE | PARENB);
15751ffecc1SBen Gras screen->rawt.c_cflag |= CS8;
158*0c3ae37fSLionel Sambuc #endif
15951ffecc1SBen Gras
16051ffecc1SBen Gras screen->curt = &screen->baset;
161*0c3ae37fSLionel Sambuc return tcsetattr(fileno(screen->infd), TCSASOFT | TCSADRAIN,
162*0c3ae37fSLionel Sambuc screen->curt) ? ERR : OK;
16351ffecc1SBen Gras }
16451ffecc1SBen Gras
16551ffecc1SBen Gras /*
16651ffecc1SBen Gras * raw --
16751ffecc1SBen Gras * Put the terminal into raw mode
16851ffecc1SBen Gras */
16951ffecc1SBen Gras int
raw(void)17051ffecc1SBen Gras raw(void)
17151ffecc1SBen Gras {
17251ffecc1SBen Gras #ifdef DEBUG
17351ffecc1SBen Gras __CTRACE(__CTRACE_MISC, "raw()\n");
17451ffecc1SBen Gras #endif
17551ffecc1SBen Gras /* Check if we need to restart ... */
17651ffecc1SBen Gras if (_cursesi_screen->endwin)
17751ffecc1SBen Gras __restartwin();
17851ffecc1SBen Gras
17951ffecc1SBen Gras _cursesi_screen->useraw = __pfast = __rawmode = 1;
18051ffecc1SBen Gras _cursesi_screen->curt = &_cursesi_screen->rawt;
18151ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
18251ffecc1SBen Gras return OK;
183*0c3ae37fSLionel Sambuc return tcsetattr(fileno(_cursesi_screen->infd), TCSASOFT | TCSADRAIN,
184*0c3ae37fSLionel Sambuc _cursesi_screen->curt) ? ERR : OK;
18551ffecc1SBen Gras }
18651ffecc1SBen Gras
18751ffecc1SBen Gras /*
18851ffecc1SBen Gras * noraw --
18951ffecc1SBen Gras * Put the terminal into cooked mode
19051ffecc1SBen Gras */
19151ffecc1SBen Gras int
noraw(void)19251ffecc1SBen Gras noraw(void)
19351ffecc1SBen Gras {
19451ffecc1SBen Gras #ifdef DEBUG
19551ffecc1SBen Gras __CTRACE(__CTRACE_MISC, "noraw()\n");
19651ffecc1SBen Gras #endif
19751ffecc1SBen Gras /* Check if we need to restart ... */
19851ffecc1SBen Gras if (_cursesi_screen->endwin)
19951ffecc1SBen Gras __restartwin();
20051ffecc1SBen Gras
20151ffecc1SBen Gras _cursesi_screen->useraw = __pfast = __rawmode = 0;
20251ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
20351ffecc1SBen Gras return OK;
20451ffecc1SBen Gras _cursesi_screen->curt = &_cursesi_screen->baset;
205*0c3ae37fSLionel Sambuc return tcsetattr(fileno(_cursesi_screen->infd), TCSASOFT | TCSADRAIN,
206*0c3ae37fSLionel Sambuc _cursesi_screen->curt) ? ERR : OK;
20751ffecc1SBen Gras }
20851ffecc1SBen Gras
20951ffecc1SBen Gras /*
21051ffecc1SBen Gras * cbreak --
21151ffecc1SBen Gras * Enable cbreak mode
21251ffecc1SBen Gras */
21351ffecc1SBen Gras int
cbreak(void)21451ffecc1SBen Gras cbreak(void)
21551ffecc1SBen Gras {
21651ffecc1SBen Gras #ifdef DEBUG
21751ffecc1SBen Gras __CTRACE(__CTRACE_MISC, "cbreak()\n");
21851ffecc1SBen Gras #endif
21951ffecc1SBen Gras /* Check if we need to restart ... */
22051ffecc1SBen Gras if (_cursesi_screen->endwin)
22151ffecc1SBen Gras __restartwin();
22251ffecc1SBen Gras
22351ffecc1SBen Gras __rawmode = 1;
22451ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
22551ffecc1SBen Gras return OK;
22651ffecc1SBen Gras _cursesi_screen->curt = _cursesi_screen->useraw ?
22751ffecc1SBen Gras &_cursesi_screen->rawt : &_cursesi_screen->cbreakt;
228*0c3ae37fSLionel Sambuc return tcsetattr(fileno(_cursesi_screen->infd), TCSASOFT | TCSADRAIN,
229*0c3ae37fSLionel Sambuc _cursesi_screen->curt) ? ERR : OK;
23051ffecc1SBen Gras }
23151ffecc1SBen Gras
23251ffecc1SBen Gras /*
23351ffecc1SBen Gras * nocbreak --
23451ffecc1SBen Gras * Disable cbreak mode
23551ffecc1SBen Gras */
23651ffecc1SBen Gras int
nocbreak(void)23751ffecc1SBen Gras nocbreak(void)
23851ffecc1SBen Gras {
23951ffecc1SBen Gras #ifdef DEBUG
24051ffecc1SBen Gras __CTRACE(__CTRACE_MISC, "nocbreak()\n");
24151ffecc1SBen Gras #endif
24251ffecc1SBen Gras /* Check if we need to restart ... */
24351ffecc1SBen Gras if (_cursesi_screen->endwin)
24451ffecc1SBen Gras __restartwin();
24551ffecc1SBen Gras
24651ffecc1SBen Gras __rawmode = 0;
24751ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
24851ffecc1SBen Gras return OK;
24951ffecc1SBen Gras /* if we were in halfdelay mode then nuke the timeout */
25051ffecc1SBen Gras if ((_cursesi_screen->half_delay == TRUE) &&
25151ffecc1SBen Gras (__notimeout() == ERR))
25251ffecc1SBen Gras return ERR;
25351ffecc1SBen Gras
25451ffecc1SBen Gras _cursesi_screen->half_delay = FALSE;
25551ffecc1SBen Gras _cursesi_screen->curt = _cursesi_screen->useraw ?
25651ffecc1SBen Gras &_cursesi_screen->rawt : &_cursesi_screen->baset;
257*0c3ae37fSLionel Sambuc return tcsetattr(fileno(_cursesi_screen->infd), TCSASOFT | TCSADRAIN,
258*0c3ae37fSLionel Sambuc _cursesi_screen->curt) ? ERR : OK;
25951ffecc1SBen Gras }
26051ffecc1SBen Gras
26151ffecc1SBen Gras /*
26251ffecc1SBen Gras * halfdelay --
26351ffecc1SBen Gras * Put the terminal into cbreak mode with the specified timeout.
26451ffecc1SBen Gras *
26551ffecc1SBen Gras */
26651ffecc1SBen Gras int
halfdelay(int duration)26751ffecc1SBen Gras halfdelay(int duration)
26851ffecc1SBen Gras {
26951ffecc1SBen Gras if ((duration < 1) || (duration > 255))
27051ffecc1SBen Gras return ERR;
27151ffecc1SBen Gras
27251ffecc1SBen Gras if (cbreak() == ERR)
27351ffecc1SBen Gras return ERR;
27451ffecc1SBen Gras
27551ffecc1SBen Gras if (__timeout(duration) == ERR)
27651ffecc1SBen Gras return ERR;
27751ffecc1SBen Gras
27851ffecc1SBen Gras _cursesi_screen->half_delay = TRUE;
27951ffecc1SBen Gras return OK;
28051ffecc1SBen Gras }
28151ffecc1SBen Gras
28251ffecc1SBen Gras int
__delay(void)28351ffecc1SBen Gras __delay(void)
28451ffecc1SBen Gras {
28551ffecc1SBen Gras #ifdef DEBUG
28651ffecc1SBen Gras __CTRACE(__CTRACE_MISC, "__delay()\n");
28751ffecc1SBen Gras #endif
28851ffecc1SBen Gras /* Check if we need to restart ... */
28951ffecc1SBen Gras if (_cursesi_screen->endwin)
29051ffecc1SBen Gras __restartwin();
29151ffecc1SBen Gras
29251ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
29351ffecc1SBen Gras return OK;
29451ffecc1SBen Gras _cursesi_screen->rawt.c_cc[VMIN] = 1;
29551ffecc1SBen Gras _cursesi_screen->rawt.c_cc[VTIME] = 0;
29651ffecc1SBen Gras _cursesi_screen->cbreakt.c_cc[VMIN] = 1;
29751ffecc1SBen Gras _cursesi_screen->cbreakt.c_cc[VTIME] = 0;
29851ffecc1SBen Gras _cursesi_screen->baset.c_cc[VMIN] = 1;
29951ffecc1SBen Gras _cursesi_screen->baset.c_cc[VTIME] = 0;
30051ffecc1SBen Gras
301*0c3ae37fSLionel Sambuc if (tcsetattr(fileno(_cursesi_screen->infd), TCSASOFT | TCSANOW,
302*0c3ae37fSLionel Sambuc _cursesi_screen->curt)) {
30351ffecc1SBen Gras __restore_termios();
30451ffecc1SBen Gras return ERR;
30551ffecc1SBen Gras }
30651ffecc1SBen Gras
30751ffecc1SBen Gras return OK;
30851ffecc1SBen Gras }
30951ffecc1SBen Gras
31051ffecc1SBen Gras int
__nodelay(void)31151ffecc1SBen Gras __nodelay(void)
31251ffecc1SBen Gras {
31351ffecc1SBen Gras #ifdef DEBUG
31451ffecc1SBen Gras __CTRACE(__CTRACE_MISC, "__nodelay()\n");
31551ffecc1SBen Gras #endif
31651ffecc1SBen Gras /* Check if we need to restart ... */
31751ffecc1SBen Gras if (_cursesi_screen->endwin)
31851ffecc1SBen Gras __restartwin();
31951ffecc1SBen Gras
32051ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
32151ffecc1SBen Gras return OK;
32251ffecc1SBen Gras _cursesi_screen->rawt.c_cc[VMIN] = 0;
32351ffecc1SBen Gras _cursesi_screen->rawt.c_cc[VTIME] = 0;
32451ffecc1SBen Gras _cursesi_screen->cbreakt.c_cc[VMIN] = 0;
32551ffecc1SBen Gras _cursesi_screen->cbreakt.c_cc[VTIME] = 0;
32651ffecc1SBen Gras _cursesi_screen->baset.c_cc[VMIN] = 0;
32751ffecc1SBen Gras _cursesi_screen->baset.c_cc[VTIME] = 0;
32851ffecc1SBen Gras
329*0c3ae37fSLionel Sambuc if (tcsetattr(fileno(_cursesi_screen->infd), TCSASOFT | TCSANOW,
330*0c3ae37fSLionel Sambuc _cursesi_screen->curt)) {
33151ffecc1SBen Gras __restore_termios();
33251ffecc1SBen Gras return ERR;
33351ffecc1SBen Gras }
33451ffecc1SBen Gras
33551ffecc1SBen Gras return OK;
33651ffecc1SBen Gras }
33751ffecc1SBen Gras
33851ffecc1SBen Gras void
__save_termios(void)33951ffecc1SBen Gras __save_termios(void)
34051ffecc1SBen Gras {
34151ffecc1SBen Gras /* Check if we need to restart ... */
34251ffecc1SBen Gras if (_cursesi_screen->endwin)
34351ffecc1SBen Gras __restartwin();
34451ffecc1SBen Gras
34551ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
34651ffecc1SBen Gras return;
34751ffecc1SBen Gras _cursesi_screen->ovmin = _cursesi_screen->cbreakt.c_cc[VMIN];
34851ffecc1SBen Gras _cursesi_screen->ovtime = _cursesi_screen->cbreakt.c_cc[VTIME];
34951ffecc1SBen Gras }
35051ffecc1SBen Gras
35151ffecc1SBen Gras void
__restore_termios(void)35251ffecc1SBen Gras __restore_termios(void)
35351ffecc1SBen Gras {
35451ffecc1SBen Gras /* Check if we need to restart ... */
35551ffecc1SBen Gras if (_cursesi_screen->endwin)
35651ffecc1SBen Gras __restartwin();
35751ffecc1SBen Gras
35851ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
35951ffecc1SBen Gras return;
36051ffecc1SBen Gras _cursesi_screen->rawt.c_cc[VMIN] = _cursesi_screen->ovmin;
36151ffecc1SBen Gras _cursesi_screen->rawt.c_cc[VTIME] = _cursesi_screen->ovtime;
36251ffecc1SBen Gras _cursesi_screen->cbreakt.c_cc[VMIN] = _cursesi_screen->ovmin;
36351ffecc1SBen Gras _cursesi_screen->cbreakt.c_cc[VTIME] = _cursesi_screen->ovtime;
36451ffecc1SBen Gras _cursesi_screen->baset.c_cc[VMIN] = _cursesi_screen->ovmin;
36551ffecc1SBen Gras _cursesi_screen->baset.c_cc[VTIME] = _cursesi_screen->ovtime;
36651ffecc1SBen Gras }
36751ffecc1SBen Gras
36851ffecc1SBen Gras int
__timeout(int delay)36951ffecc1SBen Gras __timeout(int delay)
37051ffecc1SBen Gras {
37151ffecc1SBen Gras #ifdef DEBUG
37251ffecc1SBen Gras __CTRACE(__CTRACE_MISC, "__timeout()\n");
37351ffecc1SBen Gras #endif
37451ffecc1SBen Gras /* Check if we need to restart ... */
37551ffecc1SBen Gras if (_cursesi_screen->endwin)
37651ffecc1SBen Gras __restartwin();
37751ffecc1SBen Gras
37851ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
37951ffecc1SBen Gras return OK;
38051ffecc1SBen Gras _cursesi_screen->ovmin = _cursesi_screen->cbreakt.c_cc[VMIN];
38151ffecc1SBen Gras _cursesi_screen->ovtime = _cursesi_screen->cbreakt.c_cc[VTIME];
38251ffecc1SBen Gras _cursesi_screen->rawt.c_cc[VMIN] = 0;
38351ffecc1SBen Gras _cursesi_screen->rawt.c_cc[VTIME] = delay;
38451ffecc1SBen Gras _cursesi_screen->cbreakt.c_cc[VMIN] = 0;
38551ffecc1SBen Gras _cursesi_screen->cbreakt.c_cc[VTIME] = delay;
38651ffecc1SBen Gras _cursesi_screen->baset.c_cc[VMIN] = 0;
38751ffecc1SBen Gras _cursesi_screen->baset.c_cc[VTIME] = delay;
38851ffecc1SBen Gras
389*0c3ae37fSLionel Sambuc if (tcsetattr(fileno(_cursesi_screen->infd), TCSASOFT | TCSANOW,
39051ffecc1SBen Gras _cursesi_screen->curt)) {
39151ffecc1SBen Gras __restore_termios();
39251ffecc1SBen Gras return ERR;
39351ffecc1SBen Gras }
39451ffecc1SBen Gras
39551ffecc1SBen Gras return OK;
39651ffecc1SBen Gras }
39751ffecc1SBen Gras
39851ffecc1SBen Gras int
__notimeout(void)39951ffecc1SBen Gras __notimeout(void)
40051ffecc1SBen Gras {
40151ffecc1SBen Gras #ifdef DEBUG
40251ffecc1SBen Gras __CTRACE(__CTRACE_MISC, "__notimeout()\n");
40351ffecc1SBen Gras #endif
40451ffecc1SBen Gras /* Check if we need to restart ... */
40551ffecc1SBen Gras if (_cursesi_screen->endwin)
40651ffecc1SBen Gras __restartwin();
40751ffecc1SBen Gras
40851ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
40951ffecc1SBen Gras return OK;
41051ffecc1SBen Gras _cursesi_screen->rawt.c_cc[VMIN] = 1;
41151ffecc1SBen Gras _cursesi_screen->rawt.c_cc[VTIME] = 0;
41251ffecc1SBen Gras _cursesi_screen->cbreakt.c_cc[VMIN] = 1;
41351ffecc1SBen Gras _cursesi_screen->cbreakt.c_cc[VTIME] = 0;
41451ffecc1SBen Gras _cursesi_screen->baset.c_cc[VMIN] = 1;
41551ffecc1SBen Gras _cursesi_screen->baset.c_cc[VTIME] = 0;
41651ffecc1SBen Gras
417*0c3ae37fSLionel Sambuc return tcsetattr(fileno(_cursesi_screen->infd), TCSASOFT | TCSANOW,
418*0c3ae37fSLionel Sambuc _cursesi_screen->curt) ? ERR : OK;
41951ffecc1SBen Gras }
42051ffecc1SBen Gras
42151ffecc1SBen Gras int
echo(void)42251ffecc1SBen Gras echo(void)
42351ffecc1SBen Gras {
42451ffecc1SBen Gras #ifdef DEBUG
42551ffecc1SBen Gras __CTRACE(__CTRACE_MISC, "echo()\n");
42651ffecc1SBen Gras #endif
42751ffecc1SBen Gras /* Check if we need to restart ... */
42851ffecc1SBen Gras if (_cursesi_screen->endwin)
42951ffecc1SBen Gras __restartwin();
43051ffecc1SBen Gras
43151ffecc1SBen Gras __echoit = 1;
432*0c3ae37fSLionel Sambuc return OK;
43351ffecc1SBen Gras }
43451ffecc1SBen Gras
43551ffecc1SBen Gras int
noecho(void)43651ffecc1SBen Gras noecho(void)
43751ffecc1SBen Gras {
43851ffecc1SBen Gras #ifdef DEBUG
43951ffecc1SBen Gras __CTRACE(__CTRACE_MISC, "noecho()\n");
44051ffecc1SBen Gras #endif
44151ffecc1SBen Gras /* Check if we need to restart ... */
44251ffecc1SBen Gras if (_cursesi_screen->endwin)
44351ffecc1SBen Gras __restartwin();
44451ffecc1SBen Gras
44551ffecc1SBen Gras __echoit = 0;
446*0c3ae37fSLionel Sambuc return OK;
44751ffecc1SBen Gras }
44851ffecc1SBen Gras
44951ffecc1SBen Gras int
nl(void)45051ffecc1SBen Gras nl(void)
45151ffecc1SBen Gras {
45251ffecc1SBen Gras #ifdef DEBUG
45351ffecc1SBen Gras __CTRACE(__CTRACE_MISC, "nl()\n");
45451ffecc1SBen Gras #endif
45551ffecc1SBen Gras /* Check if we need to restart ... */
45651ffecc1SBen Gras if (_cursesi_screen->endwin)
45751ffecc1SBen Gras __restartwin();
45851ffecc1SBen Gras
45951ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
46051ffecc1SBen Gras return OK;
46151ffecc1SBen Gras _cursesi_screen->rawt.c_iflag |= ICRNL;
46251ffecc1SBen Gras _cursesi_screen->rawt.c_oflag |= ONLCR;
46351ffecc1SBen Gras _cursesi_screen->cbreakt.c_iflag |= ICRNL;
46451ffecc1SBen Gras _cursesi_screen->cbreakt.c_oflag |= ONLCR;
46551ffecc1SBen Gras _cursesi_screen->baset.c_iflag |= ICRNL;
46651ffecc1SBen Gras _cursesi_screen->baset.c_oflag |= ONLCR;
46751ffecc1SBen Gras
46851ffecc1SBen Gras _cursesi_screen->nl = 1;
46951ffecc1SBen Gras _cursesi_screen->pfast = _cursesi_screen->rawmode;
470*0c3ae37fSLionel Sambuc return tcsetattr(fileno(_cursesi_screen->infd), TCSASOFT | TCSADRAIN,
471*0c3ae37fSLionel Sambuc _cursesi_screen->curt) ? ERR : OK;
47251ffecc1SBen Gras }
47351ffecc1SBen Gras
47451ffecc1SBen Gras int
nonl(void)47551ffecc1SBen Gras nonl(void)
47651ffecc1SBen Gras {
47751ffecc1SBen Gras #ifdef DEBUG
47851ffecc1SBen Gras __CTRACE(__CTRACE_MISC, "nonl()\n");
47951ffecc1SBen Gras #endif
48051ffecc1SBen Gras /* Check if we need to restart ... */
48151ffecc1SBen Gras if (_cursesi_screen->endwin)
48251ffecc1SBen Gras __restartwin();
48351ffecc1SBen Gras
48451ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
48551ffecc1SBen Gras return OK;
48651ffecc1SBen Gras _cursesi_screen->rawt.c_iflag &= ~ICRNL;
48751ffecc1SBen Gras _cursesi_screen->rawt.c_oflag &= ~ONLCR;
48851ffecc1SBen Gras _cursesi_screen->cbreakt.c_iflag &= ~ICRNL;
48951ffecc1SBen Gras _cursesi_screen->cbreakt.c_oflag &= ~ONLCR;
49051ffecc1SBen Gras _cursesi_screen->baset.c_iflag &= ~ICRNL;
49151ffecc1SBen Gras _cursesi_screen->baset.c_oflag &= ~ONLCR;
49251ffecc1SBen Gras
49351ffecc1SBen Gras _cursesi_screen->nl = 0;
49451ffecc1SBen Gras __pfast = 1;
495*0c3ae37fSLionel Sambuc return tcsetattr(fileno(_cursesi_screen->infd), TCSASOFT | TCSADRAIN,
496*0c3ae37fSLionel Sambuc _cursesi_screen->curt) ? ERR : OK;
49751ffecc1SBen Gras }
49851ffecc1SBen Gras
49951ffecc1SBen Gras #ifndef _CURSES_USE_MACROS
50051ffecc1SBen Gras void
noqiflush(void)50151ffecc1SBen Gras noqiflush(void)
50251ffecc1SBen Gras {
50351ffecc1SBen Gras (void) intrflush(stdscr, FALSE);
50451ffecc1SBen Gras }
50551ffecc1SBen Gras
50651ffecc1SBen Gras void
qiflush(void)50751ffecc1SBen Gras qiflush(void)
50851ffecc1SBen Gras {
50951ffecc1SBen Gras (void) intrflush(stdscr, TRUE);
51051ffecc1SBen Gras }
51151ffecc1SBen Gras #endif /* _CURSES_USE_MACROS */
51251ffecc1SBen Gras
51351ffecc1SBen Gras int
intrflush(WINDOW * win,bool bf)51451ffecc1SBen Gras intrflush(WINDOW *win, bool bf) /*ARGSUSED*/
51551ffecc1SBen Gras {
51651ffecc1SBen Gras /* Check if we need to restart ... */
51751ffecc1SBen Gras if (_cursesi_screen->endwin)
51851ffecc1SBen Gras __restartwin();
51951ffecc1SBen Gras
52051ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
52151ffecc1SBen Gras return OK;
52251ffecc1SBen Gras if (bf) {
52351ffecc1SBen Gras _cursesi_screen->rawt.c_lflag &= ~NOFLSH;
52451ffecc1SBen Gras _cursesi_screen->cbreakt.c_lflag &= ~NOFLSH;
52551ffecc1SBen Gras _cursesi_screen->baset.c_lflag &= ~NOFLSH;
52651ffecc1SBen Gras } else {
52751ffecc1SBen Gras _cursesi_screen->rawt.c_lflag |= NOFLSH;
52851ffecc1SBen Gras _cursesi_screen->cbreakt.c_lflag |= NOFLSH;
52951ffecc1SBen Gras _cursesi_screen->baset.c_lflag |= NOFLSH;
53051ffecc1SBen Gras }
53151ffecc1SBen Gras
53251ffecc1SBen Gras __pfast = 1;
533*0c3ae37fSLionel Sambuc return tcsetattr(fileno(_cursesi_screen->infd), TCSASOFT | TCSADRAIN,
534*0c3ae37fSLionel Sambuc _cursesi_screen->curt) ? ERR : OK;
53551ffecc1SBen Gras }
53651ffecc1SBen Gras
53751ffecc1SBen Gras void
__startwin(SCREEN * screen)53851ffecc1SBen Gras __startwin(SCREEN *screen)
53951ffecc1SBen Gras {
54051ffecc1SBen Gras
54151ffecc1SBen Gras (void) fflush(screen->infd);
54251ffecc1SBen Gras
54351ffecc1SBen Gras /*
54451ffecc1SBen Gras * Some C libraries default to a 1K buffer when talking to a tty.
54551ffecc1SBen Gras * With a larger screen, especially across a network, we'd like
54651ffecc1SBen Gras * to get it to all flush in a single write. Make it twice as big
54751ffecc1SBen Gras * as just the characters (so that we have room for cursor motions
54851ffecc1SBen Gras * and attribute information) but no more than 8K.
54951ffecc1SBen Gras */
55051ffecc1SBen Gras if (screen->stdbuf == NULL) {
55151ffecc1SBen Gras screen->len = LINES * COLS * 2;
55251ffecc1SBen Gras if (screen->len > 8192)
55351ffecc1SBen Gras screen->len = 8192;
55451ffecc1SBen Gras if ((screen->stdbuf = malloc(screen->len)) == NULL)
55551ffecc1SBen Gras screen->len = 0;
55651ffecc1SBen Gras }
55751ffecc1SBen Gras (void) setvbuf(screen->outfd, screen->stdbuf, _IOFBF, screen->len);
55851ffecc1SBen Gras
55951ffecc1SBen Gras ti_puts(screen->term, t_enter_ca_mode(screen->term), 0,
56051ffecc1SBen Gras __cputchar_args, (void *) screen->outfd);
56151ffecc1SBen Gras ti_puts(screen->term, t_cursor_normal(screen->term), 0,
56251ffecc1SBen Gras __cputchar_args, (void *) screen->outfd);
56351ffecc1SBen Gras if (screen->curscr->flags & __KEYPAD)
56451ffecc1SBen Gras ti_puts(screen->term, t_keypad_xmit(screen->term), 0,
56551ffecc1SBen Gras __cputchar_args, (void *) screen->outfd);
56651ffecc1SBen Gras screen->endwin = 0;
56751ffecc1SBen Gras }
56851ffecc1SBen Gras
56951ffecc1SBen Gras int
endwin(void)57051ffecc1SBen Gras endwin(void)
57151ffecc1SBen Gras {
57251ffecc1SBen Gras #ifdef DEBUG
57351ffecc1SBen Gras __CTRACE(__CTRACE_MISC, "endwin\n");
57451ffecc1SBen Gras #endif
57551ffecc1SBen Gras return __stopwin();
57651ffecc1SBen Gras }
57751ffecc1SBen Gras
57851ffecc1SBen Gras bool
isendwin(void)57951ffecc1SBen Gras isendwin(void)
58051ffecc1SBen Gras {
581*0c3ae37fSLionel Sambuc return _cursesi_screen->endwin ? TRUE : FALSE;
58251ffecc1SBen Gras }
58351ffecc1SBen Gras
58451ffecc1SBen Gras int
flushinp(void)58551ffecc1SBen Gras flushinp(void)
58651ffecc1SBen Gras {
58751ffecc1SBen Gras (void) fpurge(_cursesi_screen->infd);
588*0c3ae37fSLionel Sambuc return OK;
58951ffecc1SBen Gras }
59051ffecc1SBen Gras
59151ffecc1SBen Gras /*
59251ffecc1SBen Gras * The following routines, savetty and resetty are completely useless and
59351ffecc1SBen Gras * are left in only as stubs. If people actually use them they will almost
59451ffecc1SBen Gras * certainly screw up the state of the world.
59551ffecc1SBen Gras */
59651ffecc1SBen Gras /*static struct termios savedtty;*/
59751ffecc1SBen Gras int
savetty(void)59851ffecc1SBen Gras savetty(void)
59951ffecc1SBen Gras {
60051ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
60151ffecc1SBen Gras return OK;
602*0c3ae37fSLionel Sambuc return tcgetattr(fileno(_cursesi_screen->infd),
603*0c3ae37fSLionel Sambuc &_cursesi_screen->savedtty) ? ERR : OK;
60451ffecc1SBen Gras }
60551ffecc1SBen Gras
60651ffecc1SBen Gras int
resetty(void)60751ffecc1SBen Gras resetty(void)
60851ffecc1SBen Gras {
60951ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
61051ffecc1SBen Gras return OK;
611*0c3ae37fSLionel Sambuc return tcsetattr(fileno(_cursesi_screen->infd), TCSASOFT | TCSADRAIN,
612*0c3ae37fSLionel Sambuc &_cursesi_screen->savedtty) ? ERR : OK;
61351ffecc1SBen Gras }
61451ffecc1SBen Gras
61551ffecc1SBen Gras /*
61651ffecc1SBen Gras * erasechar --
61751ffecc1SBen Gras * Return the character of the erase key.
61851ffecc1SBen Gras */
61951ffecc1SBen Gras char
erasechar(void)62051ffecc1SBen Gras erasechar(void)
62151ffecc1SBen Gras {
62251ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
62351ffecc1SBen Gras return 0;
62451ffecc1SBen Gras return _cursesi_screen->baset.c_cc[VERASE];
62551ffecc1SBen Gras }
62651ffecc1SBen Gras
62751ffecc1SBen Gras /*
62851ffecc1SBen Gras * killchar --
62951ffecc1SBen Gras * Return the character of the kill key.
63051ffecc1SBen Gras */
63151ffecc1SBen Gras char
killchar(void)63251ffecc1SBen Gras killchar(void)
63351ffecc1SBen Gras {
63451ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
63551ffecc1SBen Gras return 0;
63651ffecc1SBen Gras return _cursesi_screen->baset.c_cc[VKILL];
63751ffecc1SBen Gras }
63851ffecc1SBen Gras
63951ffecc1SBen Gras /*
64051ffecc1SBen Gras * erasewchar --
64151ffecc1SBen Gras * Return the wide character of the erase key.
64251ffecc1SBen Gras */
64351ffecc1SBen Gras int
erasewchar(wchar_t * ch)64451ffecc1SBen Gras erasewchar( wchar_t *ch )
64551ffecc1SBen Gras {
64651ffecc1SBen Gras #ifndef HAVE_WCHAR
64751ffecc1SBen Gras return ERR;
64851ffecc1SBen Gras #else
64951ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
65051ffecc1SBen Gras return ERR;
65151ffecc1SBen Gras *ch = _cursesi_screen->baset.c_cc[VERASE];
65251ffecc1SBen Gras return OK;
65351ffecc1SBen Gras #endif /* HAVE_WCHAR */
65451ffecc1SBen Gras }
65551ffecc1SBen Gras
65651ffecc1SBen Gras /*
65751ffecc1SBen Gras * killwchar --
65851ffecc1SBen Gras * Return the wide character of the kill key.
65951ffecc1SBen Gras */
66051ffecc1SBen Gras int
killwchar(wchar_t * ch)66151ffecc1SBen Gras killwchar( wchar_t *ch )
66251ffecc1SBen Gras {
66351ffecc1SBen Gras #ifndef HAVE_WCHAR
66451ffecc1SBen Gras return ERR;
66551ffecc1SBen Gras #else
66651ffecc1SBen Gras if (_cursesi_screen->notty == TRUE)
66751ffecc1SBen Gras return 0;
66851ffecc1SBen Gras *ch = _cursesi_screen->baset.c_cc[VKILL];
66951ffecc1SBen Gras return OK;
67051ffecc1SBen Gras #endif /* HAVE_WCHAR */
67151ffecc1SBen Gras }
672