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