/****************************************************************************
- * Copyright (c) 1998 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2006,2008 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
/****************************************************************************
* Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
* and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ * and: Thomas E. Dickey 1996-on *
****************************************************************************/
-
/*
** lib_options.c
**
#include <curses.priv.h>
-#include <term.h> /* keypad_xmit, keypad_local, meta_on, meta_off */
- /* cursor_visible,cursor_normal,cursor_invisible */
+#include <term.h>
+
+MODULE_ID("$Id: lib_options.c,v 1.55 2008/05/25 00:32:17 tom Exp $")
-MODULE_ID("$Id: lib_options.c,v 1.36 1999/10/22 21:38:57 tom Exp $")
+static int _nc_curs_set(SCREEN *, int);
+static int _nc_meta(SCREEN *, bool);
-int idlok(WINDOW *win, bool flag)
+NCURSES_EXPORT(int)
+idlok(WINDOW *win, bool flag)
{
- T((T_CALLED("idlok(%p,%d)"), win, flag));
+ T((T_CALLED("idlok(%p,%d)"), win, flag));
- if (win) {
- _nc_idlok = win->_idlok = flag && (has_il() || change_scroll_region);
- returnCode(OK);
- }
- else
- returnCode(ERR);
+ if (win) {
+ _nc_idlok = win->_idlok = (flag && (has_il() || change_scroll_region));
+ returnCode(OK);
+ } else
+ returnCode(ERR);
}
-
-void idcok(WINDOW *win, bool flag)
+NCURSES_EXPORT(void)
+idcok(WINDOW *win, bool flag)
{
- T((T_CALLED("idcok(%p,%d)"), win, flag));
+ T((T_CALLED("idcok(%p,%d)"), win, flag));
- if (win)
- _nc_idcok = win->_idcok = flag && has_ic();
+ if (win)
+ _nc_idcok = win->_idcok = (flag && has_ic());
- returnVoid;
+ returnVoid;
}
-int halfdelay(int t)
+NCURSES_EXPORT(int)
+halfdelay(int t)
{
- T((T_CALLED("halfdelay(%d)"), t));
+ T((T_CALLED("halfdelay(%d)"), t));
- if (t < 1 || t > 255)
- returnCode(ERR);
+ if (t < 1 || t > 255 || SP == 0)
+ returnCode(ERR);
- cbreak();
- SP->_cbreak = t+1;
- returnCode(OK);
+ cbreak();
+ SP->_cbreak = t + 1;
+ returnCode(OK);
}
-int nodelay(WINDOW *win, bool flag)
+NCURSES_EXPORT(int)
+nodelay(WINDOW *win, bool flag)
{
- T((T_CALLED("nodelay(%p,%d)"), win, flag));
+ T((T_CALLED("nodelay(%p,%d)"), win, flag));
- if (win) {
- if (flag == TRUE)
+ if (win) {
+ if (flag == TRUE)
win->_delay = 0;
- else win->_delay = -1;
- returnCode(OK);
- }
else
- returnCode(ERR);
+ win->_delay = -1;
+ returnCode(OK);
+ } else
+ returnCode(ERR);
}
-int notimeout(WINDOW *win, bool f)
+NCURSES_EXPORT(int)
+notimeout(WINDOW *win, bool f)
{
- T((T_CALLED("notimout(%p,%d)"), win, f));
+ T((T_CALLED("notimeout(%p,%d)"), win, f));
- if (win) {
- win->_notimeout = f;
- returnCode(OK);
- }
- else
- returnCode(ERR);
+ if (win) {
+ win->_notimeout = f;
+ returnCode(OK);
+ } else
+ returnCode(ERR);
}
-void wtimeout(WINDOW *win, int delay)
+NCURSES_EXPORT(void)
+wtimeout(WINDOW *win, int delay)
{
- T((T_CALLED("wtimeout(%p,%d)"), win, delay));
+ T((T_CALLED("wtimeout(%p,%d)"), win, delay));
- if (win) {
- win->_delay = delay;
- }
+ if (win) {
+ win->_delay = delay;
+ }
+ returnVoid;
}
-int keypad(WINDOW *win, bool flag)
+NCURSES_EXPORT(int)
+keypad(WINDOW *win, bool flag)
{
- T((T_CALLED("keypad(%p,%d)"), win, flag));
+ T((T_CALLED("keypad(%p,%d)"), win, flag));
- if (win) {
- win->_use_keypad = flag;
- returnCode(_nc_keypad(flag));
- }
- else
- returnCode(ERR);
+ if (win) {
+ win->_use_keypad = flag;
+ returnCode(_nc_keypad(SP, flag));
+ } else
+ returnCode(ERR);
}
-
-int meta(WINDOW *win GCC_UNUSED, bool flag)
+NCURSES_EXPORT(int)
+meta(WINDOW *win GCC_UNUSED, bool flag)
{
- /* Ok, we stay relaxed and don't signal an error if win is NULL */
- T((T_CALLED("meta(%p,%d)"), win, flag));
-
- SP->_use_meta = flag;
+ int result;
- if (flag && meta_on)
- {
- TPUTS_TRACE("meta_on");
- putp(meta_on);
- }
- else if (! flag && meta_off)
- {
- TPUTS_TRACE("meta_off");
- putp(meta_off);
- }
- returnCode(OK);
+ /* Ok, we stay relaxed and don't signal an error if win is NULL */
+ T((T_CALLED("meta(%p,%d)"), win, flag));
+ result = _nc_meta(SP, flag);
+ returnCode(result);
}
/* curs_set() moved here to narrow the kernel interface */
-int curs_set(int vis)
+NCURSES_EXPORT(int)
+curs_set(int vis)
{
-int cursor = SP->_cursor;
-
- T((T_CALLED("curs_set(%d)"), vis));
-
- if (vis < 0 || vis > 2)
- returnCode(ERR);
-
- if (vis == cursor)
- returnCode(cursor);
-
- switch(vis) {
- case 2:
- if (cursor_visible)
- {
- TPUTS_TRACE("cursor_visible");
- putp(cursor_visible);
- }
- else
- returnCode(ERR);
- break;
- case 1:
- if (cursor_normal)
- {
- TPUTS_TRACE("cursor_normal");
- putp(cursor_normal);
- }
- else
- returnCode(ERR);
- break;
- case 0:
- if (cursor_invisible)
- {
- TPUTS_TRACE("cursor_invisible");
- putp(cursor_invisible);
- }
- else
- returnCode(ERR);
- break;
- }
- SP->_cursor = vis;
- _nc_flush();
+ int result;
- returnCode(cursor==-1 ? 1 : cursor);
+ T((T_CALLED("curs_set(%d)"), vis));
+ result = _nc_curs_set(SP, vis);
+ returnCode(result);
}
-int typeahead(int fd)
+NCURSES_EXPORT(int)
+typeahead(int fd)
{
- T((T_CALLED("typeahead(%d)"), fd));
+ T((T_CALLED("typeahead(%d)"), fd));
+ if (SP != 0) {
SP->_checkfd = fd;
returnCode(OK);
+ } else {
+ returnCode(ERR);
+ }
}
/*
**
*/
-#ifdef NCURSES_EXT_FUNCS
-static int has_key_internal(int keycode, struct tries *tp)
+#if NCURSES_EXT_FUNCS
+static int
+has_key_internal(int keycode, TRIES * tp)
{
if (tp == 0)
- return(FALSE);
+ return (FALSE);
else if (tp->value == keycode)
- return(TRUE);
+ return (TRUE);
else
- return(has_key_internal(keycode, tp->child)
- || has_key_internal(keycode, tp->sibling));
+ return (has_key_internal(keycode, tp->child)
+ || has_key_internal(keycode, tp->sibling));
}
-int has_key(int keycode)
+NCURSES_EXPORT(int)
+has_key(int keycode)
{
T((T_CALLED("has_key(%d)"), keycode));
- returnCode(has_key_internal(keycode, SP->_keytry));
+ returnCode(SP != 0 ? has_key_internal(keycode, SP->_keytry) : FALSE);
}
#endif /* NCURSES_EXT_FUNCS */
+/*
+ * Internal entrypoints use SCREEN* parameter to obtain capabilities rather
+ * than cur_term.
+ */
+#undef CUR
+#define CUR (sp->_term)->type.
+
+static int
+_nc_putp(const char *name GCC_UNUSED, const char *value)
+{
+ int rc = ERR;
+
+ if (value) {
+ TPUTS_TRACE(name);
+ rc = putp(value);
+ }
+ return rc;
+}
+
+static int
+_nc_putp_flush(const char *name, const char *value)
+{
+ int rc = _nc_putp(name, value);
+ if (rc != ERR) {
+ _nc_flush();
+ }
+ return rc;
+}
+
/* Turn the keypad on/off
*
* Note: we flush the output because changing this mode causes some terminals
* flush, then the next wgetch may get the escape sequence that corresponds to
* the terminal state _before_ switching modes.
*/
-int _nc_keypad(bool flag)
+NCURSES_EXPORT(int)
+_nc_keypad(SCREEN *sp, bool flag)
{
- if (flag && keypad_xmit)
+ int rc = ERR;
+
+ if (sp != 0) {
+#ifdef USE_PTHREADS
+ /*
+ * We might have this situation in a multithreaded application that
+ * has wgetch() reading in more than one thread. putp() and below
+ * may use SP explicitly.
+ */
+ if (sp != SP) {
+ SCREEN *save_sp;
+
+ /* cannot use use_screen(), since that is not in tinfo library */
+ _nc_lock_global(use_screen);
+ save_sp = SP;
+ SP = sp;
+ rc = _nc_keypad(sp, flag);
+ SP = save_sp;
+ _nc_unlock_global(use_screen);
+ } else
+#endif
{
- TPUTS_TRACE("keypad_xmit");
- putp(keypad_xmit);
- _nc_flush();
+ if (flag) {
+ (void) _nc_putp_flush("keypad_xmit", keypad_xmit);
+ } else if (!flag && keypad_local) {
+ (void) _nc_putp_flush("keypad_local", keypad_local);
+ }
+
+ if (flag && !sp->_tried) {
+ _nc_init_keytry(sp);
+ sp->_tried = TRUE;
+ }
+ sp->_keypad_on = flag;
+ rc = OK;
}
- else if (! flag && keypad_local)
- {
- TPUTS_TRACE("keypad_local");
- putp(keypad_local);
- _nc_flush();
+ }
+ return (rc);
+}
+
+static int
+_nc_curs_set(SCREEN *sp, int vis)
+{
+ int result = ERR;
+
+ T((T_CALLED("curs_set(%d)"), vis));
+ if (sp != 0 && vis >= 0 && vis <= 2) {
+ int cursor = sp->_cursor;
+
+ if (vis == cursor) {
+ result = cursor;
+ } else {
+ switch (vis) {
+ case 2:
+ result = _nc_putp_flush("cursor_visible", cursor_visible);
+ break;
+ case 1:
+ result = _nc_putp_flush("cursor_normal", cursor_normal);
+ break;
+ case 0:
+ result = _nc_putp_flush("cursor_invisible", cursor_invisible);
+ break;
+ }
+ if (result != ERR)
+ result = (cursor == -1 ? 1 : cursor);
+ sp->_cursor = vis;
}
+ }
+ returnCode(result);
+}
+
+static int
+_nc_meta(SCREEN *sp, bool flag)
+{
+ int result = ERR;
+
+ /* Ok, we stay relaxed and don't signal an error if win is NULL */
+
+ if (SP != 0) {
+ SP->_use_meta = flag;
- if (flag && !SP->_tried) {
- _nc_init_keytry();
- SP->_tried = TRUE;
+ if (flag) {
+ _nc_putp("meta_on", meta_on);
+ } else {
+ _nc_putp("meta_off", meta_off);
}
- return(OK);
+ result = OK;
+ }
+ return result;
}