138 lines
3.1 KiB
C
138 lines
3.1 KiB
C
|
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
#include <lua.h>
|
||
|
#include <lualib.h>
|
||
|
#include <lauxlib.h>
|
||
|
|
||
|
#include <curses.h>
|
||
|
#include "luacurses.h"
|
||
|
|
||
|
SCREEN* luacurses_toscreen(lua_State* L, int index)
|
||
|
{
|
||
|
SCREEN** pscreen = (SCREEN**) luaL_checkudata(L, index, MKLUALIB_META_CURSES_SCREEN);
|
||
|
if (!pscreen) luaL_argerror(L, index, "bad screen");
|
||
|
if (!*pscreen) luaL_error(L, "attempt to use invalid screen");
|
||
|
return *pscreen;
|
||
|
}
|
||
|
|
||
|
SCREEN** luacurses_newscreen(lua_State* L)
|
||
|
{
|
||
|
SCREEN** pscreen = (SCREEN**) lua_newuserdata(L, sizeof(SCREEN*));
|
||
|
*pscreen = 0;
|
||
|
luaL_getmetatable(L, MKLUALIB_META_CURSES_SCREEN);
|
||
|
lua_setmetatable(L, -2);
|
||
|
return pscreen;
|
||
|
}
|
||
|
|
||
|
void luacurses_regscreen(lua_State* L, const char* name, SCREEN* userdata)
|
||
|
{
|
||
|
lua_pushstring(L, name);
|
||
|
SCREEN** pscreen = luacurses_newscreen(L);
|
||
|
*pscreen = userdata;
|
||
|
lua_settable(L, -3);
|
||
|
}
|
||
|
|
||
|
WINDOW* luacurses_towindow(lua_State* L, int index)
|
||
|
{
|
||
|
WINDOW** pwindow = (WINDOW**) luaL_checkudata(L, index, MKLUALIB_META_CURSES_WINDOW);
|
||
|
if (!pwindow) luaL_argerror(L, index, "bad window");
|
||
|
if (!*pwindow) luaL_error(L, "attempt to use invalid window");
|
||
|
return *pwindow;
|
||
|
}
|
||
|
|
||
|
WINDOW** luacurses_newwindow(lua_State* L)
|
||
|
{
|
||
|
WINDOW** pwindow = (WINDOW**) lua_newuserdata(L, sizeof(WINDOW*));
|
||
|
*pwindow = 0;
|
||
|
luaL_getmetatable(L, MKLUALIB_META_CURSES_WINDOW);
|
||
|
lua_setmetatable(L, -2);
|
||
|
return pwindow;
|
||
|
}
|
||
|
|
||
|
void luacurses_regwindow(lua_State* L, const char* name, WINDOW* userdata)
|
||
|
{
|
||
|
lua_pushstring(L, name);
|
||
|
WINDOW** pwindow = luacurses_newwindow(L);
|
||
|
*pwindow = userdata;
|
||
|
lua_settable(L, -3);
|
||
|
}
|
||
|
|
||
|
FILE* tofile(lua_State* L, int index)
|
||
|
{
|
||
|
FILE** pf = (FILE**) luaL_checkudata(L, index, MKLUALIB_META_CURSES_FILE);
|
||
|
if (!pf) luaL_argerror(L, index, "bad file");
|
||
|
if (!*pf) luaL_error(L, "attempt to use invalid file");
|
||
|
return *pf;
|
||
|
}
|
||
|
|
||
|
FILE** newfile(lua_State* L)
|
||
|
{
|
||
|
FILE** pf = (FILE**) lua_newuserdata(L, sizeof(FILE*));
|
||
|
*pf = 0;
|
||
|
luaL_getmetatable(L, MKLUALIB_META_CURSES_FILE);
|
||
|
lua_setmetatable(L, -2);
|
||
|
return pf;
|
||
|
}
|
||
|
|
||
|
void luacurses_regfile(lua_State* L, const char* name, FILE* f)
|
||
|
{
|
||
|
lua_pushstring(L, name);
|
||
|
FILE** pf = newfile(L);
|
||
|
*pf = f;
|
||
|
lua_settable(L, -3);
|
||
|
}
|
||
|
|
||
|
char* luacurses_wgetnstr(WINDOW* w, int n)
|
||
|
{
|
||
|
char* s = (char*) malloc(n + 1);
|
||
|
wgetnstr(w, s, n);
|
||
|
return s;
|
||
|
}
|
||
|
|
||
|
char* luacurses_window_tostring(WINDOW* w)
|
||
|
{
|
||
|
char* buf = (char*) malloc(64);
|
||
|
sprintf(buf, "window %p", w);
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
char* luacurses_screen_tostring(SCREEN* s)
|
||
|
{
|
||
|
char* buf = (char*) malloc(64);
|
||
|
sprintf(buf, "screen %p", s);
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
bool luacurses_getmouse(short* id, int* x, int* y, int* z, mmask_t* bstate)
|
||
|
{
|
||
|
MEVENT e;
|
||
|
int res = getmouse(&e);
|
||
|
|
||
|
*id = e.id;
|
||
|
*x = e.x;
|
||
|
*y = e.y;
|
||
|
*z = e.z;
|
||
|
*bstate = e.bstate;
|
||
|
return (res == OK);
|
||
|
}
|
||
|
|
||
|
bool luacurses_ungetmouse (short id, int x, int y, int z, mmask_t bstate)
|
||
|
{
|
||
|
MEVENT e;
|
||
|
e.id = id;
|
||
|
e.x = x;
|
||
|
e.y = y;
|
||
|
e.z = z;
|
||
|
e.bstate = bstate;
|
||
|
return (ungetmouse(&e) == OK);
|
||
|
}
|
||
|
|
||
|
mmask_t luacurses_addmousemask(mmask_t m)
|
||
|
{
|
||
|
mmask_t old;
|
||
|
mousemask(m, &old);
|
||
|
return mousemask(old | m, 0);
|
||
|
}
|
||
|
|