lib_options.c revision 97049
1/****************************************************************************
2 * Copyright (c) 1998,1999,2000,2001,2002 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 ****************************************************************************/
33
34/*
35**	lib_options.c
36**
37**	The routines to handle option setting.
38**
39*/
40
41#include <curses.priv.h>
42
43#include <term.h>
44
45MODULE_ID("$Id: lib_options.c,v 1.46 2002/02/02 19:40:54 tom Exp $")
46
47NCURSES_EXPORT(int)
48idlok(WINDOW *win, bool flag)
49{
50    T((T_CALLED("idlok(%p,%d)"), win, flag));
51
52    if (win) {
53	_nc_idlok = win->_idlok = (flag && (has_il() || change_scroll_region));
54	returnCode(OK);
55    } else
56	returnCode(ERR);
57}
58
59NCURSES_EXPORT(void)
60idcok(WINDOW *win, bool flag)
61{
62    T((T_CALLED("idcok(%p,%d)"), win, flag));
63
64    if (win)
65	_nc_idcok = win->_idcok = (flag && has_ic());
66
67    returnVoid;
68}
69
70NCURSES_EXPORT(int)
71halfdelay(int t)
72{
73    T((T_CALLED("halfdelay(%d)"), t));
74
75    if (t < 1 || t > 255)
76	returnCode(ERR);
77
78    cbreak();
79    SP->_cbreak = t + 1;
80    returnCode(OK);
81}
82
83NCURSES_EXPORT(int)
84nodelay(WINDOW *win, bool flag)
85{
86    T((T_CALLED("nodelay(%p,%d)"), win, flag));
87
88    if (win) {
89	if (flag == TRUE)
90	    win->_delay = 0;
91	else
92	    win->_delay = -1;
93	returnCode(OK);
94    } else
95	returnCode(ERR);
96}
97
98NCURSES_EXPORT(int)
99notimeout(WINDOW *win, bool f)
100{
101    T((T_CALLED("notimout(%p,%d)"), win, f));
102
103    if (win) {
104	win->_notimeout = f;
105	returnCode(OK);
106    } else
107	returnCode(ERR);
108}
109
110NCURSES_EXPORT(void)
111wtimeout(WINDOW *win, int delay)
112{
113    T((T_CALLED("wtimeout(%p,%d)"), win, delay));
114
115    if (win) {
116	win->_delay = delay;
117    }
118    returnVoid;
119}
120
121NCURSES_EXPORT(int)
122keypad(WINDOW *win, bool flag)
123{
124    T((T_CALLED("keypad(%p,%d)"), win, flag));
125
126    if (win) {
127	win->_use_keypad = flag;
128	returnCode(_nc_keypad(flag));
129    } else
130	returnCode(ERR);
131}
132
133NCURSES_EXPORT(int)
134meta(WINDOW *win GCC_UNUSED, bool flag)
135{
136    /* Ok, we stay relaxed and don't signal an error if win is NULL */
137    T((T_CALLED("meta(%p,%d)"), win, flag));
138
139    SP->_use_meta = flag;
140
141    if (flag && meta_on) {
142	TPUTS_TRACE("meta_on");
143	putp(meta_on);
144    } else if (!flag && meta_off) {
145	TPUTS_TRACE("meta_off");
146	putp(meta_off);
147    }
148    returnCode(OK);
149}
150
151/* curs_set() moved here to narrow the kernel interface */
152
153NCURSES_EXPORT(int)
154curs_set(int vis)
155{
156    int cursor = SP->_cursor;
157
158    T((T_CALLED("curs_set(%d)"), vis));
159
160    if (vis < 0 || vis > 2)
161	returnCode(ERR);
162
163    if (vis == cursor)
164	returnCode(cursor);
165
166    switch (vis) {
167    case 2:
168	if (cursor_visible) {
169	    TPUTS_TRACE("cursor_visible");
170	    putp(cursor_visible);
171	} else
172	    returnCode(ERR);
173	break;
174    case 1:
175	if (cursor_normal) {
176	    TPUTS_TRACE("cursor_normal");
177	    putp(cursor_normal);
178	} else
179	    returnCode(ERR);
180	break;
181    case 0:
182	if (cursor_invisible) {
183	    TPUTS_TRACE("cursor_invisible");
184	    putp(cursor_invisible);
185	} else
186	    returnCode(ERR);
187	break;
188    }
189    SP->_cursor = vis;
190    _nc_flush();
191
192    returnCode(cursor == -1 ? 1 : cursor);
193}
194
195NCURSES_EXPORT(int)
196typeahead(int fd)
197{
198    T((T_CALLED("typeahead(%d)"), fd));
199    SP->_checkfd = fd;
200    returnCode(OK);
201}
202
203/*
204**      has_key()
205**
206**      Return TRUE if the current terminal has the given key
207**
208*/
209
210#if NCURSES_EXT_FUNCS
211static int
212has_key_internal(int keycode, struct tries *tp)
213{
214    if (tp == 0)
215	return (FALSE);
216    else if (tp->value == keycode)
217	return (TRUE);
218    else
219	return (has_key_internal(keycode, tp->child)
220		|| has_key_internal(keycode, tp->sibling));
221}
222
223NCURSES_EXPORT(int)
224has_key(int keycode)
225{
226    T((T_CALLED("has_key(%d)"), keycode));
227    returnCode(has_key_internal(keycode, SP->_keytry));
228}
229#endif /* NCURSES_EXT_FUNCS */
230
231/* Turn the keypad on/off
232 *
233 * Note:  we flush the output because changing this mode causes some terminals
234 * to emit different escape sequences for cursor and keypad keys.  If we don't
235 * flush, then the next wgetch may get the escape sequence that corresponds to
236 * the terminal state _before_ switching modes.
237 */
238NCURSES_EXPORT(int)
239_nc_keypad(bool flag)
240{
241    if (flag && keypad_xmit) {
242	TPUTS_TRACE("keypad_xmit");
243	putp(keypad_xmit);
244	_nc_flush();
245    } else if (!flag && keypad_local) {
246	TPUTS_TRACE("keypad_local");
247	putp(keypad_local);
248	_nc_flush();
249    }
250
251    if (flag && !SP->_tried) {
252	_nc_init_keytry();
253	SP->_tried = TRUE;
254    }
255    SP->_keypad_on = flag;
256    return (OK);
257}
258