From bb97e8aaa15217afe1f3fcdc93662ab03b8ae9d9 Mon Sep 17 00:00:00 2001 From: Tomasz Kramkowski Date: Thu, 11 Feb 2021 12:15:12 +0000 Subject: init commit --- window_wait_event.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 window_wait_event.c (limited to 'window_wait_event.c') 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; + } +} -- cgit v1.2.3-54-g00ecf