diff --git a/src/logic/scripting/lua/libinput.cpp b/src/logic/scripting/lua/libinput.cpp index 8f1d5820..5969d598 100644 --- a/src/logic/scripting/lua/libinput.cpp +++ b/src/logic/scripting/lua/libinput.cpp @@ -61,12 +61,40 @@ static int l_get_bindings(lua::State* L) { return 1; } +static int l_is_active(lua::State* L) { + auto bindname = lua::require_string(L, 1); + const auto& bind = Events::bindings.find(bindname); + if (bind == Events::bindings.end()) { + throw std::runtime_error("unknown binding "+util::quote(bindname)); + } + return lua::pushboolean(L, bind->second.active()); +} + +static int l_is_pressed(lua::State* L) { + std::string code = lua::require_string(L, 1); + size_t sep = code.find(':'); + if (sep == std::string::npos) { + throw std::runtime_error("expected 'input_type:key' format"); + } + auto prefix = code.substr(0, sep); + auto name = code.substr(sep+1); + if (prefix == "key") { + return lua::pushboolean(L, Events::pressed(static_cast(input_util::keycode_from(name)))); + } else if (prefix == "mouse") { + return lua::pushboolean(L, Events::clicked(static_cast(input_util::mousecode_from(name)))); + } else { + throw std::runtime_error("unknown input type "+util::quote(code)); + } +} + const luaL_Reg inputlib [] = { {"keycode", lua::wrap}, {"mousecode", lua::wrap}, {"add_callback", lua::wrap}, {"get_mouse_pos", lua::wrap}, {"get_bindings", lua::wrap}, + {"is_active", lua::wrap}, + {"is_pressed", lua::wrap}, {NULL, NULL} };