Mouse and keyboard events, replace luaL_openlib() with luaL_register() and move mousex and mousey out of the global table and into the 'tpt' table

This commit is contained in:
Simon Robertshaw 2011-08-05 14:54:24 +01:00
parent 98b6c4b001
commit 4ebe56f65c
3 changed files with 185 additions and 26 deletions

View File

@ -12,8 +12,9 @@
#include <defines.h> #include <defines.h>
void luacon_open(); void luacon_open();
int luacon_step(int mx, int my, int mb, int mbq, char key); int luacon_step(int mx, int my);
int luacon_keypress(char key); int luacon_mouseclick(int mx, int my, int mb, int mbq);
int luacon_keypress(char key, int modifier);
int luacon_eval(char *command); int luacon_eval(char *command);
char *luacon_geterror(); char *luacon_geterror();
void luacon_close(); void luacon_close();
@ -45,6 +46,10 @@ int luatpt_set_shortcuts(lua_State* l);
int luatpt_delete(lua_State* l); int luatpt_delete(lua_State* l);
int luatpt_register_step(lua_State* l); int luatpt_register_step(lua_State* l);
int luatpt_unregister_step(lua_State* l); int luatpt_unregister_step(lua_State* l);
int luatpt_register_mouseclick(lua_State* l);
int luatpt_unregister_mouseclick(lua_State* l);
int luatpt_register_keypress(lua_State* l);
int luatpt_unregister_keypress(lua_State* l);
int luatpt_input(lua_State* l); int luatpt_input(lua_State* l);
int luatpt_message_box(lua_State* l); int luatpt_message_box(lua_State* l);
int luatpt_get_numOfParts(lua_State* l); int luatpt_get_numOfParts(lua_State* l);

View File

