aboutsummaryrefslogtreecommitdiff
path: root/src/lua/modules/event/luaopen_event.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua/modules/event/luaopen_event.cpp')
-rw-r--r--src/lua/modules/event/luaopen_event.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/lua/modules/event/luaopen_event.cpp b/src/lua/modules/event/luaopen_event.cpp
new file mode 100644
index 0000000..af9f8fc
--- /dev/null
+++ b/src/lua/modules/event/luaopen_event.cpp
@@ -0,0 +1,106 @@
+/**
+* Event module
+*/
+#include "lua/modules/luax.h"
+#include "libjin/jin.h"
+
+namespace jin
+{
+namespace lua
+{
+
+ using namespace jin::input;
+
+ /**
+ * Load event poll, return a iterator(a table).
+ */
+ static int l_event_poll(lua_State *L)
+ {
+ // table to store events
+ luax_newtable(L);
+ static Event e;
+ int i = 1;
+ poll:
+ while (pollEvent(&e))
+ {
+ // each event is a table
+ luax_newtable(L);
+ switch (e.type)
+ {
+ case EventType::QUIT:
+ luax_setfield_string(L, "type", "quit");
+ break;
+
+ case EventType::KEY_DOWN:
+ luax_setfield_string(L, "type", "keydown");
+ luax_setfield_string(L, "key", getKeyName(e.key.keysym.sym));
+ break;
+
+ case EventType::KEY_UP:
+ luax_setfield_string(L, "type", "keyup");
+ luax_setfield_string(L, "key", getKeyName(e.key.keysym.sym));
+ break;
+
+ case EventType::MOUSE_MOTION:
+ luax_setfield_string(L, "type", "mousemotion");
+ luax_setfield_number(L, "x", e.motion.x);
+ luax_setfield_number(L, "y", e.motion.y);
+ break;
+
+ case EventType::MOUSE_BUTTON_DOWN:
+ luax_setfield_string(L, "type", "mousebuttondown");
+ luax_setfield_string(L, "button", getButtonName(e.button.button));
+ luax_setfield_number(L, "x", e.button.x);
+ luax_setfield_number(L, "y", e.button.y);
+ break;
+
+ case EventType::MOUSE_BUTTON_UP:
+ luax_setfield_string(L, "type", "mousebuttonup");
+ luax_setfield_string(L, "button", getButtonName(e.button.button));
+ luax_setfield_number(L, "x", e.button.x);
+ luax_setfield_number(L, "y", e.button.y);
+ break;
+
+ case EventType::MOUSE_WHEEL:
+ luax_setfield_string(L, "type", "wheel");
+ if(e.wheel.x == -1)
+ luax_setfield_string(L, "x", "left");
+ else if(e.wheel.x == 1)
+ luax_setfield_string(L, "x", "right");
+ else
+ luax_setfield_string(L, "x", "none");
+ if (e.wheel.y == -1)
+ luax_setfield_string(L, "y", "near");
+ else if (e.wheel.y == 1)
+ luax_setfield_string(L, "y", "far");
+ else
+ luax_setfield_string(L, "y", "none");
+ break;
+
+ default:
+ /* ignore other events */
+ luax_pop(L, 1); // pop table out
+ goto poll;
+ break;
+ }
+ luax_rawseti(L, -2, i++);
+ }
+ return 1;
+ }
+
+ static const luaL_Reg f[] = {
+ { "poll", l_event_poll },
+ { 0, 0 }
+ };
+
+ /**
+ * load event module
+ */
+ int luaopen_event(lua_State* L)
+ {
+ luax_newlib(L, f);
+ return 1;
+ }
+
+} // lua
+} // jin \ No newline at end of file