summaryrefslogtreecommitdiffhomepage
path: root/contrib/luacurses/src/luacurses.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/luacurses/src/luacurses.c')
-rw-r--r--contrib/luacurses/src/luacurses.c137
1 files changed, 137 insertions, 0 deletions
diff --git a/contrib/luacurses/src/luacurses.c b/contrib/luacurses/src/luacurses.c
new file mode 100644
index 0000000000..0cbd2fe6a4
--- /dev/null
+++ b/contrib/luacurses/src/luacurses.c
@@ -0,0 +1,137 @@
+
+#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);
+}
+