diff --git a/src/cat/LegacyLuaAPI.cpp b/src/cat/LegacyLuaAPI.cpp index df019fa7d..75b67806b 100644 --- a/src/cat/LegacyLuaAPI.cpp +++ b/src/cat/LegacyLuaAPI.cpp @@ -489,86 +489,162 @@ int luacon_elementwrite(lua_State* l){ return 0; } bool shortcuts = true; -int luacon_keyevent(int key, int modifier, int event){ - int i = 0, kpcontinue = 1, callret; - char tempkey[] = {key, 0}; - if(keypress_function_count){ - for(i = 0; i < keypress_function_count && kpcontinue; i++){ - lua_rawgeti(luacon_ci->l, LUA_REGISTRYINDEX, keypress_functions[i]); - lua_pushstring(luacon_ci->l, tempkey); - lua_pushinteger(luacon_ci->l, key); - lua_pushinteger(luacon_ci->l, modifier); - lua_pushinteger(luacon_ci->l, event); - callret = lua_pcall(luacon_ci->l, 4, 1, 0); - if (callret) +int luacon_keyevent(int key, int modifier, int event) +{ + int kycontinue = 1, i, j, callret; + lua_State* l=luacon_ci->l; + lua_pushstring(l, "keyfunctions"); + lua_rawget(l, LUA_REGISTRYINDEX); + if(!lua_istable(l, -1)) + { + lua_pop(l, 1); + lua_newtable(l); + lua_pushstring(l, "keyfunctions"); + lua_pushvalue(l, -2); + lua_rawset(l, LUA_REGISTRYINDEX); + } + int c=lua_objlen(l, -1); + for(i=1;i<=c && kycontinue;i++) + { + lua_rawgeti(l, -1, i); + lua_pushlstring(l, (const char*)&key, 1); + lua_pushinteger(l, key); + lua_pushinteger(l, modifier); + lua_pushinteger(l, event); + callret = lua_pcall(l, 4, 1, 0); + if (callret) + { + if (!strcmp(luaL_optstring(l, -1, ""), "Error: Script not responding")) { - luacon_ci->Log(CommandInterface::LogError, luacon_geterror()); + ui::Engine::Ref().LastTick(clock()); + for(j=i;j<=c-1;j++) + { + lua_rawgeti(l, -2, j+1); + lua_rawseti(l, -3, j); + } + lua_pushnil(l); + lua_rawseti(l, -3, c); + c--; + i--; } - if(lua_isboolean(luacon_ci->l, -1)){ - kpcontinue = lua_toboolean(luacon_ci->l, -1); - } - lua_pop(luacon_ci->l, 1); + lua_pop(l, 1); + luacon_ci->Log(CommandInterface::LogError, luacon_geterror()); + } + else + { + if(!lua_isnoneornil(l, -1)) + kycontinue = lua_toboolean(l, -1); + lua_pop(l, 1); } } - return kpcontinue && shortcuts; + lua_pop(l, 1); + return kycontinue && shortcuts; } -int luacon_mouseevent(int mx, int my, int mb, int event, int mouse_wheel){ - int i = 0, mpcontinue = 1, callret; - if(mouseclick_function_count){ - for(i = 0; i < mouseclick_function_count && mpcontinue; i++){ - lua_rawgeti(luacon_ci->l, LUA_REGISTRYINDEX, mouseclick_functions[i]); - lua_pushinteger(luacon_ci->l, mx); - lua_pushinteger(luacon_ci->l, my); - lua_pushinteger(luacon_ci->l, mb); - lua_pushinteger(luacon_ci->l, event); - lua_pushinteger(luacon_ci->l, mouse_wheel); - callret = lua_pcall(luacon_ci->l, 5, 1, 0); - if (callret) +int luacon_mouseevent(int mx, int my, int mb, int event, int mouse_wheel) +{ + int mpcontinue = 1, i, j, callret; + lua_State* l=luacon_ci->l; + lua_pushstring(l, "mousefunctions"); + lua_rawget(l, LUA_REGISTRYINDEX); + if(!lua_istable(l, -1)) + { + lua_pop(l, 1); + lua_newtable(l); + lua_pushstring(l, "mousefunctions"); + lua_pushvalue(l, -2); + lua_rawset(l, LUA_REGISTRYINDEX); + } + int c=lua_objlen(l, -1); + for(i=1;i<=c && mpcontinue;i++) + { + lua_rawgeti(l, -1, i); + lua_pushinteger(l, mx); + lua_pushinteger(l, my); + lua_pushinteger(l, mb); + lua_pushinteger(l, event); + lua_pushinteger(l, mouse_wheel); + callret = lua_pcall(l, 5, 1, 0); + if (callret) + { + if (!strcmp(luaL_optstring(l, -1, ""), "Error: Script not responding")) { - luacon_ci->Log(CommandInterface::LogError, luacon_geterror()); + ui::Engine::Ref().LastTick(clock()); + for(j=i;j<=c-1;j++) + { + lua_rawgeti(l, -2, j+1); + lua_rawseti(l, -3, j); + } + lua_pushnil(l); + lua_rawseti(l, -3, c); + c--; + i--; } - if(lua_isboolean(luacon_ci->l, -1)){ - mpcontinue = lua_toboolean(luacon_ci->l, -1); - } - lua_pop(luacon_ci->l, 1); + luacon_ci->Log(CommandInterface::LogError, luaL_optstring(l, -1, "")); + lua_pop(l, 1); + } + else + { + if(!lua_isnoneornil(l, -1)) + mpcontinue = lua_toboolean(l, -1); + lua_pop(l, 1); } } + lua_pop(l, 1); return mpcontinue; } - -int luacon_step(int mx, int my, std::string selectl, std::string selectr, std::string selectalt, int bsx, int bsy){ - int tempret = 0, tempb, i, callret; - lua_pushinteger(luacon_ci->l, bsy); - lua_pushinteger(luacon_ci->l, bsx); - lua_pushstring(luacon_ci->l, selectalt.c_str()); - lua_pushstring(luacon_ci->l, selectr.c_str()); - lua_pushstring(luacon_ci->l, selectl.c_str()); - lua_pushinteger(luacon_ci->l, my); - lua_pushinteger(luacon_ci->l, mx); - lua_setfield(luacon_ci->l, tptProperties, "mousex"); - lua_setfield(luacon_ci->l, tptProperties, "mousey"); - lua_setfield(luacon_ci->l, tptProperties, "selectedl"); - lua_setfield(luacon_ci->l, tptProperties, "selectedr"); - lua_setfield(luacon_ci->l, tptProperties, "selecteda"); - lua_setfield(luacon_ci->l, tptProperties, "brushx"); - lua_setfield(luacon_ci->l, tptProperties, "brushy"); - for(i = 0; i<6; i++){ - if(step_functions[i]){ - lua_rawgeti(luacon_ci->l, LUA_REGISTRYINDEX, step_functions[i]); - callret = lua_pcall(luacon_ci->l, 0, 0, 0); - if (callret) +int luacon_step(int mx, int my, std::string selectl, std::string selectr, std::string selectalt, int bsx, int bsy) +{ + int i, j, callret; + lua_State* l=luacon_ci->l; + lua_pushinteger(l, bsy); + lua_pushinteger(l, bsx); + lua_pushstring(l, selectalt.c_str()); + lua_pushstring(l, selectr.c_str()); + lua_pushstring(l, selectl.c_str()); + lua_pushinteger(l, my); + lua_pushinteger(l, mx); + lua_setfield(l, tptProperties, "mousex"); + lua_setfield(l, tptProperties, "mousey"); + lua_setfield(l, tptProperties, "selectedl"); + lua_setfield(l, tptProperties, "selectedr"); + lua_setfield(l, tptProperties, "selecteda"); + lua_setfield(l, tptProperties, "brushx"); + lua_setfield(l, tptProperties, "brushy"); + lua_pushstring(l, "stepfunctions"); + lua_rawget(l, LUA_REGISTRYINDEX); + if(!lua_istable(l, -1)) + { + lua_pop(l, 1); + lua_newtable(l); + lua_pushstring(l, "stepfunctions"); + lua_pushvalue(l, -2); + lua_rawset(l, LUA_REGISTRYINDEX); + } + int c=lua_objlen(l, -1); + for(i=1;i<=c;i++) + { + lua_rawgeti(l, -1, i); + callret = lua_pcall(l, 0, 0, 0); + if (callret) + { + if (!strcmp(luaL_optstring(l, -1, ""), "Error: Script not responding")) { - if (!strcmp(luacon_geterror(),"Error: Script not responding")) + ui::Engine::Ref().LastTick(clock()); + for(j=i;j<=c-1;j++) { - ui::Engine::Ref().LastTick(clock()); - lua_pushcfunction(luacon_ci->l, &luatpt_unregister_step); - lua_rawgeti(luacon_ci->l, LUA_REGISTRYINDEX, step_functions[i]); - lua_pcall(luacon_ci->l, 1, 0, 0); + lua_rawgeti(l, -2, j+1); + lua_rawseti(l, -3, j); } - luacon_ci->Log(CommandInterface::LogError, luacon_geterror()); + lua_pushnil(l); + lua_rawseti(l, -3, c); + c--; + i--; } + luacon_ci->Log(CommandInterface::LogError, luaL_optstring(l, -1, "")); + lua_pop(l, 1); } } + lua_pop(l, 1); return 0; } @@ -699,20 +775,24 @@ int luacon_graphicsReplacement(GRAPHICS_FUNC_ARGS, int i) lua_pushinteger(luacon_ci->l, *colb); callret = lua_pcall(luacon_ci->l, 4, 10, 0); if (callret) - luacon_ci->Log(CommandInterface::LogError, luacon_geterror()); - - cache = luaL_optint(luacon_ci->l, -10, 0); - *pixel_mode = luaL_optint(luacon_ci->l, -9, *pixel_mode); - *cola = luaL_optint(luacon_ci->l, -8, *cola); - *colr = luaL_optint(luacon_ci->l, -7, *colr); - *colg = luaL_optint(luacon_ci->l, -6, *colg); - *colb = luaL_optint(luacon_ci->l, -5, *colb); - *firea = luaL_optint(luacon_ci->l, -4, *firea); - *firer = luaL_optint(luacon_ci->l, -3, *firer); - *fireg = luaL_optint(luacon_ci->l, -2, *fireg); - *fireb = luaL_optint(luacon_ci->l, -1, *fireb); - lua_pop(luacon_ci->l, 10); - + { + luacon_ci->Log(CommandInterface::LogError, luaL_optstring(luacon_ci->l, -1, "")); + lua_pop(luacon_ci->l, 1); + } + else + { + cache = luaL_optint(luacon_ci->l, -10, 0); + *pixel_mode = luaL_optint(luacon_ci->l, -9, *pixel_mode); + *cola = luaL_optint(luacon_ci->l, -8, *cola); + *colr = luaL_optint(luacon_ci->l, -7, *colr); + *colg = luaL_optint(luacon_ci->l, -6, *colg); + *colb = luaL_optint(luacon_ci->l, -5, *colb); + *firea = luaL_optint(luacon_ci->l, -4, *firea); + *firer = luaL_optint(luacon_ci->l, -3, *firer); + *fireg = luaL_optint(luacon_ci->l, -2, *fireg); + *fireb = luaL_optint(luacon_ci->l, -1, *fireb); + lua_pop(luacon_ci->l, 10); + } return cache; } @@ -843,22 +923,44 @@ int luatpt_setconsole(lua_State* l) luacon_controller->HideConsole(); return 0; } - +static int luaL_tostring (lua_State *L, int n) { + luaL_checkany(L, n); + switch (lua_type(L, n)) { + case LUA_TNUMBER: + lua_pushstring(L, lua_tostring(L, n)); + break; + case LUA_TSTRING: + lua_pushvalue(L, n); + break; + case LUA_TBOOLEAN: + lua_pushstring(L, (lua_toboolean(L, n) ? "true" : "false")); + break; + case LUA_TNIL: + lua_pushliteral(L, "nil"); + break; + default: + lua_pushfstring(L, "%s: %p", luaL_typename(L, n), lua_topointer(L, n)); + break; + } + return 1; +} int luatpt_log(lua_State* l) { int args = lua_gettop(l); + std::string text = ""; for(int i = 1; i <= args; i++) { - if((*luacon_currentCommand)) - { - if(!(*luacon_lastError).length()) - (*luacon_lastError) = luaL_optstring(l, i, ""); - else - (*luacon_lastError) += ", " + std::string(luaL_optstring(l, i, "")); - } + luaL_tostring(l, -1); + if(text.length()) + text=std::string(luaL_optstring(l, -1, "")) + ", " + text; else - luacon_ci->Log(CommandInterface::LogNotice, luaL_optstring(l, i, "")); + text=std::string(luaL_optstring(l, -1, "")); + lua_pop(l, 2); } + if((*luacon_currentCommand)) + (*luacon_lastError) = text; + else + luacon_ci->Log(CommandInterface::LogNotice, text.c_str()); return 0; } @@ -1463,155 +1565,157 @@ int luatpt_delete(lua_State* l) int luatpt_register_step(lua_State* l) { - int ref, i, ifree = -1; - if(lua_isfunction(l, 1)){ - for(i = 0; i<6; i++){ - if(!step_functions[i]){ - if (ifree<0) ifree = i; - } else { - lua_rawgeti(l, LUA_REGISTRYINDEX, step_functions[i]); - if(lua_equal(l, 1, lua_gettop(l))){ - lua_pop(l, 1); - return luaL_error(l, "Function already registered"); - } - lua_pop(l, 1); - } - } - if (ifree>=0) + if(lua_isfunction(l, 1)) + { + lua_pushstring(l, "stepfunctions"); + lua_rawget(l, LUA_REGISTRYINDEX); + if(!lua_istable(l, -1)) { - ref = luaL_ref(l, LUA_REGISTRYINDEX); - step_functions[ifree] = ref; - return 0; + lua_pop(l, 1); + lua_newtable(l); + lua_pushstring(l, "stepfunctions"); + lua_pushvalue(l, -2); + lua_rawset(l, LUA_REGISTRYINDEX); } - else return luaL_error(l, "Step function limit reached"); + int c = lua_objlen(l, -1); + lua_pushvalue(l, 1); + lua_rawseti(l, -2, c+1); } return 0; } int luatpt_unregister_step(lua_State* l) { - int i; - if(lua_isfunction(l, 1)){ - for(i = 0; i<6; i++){ - if (step_functions[i]){ - lua_rawgeti(l, LUA_REGISTRYINDEX, step_functions[i]); - if(lua_equal(l, 1, lua_gettop(l))){ - lua_pop(l, 1); - luaL_unref(l, LUA_REGISTRYINDEX, step_functions[i]); - step_functions[i] = 0; - } - else lua_pop(l, 1); + if(lua_isfunction(l, 1)) + { + lua_pushstring(l, "stepfunctions"); + lua_rawget(l, LUA_REGISTRYINDEX); + if(!lua_istable(l, -1)) + { + lua_pop(l, -1); + lua_newtable(l); + lua_pushstring(l, "stepfunctions"); + lua_pushvalue(l, -2); + lua_rawset(l, LUA_REGISTRYINDEX); + } + int c = lua_objlen(l, -1); + int d = 0; + int i = 0; + for(i=1;i<=c;i++) + { + lua_rawgeti(l, -1, i+d); + if(lua_equal(l, 1, -1)) + { + lua_pop(l, 1); + d++; + i--; } + else + lua_rawseti(l, -2, i); } } return 0; } int luatpt_register_keypress(lua_State* l) { - int *newfunctions, i; - if(lua_isfunction(l, 1)){ - for(i = 0; i 0){ - newfunctions = (int*)calloc(keypress_function_count-1, sizeof(int)); - memcpy(newfunctions, keypress_functions, (keypress_function_count-1)*sizeof(int)); - free(keypress_functions); - keypress_functions = newfunctions; - } else { - free(keypress_functions); - keypress_functions = NULL; - } - keypress_function_count--; - } else { - return luaL_error(l, "Function not registered"); } return 0; } int luatpt_register_mouseclick(lua_State* l) { - int *newfunctions, i; - if(lua_isfunction(l, 1)){ - for(i = 0; i 0){ - newfunctions = (int*)calloc(mouseclick_function_count-1, sizeof(int)); - memcpy(newfunctions, mouseclick_functions, (mouseclick_function_count-1)*sizeof(int)); - free(mouseclick_functions); - mouseclick_functions = newfunctions; - } else { - free(mouseclick_functions); - mouseclick_functions = NULL; - } - mouseclick_function_count--; - } else { - return luaL_error(l, "Function not registered"); } return 0; } diff --git a/src/cat/LuaScriptHelper.h b/src/cat/LuaScriptHelper.h index 860d919ea..fde1eb4a1 100644 --- a/src/cat/LuaScriptHelper.h +++ b/src/cat/LuaScriptHelper.h @@ -14,11 +14,6 @@ extern std::string *luacon_lastError; extern int *lua_el_func, *lua_el_mode, *lua_gr_func; extern int getPartIndex_curIdx; -extern int step_functions[6];//[6] = {0, 0, 0, 0, 0, 0}; -extern int keypress_function_count;// = 0; -extern int *keypress_functions;// = NULL; -extern int mouseclick_function_count;// = 0; -extern int *mouseclick_functions;// = NULL; extern int tptProperties; //Table for some TPT properties extern int tptPropertiesVersion; extern int tptElements; //Table for TPT element names diff --git a/src/cat/LuaScriptInterface.cpp b/src/cat/LuaScriptInterface.cpp index 7719add79..74757e5d3 100644 --- a/src/cat/LuaScriptInterface.cpp +++ b/src/cat/LuaScriptInterface.cpp @@ -61,11 +61,6 @@ std::string *luacon_lastError; int *lua_el_func, *lua_el_mode, *lua_gr_func; int getPartIndex_curIdx; -int step_functions[6] = {0, 0, 0, 0, 0, 0}; -int keypress_function_count = 0; -int *keypress_functions = NULL; -int mouseclick_function_count = 0; -int *mouseclick_functions = NULL; int tptProperties; //Table for some TPT properties int tptPropertiesVersion; int tptElements; //Table for TPT element names