Blame ext/posix/curses.c

Packit 437b5e
/*
Packit 437b5e
 * Curses binding for Lua 5.1, 5.2 & 5.3.
Packit 437b5e
 *
Packit 437b5e
 * (c) Gary V. Vaughan <gary@vaughan.pe> 2013-2015
Packit 437b5e
 * (c) Reuben Thomas <rrt@sc3d.org> 2009-2012
Packit 437b5e
 * (c) Tiago Dionizio <tiago.dionizio AT gmail.com> 2004-2007
Packit 437b5e
 *
Packit 437b5e
 * Permission is hereby granted, free of charge, to any person obtaining
Packit 437b5e
 * a copy of this software and associated documentation files (the
Packit 437b5e
 * "Software"), to deal in the Software without restriction, including
Packit 437b5e
 * without limitation the rights to use, copy, modify, merge, publish,
Packit 437b5e
 * distribute, sublicense, and/or sell copies of the Software, and to
Packit 437b5e
 * permit persons to whom the Software is furnished to do so, subject to
Packit 437b5e
 * the following conditions:
Packit 437b5e
 *
Packit 437b5e
 * The above copyright notice and this permission notice shall be
Packit 437b5e
 * included in all copies or substantial portions of the Software.
Packit 437b5e
 *
Packit 437b5e
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Packit 437b5e
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Packit 437b5e
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Packit 437b5e
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
Packit 437b5e
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
Packit 437b5e
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
Packit 437b5e
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit 437b5e
 */
Packit 437b5e
/***
Packit 437b5e
 Full-screen Text Terminal Manipulation.
Packit 437b5e
Packit 437b5e
 In the underlying curses C library, the following functions:
Packit 437b5e
Packit 437b5e
     getstr()   (and wgetstr(), mvgetstr(), and mvwgetstr())
Packit 437b5e
     inchstr()  (and winchstr(), mvinchstr(), and mvwinchstr())
Packit 437b5e
     instr()    (and winstr(), mvinstr(), and mvwinstr())
Packit 437b5e
Packit 437b5e
 are subject to buffer overflow attack. This is because you pass in the
Packit 437b5e
 buffer to be filled in, which has to be of finite length. But in this
Packit 437b5e
 Lua module, a buffer is assigned automatically and the function returns
Packit 437b5e
 the string, so there is no security issue. You may still use the alternate
Packit 437b5e
 functions:
Packit 437b5e
Packit 437b5e
     s = stdscr:getnstr()
Packit 437b5e
     s = stdscr:inchnstr()
Packit 437b5e
     s = stdscr:innstr()
Packit 437b5e
Packit 437b5e
 which take an extra "size of buffer" argument, in order to impose a maximum
Packit 437b5e
 length on the string the user may type in.
Packit 437b5e
Packit 437b5e
 Some of the C functions beginning with "no" do not exist in Lua. You should
Packit 437b5e
 use `curses.nl(false)` and `curses.nl(true)` instead of `nonl()` and `nl()`,
Packit 437b5e
 and likewise `curses.echo(false)` and `curses.echo(true)` instead of
Packit 437b5e
 `noecho()` and `echo()` .
Packit 437b5e
Packit 437b5e
 In this Lua module the `stdscr:getch()` function always returns an integer.
Packit 437b5e
 In C, a single character is an integer, but in Lua (and Perl) a single
Packit 437b5e
 character is a short string. The Perl Curses function `getch()` returns a
Packit 437b5e
 char if it was a char, and a number if it was a constant; to get this
Packit 437b5e
 behaviour in Lua you have to convert explicitly, e.g.:
Packit 437b5e
Packit 437b5e
     if c < 256 then c = string.char(c) end
Packit 437b5e
Packit 437b5e
 Some Lua functions take a different set of parameters than their C
Packit 437b5e
 counterparts; for example, you should use `str = stdscr.getstr()` and
Packit 437b5e
 `y, x = stdscr.getyx()` instead of `getstr(str)` and `getyx(y, x)`, and
Packit 437b5e
 likewise for `getbegyx` and `getmaxyx` and `getparyx` and `pair_content`.
Packit 437b5e
 The Perl Curses module now uses the C-compatible parameters, so be aware of
Packit 437b5e
 this difference when translating code from Perl into Lua, as well as from C
Packit 437b5e
 into Lua.
Packit 437b5e
Packit 437b5e
 Many curses functions have variants starting with the prefixes `w-`, `mv-`,
Packit 437b5e
 and/or `wmv-`. These variants differ only in the explicit addition of a
Packit 437b5e
 window, or by the addition of two coordinates that are used to move the
Packit 437b5e
 cursor first. For example, in C `addch()` has three other variants:
Packit 437b5e
 `waddch()`, `mvaddch()` and `mvwaddch()`.  The Lua equivalents,
Packit 437b5e
 respectively being `stdscr:addch()`, `somewindow:addch()`,
Packit 437b5e
 `stdscr:mvaddch()` and `somewindow:mvaddch()`, with the window argument
Packit 437b5e
 passed implicitly with Lua's `:` syntax sugar.
Packit 437b5e
Packit 437b5e
@module posix.curses
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
Packit 437b5e
#include <config.h>
Packit 437b5e
Packit 437b5e
#include "curses/chstr.c"
Packit 437b5e
#include "curses/window.c"
Packit 437b5e
Packit 437b5e
Packit 437b5e
#if HAVE_CURSES
Packit 437b5e
Packit 437b5e
#include "_helpers.c"
Packit 437b5e
#include "strlcpy.c"
Packit 437b5e
Packit 437b5e
Packit 437b5e
static const char *STDSCR_REGISTRY	= "curses:stdscr";
Packit 437b5e
static const char *RIPOFF_TABLE		= "curses:ripoffline";
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Create a new line drawing buffer instance.
Packit 437b5e
@function new_chstr
Packit 437b5e
@int len number of element to allocate
Packit 437b5e
@treturn chstr a new char buffer object
Packit 437b5e
@see posix.curses.chstr
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pnew_chstr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int len = checkint(L, 1);
Packit 437b5e
	chstr* ncs = chstr_new(L, len);  /* defined in curses/chstr.c */
Packit 437b5e
	memset(ncs->str, ' ', len*sizeof(chtype));
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
Packit 437b5e
#define CCR(n, v)				\
Packit 437b5e
	lua_pushstring(L, n);			\
Packit 437b5e
	lua_pushinteger(L, v);			\
Packit 437b5e
	lua_settable(L, lua_upvalueindex(1))
Packit 437b5e
Packit 437b5e
#define CC(s)	   CCR(#s, s)
Packit 437b5e
#define CF(i)	   CCR(LPOSIX_STR(LPOSIX_SPLICE(KEY_F, i)), KEY_F(i))
Packit 437b5e
Packit 437b5e
/*
Packit 437b5e
** these values may be fixed only after initialization, so this is
Packit 437b5e
** called from Pinitscr, after the curses driver is initialized
Packit 437b5e
**
Packit 437b5e
** curses table is kept at upvalue position 1, in case the global
Packit 437b5e
** name is changed by the user or even in the registration phase by
Packit 437b5e
** the developer
Packit 437b5e
**
Packit 437b5e
** some of these values are not constant so need to register
Packit 437b5e
** them directly instead of using a table
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
static void
Packit 437b5e
register_curses_constants(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	/* colors */
Packit 437b5e
	CC(COLOR_BLACK);	CC(COLOR_RED);		CC(COLOR_GREEN);
Packit 437b5e
	CC(COLOR_YELLOW);	CC(COLOR_BLUE);		CC(COLOR_MAGENTA);