@ -5,6 +5,11 @@
lua_State *l; lua_State *l;
int step_functions[6] = {0, 0, 0, 0, 0, 0}; 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
void luacon_open(){ void luacon_open(){
const static struct luaL_reg tptluaapi [] = { const static struct luaL_reg tptluaapi [] = {
{"test", &luatpt_test}, {"test", &luatpt_test},
@ -30,6 +35,10 @@ void luacon_open(){
{"delete", &luatpt_delete}, {"delete", &luatpt_delete},
{"register_step", &luatpt_register_step}, {"register_step", &luatpt_register_step},
{"unregister_step", &luatpt_unregister_step}, {"unregister_step", &luatpt_unregister_step},
{"register_mouseclick", &luatpt_register_mouseclick},
{"unregister_mouseclick", &luatpt_unregister_mouseclick},
{"register_keypress", &luatpt_register_keypress},
{"unregister_keypress", &luatpt_unregister_keypress},
{"input", &luatpt_input}, {"input", &luatpt_input},
{"message_box", &luatpt_message_box}, {"message_box", &luatpt_message_box},
{"get_numOfParts", &luatpt_get_numOfParts}, {"get_numOfParts", &luatpt_get_numOfParts},
@ -49,38 +58,67 @@ void luacon_open(){
l = lua_open(); l = lua_open();
luaL_openlibs(l); luaL_openlibs(l);
luaL_openlib(l, "tpt", tptluaapi, 0); luaL_register(l, "tpt", tptluaapi);
tptProperties = lua_gettop(l);
lua_pushinteger(l, 0);
lua_setfield(l, tptProperties, "mousex");
lua_pushinteger(l, 0);
lua_setfield(l, tptProperties, "mousey");
} }
int luacon_step(int mx, int my, int mb, int mbq, char key){ int luacon_keypress(char key, int modifier){
int i = 0, kpcontinue = 1;
if(keypress_function_count){
for(i = 0; i < keypress_function_count && kpcontinue; i++){
lua_rawgeti(l, LUA_REGISTRYINDEX, keypress_functions[i]);
lua_pushstring(l, &key);
lua_pushinteger(l, key);
lua_pushinteger(l, modifier);
lua_pcall(l, 3, 1, 0);
if(lua_isboolean(l, -1)){
kpcontinue = lua_toboolean(l, -1);
}
lua_pop(l, 1);
}
}
return kpcontinue;
}
int luacon_mouseclick(int mx, int my, int mb, int mbq){
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_pcall(l, 4, 1, 0);
if(lua_isboolean(l, -1)){
mpcontinue = lua_toboolean(l, -1);
}
lua_pop(l, 1);
}
}
return mpcontinue;
}
int luacon_step(int mx, int my){
int tempret = 0, tempb, i, callret; int tempret = 0, tempb, i, callret;
if(step_functions[0]){ if(step_functions[0]){
//Set mouse globals //Set mouse globals
lua_pushinteger(l, mbq);
lua_pushinteger(l, mb);
lua_pushinteger(l, my); lua_pushinteger(l, my);
lua_pushinteger(l, mx); lua_pushinteger(l, mx);
lua_setfield(l, LUA_GLOBALSINDEX, "mousex"); lua_setfield(l, tptProperties, "mousex");
lua_setfield(l, LUA_GLOBALSINDEX, "mousey"); lua_setfield(l, tptProperties, "mousey");
lua_setfield(l, LUA_GLOBALSINDEX, "mouseb");
lua_setfield(l, LUA_GLOBALSINDEX, "mousebq");
for(i = 0; i<6; i++){ for(i = 0; i<6; i++){
if(step_functions[i]){ if(step_functions[i]){
lua_rawgeti(l, LUA_REGISTRYINDEX, step_functions[i]); lua_rawgeti(l, LUA_REGISTRYINDEX, step_functions[i]);
callret = lua_pcall(l, 0, 1, 0); callret = lua_pcall(l, 0, 0, 0);
if (callret) if (callret)
{ {
// failed, TODO: better error reporting // failed, TODO: better error reporting
printf("%s\n",luacon_geterror()); printf("%s\n",luacon_geterror());
} }
if(lua_isboolean(l, -1)){
tempb = lua_toboolean(l, -1);
if(tempb){ //Mouse click has been handled, set the global for future calls
lua_pushinteger(l, mb);
lua_setfield(l, LUA_GLOBALSINDEX, "mouseb");
}
tempret |= tempb;
}
lua_pop(l, 1);
} }
} }
return tempret; return tempret;
@ -748,6 +786,116 @@ int luatpt_unregister_step(lua_State* l)
} }
return 0; return 0;
} }
int luatpt_register_keypress(lua_State* l)
{
int *newfunctions, i;
if(lua_isfunction(l, 1)){
for(i = 0; i<keypress_function_count; i++){
lua_rawgeti(l, LUA_REGISTRYINDEX, keypress_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);
}
newfunctions = calloc(keypress_function_count+1, sizeof(int));
if(keypress_functions){
memcpy(newfunctions, keypress_functions, keypress_function_count*sizeof(int));
free(keypress_functions);
}
newfunctions[keypress_function_count] = luaL_ref(l, LUA_REGISTRYINDEX);
keypress_function_count++;
keypress_functions = newfunctions;
}
return 0;
}
int luatpt_unregister_keypress(lua_State* l)
{
int *newfunctions, i, functionindex = -1;
if(lua_isfunction(l, 1)){
for(i = 0; i<keypress_function_count; i++){
lua_rawgeti(l, LUA_REGISTRYINDEX, keypress_functions[i]);
if(lua_equal(l, 1, lua_gettop(l))){
functionindex = i;
}
lua_pop(l, 1);
}
}
if(functionindex != -1){
luaL_unref(l, LUA_REGISTRYINDEX, keypress_functions[functionindex]);
if(functionindex != keypress_function_count-1){
memmove(keypress_functions+functionindex+1, keypress_functions+functionindex+1, (keypress_function_count-functionindex-1)*sizeof(int));
}
if(keypress_function_count-1 > 0){
newfunctions = 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<mouseclick_function_count; i++){
lua_rawgeti(l, LUA_REGISTRYINDEX, mouseclick_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);
}
newfunctions = calloc(mouseclick_function_count+1, sizeof(int));
if(mouseclick_functions){
memcpy(newfunctions, mouseclick_functions, mouseclick_function_count*sizeof(int));
free(mouseclick_functions);
}
newfunctions[mouseclick_function_count] = luaL_ref(l, LUA_REGISTRYINDEX);
mouseclick_function_count++;
mouseclick_functions = newfunctions;
}
return 0;
}
int luatpt_unregister_mouseclick(lua_State* l)
{
int *newfunctions, i, functionindex = -1;
if(lua_isfunction(l, 1)){
for(i = 0; i<mouseclick_function_count; i++){
lua_rawgeti(l, LUA_REGISTRYINDEX, mouseclick_functions[i]);
if(lua_equal(l, 1, lua_gettop(l))){
functionindex = i;
}
lua_pop(l, 1);
}
}
if(functionindex != -1){
luaL_unref(l, LUA_REGISTRYINDEX, mouseclick_functions[functionindex]);
if(functionindex != mouseclick_function_count-1){
memmove(mouseclick_functions+functionindex+1, mouseclick_functions+functionindex+1, (mouseclick_function_count-functionindex-1)*sizeof(int));
}
if(mouseclick_function_count-1 > 0){
newfunctions = 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;
}
int luatpt_input(lua_State* l) int luatpt_input(lua_State* l)
{ {
char *prompt, *title, *result, *shadow, *text; char *prompt, *title, *result, *shadow, *text;

View File

@ -2083,7 +2083,12 @@ int main(int argc, char *argv[])
} }
do_s_check = (do_s_check+1) & 15; do_s_check = (do_s_check+1) & 15;
} }
#ifdef LUACONSOLE
if(sdl_key){
if(!luacon_keypress(sdl_key, sdl_mod))
sdl_key = 0;
}
#endif
if (sys_shortcuts==1)//all shortcuts can be disabled by python scripts if (sys_shortcuts==1)//all shortcuts can be disabled by python scripts
{ {
if (sdl_key=='q' || sdl_key==SDLK_ESCAPE) if (sdl_key=='q' || sdl_key==SDLK_ESCAPE)
@ -2511,9 +2516,6 @@ int main(int argc, char *argv[])
} }
} }
} }
//#ifdef LUACONSOLE
//luacon_keypress(sdl_key);
//#endif
#ifdef PYCONSOLE #ifdef PYCONSOLE
if (pyready==1 && pygood==1) if (pyready==1 && pygood==1)
if (pkey!=NULL && sdl_key!=NULL) if (pkey!=NULL && sdl_key!=NULL)
@ -2606,8 +2608,12 @@ int main(int argc, char *argv[])
b = SDL_GetMouseState(&x, &y); // b is current mouse state b = SDL_GetMouseState(&x, &y); // b is current mouse state
#ifdef LUACONSOLE #ifdef LUACONSOLE
if(luacon_step(x/sdl_scale, y/sdl_scale, b, bq, sdl_key)) if(b){
b = 0; //Mouse click was handled by Lua step if(!luacon_mouseclick(x/sdl_scale, y/sdl_scale, b, bq)){
b = 0;
}
}
luacon_step(x/sdl_scale, y/sdl_scale);
#endif #endif
for (i=0; i<SC_TOTAL; i++)//draw all the menu sections for (i=0; i<SC_TOTAL; i++)//draw all the menu sections