1/**************************************************************************** 2 * Copyright (c) 1998-2002,2004 Free Software Foundation, Inc. * 3 * * 4 * Permission is hereby granted, free of charge, to any person obtaining a * 5 * copy of this software and associated documentation files (the * 6 * "Software"), to deal in the Software without restriction, including * 7 * without limitation the rights to use, copy, modify, merge, publish, * 8 * distribute, distribute with modifications, sublicense, and/or sell * 9 * copies of the Software, and to permit persons to whom the Software is * 10 * furnished to do so, subject to the following conditions: * 11 * * 12 * The above copyright notice and this permission notice shall be included * 13 * in all copies or substantial portions of the Software. * 14 * * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * 16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 18 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * 21 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * 22 * * 23 * Except as contained in this notice, the name(s) of the above copyright * 24 * holders shall not be used in advertising or otherwise to promote the * 25 * sale, use or other dealings in this Software without prior written * 26 * authorization. * 27 ****************************************************************************/ 28 29/**************************************************************************** 30 * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 * 31 * and: Eric S. Raymond <esr@snark.thyrsus.com> * 32 * and: Thomas E. Dickey 1996-on * 33 ****************************************************************************/ 34 35/* 36** lib_newterm.c 37** 38** The newterm() function. 39** 40*/ 41 42#include <curses.priv.h> 43 44#if SVR4_TERMIO && !defined(_POSIX_SOURCE) 45#define _POSIX_SOURCE 46#endif 47 48#include <term.h> /* clear_screen, cup & friends, cur_term */ 49#include <tic.h> 50 51MODULE_ID("$Id: lib_newterm.c,v 1.58 2004/08/14 20:36:39 tom Exp $") 52 53#ifndef ONLCR /* Allows compilation under the QNX 4.2 OS */ 54#define ONLCR 0 55#endif 56 57/* 58 * SVr4/XSI Curses specify that hardware echo is turned off in initscr, and not 59 * restored during the curses session. The library simulates echo in software. 60 * (The behavior is unspecified if the application enables hardware echo). 61 * 62 * The newterm function also initializes terminal settings, and since initscr 63 * is supposed to behave as if it calls newterm, we do it here. 64 */ 65static inline int 66_nc_initscr(void) 67{ 68 int result = ERR; 69 70 /* for extended XPG4 conformance requires cbreak() at this point */ 71 /* (SVr4 curses does this anyway) */ 72 if (cbreak() == OK) { 73 TTY buf; 74 75 buf = cur_term->Nttyb; 76#ifdef TERMIOS 77 buf.c_lflag &= ~(ECHO | ECHONL); 78 buf.c_iflag &= ~(ICRNL | INLCR | IGNCR); 79 buf.c_oflag &= ~(ONLCR); 80#else 81 buf.sg_flags &= ~(ECHO | CRMOD); 82#endif 83 if ((result = _nc_set_tty_mode(&buf)) == OK) 84 cur_term->Nttyb = buf; 85 } 86 return result; 87} 88 89/* 90 * filter() has to be called before either initscr() or newterm(), so there is 91 * apparently no way to make this flag apply to some terminals and not others, 92 * aside from possibly delaying a filter() call until some terminals have been 93 * initialized. 94 */ 95static int filter_mode = FALSE; 96 97NCURSES_EXPORT(void) 98filter(void) 99{ 100 T((T_CALLED("filter"))); 101 filter_mode = TRUE; 102 returnVoid; 103} 104 105NCURSES_EXPORT(SCREEN *) 106newterm(NCURSES_CONST char *name, FILE *ofp, FILE *ifp) 107{ 108 int errret; 109 int slk_format = _nc_slk_format; 110 SCREEN *current; 111 112 START_TRACE(); 113 T((T_CALLED("newterm(\"%s\",%p,%p)"), name, ofp, ifp)); 114 115 /* this loads the capability entry, then sets LINES and COLS */ 116 if (setupterm(name, fileno(ofp), &errret) == ERR) 117 returnSP(0); 118 119 /* implement filter mode */ 120 if (filter_mode) { 121 LINES = 1; 122 123 clear_screen = 0; 124 cursor_down = parm_down_cursor = 0; 125 cursor_address = 0; 126 cursor_up = parm_up_cursor = 0; 127 row_address = 0; 128 129 cursor_home = carriage_return; 130 } 131 132 /* If we must simulate soft labels, grab off the line to be used. 133 We assume that we must simulate, if it is none of the standard 134 formats (4-4 or 3-2-3) for which there may be some hardware 135 support. */ 136 if (num_labels <= 0 || !SLK_STDFMT(slk_format)) 137 if (slk_format) { 138 if (ERR == _nc_ripoffline(-SLK_LINES(slk_format), 139 _nc_slk_initialize)) 140 returnSP(0); 141 } 142 /* this actually allocates the screen structure, and saves the 143 * original terminal settings. 144 */ 145 current = SP; 146 _nc_set_screen(0); 147 if (_nc_setupscreen(LINES, COLS, ofp) == ERR) { 148 _nc_set_screen(current); 149 returnSP(0); 150 } 151 152 /* if the terminal type has real soft labels, set those up */ 153 if (slk_format && num_labels > 0 && SLK_STDFMT(slk_format)) 154 _nc_slk_initialize(stdscr, COLS); 155 156 SP->_ifd = fileno(ifp); 157 typeahead(fileno(ifp)); 158#ifdef TERMIOS 159 SP->_use_meta = ((cur_term->Ottyb.c_cflag & CSIZE) == CS8 && 160 !(cur_term->Ottyb.c_iflag & ISTRIP)); 161#else 162 SP->_use_meta = FALSE; 163#endif 164 SP->_endwin = FALSE; 165 166 /* Check whether we can optimize scrolling under dumb terminals in case 167 * we do not have any of these capabilities, scrolling optimization 168 * will be useless. 169 */ 170 SP->_scrolling = ((scroll_forward && scroll_reverse) || 171 ((parm_rindex || parm_insert_line || insert_line) && 172 (parm_index || parm_delete_line || delete_line))); 173 174 baudrate(); /* sets a field in the SP structure */ 175 176 SP->_keytry = 0; 177 178 /* 179 * Check for mismatched graphic-rendition capabilities. Most SVr4 180 * terminfo trees contain entries that have rmul or rmso equated to 181 * sgr0 (Solaris curses copes with those entries). We do this only for 182 * curses, since many termcap applications assume that smso/rmso and 183 * smul/rmul are paired, and will not function properly if we remove 184 * rmso or rmul. Curses applications shouldn't be looking at this 185 * detail. 186 */ 187#define SGR0_TEST(mode) (mode != 0) && (exit_attribute_mode == 0 || strcmp(mode, exit_attribute_mode)) 188 SP->_use_rmso = SGR0_TEST(exit_standout_mode); 189 SP->_use_rmul = SGR0_TEST(exit_underline_mode); 190 191 /* compute movement costs so we can do better move optimization */ 192 _nc_mvcur_init(); 193 194 /* initialize terminal to a sane state */ 195 _nc_screen_init(); 196 197 /* Initialize the terminal line settings. */ 198 _nc_initscr(); 199 200 _nc_signal_handler(TRUE); 201 202#if USE_SIZECHANGE 203 /* 204 * Pretend we received a SIGWINCH, just in case we're starting up in a 205 * terminal that cannot initialize its size properly (Debian #265631). 206 */ 207 SP->_sig_winch = TRUE; 208#endif 209 210 returnSP(SP); 211} 212