diff --git a/src/logic/scripting/lua/libs/libcore.cpp b/src/logic/scripting/lua/libs/libcore.cpp index ee611b63..891cd791 100644 --- a/src/logic/scripting/lua/libs/libcore.cpp +++ b/src/logic/scripting/lua/libs/libcore.cpp @@ -60,6 +60,8 @@ static int l_close_world(lua::State* L) { if (save_world) { controller->saveWorld(); } + // unblock all bindings + Events::enableBindings(); // destroy LevelScreen and run quit callbacks engine->setScreen(nullptr); // create and go to menu screen diff --git a/src/logic/scripting/lua/libs/libinput.cpp b/src/logic/scripting/lua/libs/libinput.cpp index 53f1effd..2e869fe3 100644 --- a/src/logic/scripting/lua/libs/libinput.cpp +++ b/src/logic/scripting/lua/libs/libinput.cpp @@ -133,6 +133,17 @@ static int l_reset_bindings(lua::State*) { return 0; } +static int l_enable_binding(lua::State* L) { + std::string bindname = lua::require_string(L, 1); + bool enable = lua::toboolean(L, 2); + const auto& bind = Events::bindings.find(bindname); + if (bind == Events::bindings.end()) { + throw std::runtime_error("unknown binding " + util::quote(bindname)); + } + Events::bindings[bindname].enable = enable; + return 0; +} + const luaL_Reg inputlib[] = { {"keycode", lua::wrap}, {"mousecode", lua::wrap}, @@ -143,4 +154,5 @@ const luaL_Reg inputlib[] = { {"is_active", lua::wrap}, {"is_pressed", lua::wrap}, {"reset_bindings", lua::wrap}, + {"enable_binding", lua::wrap}, {NULL, NULL}}; diff --git a/src/window/Events.cpp b/src/window/Events.cpp index f310969b..f63431cf 100644 --- a/src/window/Events.cpp +++ b/src/window/Events.cpp @@ -78,6 +78,10 @@ void Events::pollEvents() { for (auto& entry : bindings) { auto& binding = entry.second; + if (!binding.enable) { + binding.state = false; + continue; + } binding.justChange = false; bool newstate = false; @@ -228,3 +232,10 @@ void Events::loadBindings( } } } + +void Events::enableBindings() { + for (auto& entry : bindings) { + auto& binding = entry.second; + binding.enable = true; + } +} diff --git a/src/window/Events.hpp b/src/window/Events.hpp index f5ed5720..8155bb2b 100644 --- a/src/window/Events.hpp +++ b/src/window/Events.hpp @@ -60,4 +60,5 @@ public: const std::string& filename, const std::string& source, BindType bindType ); + static void enableBindings(); }; diff --git a/src/window/input.hpp b/src/window/input.hpp index a90c8fe0..06ed1511 100644 --- a/src/window/input.hpp +++ b/src/window/input.hpp @@ -137,6 +137,7 @@ struct Binding { int code; bool state = false; bool justChange = false; + bool enable = true; Binding() = default; Binding(inputtype type, int code) : type(type), code(code) {