Packit 437b5e
	CC(COLOR_CYAN);		CC(COLOR_WHITE);
Packit 437b5e
Packit 437b5e
	/* alternate character set */
Packit 437b5e
	CC(ACS_BLOCK);		CC(ACS_BOARD);
Packit 437b5e
Packit 437b5e
	CC(ACS_BTEE);		CC(ACS_TTEE);
Packit 437b5e
	CC(ACS_LTEE);		CC(ACS_RTEE);
Packit 437b5e
	CC(ACS_LLCORNER);	CC(ACS_LRCORNER);
Packit 437b5e
	CC(ACS_URCORNER);	CC(ACS_ULCORNER);
Packit 437b5e
Packit 437b5e
	CC(ACS_LARROW);		CC(ACS_RARROW);
Packit 437b5e
	CC(ACS_UARROW);		CC(ACS_DARROW);
Packit 437b5e
Packit 437b5e
	CC(ACS_HLINE);		CC(ACS_VLINE);
Packit 437b5e
Packit 437b5e
	CC(ACS_BULLET);		CC(ACS_CKBOARD);	CC(ACS_LANTERN);
Packit 437b5e
	CC(ACS_DEGREE);		CC(ACS_DIAMOND);
Packit 437b5e
Packit 437b5e
	CC(ACS_PLMINUS);	CC(ACS_PLUS);
Packit 437b5e
	CC(ACS_S1);		CC(ACS_S9);
Packit 437b5e
Packit 437b5e
	/* attributes */
Packit 437b5e
	CC(A_NORMAL);		CC(A_STANDOUT);		CC(A_UNDERLINE);
Packit 437b5e
	CC(A_REVERSE);		CC(A_BLINK);		CC(A_DIM);
Packit 437b5e
	CC(A_BOLD);		CC(A_PROTECT);		CC(A_INVIS);
Packit 437b5e
	CC(A_ALTCHARSET);	CC(A_CHARTEXT);
Packit 437b5e
	CC(A_ATTRIBUTES);
Packit 437b5e
#ifdef A_COLOR
Packit 437b5e
	CC(A_COLOR);
Packit 437b5e
#endif
Packit 437b5e
Packit 437b5e
	/* key functions */
Packit 437b5e
	CC(KEY_BREAK);		CC(KEY_DOWN);		CC(KEY_UP);
Packit 437b5e
	CC(KEY_LEFT);		CC(KEY_RIGHT);		CC(KEY_HOME);
Packit 437b5e
	CC(KEY_BACKSPACE);
Packit 437b5e
Packit 437b5e
	CC(KEY_DL);		CC(KEY_IL);		CC(KEY_DC);
Packit 437b5e
	CC(KEY_IC);		CC(KEY_EIC);		CC(KEY_CLEAR);
Packit 437b5e
	CC(KEY_EOS);		CC(KEY_EOL);		CC(KEY_SF);
Packit 437b5e
	CC(KEY_SR);		CC(KEY_NPAGE);		CC(KEY_PPAGE);
Packit 437b5e
	CC(KEY_STAB);		CC(KEY_CTAB);		CC(KEY_CATAB);
Packit 437b5e
	CC(KEY_ENTER);		CC(KEY_SRESET);		CC(KEY_RESET);
Packit 437b5e
	CC(KEY_PRINT);		CC(KEY_LL);		CC(KEY_A1);
Packit 437b5e
	CC(KEY_A3);		CC(KEY_B2);		CC(KEY_C1);
Packit 437b5e
	CC(KEY_C3);		CC(KEY_BTAB);		CC(KEY_BEG);
Packit 437b5e
	CC(KEY_CANCEL);		CC(KEY_CLOSE);		CC(KEY_COMMAND);
Packit 437b5e
	CC(KEY_COPY);		CC(KEY_CREATE);		CC(KEY_END);
Packit 437b5e
	CC(KEY_EXIT);		CC(KEY_FIND);		CC(KEY_HELP);
Packit 437b5e
	CC(KEY_MARK);		CC(KEY_MESSAGE); /* ncurses extension: CC(KEY_MOUSE); */
Packit 437b5e
	CC(KEY_MOVE);		CC(KEY_NEXT);		CC(KEY_OPEN);
Packit 437b5e
	CC(KEY_OPTIONS);	CC(KEY_PREVIOUS);	CC(KEY_REDO);
Packit 437b5e
	CC(KEY_REFERENCE);	CC(KEY_REFRESH);	CC(KEY_REPLACE);
Packit 437b5e
	CC(KEY_RESIZE);		CC(KEY_RESTART);	CC(KEY_RESUME);
Packit 437b5e
	CC(KEY_SAVE);		CC(KEY_SBEG);		CC(KEY_SCANCEL);
Packit 437b5e
	CC(KEY_SCOMMAND);	CC(KEY_SCOPY);		CC(KEY_SCREATE);
Packit 437b5e
	CC(KEY_SDC);		CC(KEY_SDL);		CC(KEY_SELECT);
Packit 437b5e
	CC(KEY_SEND);		CC(KEY_SEOL);		CC(KEY_SEXIT);
Packit 437b5e
	CC(KEY_SFIND);		CC(KEY_SHELP);		CC(KEY_SHOME);
Packit 437b5e
	CC(KEY_SIC);		CC(KEY_SLEFT);		CC(KEY_SMESSAGE);
Packit 437b5e
	CC(KEY_SMOVE);		CC(KEY_SNEXT);		CC(KEY_SOPTIONS);
Packit 437b5e
	CC(KEY_SPREVIOUS);	CC(KEY_SPRINT);		CC(KEY_SREDO);
Packit 437b5e
	CC(KEY_SREPLACE);	CC(KEY_SRIGHT);		CC(KEY_SRSUME);
Packit 437b5e
	CC(KEY_SSAVE);		CC(KEY_SSUSPEND);	CC(KEY_SUNDO);
Packit 437b5e
	CC(KEY_SUSPEND);	CC(KEY_UNDO);
Packit 437b5e
Packit 437b5e
	/* KEY_Fx  0 <= x <= 63 */
Packit 437b5e
	CC(KEY_F0);
Packit 437b5e
	CF(1);  CF(2);  CF(3);  CF(4);  CF(5);  CF(6);  CF(7);  CF(8);
Packit 437b5e
	CF(9);  CF(10); CF(11); CF(12); CF(13); CF(14); CF(15); CF(16);
Packit 437b5e
	CF(17); CF(18); CF(19); CF(20); CF(21); CF(22); CF(23); CF(24);
Packit 437b5e
	CF(25); CF(26); CF(27); CF(28); CF(29); CF(30); CF(31); CF(32);
Packit 437b5e
	CF(33); CF(34); CF(35); CF(36); CF(37); CF(38); CF(39); CF(40);
Packit 437b5e
	CF(41); CF(42); CF(43); CF(44); CF(45); CF(46); CF(47); CF(48);
Packit 437b5e
	CF(49); CF(50); CF(51); CF(52); CF(53); CF(54); CF(55); CF(56);
Packit 437b5e
	CF(57); CF(58); CF(59); CF(60); CF(61); CF(62); CF(63);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
/*
Packit 437b5e
** make sure screen is restored (and cleared) at exit
Packit 437b5e
** (for the situations where program is aborted without a
Packit 437b5e
** proper cleanup)
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
static void
Packit 437b5e
cleanup(void)
Packit 437b5e
{
Packit 437b5e
	if (!isendwin())
Packit 437b5e
	{
Packit 437b5e
		wclear(stdscr);
Packit 437b5e
		wrefresh(stdscr);
Packit 437b5e
		endwin();
Packit 437b5e
	}
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Initialise screen.
Packit 437b5e
@function initscr
Packit 437b5e
@treturn window main screen
Packit 437b5e
@see curs_initscr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pinitscr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w;
Packit 437b5e
Packit 437b5e
	/* initialize curses */
