GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: lib/libcurses/base/lib_newterm.c Lines: 0 53 0.0 %
Date: 2017-11-07 Branches: 0 48 0.0 %

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