From 99b67598aa7400300d7e548bc5d0293f09632c25 Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Sat, 20 Aug 2011 18:18:09 +0100 Subject: [PATCH] Changes to unify mouse and keyboard events for Lua --- includes/interface.h | 2 +- includes/luaconsole.h | 10 ++++++++-- src/interface.c | 5 +++-- src/luaconsole.c | 23 ++++++++++++++--------- src/main.c | 24 +++++++++++++++++++----- 5 files changed, 45 insertions(+), 19 deletions(-) diff --git a/includes/interface.h b/includes/interface.h index aff63e4e8..eac295dbc 100644 --- a/includes/interface.h +++ b/includes/interface.h @@ -132,7 +132,7 @@ typedef struct ui_richtext ui_richtext; int SLALT; extern SDLMod sdl_mod; -extern int sdl_key, sdl_wheel, sdl_caps, sdl_ascii, sdl_zoom_trig; +extern int sdl_key, sdl_rkey, sdl_wheel, sdl_caps, sdl_ascii, sdl_zoom_trig; #if (defined(LIN32) || defined(LIN64)) && defined(SDL_VIDEO_DRIVER_X11) extern SDL_SysWMinfo sdl_wminfo; extern Atom XA_CLIPBOARD, XA_TARGETS; diff --git a/includes/luaconsole.h b/includes/luaconsole.h index 036327ae7..5a5ca2b06 100644 --- a/includes/luaconsole.h +++ b/includes/luaconsole.h @@ -11,10 +11,16 @@ #endif #include +#define LUACON_MDOWN 1 +#define LUACON_MUP 2 +#define LUACON_MPRESS 3 +#define LUACON_KDOWN 1 +#define LUACON_KUP 2 + void luacon_open(); int luacon_step(int mx, int my); -int luacon_mouseclick(int mx, int my, int mb, int mbq); -int luacon_keypress(char key, int modifier); +int luacon_mouseevent(int mx, int my, int mb, int event); +int luacon_keyevent(char key, int modifier, int event); int luacon_eval(char *command); char *luacon_geterror(); void luacon_close(); diff --git a/src/interface.c b/src/interface.c index 5679a5fee..0b8a2d2fd 100644 --- a/src/interface.c +++ b/src/interface.c @@ -26,7 +26,7 @@ #endif SDLMod sdl_mod; -int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; +int sdl_key, sdl_rkey, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; #if (defined(LIN32) || defined(LIN64)) && defined(SDL_VIDEO_DRIVER_X11) SDL_SysWMinfo sdl_wminfo; Atom XA_CLIPBOARD, XA_TARGETS; @@ -2206,7 +2206,7 @@ int color_menu_ui(pixel *vid_buf, int i, int *cr, int *cg, int *cb, int b, int b int sdl_poll(void) { SDL_Event event; - sdl_key=sdl_wheel=sdl_ascii=0; + sdl_key=sdl_rkey=sdl_wheel=sdl_ascii=0; while (SDL_PollEvent(&event)) { switch (event.type) @@ -2266,6 +2266,7 @@ int sdl_poll(void) break; case SDL_KEYUP: + sdl_rkey=event.key.keysym.sym; if (event.key.keysym.sym == SDLK_CAPSLOCK) sdl_caps = 0; if (event.key.keysym.sym == 'z') diff --git a/src/luaconsole.c b/src/luaconsole.c index 186764d3e..1376252c4 100644 --- a/src/luaconsole.c +++ b/src/luaconsole.c @@ -39,6 +39,10 @@ void luacon_open(){ {"unregister_mouseclick", &luatpt_unregister_mouseclick}, {"register_keypress", &luatpt_register_keypress}, {"unregister_keypress", &luatpt_unregister_keypress}, + {"register_mouseevent", &luatpt_register_mouseclick}, + {"unregister_mouseevent", &luatpt_unregister_mouseclick}, + {"register_keyevent", &luatpt_register_keypress}, + {"unregister_keyevent", &luatpt_unregister_keypress}, {"input", &luatpt_input}, {"message_box", &luatpt_message_box}, {"get_numOfParts", &luatpt_get_numOfParts}, @@ -70,7 +74,7 @@ void luacon_open(){ lua_pushinteger(l, 0); lua_setfield(l, tptProperties, "mousey"); } -int luacon_keypress(char key, int modifier){ +int luacon_keyevent(char key, int modifier, int event){ int i = 0, kpcontinue = 1; if(keypress_function_count){ for(i = 0; i < keypress_function_count && kpcontinue; i++){ @@ -78,7 +82,8 @@ int luacon_keypress(char key, int modifier){ lua_pushstring(l, &key); lua_pushinteger(l, key); lua_pushinteger(l, modifier); - lua_pcall(l, 3, 1, 0); + lua_pushinteger(l, event); + lua_pcall(l, 4, 1, 0); if(lua_isboolean(l, -1)){ kpcontinue = lua_toboolean(l, -1); } @@ -87,15 +92,15 @@ int luacon_keypress(char key, int modifier){ } return kpcontinue; } -int luacon_mouseclick(int mx, int my, int mb, int mbq){ +int luacon_mouseevent(int mx, int my, int mb, int event){ int i = 0, mpcontinue = 1; if(mouseclick_function_count){ for(i = 0; i < mouseclick_function_count && mpcontinue; i++){ lua_rawgeti(l, LUA_REGISTRYINDEX, mouseclick_functions[i]); - lua_pushinteger(l, mbq); - lua_pushinteger(l, mb); lua_pushinteger(l, mx); lua_pushinteger(l, my); + lua_pushinteger(l, mb); + lua_pushinteger(l, event); lua_pcall(l, 4, 1, 0); if(lua_isboolean(l, -1)){ mpcontinue = lua_toboolean(l, -1); @@ -107,12 +112,12 @@ int luacon_mouseclick(int mx, int my, int mb, int mbq){ } int luacon_step(int mx, int my){ int tempret = 0, tempb, i, callret; + lua_pushinteger(l, my); + lua_pushinteger(l, mx); + lua_setfield(l, tptProperties, "mousex"); + lua_setfield(l, tptProperties, "mousey"); if(step_functions[0]){ //Set mouse globals - lua_pushinteger(l, my); - lua_pushinteger(l, mx); - lua_setfield(l, tptProperties, "mousex"); - lua_setfield(l, tptProperties, "mousey"); for(i = 0; i<6; i++){ if(step_functions[i]){ lua_rawgeti(l, LUA_REGISTRYINDEX, step_functions[i]); diff --git a/src/main.c b/src/main.c index 6de8abe20..e92c0a77f 100644 --- a/src/main.c +++ b/src/main.c @@ -1576,7 +1576,7 @@ int main(int argc, char *argv[]) void *http_ver_check, *http_session_check = NULL; char *ver_data=NULL, *check_data=NULL, *tmp; //char console_error[255] = ""; - int result, i, j, bq, fire_fc=0, do_check=0, do_s_check=0, old_version=0, http_ret=0,http_s_ret=0, major, minor, old_ver_len, new_message_len=0; + int result, i, j, bq, bc, fire_fc=0, do_check=0, do_s_check=0, old_version=0, http_ret=0,http_s_ret=0, major, minor, old_ver_len, new_message_len=0; #ifdef INTERNAL int vs = 0; #endif @@ -2003,9 +2003,13 @@ int main(int argc, char *argv[]) } #ifdef LUACONSOLE if(sdl_key){ - if(!luacon_keypress(sdl_key, sdl_mod)) + if(!luacon_keyevent(sdl_key, sdl_mod, LUACON_KDOWN)) sdl_key = 0; } + if(sdl_rkey){ + if(!luacon_keyevent(sdl_rkey, sdl_mod, LUACON_KUP)) + sdl_rkey = 0; + } #endif #ifdef PYCONSOLE if(sdl_key){ @@ -2515,11 +2519,21 @@ int main(int argc, char *argv[]) } bq = b; // bq is previous mouse state - b = SDL_GetMouseState(&x, &y); // b is current mouse state + bc = b = SDL_GetMouseState(&x, &y); // b is current mouse state #ifdef LUACONSOLE - if(b){ - if(!luacon_mouseclick(x/sdl_scale, y/sdl_scale, b, bq)){ + if(bc && bq){ + if(!luacon_mouseevent(x/sdl_scale, y/sdl_scale, bc, LUACON_MPRESS)){ + b = 0; + } + } + else if(bc && !bq){ + if(!luacon_mouseevent(x/sdl_scale, y/sdl_scale, bc, LUACON_MDOWN)){ + b = 0; + } + } + else if(!bc && bq){ + if(!luacon_mouseevent(x/sdl_scale, y/sdl_scale, bq, LUACON_MUP)){ b = 0; } }