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