summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2011-08-05 13:54:24 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2011-08-05 13:54:24 (GMT)
commit4ebe56f65c44fb64f023d624a3f62c87fc2d749c (patch)
treead134722825c479d83c775251182bd6cb7b4050b /src
parent98b6c4b0016c4116834bd023e45b2ef0f447218a (diff)
downloadpowder-4ebe56f65c44fb64f023d624a3f62c87fc2d749c.zip
powder-4ebe56f65c44fb64f023d624a3f62c87fc2d749c.tar.gz
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
Diffstat (limited to 'src')
-rw-r--r--src/luaconsole.c184
-rw-r--r--src/main.c18
2 files changed, 178 insertions, 24 deletions
diff --git a/src/luaconsole.c b/src/luaconsole.c
index 6e4df7c..5209689 100644
--- a/src/luaconsole.c
+++ b/src/luaconsole.c
@@ -5,6 +5,11 @@
lua_State *l;
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(){
const static struct luaL_reg tptluaapi [] = {
{"test", &luatpt_test},
@@ -30,6 +35,10 @@ void luacon_open(){
{"delete", &luatpt_delete},
{"register_step", &luatpt_register_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},
{"message_box", &luatpt_message_box},
{"get_numOfParts", &luatpt_get_numOfParts},
@@ -49,38 +58,67 @@ void luacon_open(){
l = lua_open();
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;
if(step_functions[0]){
//Set mouse globals
- lua_pushinteger(l, mbq);
- lua_pushinteger(l, mb);
lua_pushinteger(l, my);
lua_pushinteger(l, mx);
- lua_setfield(l, LUA_GLOBALSINDEX, "mousex");
- lua_setfield(l, LUA_GLOBALSINDEX, "mousey");
- lua_setfield(l, LUA_GLOBALSINDEX, "mouseb");
- lua_setfield(l, LUA_GLOBALSINDEX, "mousebq");
+ 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]);
- callret = lua_pcall(l, 0, 1, 0);
+ callret = lua_pcall(l, 0, 0, 0);
if (callret)
{
// failed, TODO: better error reporting
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;
@@ -748,6 +786,116 @@ int luatpt_unregister_step(lua_State* l)
}
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)
{
char *prompt, *title, *result, *shadow, *text;
diff --git a/src/main.c b/src/main.c
index e1d2d7e..f3da87c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2083,7 +2083,12 @@ int main(int argc, char *argv[])
}
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 (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
if (pyready==1 && pygood==1)
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
#ifdef LUACONSOLE
- if(luacon_step(x/sdl_scale, y/sdl_scale, b, bq, sdl_key))
- b = 0; //Mouse click was handled by Lua step
+ if(b){
+ if(!luacon_mouseclick(x/sdl_scale, y/sdl_scale, b, bq)){
+ b = 0;
+ }
+ }
+ luacon_step(x/sdl_scale, y/sdl_scale);
#endif
for (i=0; i<SC_TOTAL; i++)//draw all the menu sections