Packit 437b5e
	w = initscr();
Packit 437b5e
Packit 437b5e
	/* no longer used, so clean it up */
Packit 437b5e
	lua_pushstring(L, RIPOFF_TABLE);
Packit 437b5e
	lua_pushnil(L);
Packit 437b5e
	lua_settable(L, LUA_REGISTRYINDEX);
Packit 437b5e
Packit 437b5e
	/* failed to initialize */
Packit 437b5e
	if (w == NULL)
Packit 437b5e
		return 0;
Packit 437b5e
Packit 437b5e
	/* return stdscr - main window */
Packit 437b5e
	lc_newwin(L, w);
Packit 437b5e
Packit 437b5e
	/* save main window on registry */
Packit 437b5e
	lua_pushstring(L, STDSCR_REGISTRY);
Packit 437b5e
	lua_pushvalue(L, -2);
Packit 437b5e
	lua_rawset(L, LUA_REGISTRYINDEX);
Packit 437b5e
Packit 437b5e
	/* setup curses constants - curses.xxx numbers */
Packit 437b5e
	register_curses_constants(L);
Packit 437b5e
Packit 437b5e
	/* install cleanup handler to help in debugging and screen trashing */
Packit 437b5e
	atexit(cleanup);
Packit 437b5e
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Clean up terminal prior to exiting or escaping curses.
Packit 437b5e
@function endwin
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_initscr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pendwin(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(endwin());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Has @{endwin} been called more recently than @{posix.curses.window:refresh}?
Packit 437b5e
@function isendwin
Packit 437b5e
@treturn bool whether @{endwin} has been called
Packit 437b5e
@see curs_initscr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pisendwin(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushboolresult(isendwin());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Retern the main screen window.
Packit 437b5e
@function stdscr
Packit 437b5e
@treturn window main screen
Packit 437b5e
@see initscr
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pstdscr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	lua_pushstring(L, STDSCR_REGISTRY);
Packit 437b5e
	lua_rawget(L, LUA_REGISTRYINDEX);
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Number of columns in the main screen window.
Packit 437b5e
@function cols
Packit 437b5e
@treturn int number of columns in the main screen
Packit 437b5e
@see lines
Packit 437b5e
@see stdscr
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pcols(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushintresult(COLS);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Number of lines in the main screen window.
Packit 437b5e
@function lines
Packit 437b5e
@treturn int number of lines in the main screen
Packit 437b5e
@see cols
Packit 437b5e
@see stdscr
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Plines(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushintresult(LINES);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Initialise color output facility.
Packit 437b5e
@function start_color
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_color(3x)
Packit 437b5e
@see has_colors
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pstart_color(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(start_color());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Does the terminal have color capability?
Packit 437b5e
@function has_colors
Packit 437b5e
@treturn bool `true`, if the terminal supports colors
Packit 437b5e
@see curs_color(3x)
Packit 437b5e
@see start_color
Packit 437b5e
@usage
Packit 437b5e
if curses.has_colors () then
Packit 437b5e
  curses.start_color ()
Packit 437b5e
end
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Phas_colors(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushboolresult(has_colors());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Reserve `-1` to represent terminal default colors.
Packit 437b5e
@function use_default_colors
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see default_colors(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Puse_default_colors(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(use_default_colors());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Associate a color pair id with a specific foreground and background color.
Packit 437b5e
@function init_pair
Packit 437b5e
@int pair color pair id to act on
Packit 437b5e
@int f foreground color to assign
Packit 437b5e
@int b background color to assign
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_color(3x)
Packit 437b5e
@see pair_content
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pinit_pair(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	short pair = checkint(L, 1);
Packit 437b5e
	short f = checkint(L, 2);
Packit 437b5e
	short b = checkint(L, 3);
Packit 437b5e
	return pushokresult(init_pair(pair, f, b));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Return the foreground and background colors associated with a color pair id.
Packit 437b5e
@function pair_content
Packit 437b5e
@int pair color pair id to act on
Packit 437b5e
@treturn int foreground color of *pair*
Packit 437b5e
@treturn int background color of *pair*
Packit 437b5e
@see curs_color(3x)
Packit 437b5e
@see init_pair
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Ppair_content(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	short pair = checkint(L, 1);
Packit 437b5e
	short f;
Packit 437b5e
	short b;
Packit 437b5e
	int ret = pair_content(pair, &f, &b);
Packit 437b5e
Packit 437b5e
	if (ret == ERR)
Packit 437b5e
		return 0;
Packit 437b5e
Packit 437b5e
	lua_pushinteger(L, f);
Packit 437b5e
	lua_pushinteger(L, b);
Packit 437b5e
	return 2;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
How many colors are available for this terminal?
Packit 437b5e
@function colors
Packit 437b5e
@treturn int total number of available colors
Packit 437b5e
@see curs_color(3x)
Packit 437b5e
@see color_pairs
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pcolors(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushintresult(COLORS);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
How may distinct color pairs are supported by this terminal?
Packit 437b5e
@function color_pairs
Packit 437b5e
@treturn int total number of available color pairs
Packit 437b5e
@see curs_color(3x)
Packit 437b5e
@see colors
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pcolor_pairs(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushintresult(COLOR_PAIRS);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Return the attributes for the given color pair id.
Packit 437b5e
@function color_pair
Packit 437b5e
@int pair color pair id to act on
Packit 437b5e
@treturn int attributes for color pair *pair*
Packit 437b5e
@see curs_color(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pcolor_pair(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int n = checkint(L, 1);
Packit 437b5e
	return pushintresult(COLOR_PAIR(n));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch the output speed of the terminal.
Packit 437b5e
@function baudrate
Packit 437b5e
@treturn int output speed of the terminal in bits-per-second
Packit 437b5e
@see curs_termattrs(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pbaudrate(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushintresult(baudrate());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch the terminal's current erase character.
Packit 437b5e
@function erasechar
Packit 437b5e
@treturn int current erase character
Packit 437b5e
@see curs_termattrs(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Perasechar(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushintresult(erasechar());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch the character insert and delete capability of the terminal.
Packit 437b5e
@function has_ic
Packit 437b5e
@treturn bool `true`, if the terminal has insert and delete character
Packit 437b5e
  operations
Packit 437b5e
@see curs_termattrs(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Phas_ic(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushboolresult(has_ic());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch the line insert and delete capability of the terminal.
Packit 437b5e
@function has_il
Packit 437b5e
@treturn bool `true`, if the terminal has insert and delete line operations
Packit 437b5e
@see curs_termattrs(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Phas_il(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushboolresult(has_il());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch the terminal's current kill character.
Packit 437b5e
@function killchar
Packit 437b5e
@treturn int current line kill character
Packit 437b5e
@see curs_termattrs(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pkillchar(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushintresult(killchar());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Bitwise OR of all (or selected) video attributes supported by the terminal.
Packit 437b5e
@function termattrs
Packit 437b5e
@int[opt] a terminal attribute bits
Packit 437b5e
@treturn[1] bool `true`, if the terminal supports attribute *a*
Packit 437b5e
@treturn[2] int bitarray of supported terminal attributes
Packit 437b5e
@see curs_termattrs(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Ptermattrs(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	if (lua_gettop(L) > 0)
Packit 437b5e
	{
Packit 437b5e
		int a = checkint(L, 1);
Packit 437b5e
		return pushboolresult(termattrs() & a);
Packit 437b5e
	}
Packit 437b5e
	return pushintresult(termattrs());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch the name of the terminal.
Packit 437b5e
@function termname
Packit 437b5e
@treturn string terminal name
Packit 437b5e
@see curs_termattrs(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Ptermname(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushstringresult(termname());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch the verbose name of the terminal.
Packit 437b5e
@function longname
Packit 437b5e
@treturn string verbose description of the current terminal
Packit 437b5e
@see curs_termattrs(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Plongname(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushstringresult(longname());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/* there is no easy way to implement this... */
Packit 437b5e
Packit 437b5e
static lua_State *rip_L = NULL;
Packit 437b5e
Packit 437b5e
static int
Packit 437b5e
ripoffline_cb(WINDOW* w, int cols)
Packit 437b5e
{
Packit 437b5e
	static int line = 0;
Packit 437b5e
	int top = lua_gettop(rip_L);
Packit 437b5e
Packit 437b5e
	/* better be safe */
Packit 437b5e
	if (!lua_checkstack(rip_L, 5))
Packit 437b5e
		return 0;
Packit 437b5e
Packit 437b5e
	/* get the table from the registry */
Packit 437b5e
	lua_pushstring(rip_L, RIPOFF_TABLE);
Packit 437b5e
	lua_gettable(rip_L, LUA_REGISTRYINDEX);
Packit 437b5e
Packit 437b5e
	/* get user callback function */
Packit 437b5e
	if (lua_isnil(rip_L, -1)) {
Packit 437b5e
		lua_pop(rip_L, 1);
Packit 437b5e
		return 0;
Packit 437b5e
	}
Packit 437b5e
Packit 437b5e
	lua_rawgeti(rip_L, -1, ++line);	/* function to be called */
Packit 437b5e
	lc_newwin(rip_L, w);		/* create window object */
Packit 437b5e
	lua_pushinteger(rip_L, cols);   /* push number of columns */
Packit 437b5e
Packit 437b5e
	lua_pcall(rip_L, 2,  0, 0);	/* call the lua function */
Packit 437b5e
Packit 437b5e
	lua_settop(rip_L, top);
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Reduce the available size of the main screen.
Packit 437b5e
@function ripoffline
Packit 437b5e
@bool top_line
Packit 437b5e
@func callback
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_kernel(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pripoffline(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	static int rip = 0;
Packit 437b5e
	int top_line = lua_toboolean(L, 1);
Packit 437b5e
Packit 437b5e
#if LPOSIX_CURSES_COMPLIANT
Packit 437b5e
	if (!lua_isfunction(L, 2))
Packit 437b5e
	{
Packit 437b5e
		lua_pushliteral(L, "invalid callback passed as second parameter");
Packit 437b5e
		lua_error(L);
Packit 437b5e
	}
Packit 437b5e
Packit 437b5e
	/* need to save the lua state somewhere... */
Packit 437b5e
	rip_L = L;
Packit 437b5e
Packit 437b5e
	/* get the table where we are going to save the callbacks */
Packit 437b5e
	lua_pushstring(L, RIPOFF_TABLE);
Packit 437b5e
	lua_gettable(L, LUA_REGISTRYINDEX);
Packit 437b5e
Packit 437b5e
	if (lua_isnil(L, -1))
Packit 437b5e
	{
Packit 437b5e
		lua_pop(L, 1);
Packit 437b5e
		lua_newtable(L);
Packit 437b5e
Packit 437b5e
		lua_pushstring(L, RIPOFF_TABLE);
Packit 437b5e
		lua_pushvalue(L, -2);
Packit 437b5e
		lua_settable(L, LUA_REGISTRYINDEX);
Packit 437b5e
	}
Packit 437b5e
Packit 437b5e
	/* save function callback in registry table */
Packit 437b5e
	lua_pushvalue(L, 2);
Packit 437b5e
	lua_rawseti(L, -2, ++rip);
Packit 437b5e
Packit 437b5e
	/* and tell curses we are going to take the line */
Packit 437b5e
	return pushokresult(ripoffline(top_line ? 1 : -1, ripoffline_cb));
Packit 437b5e
#else
Packit 437b5e
	return binding_notimplemented(L, "ripoffline", "curses");
Packit 437b5e
#endif
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Change the visibility of the cursor.
Packit 437b5e
@function curs_set
Packit 437b5e
@int vis one of `0` (invisible), `1` (visible) or `2` (very visible)
Packit 437b5e
@treturn[1] int previous cursor state
Packit 437b5e
@return[2] nil if *vis* is not supported
Packit 437b5e
@see curs_kernel(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pcurs_set(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int vis = checkint(L, 1);
Packit 437b5e
	int state = curs_set(vis);
Packit 437b5e
	if (state == ERR)
Packit 437b5e
		return 0;
Packit 437b5e
Packit 437b5e
	return pushintresult(state);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Sleep for a few milliseconds.
Packit 437b5e
@function napms
Packit 437b5e
@int ms time to wait in milliseconds
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_kernel(3x)
Packit 437b5e
@see delay_output
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pnapms(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int ms = checkint(L, 1);
Packit 437b5e
	return pushokresult(napms(ms));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Change the terminal size.
Packit 437b5e
@function resizeterm
Packit 437b5e
@int nlines number of lines
Packit 437b5e
@int ncols number of columns
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@raise unimplemented
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Presizeterm(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int nlines  = checkint(L, 1);
Packit 437b5e
	int ncols   = checkint(L, 2);
Packit 437b5e
#if HAVE_RESIZETERM
Packit 437b5e
	return pushokresult(resizeterm (nlines, ncols));
Packit 437b5e
#else
Packit 437b5e
	return binding_notimplemented(L, "resizeterm", "curses");
Packit 437b5e
#endif
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Send the terminal audible bell.
Packit 437b5e
@function beep
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_beep(3x)
Packit 437b5e
@see flash
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pbeep(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(beep());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Send the terminal visible bell.
Packit 437b5e
@function flash
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_beep(3x)
Packit 437b5e
@see beep
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pflash(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(flash());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Create a new window.
Packit 437b5e
@function newwin
Packit 437b5e
@int nlines number of window lines
Packit 437b5e
@int ncols number of window columns
Packit 437b5e
@int begin_y top line of window
Packit 437b5e
@int begin_x leftmost column of window
Packit 437b5e
@treturn window a new window object
Packit 437b5e
@see curs_window(3x)
Packit 437b5e
@see posix.curses.window
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pnewwin(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int nlines  = checkint(L, 1);
Packit 437b5e
	int ncols   = checkint(L, 2);
Packit 437b5e
	int begin_y = checkint(L, 3);
Packit 437b5e
	int begin_x = checkint(L, 4);
Packit 437b5e
Packit 437b5e
	lc_newwin(L, newwin(nlines, ncols, begin_y, begin_x));
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Refresh the visible terminal screen.
Packit 437b5e
@function doupdate
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_refresh(3x)
Packit 437b5e
@see posix.curses.window:refresh
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pdoupdate(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(doupdate());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Initialise the soft label keys area.
Packit 437b5e
This must be called before @{initscr}.
Packit 437b5e
@function slk_init
Packit 437b5e
@int fmt
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_slk(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pslk_init(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int fmt = checkint(L, 1);
Packit 437b5e
#if LPOSIX_CURSES_COMPLIANT
Packit 437b5e
	return pushokresult(slk_init(fmt));
Packit 437b5e
#else
Packit 437b5e
	return binding_notimplemented(L, "slk_init", "curses");
Packit 437b5e
#endif
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Set the label for a soft label key.
Packit 437b5e
@function slk_set
Packit 437b5e
@int labnum
Packit 437b5e
@string label
Packit 437b5e
@int fmt
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_slk(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pslk_set(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int labnum = checkint(L, 1);
Packit 437b5e
	const char* label = luaL_checkstring(L, 2);
Packit 437b5e
	int fmt = checkint(L, 3);
Packit 437b5e
#if LPOSIX_CURSES_COMPLIANT
Packit 437b5e
	return pushokresult(slk_set(labnum, label, fmt));
Packit 437b5e
#else
Packit 437b5e
	return binding_notimplemented(L, "slk_set", "curses");
Packit 437b5e
#endif
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Refresh the soft label key area.
Packit 437b5e
@function slk_refresh
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_slk(3x)
Packit 437b5e
@see posix.curses.window:refresh
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pslk_refresh(lua_State *L)
Packit 437b5e
{
Packit 437b5e
#if LPOSIX_CURSES_COMPLIANT
Packit 437b5e
	return pushokresult(slk_refresh());
Packit 437b5e
#else
Packit 437b5e
	return binding_notimplemented(L, "slk_refresh", "curses");
Packit 437b5e
#endif
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Copy the soft label key area backing screen to the virtual screen.
Packit 437b5e
@function slk_noutrefresh
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_slk(3x)
Packit 437b5e
@see posix.curses.window:refresh
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pslk_noutrefresh(lua_State *L)
Packit 437b5e
{
Packit 437b5e
#if LPOSIX_CURSES_COMPLIANT
Packit 437b5e
	return pushokresult(slk_noutrefresh());
Packit 437b5e
#else
Packit 437b5e
	return binding_notimplemented(L, "slk_noutrefresh", "curses");
Packit 437b5e
#endif
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch the label for a soft label key.
Packit 437b5e
@function slk_label
Packit 437b5e
@int labnum
Packit 437b5e
@treturn string current label for *labnum*
Packit 437b5e
@see curs_slk(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pslk_label(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int labnum = checkint(L, 1);
Packit 437b5e
#if LPOSIX_CURSES_COMPLIANT
Packit 437b5e
	return pushstringresult(slk_label(labnum));
Packit 437b5e
#else
Packit 437b5e
	return binding_notimplemented(L, "slk_label", "curses");
Packit 437b5e
#endif
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Clears the soft labels from the screen.
Packit 437b5e
@function slk_clear
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_slk(3x)
Packit 437b5e
@see slk_restore
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pslk_clear(lua_State *L)
Packit 437b5e
{
Packit 437b5e
#if LPOSIX_CURSES_COMPLIANT
Packit 437b5e
	return pushokresult(slk_clear());
Packit 437b5e
#else
Packit 437b5e
	return binding_notimplemented(L, "slk_clear", "curses");
Packit 437b5e
#endif
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Restores the soft labels to the screen.
Packit 437b5e
@function slk_restore
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_slk(3x)
Packit 437b5e
@see slk_clear
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pslk_restore(lua_State *L)
Packit 437b5e
{
Packit 437b5e
#if LPOSIX_CURSES_COMPLIANT
Packit 437b5e
	return pushokresult(slk_restore());
Packit 437b5e
#else
Packit 437b5e
	return binding_notimplemented(L, "slk_restore", "curses");
Packit 437b5e
#endif
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Mark the soft label key area for refresh.
Packit 437b5e
@function slk_touch
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_slk(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pslk_touch(lua_State *L)
Packit 437b5e
{
Packit 437b5e
#if LPOSIX_CURSES_COMPLIANT
Packit 437b5e
	return pushokresult(slk_touch());
Packit 437b5e
#else
Packit 437b5e
	return binding_notimplemented(L, "slk_touch", "curses");
Packit 437b5e
#endif
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Enable an attribute for soft labels.
Packit 437b5e
@function slk_attron
Packit 437b5e
@int attrs
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_slk(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pslk_attron(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	chtype attrs = checkch(L, 1);
Packit 437b5e
#if LPOSIX_CURSES_COMPLIANT
Packit 437b5e
	return pushokresult(slk_attron(attrs));
Packit 437b5e
#else
Packit 437b5e
	return binding_notimplemented(L, "slk_attron", "curses");
Packit 437b5e
#endif
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Disable an attribute for soft labels.
Packit 437b5e
@function slk_attroff
Packit 437b5e
@int attrs
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_slk(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pslk_attroff(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	chtype attrs = checkch(L, 1);
Packit 437b5e
#if LPOSIX_CURSES_COMPLIANT
Packit 437b5e
	return pushokresult(slk_attroff(attrs));
Packit 437b5e
#else
Packit 437b5e
	return binding_notimplemented(L, "slk_attroff", "curses");
Packit 437b5e
#endif
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Set the attributes for soft labels.
Packit 437b5e
@function slk_attrset
Packit 437b5e
@int attrs
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_slk(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pslk_attrset(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	chtype attrs = checkch(L, 1);
Packit 437b5e
#if LPOSIX_CURSES_COMPLIANT
Packit 437b5e
	return pushokresult(slk_attrset(attrs));
Packit 437b5e
#else
Packit 437b5e
	return binding_notimplemented(L, "slk_attrset", "curses");
Packit 437b5e
#endif
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Put the terminal into cbreak mode.
Packit 437b5e
@function cbreak
Packit 437b5e
@bool[opt] on
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_inopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pcbreak(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	if (lua_isnoneornil(L, 1) || lua_toboolean(L, 1))
Packit 437b5e
		return pushokresult(cbreak());
Packit 437b5e
	return pushokresult(nocbreak());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Whether characters are echoed to the terminal as they are typed.
Packit 437b5e
@function echo
Packit 437b5e
@bool[opt] on
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_inopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pecho(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	if (lua_isnoneornil(L, 1) || lua_toboolean(L, 1))
Packit 437b5e
		return pushokresult(echo());
Packit 437b5e
	return pushokresult(noecho());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Put the terminal into raw mode.
Packit 437b5e
@function raw
Packit 437b5e
@bool[opt] on
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_inopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Praw(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	if (lua_isnoneornil(L, 1) || lua_toboolean(L, 1))
Packit 437b5e
		return pushokresult(raw());
Packit 437b5e
	return pushokresult(noraw());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Put the terminal into halfdelay mode.
Packit 437b5e
@function halfdelay
Packit 437b5e
@int tenths delay in tenths of a second
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_inopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Phalfdelay(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int tenths = checkint(L, 1);
Packit 437b5e
	return pushokresult(halfdelay(tenths));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Whether to translate a return key to newline on input.
Packit 437b5e
@function nl
Packit 437b5e
@bool[opt] on
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_outopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pnl(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	if (lua_isnoneornil(L, 1) || lua_toboolean(L, 1))
Packit 437b5e
		return pushokresult(nl());
Packit 437b5e
	return pushokresult(nonl());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Return a printable representation of a character, ignoring attributes.
Packit 437b5e
@function unctrl
Packit 437b5e
@int c character to act on
Packit 437b5e
@treturn string printable representation of *c*
Packit 437b5e
@see curs_util(3x)
Packit 437b5e
@see keyname
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Punctrl(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	chtype c = checkch(L, 1);
Packit 437b5e
	return pushstringresult(unctrl(c));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Return a printable representation of a key.
Packit 437b5e
@function keyname
Packit 437b5e
@int c a key
Packit 437b5e
@treturn string key name of *c*
Packit 437b5e
@see curs_util(3x)
Packit 437b5e
@see unctrl
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pkeyname(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int c = checkint(L, 1);
Packit 437b5e
	return pushstringresult(keyname(c));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Insert padding characters to force a short delay.
Packit 437b5e
@function delay_output
Packit 437b5e
@int ms delay time in milliseconds
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_util(3x)
Packit 437b5e
@see napms
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pdelay_output(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int ms = checkint(L, 1);
Packit 437b5e
	return pushokresult(delay_output(ms));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Throw away any typeahead in the keyboard input buffer.
Packit 437b5e
@function flushinp
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_util(3x)
Packit 437b5e
@see ungetch
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pflushinp(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushboolresult(flushinp());
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Return a character to the keyboard input buffer.
Packit 437b5e
@function ungetch
Packit 437b5e
@int c
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_getch(3x)
Packit 437b5e
@see flushinp
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pungetch(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int c = checkint(L, 1);
Packit 437b5e
	return pushokresult(ungetch(c));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Create a new pad.
Packit 437b5e
@function newpad
Packit 437b5e
@int nlines
Packit 437b5e
@int ncols
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see cur_pad(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pnewpad(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int nlines = checkint(L, 1);
Packit 437b5e
	int ncols = checkint(L, 2);
Packit 437b5e
	lc_newwin(L, newpad(nlines, ncols));
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
static char ti_capname[32];
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch terminfo boolean capability.
Packit 437b5e
@function tigetflag
Packit 437b5e
@string capname
Packit 437b5e
@treturn bool content of terminal boolean capability
Packit 437b5e
@see curs_terminfo(3x)
Packit 437b5e
@see terminfo(5)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Ptigetflag (lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int r;
Packit 437b5e
Packit 437b5e
	strlcpy (ti_capname, luaL_checkstring (L, 1), sizeof (ti_capname));
Packit 437b5e
	r = tigetflag (ti_capname);
Packit 437b5e
	if (-1 == r)
Packit 437b5e
		return luaL_error (L, "`%s' is not a boolean capability", ti_capname);
Packit 437b5e
	return pushboolresult (r);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch terminfo numeric capability.
Packit 437b5e
@function tigetnum
Packit 437b5e
@string capname
Packit 437b5e
@treturn int content of terminal numeric capability
Packit 437b5e
@see curs_terminfo(3x)
Packit 437b5e
@see terminfo(5)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Ptigetnum (lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int res;
Packit 437b5e
Packit 437b5e
	strlcpy (ti_capname, luaL_checkstring (L, 1), sizeof (ti_capname));
Packit 437b5e
	res = tigetnum (ti_capname);
Packit 437b5e
	if (-2 == res)
Packit 437b5e
		return luaL_error (L, "`%s' is not a numeric capability", ti_capname);
Packit 437b5e
	else if (-1 == res)
Packit 437b5e
		lua_pushnil (L);
Packit 437b5e
	else
Packit 437b5e
		lua_pushinteger(L, res);
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch terminfo string capability.
Packit 437b5e
@function tigetstr
Packit 437b5e
@string capname
Packit 437b5e
@treturn string content of terminal string capability
Packit 437b5e
@see curs_terminfo(3x)
Packit 437b5e
@see terminfo(5)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Ptigetstr (lua_State *L)
Packit 437b5e
{
Packit 437b5e
	const char *res;
Packit 437b5e
Packit 437b5e
	strlcpy (ti_capname, luaL_checkstring (L, 1), sizeof (ti_capname));
Packit 437b5e
	res = tigetstr (ti_capname);
Packit 437b5e
	if ((char *) -1 == res)
Packit 437b5e
		return luaL_error (L, "`%s' is not a string capability", ti_capname);
Packit 437b5e
	else if (NULL == res)
Packit 437b5e
		lua_pushnil (L);
Packit 437b5e
	else
Packit 437b5e
		lua_pushstring(L, res);
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
#endif
Packit 437b5e
Packit 437b5e
Packit 437b5e
static const luaL_Reg curseslib[] =
Packit 437b5e
{
Packit 437b5e
#if HAVE_CURSES
Packit 437b5e
	LPOSIX_FUNC( Pbaudrate		),
Packit 437b5e
	LPOSIX_FUNC( Pbeep		),
Packit 437b5e
	LPOSIX_FUNC( Pcbreak		),
Packit 437b5e
	LPOSIX_FUNC( Pcolor_pair	),
Packit 437b5e
	LPOSIX_FUNC( Pcolor_pairs	),
Packit 437b5e
	LPOSIX_FUNC( Pcolors		),
Packit 437b5e
	LPOSIX_FUNC( Pcols		),
Packit 437b5e
	LPOSIX_FUNC( Pcurs_set		),
Packit 437b5e
	LPOSIX_FUNC( Pdelay_output	),
Packit 437b5e
	LPOSIX_FUNC( Pdoupdate		),
Packit 437b5e
	LPOSIX_FUNC( Pecho		),
Packit 437b5e
	LPOSIX_FUNC( Pendwin		),
Packit 437b5e
	LPOSIX_FUNC( Perasechar		),
Packit 437b5e
	LPOSIX_FUNC( Pflash		),
Packit 437b5e
	LPOSIX_FUNC( Pflushinp		),
Packit 437b5e
	LPOSIX_FUNC( Phalfdelay		),
Packit 437b5e
	LPOSIX_FUNC( Phas_colors	),
Packit 437b5e
	LPOSIX_FUNC( Phas_ic		),
Packit 437b5e
	LPOSIX_FUNC( Phas_il		),
Packit 437b5e
	LPOSIX_FUNC( Pinit_pair		),
Packit 437b5e
	LPOSIX_FUNC( Pisendwin		),
Packit 437b5e
	LPOSIX_FUNC( Pkeyname		),
Packit 437b5e
	LPOSIX_FUNC( Pkillchar		),
Packit 437b5e
	LPOSIX_FUNC( Plines		),
Packit 437b5e
	LPOSIX_FUNC( Plongname		),
Packit 437b5e
	LPOSIX_FUNC( Pnapms		),
Packit 437b5e
	LPOSIX_FUNC( Pnew_chstr		),
Packit 437b5e
	LPOSIX_FUNC( Pnewpad		),
Packit 437b5e
	LPOSIX_FUNC( Pnewwin		),
Packit 437b5e
	LPOSIX_FUNC( Pnl		),
Packit 437b5e
	LPOSIX_FUNC( Ppair_content	),
Packit 437b5e
	LPOSIX_FUNC( Praw		),
Packit 437b5e
	LPOSIX_FUNC( Presizeterm	),
Packit 437b5e
	LPOSIX_FUNC( Pripoffline	),
Packit 437b5e
	LPOSIX_FUNC( Pslk_attroff	),
Packit 437b5e
	LPOSIX_FUNC( Pslk_attron	),
Packit 437b5e
	LPOSIX_FUNC( Pslk_attrset	),
Packit 437b5e
	LPOSIX_FUNC( Pslk_clear		),
Packit 437b5e
	LPOSIX_FUNC( Pslk_init		),
Packit 437b5e
	LPOSIX_FUNC( Pslk_label		),
Packit 437b5e
	LPOSIX_FUNC( Pslk_noutrefresh	),
Packit 437b5e
	LPOSIX_FUNC( Pslk_refresh	),
Packit 437b5e
	LPOSIX_FUNC( Pslk_restore	),
Packit 437b5e
	LPOSIX_FUNC( Pslk_set		),
Packit 437b5e
	LPOSIX_FUNC( Pslk_touch		),
Packit 437b5e
	LPOSIX_FUNC( Pstart_color	),
Packit 437b5e
	LPOSIX_FUNC( Pstdscr		),
Packit 437b5e
	LPOSIX_FUNC( Ptermattrs		),
Packit 437b5e
	LPOSIX_FUNC( Ptermname		),
Packit 437b5e
	LPOSIX_FUNC( Ptigetflag		),
Packit 437b5e
	LPOSIX_FUNC( Ptigetnum		),
Packit 437b5e
	LPOSIX_FUNC( Ptigetstr		),
Packit 437b5e
	LPOSIX_FUNC( Punctrl		),
Packit 437b5e
	LPOSIX_FUNC( Pungetch		),
Packit 437b5e
	LPOSIX_FUNC( Puse_default_colors),
Packit 437b5e
#endif
Packit 437b5e
	{NULL, NULL}
Packit 437b5e
};
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Constants.
Packit 437b5e
@section constants
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Curses constants.
Packit 437b5e
Any constants not available in the underlying system will be `nil` valued,
Packit 437b5e
see @{curses.lua}. Many of the `KEY_` constants cannot be generated by
Packit 437b5e
modern keyboards and are mostly for historical compatibility with ancient
Packit 437b5e
terminal hardware keyboards.
Packit 437b5e
Packit 437b5e
Note that, unlike the other posix submodules, almost all of these constants
Packit 437b5e
remain undefined (`nil`) until after @{posix.curses.initscr} has returned
Packit 437b5e
successfully.
Packit 437b5e
@table posix.curses
Packit 437b5e
@int ACS_BLOCK alternate character set solid block
Packit 437b5e
@int ACS_BOARD alternate character set board of squares
Packit 437b5e
@int ACS_BTEE alternate character set bottom-tee
Packit 437b5e
@int ACS_BULLET alternate character set bullet
Packit 437b5e
@int ACS_CKBOARD alternate character set stipple
Packit 437b5e
@int ACS_DARROW alternate character set down arrow
Packit 437b5e
@int ACS_DEGREE alternate character set degrees mark
Packit 437b5e
@int ACS_DIAMOND alternate character set diamond
Packit 437b5e
@int ACS_HLINE alternate character set horizontal line
Packit 437b5e
@int ACS_LANTERN alternate character set lantern
Packit 437b5e
@int ACS_LARROW alternate character set left arrow
Packit 437b5e
@int ACS_LLCORNER alternate character set lower left corner
Packit 437b5e
@int ACS_LRCORNER alternate character set lower right corner
Packit 437b5e
@int ACS_LTEE alternate character set left tee
Packit 437b5e
@int ACS_PLMINUS alternate character set plus/minus
Packit 437b5e
@int ACS_PLUS alternate character set plus
Packit 437b5e
@int ACS_RARROW alternate character set right arrow
Packit 437b5e
@int ACS_RTEE alternate character set right tee
Packit 437b5e
@int ACS_S1 alternate character set scan-line 1
Packit 437b5e
@int ACS_S9 alternate character set scan-line 9
Packit 437b5e
@int ACS_TTEE alternate character set top tee
Packit 437b5e
@int ACS_UARROW alternate character set up arrow
Packit 437b5e
@int ACS_ULCORNER alternate character set upper left corner
Packit 437b5e
@int ACS_URCORNER alternate character set upper right corner
Packit 437b5e
@int ACS_VLINE alternate character set vertical line
Packit 437b5e
@int A_ALTCHARSET alternatate character set attribute
Packit 437b5e
@int A_ATTRIBUTES attributed character attributes bitmask
Packit 437b5e
@int A_BLINK blinking attribute
Packit 437b5e
@int A_BOLD bold attribute
Packit 437b5e
@int A_CHARTEXT attributed character text bitmask
Packit 437b5e
@int A_COLOR attributed character color-pair bitmask
Packit 437b5e
@int A_DIM half-bright attribute
Packit 437b5e
@int A_INVIS invisible attribute
Packit 437b5e
@int A_NORMAL normal attribute (all attributes off)
Packit 437b5e
@int A_PROTECT protected attribute
Packit 437b5e
@int A_REVERSE reverse video attribute
Packit 437b5e
@int A_STANDOUT standout attribute
Packit 437b5e
@int A_UNDERLINE underline attribute
Packit 437b5e
@int COLOR_BLACK black color attribute
Packit 437b5e
@int COLOR_BLUE blue color attribute
Packit 437b5e
@int COLOR_CYAN cyan color attribute
Packit 437b5e
@int COLOR_GREEN green color attribute
Packit 437b5e
@int COLOR_MAGENTA magenta color attribute
Packit 437b5e
@int COLOR_RED red color attribute
Packit 437b5e
@int COLOR_WHITE white color attribute
Packit 437b5e
@int COLOR_YELLOW yellow color attribute
Packit 437b5e
@int KEY_A1 upper-left of keypad key
Packit 437b5e
@int KEY_A3 upper-right of keypad key
Packit 437b5e
@int KEY_B2 center of keypad key
Packit 437b5e
@int KEY_BACKSPACE backspace key
Packit 437b5e
@int KEY_BEG beginning key
Packit 437b5e
@int KEY_BREAK break key
Packit 437b5e
@int KEY_BTAB backtab key
Packit 437b5e
@int KEY_C1 bottom-left of keypad key
Packit 437b5e
@int KEY_C3 bottom-right of keypad key
Packit 437b5e
@int KEY_CANCEL cancel key
Packit 437b5e
@int KEY_CATAB clear all tabs key
Packit 437b5e
@int KEY_CLEAR clear screen key
Packit 437b5e
@int KEY_CLOSE close key
Packit 437b5e
@int KEY_COMMAND command key
Packit 437b5e
@int KEY_COPY copy key
Packit 437b5e
@int KEY_CREATE create key
Packit 437b5e
@int KEY_CTAB clear tab key
Packit 437b5e
@int KEY_DC delete character key
Packit 437b5e
@int KEY_DL delete line key
Packit 437b5e
@int KEY_DOWN down arrow key
Packit 437b5e
@int KEY_EIC exit insert char mode key
Packit 437b5e
@int KEY_END end key
Packit 437b5e
@int KEY_ENTER enter key
Packit 437b5e
@int KEY_EOL clear to end of line key
Packit 437b5e
@int KEY_EOS clear to end of screen key
Packit 437b5e
@int KEY_EXIT exit key
Packit 437b5e
@int KEY_F0 f0 key
Packit 437b5e
@int KEY_F1 f1 key
Packit 437b5e
@int KEY_F2 f2 key
Packit 437b5e
@int KEY_F3 f3 key
Packit 437b5e
@int KEY_F4 f4 key
Packit 437b5e
@int KEY_F5 f5 key
Packit 437b5e
@int KEY_F6 f6 key
Packit 437b5e
@int KEY_F7 f7 key
Packit 437b5e
@int KEY_F8 f8 key
Packit 437b5e
@int KEY_F9 f9 key
Packit 437b5e
@int KEY_F10 f10 key
Packit 437b5e
@int KEY_F11 f11 key
Packit 437b5e
@int KEY_F12 f12 key
Packit 437b5e
@int KEY_F13 f13 key
Packit 437b5e
@int KEY_F14 f14 key
Packit 437b5e
@int KEY_F15 f15 key
Packit 437b5e
@int KEY_F16 f16 key
Packit 437b5e
@int KEY_F17 f17 key
Packit 437b5e
@int KEY_F18 f18 key
Packit 437b5e
@int KEY_F19 f19 key
Packit 437b5e
@int KEY_F20 f20 key
Packit 437b5e
@int KEY_F21 f21 key
Packit 437b5e
@int KEY_F22 f22 key
Packit 437b5e
@int KEY_F23 f23 key
Packit 437b5e
@int KEY_F24 f24 key
Packit 437b5e
@int KEY_F25 f25 key
Packit 437b5e
@int KEY_F26 f26 key
Packit 437b5e
@int KEY_F27 f27 key
Packit 437b5e
@int KEY_F28 f28 key
Packit 437b5e
@int KEY_F29 f29 key
Packit 437b5e
@int KEY_F30 f30 key
Packit 437b5e
@int KEY_F31 f31 key
Packit 437b5e
@int KEY_F32 f32 key
Packit 437b5e
@int KEY_F33 f33 key
Packit 437b5e
@int KEY_F34 f34 key
Packit 437b5e
@int KEY_F35 f35 key
Packit 437b5e
@int KEY_F36 f36 key
Packit 437b5e
@int KEY_F37 f37 key
Packit 437b5e
@int KEY_F38 f38 key
Packit 437b5e
@int KEY_F39 f39 key
Packit 437b5e
@int KEY_F40 f40 key
Packit 437b5e
@int KEY_F41 f41 key
Packit 437b5e
@int KEY_F42 f42 key
Packit 437b5e
@int KEY_F43 f43 key
Packit 437b5e
@int KEY_F44 f44 key
Packit 437b5e
@int KEY_F45 f45 key
Packit 437b5e
@int KEY_F46 f46 key
Packit 437b5e
@int KEY_F47 f47 key
Packit 437b5e
@int KEY_F48 f48 key
Packit 437b5e
@int KEY_F49 f49 key
Packit 437b5e
@int KEY_F50 f50 key
Packit 437b5e
@int KEY_F51 f51 key
Packit 437b5e
@int KEY_F52 f52 key
Packit 437b5e
@int KEY_F53 f53 key
Packit 437b5e
@int KEY_F54 f54 key
Packit 437b5e
@int KEY_F55 f55 key
Packit 437b5e
@int KEY_F56 f56 key
Packit 437b5e
@int KEY_F57 f57 key
Packit 437b5e
@int KEY_F58 f58 key
Packit 437b5e
@int KEY_F59 f59 key
Packit 437b5e
@int KEY_F60 f60 key
Packit 437b5e
@int KEY_F61 f61 key
Packit 437b5e
@int KEY_F62 f62 key
Packit 437b5e
@int KEY_F63 f63 key
Packit 437b5e
@int KEY_FIND find key
Packit 437b5e
@int KEY_HELP help key
Packit 437b5e
@int KEY_HOME home key
Packit 437b5e
@int KEY_IC enter insert char mode key
Packit 437b5e
@int KEY_IL insert line key
Packit 437b5e
@int KEY_LEFT cursor left key
Packit 437b5e
@int KEY_LL home down or bottom key
Packit 437b5e
@int KEY_MARK mark key
Packit 437b5e
@int KEY_MESSAGE message key
Packit 437b5e
@int KEY_MOUSE mouse event available virtual key
Packit 437b5e
@int KEY_MOVE move key
Packit 437b5e
@int KEY_NEXT next object key
Packit 437b5e
@int KEY_NPAGE next page key
Packit 437b5e
@int KEY_OPEN open key
Packit 437b5e
@int KEY_OPTIONS options key
Packit 437b5e
@int KEY_PPAGE previous page key
Packit 437b5e
@int KEY_PREVIOUS prewious object key
Packit 437b5e
@int KEY_PRINT print key
Packit 437b5e
@int KEY_REDO redo key
Packit 437b5e
@int KEY_REFERENCE reference key
Packit 437b5e
@int KEY_REFRESH refresh key
Packit 437b5e
@int KEY_REPLACE replace key
Packit 437b5e
@int KEY_RESET hard reset key
Packit 437b5e
@int KEY_RESIZE resize event virtual key
Packit 437b5e
@int KEY_RESTART restart key
Packit 437b5e
@int KEY_RESUME resume key
Packit 437b5e
@int KEY_RIGHT cursor right key
Packit 437b5e
@int KEY_SAVE save key
Packit 437b5e
@int KEY_SBEG shift beginning key
Packit 437b5e
@int KEY_SCANCEL shift cancel key
Packit 437b5e
@int KEY_SCOMMAND shift command key
Packit 437b5e
@int KEY_SCOPY shift copy key
Packit 437b5e
@int KEY_SCREATE shift create key
Packit 437b5e
@int KEY_SDC shift delete character key
Packit 437b5e
@int KEY_SDL shift delete line key
Packit 437b5e
@int KEY_SELECT select key
Packit 437b5e
@int KEY_SEND send key
Packit 437b5e
@int KEY_SEOL shift clear to end of line key
Packit 437b5e
@int KEY_SEXIT shift exit key
Packit 437b5e
@int KEY_SF scroll one line forward key
Packit 437b5e
@int KEY_SFIND shift find key
Packit 437b5e
@int KEY_SHELP shift help key
Packit 437b5e
@int KEY_SHOME shift home key
Packit 437b5e
@int KEY_SIC shift enter insert mode key
Packit 437b5e
@int KEY_SLEFT shift cursor left key
Packit 437b5e
@int KEY_SMESSAGE shift message key
Packit 437b5e
@int KEY_SMOVE shift move key
Packit 437b5e
@int KEY_SNEXT shift next object key
Packit 437b5e
@int KEY_SOPTIONS shift options key
Packit 437b5e
@int KEY_SPREVIOUS shift previous object key
Packit 437b5e
@int KEY_SPRINT shift print key
Packit 437b5e
@int KEY_SR scroll one line backward key
Packit 437b5e
@int KEY_SREDO shift redo key
Packit 437b5e
@int KEY_SREPLACE shift replace key
Packit 437b5e
@int KEY_SRESET soft reset key
Packit 437b5e
@int KEY_SRIGHT shift cursor right key
Packit 437b5e
@int KEY_SRSUME shift resume key
Packit 437b5e
@int KEY_SSAVE shift save key
Packit 437b5e
@int KEY_SSUSPEND shift suspend key
Packit 437b5e
@int KEY_STAB shift tab key
Packit 437b5e
@int KEY_SUNDO shift undo key
Packit 437b5e
@int KEY_SUSPEND suspend key
Packit 437b5e
@int KEY_UNDO undo key
Packit 437b5e
@int KEY_UP cursor up key
Packit 437b5e
@usage
Packit 437b5e
  -- Print curses constants supported on this host.
Packit 437b5e
  for name, value in pairs (require "posix.curses") do
Packit 437b5e
    if type (value) == "number" then
Packit 437b5e
      print (name, value)
Packit 437b5e
     end
Packit 437b5e
  end
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
LUALIB_API int
Packit 437b5e
luaopen_posix_curses(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	luaopen_posix_curses_window(L);
Packit 437b5e
	luaopen_posix_curses_chstr(L);
Packit 437b5e
Packit 437b5e
	luaL_register(L, "curses", curseslib);
Packit 437b5e
	lua_pushliteral(L, "posix curses for " LUA_VERSION " / " PACKAGE_STRING);
Packit 437b5e
	lua_setfield(L, -2, "version");
Packit 437b5e
Packit 437b5e
#if HAVE_CURSES
Packit 437b5e
	lua_pushstring(L, "initscr");
Packit 437b5e
	lua_pushvalue(L, -2);
Packit 437b5e
	lua_pushcclosure(L, Pinitscr, 1);
Packit 437b5e
	lua_settable(L, -3);
Packit 437b5e
#endif
Packit 437b5e
Packit 437b5e
	return 1;
Packit 437b5e
}