don't softlock the game on modal popups

overlays can prevent clicks from being handled by DF. likewise, vanilla
modal popups can prevent clicks from getting handled by DFHack. to
prevent a softlock, overlay will skip sending input to the overlay
widgets when a modal dialog is visible
develop
Myk Taylor 2023-03-07 08:00:13 -08:00
parent 26a257eb8c
commit fc4d2605f2
No known key found for this signature in database
1 changed files with 12 additions and 7 deletions

@ -13,6 +13,7 @@
#include "df/viewscreen_titlest.h" #include "df/viewscreen_titlest.h"
#include "df/viewscreen_update_regionst.h" #include "df/viewscreen_update_regionst.h"
#include "df/viewscreen_worldst.h" #include "df/viewscreen_worldst.h"
#include "df/world.h"
#include "Debug.h" #include "Debug.h"
#include "LuaTools.h" #include "LuaTools.h"
@ -27,6 +28,8 @@ using namespace DFHack;
DFHACK_PLUGIN("overlay"); DFHACK_PLUGIN("overlay");
DFHACK_PLUGIN_IS_ENABLED(is_enabled); DFHACK_PLUGIN_IS_ENABLED(is_enabled);
REQUIRE_GLOBAL(world);
namespace DFHack { namespace DFHack {
DBG_DECLARE(overlay, control, DebugCategory::LINFO); DBG_DECLARE(overlay, control, DebugCategory::LINFO);
DBG_DECLARE(overlay, event, DebugCategory::LINFO); DBG_DECLARE(overlay, event, DebugCategory::LINFO);
@ -67,6 +70,8 @@ struct viewscreen_overlay : T {
} }
DEFINE_VMETHOD_INTERPOSE(void, feed, (std::set<df::interface_key> *input)) { DEFINE_VMETHOD_INTERPOSE(void, feed, (std::set<df::interface_key> *input)) {
bool input_is_handled = false; bool input_is_handled = false;
// don't send input to the overlays if there is a modal dialog up
if (!world->status.popups.size())
call_overlay_lua(NULL, "feed_viewscreen_widgets", 2, 1, call_overlay_lua(NULL, "feed_viewscreen_widgets", 2, 1,
[&](lua_State *L) { [&](lua_State *L) {
Lua::Push(L, T::_identity.getName()); Lua::Push(L, T::_identity.getName());