Blame ext/posix/curses/window.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
 Curses Window objects.
Packit 437b5e
Packit 437b5e
 The methods documented on this page are available on any Curses Window
Packit 437b5e
 object, such as created by:
Packit 437b5e
Packit 437b5e
     stdscr = curses.initscr ()
Packit 437b5e
     window = curses.newwin (25, 80, 0, 0)
Packit 437b5e
Packit 437b5e
@classmod posix.curses.window
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
#include <config.h>
Packit 437b5e
Packit 437b5e
#if HAVE_CURSES
Packit 437b5e
Packit 437b5e
#include "_helpers.c"
Packit 437b5e
Packit 437b5e
#include "curses/chstr.c"
Packit 437b5e
Packit 437b5e
Packit 437b5e
static const char *WINDOWMETA = "posix.curses:window";
Packit 437b5e
Packit 437b5e
static void
Packit 437b5e
lc_newwin(lua_State *L, WINDOW *nw)
Packit 437b5e
{
Packit 437b5e
	if (nw)
Packit 437b5e
	{
Packit 437b5e
		WINDOW **w = lua_newuserdata(L, sizeof(WINDOW*));
Packit 437b5e
		luaL_getmetatable(L, WINDOWMETA);
Packit 437b5e
		lua_setmetatable(L, -2);
Packit 437b5e
		*w = nw;
Packit 437b5e
	}
Packit 437b5e
	else
Packit 437b5e
	{
Packit 437b5e
		lua_pushliteral(L, "failed to create window");
Packit 437b5e
		lua_error(L);
Packit 437b5e
	}
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
static WINDOW **
Packit 437b5e
lc_getwin(lua_State *L, int offset)
Packit 437b5e
{
Packit 437b5e
	WINDOW **w = (WINDOW**)luaL_checkudata(L, offset, WINDOWMETA);
Packit 437b5e
	if (w == NULL)
Packit 437b5e
		luaL_argerror(L, offset, "bad curses window");
Packit 437b5e
	return w;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
static WINDOW *
Packit 437b5e
checkwin(lua_State *L, int offset)
Packit 437b5e
{
Packit 437b5e
	WINDOW **w = lc_getwin(L, offset);
Packit 437b5e
	if (*w == NULL)
Packit 437b5e
		luaL_argerror(L, offset, "attempt to use closed curses window");
Packit 437b5e
	return *w;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Unique string representation of a @{posix.curses.window}.
Packit 437b5e
@function __tostring
Packit 437b5e
@treturn string unique string representation of the window object.
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
W__tostring(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW **w = lc_getwin(L, 1);
Packit 437b5e
	char buff[34];
Packit 437b5e
	if (*w == NULL)
Packit 437b5e
		strcpy(buff, "closed");
Packit 437b5e
	else
Packit 437b5e
		sprintf(buff, "%p", lua_touserdata(L, 1));
Packit 437b5e
	lua_pushfstring(L, "curses window (%s)", buff);
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Free all the resources associated with a window.
Packit 437b5e
@function close
Packit 437b5e
@see curs_window(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wclose(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW **w = lc_getwin(L, 1);
Packit 437b5e
	if (*w != NULL && *w != stdscr)
Packit 437b5e
	{
Packit 437b5e
		delwin(*w);
Packit 437b5e
		*w = NULL;
Packit 437b5e
	}
Packit 437b5e
	return 0;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Move the position of a window.
Packit 437b5e
@function move_window
Packit 437b5e
@int y offset frow top of screen
Packit 437b5e
@int x offset from left of screen
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_window(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmove_window(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int x = checkint(L, 3);
Packit 437b5e
	return pushokresult(mvwin(w, y, x));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Create a new subwindow.
Packit 437b5e
@function sub
Packit 437b5e
@treturn window a new absolutely positioned subwindow
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
@see curs_window(3x)
Packit 437b5e
@see derive
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wsub(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *orig = checkwin(L, 1);
Packit 437b5e
	int nlines  = checkint(L, 2);
Packit 437b5e
	int ncols   = checkint(L, 3);
Packit 437b5e
	int begin_y = checkint(L, 4);
Packit 437b5e
	int begin_x = checkint(L, 5);
Packit 437b5e
Packit 437b5e
	lc_newwin(L, subwin(orig, nlines, ncols, begin_y, begin_x));
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Create a new derived window.
Packit 437b5e
@function derive
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 relatively positioned subwindow
Packit 437b5e
@see curs_window(3x)
Packit 437b5e
@see sub
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wderive(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *orig = checkwin(L, 1);
Packit 437b5e
	int nlines  = checkint(L, 2);
Packit 437b5e
	int ncols   = checkint(L, 3);
Packit 437b5e
	int begin_y = checkint(L, 4);
Packit 437b5e
	int begin_x = checkint(L, 5);
Packit 437b5e
Packit 437b5e
	lc_newwin(L, derwin(orig, nlines, ncols, begin_y, begin_x));
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Move the position of a derived window.
Packit 437b5e
@function move_derived
Packit 437b5e
@int par_y lines from top of parent window
Packit 437b5e
@int par_x columns from left of parent window
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_window(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmove_derived(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int par_y = checkint(L, 2);
Packit 437b5e
	int par_x = checkint(L, 3);
Packit 437b5e
	return pushokresult(mvderwin(w, par_y, par_x));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Change the size of a window.
Packit 437b5e
@function resize
Packit 437b5e
@int height new number of lines
Packit 437b5e
@int width new number of columns
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_wresize(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wresize(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int height = checkint(L, 2);
Packit 437b5e
	int width = checkint(L, 3);
Packit 437b5e
Packit 437b5e
	int c = wresize(w, height, width);
Packit 437b5e
	if (c == ERR) return 0;
Packit 437b5e
Packit 437b5e
	return pushokresult(true);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Make a duplicate of a window.
Packit 437b5e
@function clone
Packit 437b5e
@treturn window a new duplicate of this window
Packit 437b5e
@see curs_window(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wclone(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	lc_newwin(L, dupwin(w));
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Mark ancestors of a window for refresh.
Packit 437b5e
@function syncup
Packit 437b5e
@see curs_window(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wsyncup(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	wsyncup(checkwin(L, 1));
Packit 437b5e
	return 0;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Automatically mark ancestors of a changed window for refresh.
Packit 437b5e
@function syncok
Packit 437b5e
@bool bf
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_window(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wsyncok(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
#if LPOSIX_CURSES_COMPLIANT
Packit 437b5e
	int bf = lua_toboolean(L, 2);
Packit 437b5e
	return pushokresult(syncok(w, bf));
Packit 437b5e
#else
Packit 437b5e
	return binding_notimplemented(L, "syncok", "curses");
Packit 437b5e
#endif
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Mark cursor position of ancestors of a window for refresh.
Packit 437b5e
@function cursyncup
Packit 437b5e
@see curs_window(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wcursyncup(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	wcursyncup(checkwin(L, 1));
Packit 437b5e
	return 0;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Mark child windows for refresh.
Packit 437b5e
@function syncdown
Packit 437b5e
@see curs_window(3x)
Packit 437b5e
@see refresh
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wsyncdown(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	wsyncdown(checkwin(L, 1));
Packit 437b5e
	return 0;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Refresh the window terminal display from the virtual screen.
Packit 437b5e
@function refresh
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_refresh(3x)
Packit 437b5e
@see posix.curses.doupdate
Packit 437b5e
@see noutrefresh
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wrefresh(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(wrefresh(checkwin(L, 1)));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Copy the window backing screen to the virtual screen.
Packit 437b5e
@function noutrefresh
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_refresh(3x)
Packit 437b5e
@see posix.curses.doupdate
Packit 437b5e
@see refresh
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wnoutrefresh(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(wnoutrefresh(checkwin(L, 1)));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Mark a window as having corrupted display that needs fully redrawing.
Packit 437b5e
@function redrawwin
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_refresh(3x)
Packit 437b5e
@see redrawln
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wredrawwin(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(redrawwin(checkwin(L, 1)));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Mark a range of lines in a window as corrupted and in need of redrawing.
Packit 437b5e
@function redrawln
Packit 437b5e
@int beg_line
Packit 437b5e
@int num_lines
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_refresh(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wredrawln(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int beg_line = checkint(L, 2);
Packit 437b5e
	int num_lines = checkint(L, 3);
Packit 437b5e
	return pushokresult(wredrawln(w, beg_line, num_lines));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Change the cursor position.
Packit 437b5e
@function move
Packit 437b5e
@int y
Packit 437b5e
@int x
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_move(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmove(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int x = checkint(L, 3);
Packit 437b5e
	return pushokresult(wmove(w, y, x));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Scroll the window up *n* lines.
Packit 437b5e
@function scrl
Packit 437b5e
@int n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_scroll(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wscrl(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int n = checkint(L, 2);
Packit 437b5e
	return pushokresult(wscrl(w, n));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Set the changed state of a window since the last refresh.
Packit 437b5e
@function touch
Packit 437b5e
@param[opt] changed
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_touch(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wtouch(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int changed;
Packit 437b5e
	if (lua_isnoneornil(L, 2))
Packit 437b5e
		changed = TRUE;
Packit 437b5e
	else
Packit 437b5e
		changed = lua_toboolean(L, 2);
Packit 437b5e
Packit 437b5e
	if (changed)
Packit 437b5e
		return pushokresult(touchwin(w));
Packit 437b5e
	return pushokresult(untouchwin(w));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Mark a range of lines as changed since the last refresh.
Packit 437b5e
@function touchline
Packit 437b5e
@int y
Packit 437b5e
@int n
Packit 437b5e
@param[opt] changed
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_refresh(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wtouchline(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int n = checkint(L, 3);
Packit 437b5e
	int changed;
Packit 437b5e
	if (lua_isnoneornil(L, 4))
Packit 437b5e
		changed = TRUE;
Packit 437b5e
	else
Packit 437b5e
		changed = lua_toboolean(L, 4);
Packit 437b5e
	return pushokresult(wtouchln(w, y, n, changed));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Has a particular window line changed since the last refresh?
Packit 437b5e
@function is_linetouched
Packit 437b5e
@int line
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_refresh(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wis_linetouched(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int line = checkint(L, 2);
Packit 437b5e
	return pushboolresult(is_linetouched(w, line));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Has a window changed since the last refresh?
Packit 437b5e
@function is_wintouched
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_refresh(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wis_wintouched(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	return pushboolresult(is_wintouched(w));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch the cursor position.
Packit 437b5e
@function getyx
Packit 437b5e
@treturn int y coordinate of top line
Packit 437b5e
@treturn int x coordinate of left column
Packit 437b5e
@see curs_getyx(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wgetyx(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y, x;
Packit 437b5e
	getyx(w, y, x);
Packit 437b5e
	lua_pushinteger(L, y);
Packit 437b5e
	lua_pushinteger(L, x);
Packit 437b5e
	return 2;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch the parent-relative coordinates of a subwindow.
Packit 437b5e
@function getparyx
Packit 437b5e
@treturn int y coordinate of top line relative to parent window
Packit 437b5e
@treturn int x coordinate of left column relative to parent window
Packit 437b5e
@see curs_getyx(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wgetparyx(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y, x;
Packit 437b5e
	getparyx(w, y, x);
Packit 437b5e
	lua_pushinteger(L, y);
Packit 437b5e
	lua_pushinteger(L, x);
Packit 437b5e
	return 2;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch the absolute top-left coordinates of a window.
Packit 437b5e
@function getbegyx
Packit 437b5e
@treturn int y coordinate of top line
Packit 437b5e
@treturn int x coordinate of left column
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_getyx(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wgetbegyx(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y, x;
Packit 437b5e
	getbegyx(w, y, x);
Packit 437b5e
	lua_pushinteger(L, y);
Packit 437b5e
	lua_pushinteger(L, x);
Packit 437b5e
	return 2;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch the absolute bottom-right coordinates of a window.
Packit 437b5e
@function getmaxyx
Packit 437b5e
@treturn int y coordinate of bottom line
Packit 437b5e
@treturn int x coordinate of right column
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_getyx(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wgetmaxyx(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y, x;
Packit 437b5e
	getmaxyx(w, y, x);
Packit 437b5e
	lua_pushinteger(L, y);
Packit 437b5e
	lua_pushinteger(L, x);
Packit 437b5e
	return 2;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Draw a border around a window.
Packit 437b5e
@function border
Packit 437b5e
@int[opt] ls
Packit 437b5e
@int[opt] rs
Packit 437b5e
@int[opt] ts
Packit 437b5e
@int[opt] bs
Packit 437b5e
@int[opt] tl
Packit 437b5e
@int[opt] tr
Packit 437b5e
@int[opt] bl
Packit 437b5e
@int[opt] br
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_border(3x)
Packit 437b5e
@usage
Packit 437b5e
  win:border (curses.ACS_VLINE, curses.ACS_VLINE,
Packit 437b5e
              curses.ACS_HLINE, curses.ACS_HLINE,
Packit 437b5e
	      curses.ACS_ULCORNER, curses.ACS_URCORNER,
Packit 437b5e
	      curses.ACS_LLCORNER, curses.ACS_LRCORNER)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wborder(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	chtype ls = optch(L, 2, 0);
Packit 437b5e
	chtype rs = optch(L, 3, 0);
Packit 437b5e
	chtype ts = optch(L, 4, 0);
Packit 437b5e
	chtype bs = optch(L, 5, 0);
Packit 437b5e
	chtype tl = optch(L, 6, 0);
Packit 437b5e
	chtype tr = optch(L, 7, 0);
Packit 437b5e
	chtype bl = optch(L, 8, 0);
Packit 437b5e
	chtype br = optch(L, 9, 0);
Packit 437b5e
Packit 437b5e
	return pushokresult(wborder(w, ls, rs, ts, bs, tl, tr, bl, br));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Draw a box around a window.
Packit 437b5e
@function box
Packit 437b5e
@int verch
Packit 437b5e
@int horch
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_border(3x)
Packit 437b5e
@see border
Packit 437b5e
@usage
Packit 437b5e
  win:box (curses.ACS_VLINE, curses.ACS_HLINE)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wbox(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	chtype verch = checkch(L, 2);
Packit 437b5e
	chtype horch = checkch(L, 3);
Packit 437b5e
Packit 437b5e
	return pushokresult(box(w, verch, horch));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Draw a row of characters from the current cursor position.
Packit 437b5e
@function hline
Packit 437b5e
@int ch
Packit 437b5e
@int n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_border(3x)
Packit 437b5e
@see mvhline
Packit 437b5e
@see vline
Packit 437b5e
@usage
Packit 437b5e
  _, width = win:getmaxyx ()
Packit 437b5e
  win:hline (curses.ACS_HLINE, width - curs_x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Whline(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	chtype ch = checkch(L, 2);
Packit 437b5e
	int n = checkint(L, 3);
Packit 437b5e
Packit 437b5e
	return pushokresult(whline(w, ch, n));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Draw a column of characters from the current cursor position.
Packit 437b5e
@function vline
Packit 437b5e
@int ch
Packit 437b5e
@int n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_border(3x)
Packit 437b5e
@see hline
Packit 437b5e
@see mvvline
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wvline(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	chtype ch = checkch(L, 2);
Packit 437b5e
	int n = checkint(L, 3);
Packit 437b5e
Packit 437b5e
	return pushokresult(wvline(w, ch, n));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Move the cursor, then draw a row of characters from the new cursor position.
Packit 437b5e
@function mvhline
Packit 437b5e
@int y
Packit 437b5e
@int x
Packit 437b5e
@int ch
Packit 437b5e
@int n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_border(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmvhline(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int x = checkint(L, 3);
Packit 437b5e
	chtype ch = checkch(L, 4);
Packit 437b5e
	int n = checkint(L, 5);
Packit 437b5e
Packit 437b5e
	return pushokresult(mvwhline(w, y, x, ch, n));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Move the cursor, then draw a column of characters from the new cursor position.
Packit 437b5e
@function mvvline
Packit 437b5e
@int y
Packit 437b5e
@int x
Packit 437b5e
@int ch
Packit 437b5e
@int n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_border(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmvvline(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int x = checkint(L, 3);
Packit 437b5e
	chtype ch = checkch(L, 4);
Packit 437b5e
	int n = checkint(L, 5);
Packit 437b5e
Packit 437b5e
	return pushokresult(mvwvline(w, y, x, ch, n));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Write blanks to every character position in the window.
Packit 437b5e
@function erase
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_clear(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Werase(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(werase(checkwin(L, 1)));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Call @{erase} and then @{clearok}.
Packit 437b5e
@function clear
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_border(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wclear(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(wclear(checkwin(L, 1)));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Write blanks to every character position after the cursor.
Packit 437b5e
@function clrtobot
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_border(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wclrtobot(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(wclrtobot(checkwin(L, 1)));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Write blanks from the cursor to the end of the current line.
Packit 437b5e
@function clrtoeol
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_border(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wclrtoeol(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(wclrtoeol(checkwin(L, 1)));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Advance the cursor after writing a character at the old position.
Packit 437b5e
@function addch
Packit 437b5e
@int ch
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_addch(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Waddch(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	chtype ch = checkch(L, 2);
Packit 437b5e
	return pushokresult(waddch(w, ch));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Call @{move}, then @{addch}.
Packit 437b5e
@function mvaddch
Packit 437b5e
@int ch
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_addch(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmvaddch(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int x = checkint(L, 3);
Packit 437b5e
	chtype ch = checkch(L, 4);
Packit 437b5e
	return pushokresult(mvwaddch(w, y, x, ch));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Call @{addch} then @{refresh}.
Packit 437b5e
@function echoch
Packit 437b5e
@int ch
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_addch(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wechoch(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	chtype ch = checkch(L, 2);
Packit 437b5e
	return pushokresult(wechochar(w, ch));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Copy a @{posix.curses.chstr} starting at the current cursor position.
Packit 437b5e
@function addchstr
Packit 437b5e
@int chstr cs
Packit 437b5e
@int[opt] n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_addchstr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Waddchstr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int n = optint(L, 3, -1);
Packit 437b5e
	chstr *cs = checkchstr(L, 2);
Packit 437b5e
Packit 437b5e
	if (n < 0 || n > (int) cs->len)
Packit 437b5e
		n = cs->len;
Packit 437b5e
Packit 437b5e
	return pushokresult(waddchnstr(w, cs->str, n));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Call @{move} then @{addchstr}.
Packit 437b5e
@function mvaddchstr
Packit 437b5e
@int y
Packit 437b5e
@int x
Packit 437b5e
@int[opt] n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_addchstr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmvaddchstr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int x = checkint(L, 3);
Packit 437b5e
	int n = optint(L, 5, -1);
Packit 437b5e
	chstr *cs = checkchstr(L, 4);
Packit 437b5e
Packit 437b5e
	if (n < 0 || n > (int) cs->len)
Packit 437b5e
		n = cs->len;
Packit 437b5e
Packit 437b5e
	return pushokresult(mvwaddchnstr(w, y, x, cs->str, n));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Copy a Lua string starting at the current cursor position.
Packit 437b5e
@function addstr
Packit 437b5e
@string str
Packit 437b5e
@int[opt] n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_addstr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Waddstr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	const char *str = luaL_checkstring(L, 2);
Packit 437b5e
	int n = optint(L, 3, -1);
Packit 437b5e
	return pushokresult(waddnstr(w, str, n));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Call @{move} then @{addstr}.
Packit 437b5e
@function mvaddstr
Packit 437b5e
@int y
Packit 437b5e
@int x
Packit 437b5e
@string str
Packit 437b5e
@int[opt] n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_addstr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmvaddstr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int x = checkint(L, 3);
Packit 437b5e
	const char *str = luaL_checkstring(L, 4);
Packit 437b5e
	int n = optint(L, 5, -1);
Packit 437b5e
	return pushokresult(mvwaddnstr(w, y, x, str, n));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Set the background attributes for subsequently written characters.
Packit 437b5e
@function wbkgdset
Packit 437b5e
@int ch
Packit 437b5e
@see curs_bkgd(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wwbkgdset(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	chtype ch = checkch(L, 2);
Packit 437b5e
	wbkgdset(w, ch);
Packit 437b5e
	return 0;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Call @{wbkgdset} and then set the background of every position accordingly.
Packit 437b5e
@function wbkgd
Packit 437b5e
@int ch
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_bkgd(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wwbkgd(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	chtype ch = checkch(L, 2);
Packit 437b5e
	return pushokresult(wbkgd(w, ch));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch the current background attribute for the window.
Packit 437b5e
@function getbkgd
Packit 437b5e
@treturn int current window background attribute
Packit 437b5e
@see curs_bkgd(3x)
Packit 437b5e
@see wbkgd
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wgetbkgd(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushintresult(getbkgd(checkwin(L, 1)));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Set the flush on interrupt behaviour for the window.
Packit 437b5e
@function intrflush
Packit 437b5e
@bool bf
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_inopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wintrflush(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int bf = lua_toboolean(L, 2);
Packit 437b5e
	return pushokresult(intrflush(w, bf));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Set the single value keypad keys behaviour for the window.
Packit 437b5e
@function keypad
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
Wkeypad(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int bf = lua_isnoneornil(L, 2) ? 1 : lua_toboolean(L, 2);
Packit 437b5e
	return pushokresult(keypad(w, bf));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Force 8-bit (or 7-bit) input characters for the window.
Packit 437b5e
@function meta
Packit 437b5e
@bool on `true` to force 8-bit input characters
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_inopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmeta(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int bf = lua_toboolean(L, 2);
Packit 437b5e
	return pushokresult(meta(w, bf));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Force @{getch} to be non-blocking.
Packit 437b5e
@function nodelay
Packit 437b5e
@bool on
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_inopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wnodelay(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int bf = lua_toboolean(L, 2);
Packit 437b5e
	return pushokresult(nodelay(w, bf));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
For differentiating user input from terminal control sequences.
Packit 437b5e
@function timeout
Packit 437b5e
@int delay milliseconds, `0` for blocking, `-1` for non-blocking
Packit 437b5e
@see curs_inopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wtimeout(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int delay = checkint(L, 2);
Packit 437b5e
	wtimeout(w, delay);
Packit 437b5e
	return 0;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Return input immediately from this window.
Packit 437b5e
@function notimeout
Packit 437b5e
@bool bf
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_inopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wnotimeout(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int bf = lua_toboolean(L, 2);
Packit 437b5e
	return pushokresult(notimeout(w, bf));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
The next call to @{refresh} will clear and completely redraw the window.
Packit 437b5e
@function clearok
Packit 437b5e
@bool bf
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_outopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wclearok(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int bf = lua_toboolean(L, 2);
Packit 437b5e
	return pushokresult(clearok(w, bf));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Use hardware character insert and delete on supporting terminals.
Packit 437b5e
@function idcok
Packit 437b5e
@bool bf
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_outopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Widcok(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int bf = lua_toboolean(L, 2);
Packit 437b5e
	idcok(w, bf);
Packit 437b5e
	return 0;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Use hardware line insert and delete on supporting terminals.
Packit 437b5e
@function idlok
Packit 437b5e
@bool bf
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_outopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Widlok(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int bf = lua_toboolean(L, 2);
Packit 437b5e
	return pushokresult(idlok(w, bf));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
No need to force synchronisation of hardware cursor.
Packit 437b5e
@function leaveok
Packit 437b5e
@bool bf
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_outopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wleaveok(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int bf = lua_toboolean(L, 2);
Packit 437b5e
	return pushokresult(leaveok(w, bf));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Scroll up one line when the cursor writes to the last screen position.
Packit 437b5e
@function scrollok
Packit 437b5e
@bool bf
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_outopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wscrollok(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int bf = lua_toboolean(L, 2);
Packit 437b5e
	return pushokresult(scrollok(w, bf));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Automatically call @{refresh} whenever the window content is changed.
Packit 437b5e
@function immedok
Packit 437b5e
@bool bf
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_outopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wimmedok(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
#if LPOSIX_CURSES_COMPLIANT
Packit 437b5e
	int bf = lua_toboolean(L, 2);
Packit 437b5e
	immedok(w, bf);
Packit 437b5e
	return 0;
Packit 437b5e
#else
Packit 437b5e
	return binding_notimplemented(L, "immedok", "curses");
Packit 437b5e
#endif
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Set a software scrolling region for the window.
Packit 437b5e
@function wsetscrreg
Packit 437b5e
@int top top line of the scrolling region (line 0 is the first line)
Packit 437b5e
@int bot bottom line of the scrolling region
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_outopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wwsetscrreg(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int top = checkint(L, 2);
Packit 437b5e
	int bot = checkint(L, 3);
Packit 437b5e
	return pushokresult(wsetscrreg(w, top, bot));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Overlay this window on top of another non-destructively.
Packit 437b5e
@function overlay
Packit 437b5e
@tparam window dst destination window
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_overlay(3x)
Packit 437b5e
@see overwrite
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Woverlay(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *srcwin = checkwin(L, 1);
Packit 437b5e
	WINDOW *dstwin = checkwin(L, 2);
Packit 437b5e
	return pushokresult(overlay(srcwin, dstwin));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Destructively overwrite another window with this one.
Packit 437b5e
@function overwrite
Packit 437b5e
@tparam window dst destination window
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_inopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Woverwrite(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *srcwin = checkwin(L, 1);
Packit 437b5e
	WINDOW *dstwin = checkwin(L, 2);
Packit 437b5e
	return pushokresult(overwrite(srcwin, dstwin));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Overlay a rectangle of this window over another.
Packit 437b5e
@function copywin
Packit 437b5e
@tparam window dst destination window
Packit 437b5e
@int st top row from this window
Packit 437b5e
@int sl left column from this window
Packit 437b5e
@int dt top row of rectangle
Packit 437b5e
@int dl left column of rectangle
Packit 437b5e
@int db bottom row of rectangle
Packit 437b5e
@int dr right column of rectangle
Packit 437b5e
@bool overlay if `true`, copy destructively like @{overlay}
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_inopts(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wcopywin(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *srcwin = checkwin(L, 1);
Packit 437b5e
	WINDOW *dstwin = checkwin(L, 2);
Packit 437b5e
	int sminrow = checkint(L, 3);
Packit 437b5e
	int smincol = checkint(L, 4);
Packit 437b5e
	int dminrow = checkint(L, 5);
Packit 437b5e
	int dmincol = checkint(L, 6);
Packit 437b5e
	int dmaxrow = checkint(L, 7);
Packit 437b5e
	int dmaxcol = checkint(L, 8);
Packit 437b5e
	int woverlay = lua_toboolean(L, 9);
Packit 437b5e
	return pushokresult(copywin(srcwin, dstwin, sminrow,
Packit 437b5e
		smincol, dminrow, dmincol, dmaxrow, dmaxcol, woverlay));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Delete the character under the cursor.
Packit 437b5e
@function delch
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_delch(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wdelch(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(wdelch(checkwin(L, 1)));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Call @{move} then @{delch}.
Packit 437b5e
@function mvdelch
Packit 437b5e
@int y
Packit 437b5e
@int x
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_util(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmvdelch(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int x = checkint(L, 3);
Packit 437b5e
	return pushokresult(mvwdelch(w, y, x));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Move the lines below the cursor up, to delete the current line.
Packit 437b5e
@function deleteln
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_deleteln(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wdeleteln(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(wdeleteln(checkwin(L, 1)));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Move the current line and those below down one line, leaving a new blank line.
Packit 437b5e
@function insertln
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_deleteln(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Winsertln(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(winsertln(checkwin(L, 1)));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Call @{deleteln} *n* times.
Packit 437b5e
@function winsdelln
Packit 437b5e
@int n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_deleteln(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wwinsdelln(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int n = checkint(L, 2);
Packit 437b5e
	return pushokresult(winsdelln(w, n));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Read a character from the window input.
Packit 437b5e
@function getch
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_getch(3x)
Packit 437b5e
@see posix.curses.cbreak
Packit 437b5e
@see posix.curses.echo
Packit 437b5e
@see keypad
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wgetch(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int c = wgetch(w);
Packit 437b5e
Packit 437b5e
	if (c == ERR)
Packit 437b5e
		return 0;
Packit 437b5e
Packit 437b5e
	return pushintresult(c);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Call @{move} then @{getch}
Packit 437b5e
@function mvgetch
Packit 437b5e
@int y
Packit 437b5e
@int x
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_deleteln(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmvgetch(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int x = checkint(L, 3);
Packit 437b5e
	int c;
Packit 437b5e
Packit 437b5e
	if (wmove(w, y, x) == ERR)
Packit 437b5e
		return 0;
Packit 437b5e
Packit 437b5e
	c = wgetch(w);
Packit 437b5e
Packit 437b5e
	if (c == ERR)
Packit 437b5e
		return 0;
Packit 437b5e
Packit 437b5e
	return pushintresult(c);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Read characters up to the next newline from the window input.
Packit 437b5e
@function getstr
Packit 437b5e
@int[opt] n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_getstr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wgetstr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int n = optint(L, 2, 0);
Packit 437b5e
	char buf[LUAL_BUFFERSIZE];
Packit 437b5e
Packit 437b5e
	if (n == 0 || n >= LUAL_BUFFERSIZE)
Packit 437b5e
		n = LUAL_BUFFERSIZE - 1;
Packit 437b5e
	if (wgetnstr(w, buf, n) == ERR)
Packit 437b5e
		return 0;
Packit 437b5e
Packit 437b5e
	return pushstringresult(buf);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Call @{move} then @{getstr}.
Packit 437b5e
@function mvgetstr
Packit 437b5e
@int y
Packit 437b5e
@int x
Packit 437b5e
@int[opt=-1] n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_getstr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmvgetstr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int x = checkint(L, 3);
Packit 437b5e
	int n = optint(L, 4, -1);
Packit 437b5e
	char buf[LUAL_BUFFERSIZE];
Packit 437b5e
Packit 437b5e
	if (n == 0 || n >= LUAL_BUFFERSIZE)
Packit 437b5e
		n = LUAL_BUFFERSIZE - 1;
Packit 437b5e
	if (mvwgetnstr(w, y, x, buf, n) == ERR)
Packit 437b5e
		return 0;
Packit 437b5e
Packit 437b5e
	return pushstringresult(buf);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch the attributed character at the current cursor position.
Packit 437b5e
@function winch
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_inch(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wwinch(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	return pushintresult(winch(w));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Call @{move} then @{winch}
Packit 437b5e
@function mvwinch
Packit 437b5e
@int y
Packit 437b5e
@int x
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_getstr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmvwinch(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int x = checkint(L, 3);
Packit 437b5e
	return pushintresult(mvwinch(w, y, x));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch attributed characters from cursor position up to rightmost window position.
Packit 437b5e
@function winchnstr
Packit 437b5e
@int n
Packit 437b5e
@treturn posix.curses.chstr characters from cursor to end of line
Packit 437b5e
@see curs_inchstr(3x)
Packit 437b5e
@see winnstr
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wwinchnstr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int n = checkint(L, 2);
Packit 437b5e
	chstr *cs = chstr_new(L, n);
Packit 437b5e
Packit 437b5e
	if (winchnstr(w, cs->str, n) == ERR)
Packit 437b5e
		return 0;
Packit 437b5e
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Call @{move} then @{winchnstr}.
Packit 437b5e
@function mvwinchnstr
Packit 437b5e
@int y
Packit 437b5e
@int x
Packit 437b5e
@int n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_getstr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmvwinchnstr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int x = checkint(L, 3);
Packit 437b5e
	int n = checkint(L, 4);
Packit 437b5e
	chstr *cs = chstr_new(L, n);
Packit 437b5e
Packit 437b5e
	if (mvwinchnstr(w, y, x, cs->str, n) == ERR)
Packit 437b5e
		return 0;
Packit 437b5e
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch a string from cursor position up to rightmost window position.
Packit 437b5e
@function winnstr
Packit 437b5e
@int n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_instr(3x)
Packit 437b5e
@see winchnstr
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wwinnstr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int n = checkint(L, 2);
Packit 437b5e
	char buf[LUAL_BUFFERSIZE];
Packit 437b5e
Packit 437b5e
	if (n >= LUAL_BUFFERSIZE)
Packit 437b5e
		n = LUAL_BUFFERSIZE - 1;
Packit 437b5e
	if (winnstr(w, buf, n) == ERR)
Packit 437b5e
		return 0;
Packit 437b5e
Packit 437b5e
	lua_pushlstring(L, buf, n);
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Call @{move} then @{winnstr}.
Packit 437b5e
@function mvwinnstr
Packit 437b5e
@int y
Packit 437b5e
@int x
Packit 437b5e
@int n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_instr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmvwinnstr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int x = checkint(L, 3);
Packit 437b5e
	int n = checkint(L, 4);
Packit 437b5e
	char buf[LUAL_BUFFERSIZE];
Packit 437b5e
Packit 437b5e
	if (n >= LUAL_BUFFERSIZE)
Packit 437b5e
		n = LUAL_BUFFERSIZE - 1;
Packit 437b5e
	if (mvwinnstr(w, y, x, buf, n) == ERR)
Packit 437b5e
		return 0;
Packit 437b5e
Packit 437b5e
	lua_pushlstring(L, buf, n);
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Insert a character before the current cursor position.
Packit 437b5e
@function winsch
Packit 437b5e
@int ch
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_insch(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wwinsch(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	chtype ch = checkch(L, 2);
Packit 437b5e
	return pushokresult(winsch(w, ch));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Call @{move} then @{winsch}.
Packit 437b5e
@function mvwinsch
Packit 437b5e
@int y
Packit 437b5e
@int x
Packit 437b5e
@int ch
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_insch(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmvwinsch(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int x = checkint(L, 3);
Packit 437b5e
	chtype ch = checkch(L, 4);
Packit 437b5e
	return pushokresult(mvwinsch(w, y, x, ch));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Insert a string of characters before the current cursor position.
Packit 437b5e
@function winsstr
Packit 437b5e
@string str
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_insstr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wwinsstr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	const char *str = luaL_checkstring(L, 2);
Packit 437b5e
	return pushokresult(winsnstr(w, str, lua_strlen(L, 2)));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Call @{move} then @{winsstr}.
Packit 437b5e
@function mvwinsstr
Packit 437b5e
@int y
Packit 437b5e
@int x
Packit 437b5e
@string str
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_getstr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmvwinsstr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int x = checkint(L, 3);
Packit 437b5e
	const char *str = luaL_checkstring(L, 4);
Packit 437b5e
	return pushokresult(mvwinsnstr(w, y, x, str, lua_strlen(L, 2)));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Like @{winsstr}, but no more than *n* characters.
Packit 437b5e
@function winsnstr
Packit 437b5e
@string str
Packit 437b5e
@int n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_getstr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wwinsnstr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	const char *str = luaL_checkstring(L, 2);
Packit 437b5e
	int n = checkint(L, 3);
Packit 437b5e
	return pushokresult(winsnstr(w, str, n));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Call @{move} then @{winsnstr}.
Packit 437b5e
@function mvwinsnstr
Packit 437b5e
@int y
Packit 437b5e
@int x
Packit 437b5e
@string str
Packit 437b5e
@int n
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_getstr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wmvwinsnstr(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int y = checkint(L, 2);
Packit 437b5e
	int x = checkint(L, 3);
Packit 437b5e
	const char *str = luaL_checkstring(L, 4);
Packit 437b5e
	int n = checkint(L, 5);
Packit 437b5e
	return pushokresult(mvwinsnstr(w, y, x, str, n));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Return a new subpad window object.
Packit 437b5e
@function subpad
Packit 437b5e
@int nlines
Packit 437b5e
@int ncols
Packit 437b5e
@int begin_y
Packit 437b5e
@int begin_x
Packit 437b5e
@treturn window a new subpad window object
Packit 437b5e
@see cur_pad(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wsubpad(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *orig = checkwin(L, 1);
Packit 437b5e
	int nlines  = checkint(L, 2);
Packit 437b5e
	int ncols   = checkint(L, 3);
Packit 437b5e
	int begin_y = checkint(L, 4);
Packit 437b5e
	int begin_x = checkint(L, 5);
Packit 437b5e
Packit 437b5e
	lc_newwin(L, subpad(orig, nlines, ncols, begin_y, begin_x));
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Equivalent to @{refresh} for use with pad windows.
Packit 437b5e
@function prefresh
Packit 437b5e
@int st top row from this pad window
Packit 437b5e
@int sl left column from this pad window
Packit 437b5e
@int dt top row of rectangle
Packit 437b5e
@int dl left column of rectangle
Packit 437b5e
@int db bottom row of rectangle
Packit 437b5e
@int dr right column of rectangle
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see cur_pad(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wprefresh(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *p = checkwin(L, 1);
Packit 437b5e
	int pminrow = checkint(L, 2);
Packit 437b5e
	int pmincol = checkint(L, 3);
Packit 437b5e
	int sminrow = checkint(L, 4);
Packit 437b5e
	int smincol = checkint(L, 5);
Packit 437b5e
	int smaxrow = checkint(L, 6);
Packit 437b5e
	int smaxcol = checkint(L, 7);
Packit 437b5e
Packit 437b5e
	return pushokresult(prefresh(p, pminrow, pmincol,
Packit 437b5e
		sminrow, smincol, smaxrow, smaxcol));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Equivalent to @{noutrefresh} for use with pad windows.
Packit 437b5e
@function pnoutrefresh
Packit 437b5e
@int st top row from this pad window
Packit 437b5e
@int sl left column from this pad window
Packit 437b5e
@int dt top row of rectangle
Packit 437b5e
@int dl left column of rectangle
Packit 437b5e
@int db bottom row of rectangle
Packit 437b5e
@int dr right column of rectangle
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see cur_pad(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wpnoutrefresh(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *p = checkwin(L, 1);
Packit 437b5e
	int pminrow = checkint(L, 2);
Packit 437b5e
	int pmincol = checkint(L, 3);
Packit 437b5e
	int sminrow = checkint(L, 4);
Packit 437b5e
	int smincol = checkint(L, 5);
Packit 437b5e
	int smaxrow = checkint(L, 6);
Packit 437b5e
	int smaxcol = checkint(L, 7);
Packit 437b5e
Packit 437b5e
	return pushokresult(pnoutrefresh(p, pminrow, pmincol,
Packit 437b5e
		sminrow, smincol, smaxrow, smaxcol));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
An efficient equivalent to @{addch} followed by @{refresh}.
Packit 437b5e
@function pechochar
Packit 437b5e
@int ch
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see cur_pad(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wpechochar(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *p = checkwin(L, 1);
Packit 437b5e
	chtype ch = checkch(L, 2);
Packit 437b5e
	return pushokresult(pechochar(p, ch));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Turn off the given attributes for subsequent writes to the window.
Packit 437b5e
@function attroff
Packit 437b5e
@int attrs
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_attr(3x)
Packit 437b5e
@see standend
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wattroff(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int attrs = checkint(L, 2);
Packit 437b5e
	return pushokresult(wattroff(w, attrs));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Turn on the given attributes for subsequent writes to the window.
Packit 437b5e
@function attron
Packit 437b5e
@int attrs
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_attr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wattron(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int attrs = checkint(L, 2);
Packit 437b5e
	return pushokresult(wattron(w, attrs));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Set the given attributes for subsequent writes to the window.
Packit 437b5e
@function attrset
Packit 437b5e
@int attrs
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_attr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wattrset(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	WINDOW *w = checkwin(L, 1);
Packit 437b5e
	int attrs = checkint(L, 2);
Packit 437b5e
	return pushokresult(wattrset(w, attrs));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Turn off all attributes for subsequent writes to the window.
Packit 437b5e
@function standend
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_attr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wstandend(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(wstandend(checkwin(L, 1)));
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Set `A_STANDOUT` for subsequent writes to the window.
Packit 437b5e
@function standout
Packit 437b5e
@treturn bool `true`, if successful
Packit 437b5e
@see curs_attr(3x)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Wstandout(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	return pushokresult(wstandout(checkwin(L, 1)));
Packit 437b5e
}
Packit 437b5e
#endif /*!HAVE_CURSES*/
Packit 437b5e
Packit 437b5e
Packit 437b5e
static const luaL_Reg posix_curses_window_fns[] =
Packit 437b5e
{
Packit 437b5e
#if HAVE_CURSES
Packit 437b5e
	LPOSIX_FUNC( W__tostring	),
Packit 437b5e
	LPOSIX_FUNC( Waddch		),
Packit 437b5e
	LPOSIX_FUNC( Waddchstr		),
Packit 437b5e
	LPOSIX_FUNC( Waddstr		),
Packit 437b5e
	LPOSIX_FUNC( Wattroff		),
Packit 437b5e
	LPOSIX_FUNC( Wattron		),
Packit 437b5e
	LPOSIX_FUNC( Wattrset		),
Packit 437b5e
	LPOSIX_FUNC( Wborder		),
Packit 437b5e
	LPOSIX_FUNC( Wbox		),
Packit 437b5e
	LPOSIX_FUNC( Wclear		),
Packit 437b5e
	LPOSIX_FUNC( Wclearok		),
Packit 437b5e
	LPOSIX_FUNC( Wclone		),
Packit 437b5e
	LPOSIX_FUNC( Wclose		),
Packit 437b5e
	LPOSIX_FUNC( Wclrtobot		),
Packit 437b5e
	LPOSIX_FUNC( Wclrtoeol		),
Packit 437b5e
	LPOSIX_FUNC( Wcopywin		),
Packit 437b5e
	LPOSIX_FUNC( Wcursyncup		),
Packit 437b5e
	LPOSIX_FUNC( Wdelch		),
Packit 437b5e
	LPOSIX_FUNC( Wdeleteln		),
Packit 437b5e
	LPOSIX_FUNC( Wderive		),
Packit 437b5e
	LPOSIX_FUNC( Wechoch		),
Packit 437b5e
	LPOSIX_FUNC( Werase		),
Packit 437b5e
	LPOSIX_FUNC( Wgetbegyx		),
Packit 437b5e
	LPOSIX_FUNC( Wgetbkgd		),
Packit 437b5e
	LPOSIX_FUNC( Wgetch		),
Packit 437b5e
	LPOSIX_FUNC( Wgetmaxyx		),
Packit 437b5e
	LPOSIX_FUNC( Wgetparyx		),
Packit 437b5e
	LPOSIX_FUNC( Wgetstr		),
Packit 437b5e
	LPOSIX_FUNC( Wgetyx		),
Packit 437b5e
	LPOSIX_FUNC( Whline		),
Packit 437b5e
	LPOSIX_FUNC( Widcok		),
Packit 437b5e
	LPOSIX_FUNC( Widlok		),
Packit 437b5e
	LPOSIX_FUNC( Wimmedok		),
Packit 437b5e
	LPOSIX_FUNC( Winsertln		),
Packit 437b5e
	LPOSIX_FUNC( Wintrflush		),
Packit 437b5e
	LPOSIX_FUNC( Wis_linetouched	),
Packit 437b5e
	LPOSIX_FUNC( Wis_wintouched	),
Packit 437b5e
	LPOSIX_FUNC( Wkeypad		),
Packit 437b5e
	LPOSIX_FUNC( Wleaveok		),
Packit 437b5e
	LPOSIX_FUNC( Wmeta		),
Packit 437b5e
	LPOSIX_FUNC( Wmove		),
Packit 437b5e
	LPOSIX_FUNC( Wmove_derived	),
Packit 437b5e
	LPOSIX_FUNC( Wmove_window	),
Packit 437b5e
	LPOSIX_FUNC( Wmvaddch		),
Packit 437b5e
	LPOSIX_FUNC( Wmvaddchstr	),
Packit 437b5e
	LPOSIX_FUNC( Wmvaddstr		),
Packit 437b5e
	LPOSIX_FUNC( Wmvdelch		),
Packit 437b5e
	LPOSIX_FUNC( Wmvgetch		),
Packit 437b5e
	LPOSIX_FUNC( Wmvgetstr		),
Packit 437b5e
	LPOSIX_FUNC( Wmvhline		),
Packit 437b5e
	LPOSIX_FUNC( Wmvvline		),
Packit 437b5e
	LPOSIX_FUNC( Wmvwinch		),
Packit 437b5e
	LPOSIX_FUNC( Wmvwinchnstr	),
Packit 437b5e
	LPOSIX_FUNC( Wmvwinnstr		),
Packit 437b5e
	LPOSIX_FUNC( Wmvwinsch		),
Packit 437b5e
	LPOSIX_FUNC( Wmvwinsnstr	),
Packit 437b5e
	LPOSIX_FUNC( Wmvwinsstr		),
Packit 437b5e
	LPOSIX_FUNC( Wnodelay		),
Packit 437b5e
	LPOSIX_FUNC( Wnotimeout		),
Packit 437b5e
	LPOSIX_FUNC( Wnoutrefresh	),
Packit 437b5e
	LPOSIX_FUNC( Woverlay		),
Packit 437b5e
	LPOSIX_FUNC( Woverwrite		),
Packit 437b5e
	LPOSIX_FUNC( Wpechochar		),
Packit 437b5e
	LPOSIX_FUNC( Wpnoutrefresh	),
Packit 437b5e
	LPOSIX_FUNC( Wprefresh		),
Packit 437b5e
	LPOSIX_FUNC( Wredrawln		),
Packit 437b5e
	LPOSIX_FUNC( Wredrawwin		),
Packit 437b5e
	LPOSIX_FUNC( Wrefresh		),
Packit 437b5e
	LPOSIX_FUNC( Wresize		),
Packit 437b5e
	LPOSIX_FUNC( Wscrl		),
Packit 437b5e
	LPOSIX_FUNC( Wscrollok		),
Packit 437b5e
	LPOSIX_FUNC( Wstandend		),
Packit 437b5e
	LPOSIX_FUNC( Wstandout		),
Packit 437b5e
	LPOSIX_FUNC( Wsub		),
Packit 437b5e
	LPOSIX_FUNC( Wsubpad		),
Packit 437b5e
	LPOSIX_FUNC( Wsyncdown		),
Packit 437b5e
	LPOSIX_FUNC( Wsyncok		),
Packit 437b5e
	LPOSIX_FUNC( Wsyncup		),
Packit 437b5e
	LPOSIX_FUNC( Wtimeout		),
Packit 437b5e
	LPOSIX_FUNC( Wtouch		),
Packit 437b5e
	LPOSIX_FUNC( Wtouchline		),
Packit 437b5e
	LPOSIX_FUNC( Wvline		),
Packit 437b5e
	LPOSIX_FUNC( Wwbkgd		),
Packit 437b5e
	LPOSIX_FUNC( Wwbkgdset		),
Packit 437b5e
	LPOSIX_FUNC( Wwinch		),
Packit 437b5e
	LPOSIX_FUNC( Wwinchnstr		),
Packit 437b5e
	LPOSIX_FUNC( Wwinnstr		),
Packit 437b5e
	LPOSIX_FUNC( Wwinsch		),
Packit 437b5e
	LPOSIX_FUNC( Wwinsdelln		),
Packit 437b5e
	LPOSIX_FUNC( Wwinsnstr		),
Packit 437b5e
	LPOSIX_FUNC( Wwinsstr		),
Packit 437b5e
	LPOSIX_FUNC( Wwsetscrreg	),
Packit 437b5e
	{"__gc",     Wclose		}, /* rough safety net */
Packit 437b5e
#endif
Packit 437b5e
	{NULL, NULL}
Packit 437b5e
};
Packit 437b5e
Packit 437b5e
Packit 437b5e
LUALIB_API int
Packit 437b5e
luaopen_posix_curses_window(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int t, mt;
Packit 437b5e
Packit 437b5e
	luaL_register(L, "posix.curses.window", posix_curses_window_fns);
Packit 437b5e
	t = lua_gettop(L);
Packit 437b5e
Packit 437b5e
#if HAVE_CURSES
Packit 437b5e
	luaL_newmetatable(L, WINDOWMETA);
Packit 437b5e
	mt = lua_gettop(L);
Packit 437b5e
Packit 437b5e
	lua_pushvalue(L, mt);
Packit 437b5e
	lua_setfield(L, mt, "__index");		/* mt.__index = mt */
Packit 437b5e
	lua_pushliteral(L, "PosixWindow");
Packit 437b5e
	lua_setfield(L, mt, "_type");		/* mt._type = "Curses Window" */
Packit 437b5e
Packit 437b5e
	/* for k,v in pairs(t) do mt[k]=v end */
Packit 437b5e
	for (lua_pushnil(L); lua_next(L, t) != 0;)
Packit 437b5e
		lua_setfield(L, mt, lua_tostring(L, -2));
Packit 437b5e
Packit 437b5e
	lua_pop(L, 1);				/* pop mt */
Packit 437b5e
#endif
Packit 437b5e
Packit 437b5e
	/* t.version = "posix.curses.window..." */
Packit 437b5e
	lua_pushliteral(L, "posix.curses.window for " LUA_VERSION " / " PACKAGE_STRING);
Packit 437b5e
	lua_setfield(L, t, "version");
Packit 437b5e
Packit 437b5e
	return 1;
Packit 437b5e
}