aboutsummaryrefslogtreecommitdiffstats
path: root/window_wait_event.c
diff options
context:
space:
mode:
authorTomasz Kramkowski <tk@the-tk.com>2021-02-11 12:15:12 +0000
committerTomasz Kramkowski <tk@the-tk.com>2021-02-11 14:25:14 +0000
commitbb97e8aaa15217afe1f3fcdc93662ab03b8ae9d9 (patch)
tree64fa5b5ba419e72bc6acaddadbc51c73646295fa /window_wait_event.c
downloadluiml-bb97e8aaa15217afe1f3fcdc93662ab03b8ae9d9.tar.gz
luiml-bb97e8aaa15217afe1f3fcdc93662ab03b8ae9d9.tar.xz
luiml-bb97e8aaa15217afe1f3fcdc93662ab03b8ae9d9.zip
init commit
Diffstat (limited to 'window_wait_event.c')
-rw-r--r--window_wait_event.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/window_wait_event.c b/window_wait_event.c
new file mode 100644
index 0000000..9c06d72
--- /dev/null
+++ b/window_wait_event.c
@@ -0,0 +1,102 @@
+#include "xlua.h"
+
+/* window:wait_event() -> event, data */
+static int wait_event(lua_State *L)
+{
+ static const struct key mousebutton_keys[] = {
+ KEY_STR(button, VT_STRING),
+ KEY_STR(down, VT_BOOLEAN),
+ KEY_STR(x, VT_NUMBER),
+ KEY_STR(y, VT_NUMBER),
+ KEY_END,
+ };
+ static const struct key mousemotion_keys[] = {
+ KEY_STR(x, VT_NUMBER),
+ KEY_STR(y, VT_NUMBER),
+ KEY_STR(xrel, VT_NUMBER),
+ KEY_STR(yrel, VT_NUMBER),
+ KEY_END,
+ };
+ static const struct key key_keys[] = {
+ KEY_STR(down, VT_BOOLEAN),
+ KEY_STR(repeat, VT_BOOLEAN),
+ KEY_END,
+ };
+ static const struct key keysym_keys[] = {
+ KEY_STR(scancode, VT_STRING),
+ KEY_STR(sym, VT_STRING),
+ KEY_END,
+ };
+ struct window *w;
+ SDL_Event e;
+
+ w = luaL_checkudata(L, 1, UD_WINDOW);
+
+ while (1) {
+ if (SDL_WaitEvent(&e) == 0) return sdl_error(L, "SDL_WaitEvent");
+
+ switch (e.type) {
+ case SDL_QUIT:
+ lua_pushstring(L, "QUIT");
+ lua_pushnil(L);
+ break;
+ case SDL_WINDOWEVENT:
+ if (e.window.event != SDL_WINDOWEVENT_EXPOSED)
+ continue;
+ lua_pushstring(L, "REDRAW");
+ lua_pushnil(L);
+ break;
+ case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP:
+ lua_pushstring(L, "MOUSEBUTTON");
+ pushtable(L, mousebutton_keys,
+ strbutton(e.button.button),
+ e.button.state == SDL_PRESSED,
+ (lua_Number)e.button.x,
+ (lua_Number)e.button.y);
+ break;
+ case SDL_MOUSEMOTION:
+ lua_pushstring(L, "MOUSEMOTION");
+ pushtable(L, mousemotion_keys,
+ (lua_Number)e.motion.x,
+ (lua_Number)e.motion.y,
+ (lua_Number)e.motion.xrel,
+ (lua_Number)e.motion.yrel);
+ lua_pushstring(L, "state");
+ lua_createtable(L, 0, 5);
+ pushsetmember(L, -1, "LEFT", e.motion.state & SDL_BUTTON_LMASK);
+ pushsetmember(L, -1, "MIDDLE", e.motion.state & SDL_BUTTON_MMASK);
+ pushsetmember(L, -1, "RIGHT", e.motion.state & SDL_BUTTON_RMASK);
+ pushsetmember(L, -1, "X1", e.motion.state & SDL_BUTTON_X1MASK);
+ pushsetmember(L, -1, "X2", e.motion.state & SDL_BUTTON_X2MASK);
+ lua_settable(L, -3);
+ break;
+ case SDL_KEYDOWN: case SDL_KEYUP:
+ lua_pushstring(L, "KEY");
+ pushtable(L, key_keys,
+ e.key.state == SDL_PRESSED,
+ e.key.repeat);
+ lua_pushstring(L, "keysym");
+ pushtable(L, keysym_keys,
+ strscancode(e.key.keysym.scancode),
+ strsym(e.key.keysym.sym));
+ lua_pushstring(L, "mod");
+ lua_createtable(L, 0, 11);
+ pushsetmember(L, -1, "LSHIFT", e.key.keysym.mod & KMOD_LSHIFT);
+ pushsetmember(L, -1, "RSHIFT", e.key.keysym.mod & KMOD_RSHIFT);
+ pushsetmember(L, -1, "LCTRL", e.key.keysym.mod & KMOD_LCTRL);
+ pushsetmember(L, -1, "RCTRL", e.key.keysym.mod & KMOD_RCTRL);
+ pushsetmember(L, -1, "LALT", e.key.keysym.mod & KMOD_LALT);
+ pushsetmember(L, -1, "RALT", e.key.keysym.mod & KMOD_RALT);
+ pushsetmember(L, -1, "LGUI", e.key.keysym.mod & KMOD_LGUI);
+ pushsetmember(L, -1, "RGUI", e.key.keysym.mod & KMOD_RGUI);
+ pushsetmember(L, -1, "NUM", e.key.keysym.mod & KMOD_NUM);
+ pushsetmember(L, -1, "CAPS", e.key.keysym.mod & KMOD_CAPS);
+ pushsetmember(L, -1, "MODE", e.key.keysym.mod & KMOD_MODE);
+ lua_settable(L, -3);
+ lua_settable(L, -3);
+ break;
+ default: continue;
+ }
+ return 2;
+ }
+}