lib_options.c revision 76726
1/****************************************************************************
2 * Copyright (c) 1998,1999,2000 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.42 2000/12/10 02:55:07 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}
119
120NCURSES_EXPORT(int)
121keypad(WINDOW *win, bool flag)
122{
123    T((T_CALLED("keypad(%p,%d)"), win, flag));
124
125    if (win) {
126	win->_use_keypad = flag;
127	returnCode(_nc_keypad(flag));
128    } else
129	returnCode(ERR);
130}
131
132NCURSES_EXPORT(int)
133meta(WINDOW *win GCC_UNUSED, bool flag)
134{
135    /* Ok, we stay relaxed and don't signal an error if win is NULL */
136    T((T_CALLED("meta(%p,%d)"), win, flag));
137
138    SP->_use_meta = flag;
139
140    if (flag && meta_on) {
141	TPUTS_TRACE("meta_on");
142	putp(meta_on);
143    } else if (!flag && meta_off) {
144	TPUTS_TRACE("meta_off");
145	putp(meta_off);
146    }
147    returnCode(OK);
148}
149
150/* curs_set() moved here to narrow the kernel interface */
151
152NCURSES_EXPORT(int)
153curs_set(int vis)
154{
155    int cursor = SP->_cursor;
156
157    T((T_CALLED("curs_set(%d)"), vis));
158
159    if (vis < 0 || vis > 2)
160	returnCode(ERR);
161
162    if (vis == cursor)
163	returnCode(cursor);
164
165    switch (vis) {
166    case 2:
167	if (cursor_visible) {
168	    TPUTS_TRACE("cursor_visible");
169	    putp(cursor_visible);
170	} else
171	    returnCode(ERR);
172	break;
173    case 1:
174	if (cursor_normal) {
175	    TPUTS_TRACE("cursor_normal");
176	    putp(cursor_normal);
177	} else
178	    returnCode(ERR);
179	break;
180    case 0:
181	if (cursor_invisible) {
182	    TPUTS_TRACE("cursor_invisible");
183	    putp(cursor_invisible);
184	} else
185	    returnCode(ERR);
186	break;
187    }
188    SP->_cursor = vis;
189    _nc_flush();
190
191    returnCode(cursor == -1 ? 1 : cursor);
192}
193
194NCURSES_EXPORT(int)
195typeahead(int fd)
196{
197    T((T_CALLED("typeahead(%d)"), fd));
198    SP->_checkfd = fd;
199    returnCode(OK);
200}
201
202/*
203**      has_key()
204**
205**      Return TRUE if the current terminal has the given key
206**
207*/
208
209#if NCURSES_EXT_FUNCS
210static int
211has_key_internal(int keycode, struct tries *tp)
212{
213    if (tp == 0)
214	return (FALSE);
215    else if (tp->value == keycode)
216	return (TRUE);
217    else
218	return (has_key_internal(keycode, tp->child)
219		|| has_key_internal(keycode, tp->sibling));
220}
221
222NCURSES_EXPORT(int)
223has_key(int keycode)
224{
225    T((T_CALLED("has_key(%d)"), keycode));
226    returnCode(has_key_internal(keycode, SP->_keytry));
227}
228#endif /* NCURSES_EXT_FUNCS */
229
230/* Turn the keypad on/off
231 *
232 * Note:  we flush the output because changing this mode causes some terminals
233 * to emit different escape sequences for cursor and keypad keys.  If we don't
234 * flush, then the next wgetch may get the escape sequence that corresponds to
235 * the terminal state _before_ switching modes.
236 */
237NCURSES_EXPORT(int)
238_nc_keypad(bool flag)
239{
240    if (flag && keypad_xmit) {
241	TPUTS_TRACE("keypad_xmit");
242	putp(keypad_xmit);
243	_nc_flush();
244    } else if (!flag && keypad_local) {
245	TPUTS_TRACE("keypad_local");
246	putp(keypad_local);
247	_nc_flush();
248    }
249
250    if (flag && !SP->_tried) {
251	_nc_init_keytry();
252	SP->_tried = TRUE;
253    }
254    return (OK);
255}
256