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