lib_options.c revision 62449
150276Speter/****************************************************************************
262449Speter * Copyright (c) 1998,1999,2000 Free Software Foundation, Inc.              *
350276Speter *                                                                          *
450276Speter * Permission is hereby granted, free of charge, to any person obtaining a  *
550276Speter * copy of this software and associated documentation files (the            *
650276Speter * "Software"), to deal in the Software without restriction, including      *
750276Speter * without limitation the rights to use, copy, modify, merge, publish,      *
850276Speter * distribute, distribute with modifications, sublicense, and/or sell       *
950276Speter * copies of the Software, and to permit persons to whom the Software is    *
1050276Speter * furnished to do so, subject to the following conditions:                 *
1150276Speter *                                                                          *
1250276Speter * The above copyright notice and this permission notice shall be included  *
1350276Speter * in all copies or substantial portions of the Software.                   *
1450276Speter *                                                                          *
1550276Speter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
1650276Speter * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
1750276Speter * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
1850276Speter * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
1950276Speter * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
2050276Speter * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
2150276Speter * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
2250276Speter *                                                                          *
2350276Speter * Except as contained in this notice, the name(s) of the above copyright   *
2450276Speter * holders shall not be used in advertising or otherwise to promote the     *
2550276Speter * sale, use or other dealings in this Software without prior written       *
2650276Speter * authorization.                                                           *
2750276Speter ****************************************************************************/
2850276Speter
2950276Speter/****************************************************************************
3050276Speter *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
3150276Speter *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
3250276Speter ****************************************************************************/
3350276Speter
3450276Speter/*
3550276Speter**	lib_options.c
3650276Speter**
3750276Speter**	The routines to handle option setting.
3850276Speter**
3950276Speter*/
4050276Speter
4150276Speter#include <curses.priv.h>
4250276Speter
4362449Speter#include <term.h>
4450276Speter
4562449SpeterMODULE_ID("$Id: lib_options.c,v 1.39 2000/03/12 00:19:11 tom Exp $")
4650276Speter
4762449Speterint
4862449Speteridlok(WINDOW *win, bool flag)
4950276Speter{
5062449Speter    T((T_CALLED("idlok(%p,%d)"), win, flag));
5150276Speter
5262449Speter    if (win) {
5362449Speter	_nc_idlok = win->_idlok = (flag && (has_il() || change_scroll_region));
5462449Speter	returnCode(OK);
5562449Speter    } else
5662449Speter	returnCode(ERR);
5750276Speter}
5850276Speter
5962449Spetervoid
6062449Speteridcok(WINDOW *win, bool flag)
6150276Speter{
6262449Speter    T((T_CALLED("idcok(%p,%d)"), win, flag));
6350276Speter
6462449Speter    if (win)
6562449Speter	_nc_idcok = win->_idcok = (flag && has_ic());
6650276Speter
6762449Speter    returnVoid;
6850276Speter}
6950276Speter
7062449Speterint
7162449Speterhalfdelay(int t)
7250276Speter{
7362449Speter    T((T_CALLED("halfdelay(%d)"), t));
7450276Speter
7562449Speter    if (t < 1 || t > 255)
7662449Speter	returnCode(ERR);
7750276Speter
7862449Speter    cbreak();
7962449Speter    SP->_cbreak = t + 1;
8062449Speter    returnCode(OK);
8150276Speter}
8250276Speter
8362449Speterint
8462449Speternodelay(WINDOW *win, bool flag)
8550276Speter{
8662449Speter    T((T_CALLED("nodelay(%p,%d)"), win, flag));
8750276Speter
8862449Speter    if (win) {
8962449Speter	if (flag == TRUE)
9050276Speter	    win->_delay = 0;
9150276Speter	else
9262449Speter	    win->_delay = -1;
9362449Speter	returnCode(OK);
9462449Speter    } else
9562449Speter	returnCode(ERR);
9650276Speter}
9750276Speter
9862449Speterint
9962449Speternotimeout(WINDOW *win, bool f)
10050276Speter{
10162449Speter    T((T_CALLED("notimout(%p,%d)"), win, f));
10250276Speter
10362449Speter    if (win) {
10462449Speter	win->_notimeout = f;
10562449Speter	returnCode(OK);
10662449Speter    } else
10762449Speter	returnCode(ERR);
10850276Speter}
10950276Speter
11062449Spetervoid
11162449Speterwtimeout(WINDOW *win, int delay)
11250276Speter{
11362449Speter    T((T_CALLED("wtimeout(%p,%d)"), win, delay));
11450276Speter
11562449Speter    if (win) {
11662449Speter	win->_delay = delay;
11762449Speter    }
11850276Speter}
11950276Speter
12062449Speterint
12162449Speterkeypad(WINDOW *win, bool flag)
12250276Speter{
12362449Speter    T((T_CALLED("keypad(%p,%d)"), win, flag));
12450276Speter
12562449Speter    if (win) {
12662449Speter	win->_use_keypad = flag;
12762449Speter	returnCode(_nc_keypad(flag));
12862449Speter    } else
12962449Speter	returnCode(ERR);
13050276Speter}
13150276Speter
13262449Speterint
13362449Spetermeta(WINDOW *win GCC_UNUSED, bool flag)
13450276Speter{
13562449Speter    /* Ok, we stay relaxed and don't signal an error if win is NULL */
13662449Speter    T((T_CALLED("meta(%p,%d)"), win, flag));
13750276Speter
13862449Speter    SP->_use_meta = flag;
13950276Speter
14062449Speter    if (flag && meta_on) {
14162449Speter	TPUTS_TRACE("meta_on");
14262449Speter	putp(meta_on);
14362449Speter    } else if (!flag && meta_off) {
14462449Speter	TPUTS_TRACE("meta_off");
14562449Speter	putp(meta_off);
14662449Speter    }
14762449Speter    returnCode(OK);
14850276Speter}
14950276Speter
15050276Speter/* curs_set() moved here to narrow the kernel interface */
15150276Speter
15262449Speterint
15362449Spetercurs_set(int vis)
15450276Speter{
15562449Speter    int cursor = SP->_cursor;
15650276Speter
15762449Speter    T((T_CALLED("curs_set(%d)"), vis));
15850276Speter
15962449Speter    if (vis < 0 || vis > 2)
16062449Speter	returnCode(ERR);
16150276Speter
16262449Speter    if (vis == cursor)
16362449Speter	returnCode(cursor);
16450276Speter
16562449Speter    switch (vis) {
16662449Speter    case 2:
16762449Speter	if (cursor_visible) {
16862449Speter	    TPUTS_TRACE("cursor_visible");
16962449Speter	    putp(cursor_visible);
17062449Speter	} else
17162449Speter	    returnCode(ERR);
17262449Speter	break;
17362449Speter    case 1:
17462449Speter	if (cursor_normal) {
17562449Speter	    TPUTS_TRACE("cursor_normal");
17662449Speter	    putp(cursor_normal);
17762449Speter	} else
17862449Speter	    returnCode(ERR);
17962449Speter	break;
18062449Speter    case 0:
18162449Speter	if (cursor_invisible) {
18262449Speter	    TPUTS_TRACE("cursor_invisible");
18362449Speter	    putp(cursor_invisible);
18462449Speter	} else
18562449Speter	    returnCode(ERR);
18662449Speter	break;
18762449Speter    }
18862449Speter    SP->_cursor = vis;
18962449Speter    _nc_flush();
19050276Speter
19162449Speter    returnCode(cursor == -1 ? 1 : cursor);
19250276Speter}
19350276Speter
19462449Speterint
19562449Spetertypeahead(int fd)
19650276Speter{
19762449Speter    T((T_CALLED("typeahead(%d)"), fd));
19862449Speter    SP->_checkfd = fd;
19962449Speter    returnCode(OK);
20050276Speter}
20150276Speter
20250276Speter/*
20350276Speter**      has_key()
20450276Speter**
20550276Speter**      Return TRUE if the current terminal has the given key
20650276Speter**
20750276Speter*/
20850276Speter
20950276Speter#ifdef NCURSES_EXT_FUNCS
21062449Speterstatic int
21162449Speterhas_key_internal(int keycode, struct tries *tp)
21250276Speter{
21350276Speter    if (tp == 0)
21462449Speter	return (FALSE);
21550276Speter    else if (tp->value == keycode)
21662449Speter	return (TRUE);
21750276Speter    else
21862449Speter	return (has_key_internal(keycode, tp->child)
21962449Speter	    || has_key_internal(keycode, tp->sibling));
22050276Speter}
22150276Speter
22262449Speterint
22362449Speterhas_key(int keycode)
22450276Speter{
22550276Speter    T((T_CALLED("has_key(%d)"), keycode));
22650276Speter    returnCode(has_key_internal(keycode, SP->_keytry));
22750276Speter}
22850276Speter#endif /* NCURSES_EXT_FUNCS */
22950276Speter
23050276Speter/* Turn the keypad on/off
23150276Speter *
23250276Speter * Note:  we flush the output because changing this mode causes some terminals
23350276Speter * to emit different escape sequences for cursor and keypad keys.  If we don't
23450276Speter * flush, then the next wgetch may get the escape sequence that corresponds to
23550276Speter * the terminal state _before_ switching modes.
23650276Speter */
23762449Speterint
23862449Speter_nc_keypad(bool flag)
23950276Speter{
24062449Speter    if (flag && keypad_xmit) {
24162449Speter	TPUTS_TRACE("keypad_xmit");
24262449Speter	putp(keypad_xmit);
24362449Speter	_nc_flush();
24462449Speter    } else if (!flag && keypad_local) {
24562449Speter	TPUTS_TRACE("keypad_local");
24662449Speter	putp(keypad_local);
24762449Speter	_nc_flush();
24862449Speter    }
24950276Speter
25062449Speter    if (flag && !SP->_tried) {
25162449Speter	_nc_init_keytry();
25262449Speter	SP->_tried = TRUE;
25362449Speter    }
25462449Speter    return (OK);
25550276Speter}
256