150276Speter/****************************************************************************
2178866Srafan * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc.              *
350276Speter *                                                                          *
450276Speter * Permission is hereby granted, free of charge, to any person obtaining a  *
550276Speter * copy of this software and associated documentation files (the            *
650276Speter * "Software"), to deal in the Software without restriction, including      *
750276Speter * without limitation the rights to use, copy, modify, merge, publish,      *
850276Speter * distribute, distribute with modifications, sublicense, and/or sell       *
950276Speter * copies of the Software, and to permit persons to whom the Software is    *
1050276Speter * furnished to do so, subject to the following conditions:                 *
1150276Speter *                                                                          *
1250276Speter * The above copyright notice and this permission notice shall be included  *
1350276Speter * in all copies or substantial portions of the Software.                   *
1450276Speter *                                                                          *
1550276Speter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
1650276Speter * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
1750276Speter * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
1850276Speter * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
1950276Speter * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
2050276Speter * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
2150276Speter * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
2250276Speter *                                                                          *
2350276Speter * Except as contained in this notice, the name(s) of the above copyright   *
2450276Speter * holders shall not be used in advertising or otherwise to promote the     *
2550276Speter * sale, use or other dealings in this Software without prior written       *
2650276Speter * authorization.                                                           *
2750276Speter ****************************************************************************/
2850276Speter
2950276Speter/*
3050276Speter *		def_prog_mode()
3150276Speter *		def_shell_mode()
3250276Speter *		reset_prog_mode()
3350276Speter *		reset_shell_mode()
3450276Speter *		savetty()
3550276Speter *		resetty()
3650276Speter */
3750276Speter
3850276Speter#include <curses.priv.h>
3976726Speter#include <term.h>		/* cur_term */
4050276Speter
41184989SrafanMODULE_ID("$Id: lib_ttyflags.c,v 1.18 2008/08/03 22:10:44 tom Exp $")
4250276Speter
4376726SpeterNCURSES_EXPORT(int)
4476726Speter_nc_get_tty_mode(TTY * buf)
4550276Speter{
46166124Srafan    int result = OK;
47166124Srafan
48174993Srafan    if (buf == 0) {
49166124Srafan	result = ERR;
50166124Srafan    } else {
51174993Srafan	if (cur_term == 0) {
52174993Srafan	    result = ERR;
53174993Srafan	} else {
54174993Srafan	    for (;;) {
55174993Srafan		if (GET_TTY(cur_term->Filedes, buf) != 0) {
56174993Srafan		    if (errno == EINTR)
57174993Srafan			continue;
58174993Srafan		    result = ERR;
59174993Srafan		}
60174993Srafan		break;
61166124Srafan	    }
62166124Srafan	}
63166124Srafan
64174993Srafan	if (result == ERR)
65174993Srafan	    memset(buf, 0, sizeof(*buf));
66166124Srafan
67174993Srafan	TR(TRACE_BITS, ("_nc_get_tty_mode(%d): %s",
68184989Srafan			cur_term ? cur_term->Filedes : -1,
69184989Srafan			_nc_trace_ttymode(buf)));
70174993Srafan    }
71166124Srafan    return (result);
7250276Speter}
7350276Speter
7476726SpeterNCURSES_EXPORT(int)
7576726Speter_nc_set_tty_mode(TTY * buf)
7650276Speter{
77166124Srafan    int result = OK;
78166124Srafan
79174993Srafan    if (buf == 0) {
80166124Srafan	result = ERR;
81166124Srafan    } else {
82174993Srafan	if (cur_term == 0) {
83174993Srafan	    result = ERR;
84174993Srafan	} else {
85174993Srafan	    for (;;) {
86174993Srafan		if (SET_TTY(cur_term->Filedes, buf) != 0) {
87174993Srafan		    if (errno == EINTR)
88174993Srafan			continue;
89174993Srafan		    if ((errno == ENOTTY) && (SP != 0))
90174993Srafan			SP->_notty = TRUE;
91174993Srafan		    result = ERR;
92174993Srafan		}
93174993Srafan		break;
94166124Srafan	    }
95166124Srafan	}
96174993Srafan	TR(TRACE_BITS, ("_nc_set_tty_mode(%d): %s",
97184989Srafan			cur_term ? cur_term->Filedes : -1,
98184989Srafan			_nc_trace_ttymode(buf)));
99166124Srafan    }
100166124Srafan    return (result);
10150276Speter}
10250276Speter
10376726SpeterNCURSES_EXPORT(int)
10476726Speterdef_shell_mode(void)
10550276Speter{
106184989Srafan    int rc = ERR;
107184989Srafan
10876726Speter    T((T_CALLED("def_shell_mode()")));
10950276Speter
110184989Srafan    if (cur_term != 0) {
111184989Srafan	/*
112184989Srafan	 * If XTABS was on, remove the tab and backtab capabilities.
113184989Srafan	 */
114184989Srafan	if (_nc_get_tty_mode(&cur_term->Ottyb) == OK) {
11550276Speter#ifdef TERMIOS
116184989Srafan	    if (cur_term->Ottyb.c_oflag & OFLAGS_TABS)
117184989Srafan		tab = back_tab = NULL;
11850276Speter#else
119184989Srafan	    if (cur_term->Ottyb.sg_flags & XTABS)
120184989Srafan		tab = back_tab = NULL;
12150276Speter#endif
122184989Srafan	    rc = OK;
123184989Srafan	}
124184989Srafan    }
125184989Srafan    returnCode(rc);
12650276Speter}
12750276Speter
12876726SpeterNCURSES_EXPORT(int)
12976726Speterdef_prog_mode(void)
13050276Speter{
131184989Srafan    int rc = ERR;
132184989Srafan
13376726Speter    T((T_CALLED("def_prog_mode()")));
13450276Speter
135184989Srafan    if (cur_term != 0) {
136184989Srafan	/*
137184989Srafan	 * Turn off the XTABS bit in the tty structure if it was on.
138184989Srafan	 */
139184989Srafan	if (_nc_get_tty_mode(&cur_term->Nttyb) == OK) {
14050276Speter#ifdef TERMIOS
141184989Srafan	    cur_term->Nttyb.c_oflag &= ~OFLAGS_TABS;
14250276Speter#else
143184989Srafan	    cur_term->Nttyb.sg_flags &= ~XTABS;
14450276Speter#endif
145184989Srafan	    rc = OK;
146184989Srafan	}
147184989Srafan    }
148184989Srafan    returnCode(rc);
14950276Speter}
15050276Speter
15176726SpeterNCURSES_EXPORT(int)
15276726Speterreset_prog_mode(void)
15350276Speter{
15476726Speter    T((T_CALLED("reset_prog_mode()")));
15550276Speter
15676726Speter    if (cur_term != 0) {
157166124Srafan	if (_nc_set_tty_mode(&cur_term->Nttyb) == OK) {
158166124Srafan	    if (SP) {
159166124Srafan		if (SP->_keypad_on)
160178866Srafan		    _nc_keypad(SP, TRUE);
161166124Srafan		NC_BUFFERED(TRUE);
162166124Srafan	    }
163166124Srafan	    returnCode(OK);
16450276Speter	}
16576726Speter    }
16676726Speter    returnCode(ERR);
16750276Speter}
16850276Speter
16976726SpeterNCURSES_EXPORT(int)
17076726Speterreset_shell_mode(void)
17150276Speter{
17276726Speter    T((T_CALLED("reset_shell_mode()")));
17350276Speter
17476726Speter    if (cur_term != 0) {
17576726Speter	if (SP) {
176178866Srafan	    _nc_keypad(SP, FALSE);
17776726Speter	    _nc_flush();
17876726Speter	    NC_BUFFERED(FALSE);
17950276Speter	}
18076726Speter	returnCode(_nc_set_tty_mode(&cur_term->Ottyb));
18176726Speter    }
18276726Speter    returnCode(ERR);
18350276Speter}
18450276Speter
185174993Srafanstatic TTY *
186174993Srafansaved_tty(void)
187174993Srafan{
188174993Srafan    TTY *result = 0;
189174993Srafan
190174993Srafan    if (SP != 0) {
191174993Srafan	result = &(SP->_saved_tty);
192174993Srafan    } else {
193174993Srafan	if (_nc_prescreen.saved_tty == 0) {
194174993Srafan	    _nc_prescreen.saved_tty = typeCalloc(TTY, 1);
195174993Srafan	}
196174993Srafan	result = _nc_prescreen.saved_tty;
197174993Srafan    }
198174993Srafan    return result;
199174993Srafan}
200174993Srafan
20150276Speter/*
20250276Speter**	savetty()  and  resetty()
20350276Speter**
20450276Speter*/
20550276Speter
20676726SpeterNCURSES_EXPORT(int)
20776726Spetersavetty(void)
20850276Speter{
20976726Speter    T((T_CALLED("savetty()")));
21050276Speter
211174993Srafan    returnCode(_nc_get_tty_mode(saved_tty()));
21250276Speter}
21350276Speter
21476726SpeterNCURSES_EXPORT(int)
21576726Speterresetty(void)
21650276Speter{
21776726Speter    T((T_CALLED("resetty()")));
21850276Speter
219174993Srafan    returnCode(_nc_set_tty_mode(saved_tty()));
22050276Speter}
221