Fix LuaUtil::Callback

openmw-fix_osx_build_maybe
Petr Mikheev 3 years ago
parent be100749f8
commit d16fa553c8

@ -6,6 +6,9 @@ namespace sol
{ {
template <> template <>
struct is_automagical<MWLua::AsyncPackageId> : std::false_type {}; struct is_automagical<MWLua::AsyncPackageId> : std::false_type {};
template <>
struct is_automagical<LuaUtil::Callback> : std::false_type {};
} }
namespace MWLua namespace MWLua
@ -50,11 +53,15 @@ namespace MWLua
asyncId.mContainer->setupUnsavableTimer( asyncId.mContainer->setupUnsavableTimer(
TimerType::GAME_TIME, world->getGameTime() + delay, asyncId.mScriptId, std::move(callback)); TimerType::GAME_TIME, world->getGameTime() + delay, asyncId.mScriptId, std::move(callback));
}; };
api["callback"] = [](const AsyncPackageId& asyncId, sol::function fn) api["callback"] = [](const AsyncPackageId& asyncId, sol::function fn) -> LuaUtil::Callback
{ {
return LuaUtil::Callback{std::move(fn), asyncId.mHiddenData}; return LuaUtil::Callback{std::move(fn), asyncId.mHiddenData};
}; };
sol::usertype<LuaUtil::Callback> callbackType = context.mLua->sol().new_usertype<LuaUtil::Callback>("Callback");
callbackType[sol::meta_function::call] =
[](const LuaUtil::Callback& callback, sol::variadic_args va) { return callback.call(sol::as_args(va)); };
auto initializer = [](sol::table hiddenData) auto initializer = [](sol::table hiddenData)
{ {
LuaUtil::ScriptsContainer::ScriptId id = hiddenData[LuaUtil::ScriptsContainer::sScriptIdKey]; LuaUtil::ScriptsContainer::ScriptId id = hiddenData[LuaUtil::ScriptsContainer::sScriptIdKey];

@ -169,7 +169,7 @@ namespace MWLua
// Run queued callbacks // Run queued callbacks
for (CallbackWithData& c : mQueuedCallbacks) for (CallbackWithData& c : mQueuedCallbacks)
c.mCallback(c.mArg); c.mCallback.call(c.mArg);
mQueuedCallbacks.clear(); mQueuedCallbacks.clear();
// Engine handlers in local scripts // Engine handlers in local scripts

@ -447,16 +447,16 @@ return {
callback.mHiddenData[LuaUtil::ScriptsContainer::sScriptIdKey] = LuaUtil::ScriptsContainer::ScriptId{nullptr, 0}; callback.mHiddenData[LuaUtil::ScriptsContainer::sScriptIdKey] = LuaUtil::ScriptsContainer::ScriptId{nullptr, 0};
testing::internal::CaptureStdout(); testing::internal::CaptureStdout();
callback(1.5); callback.call(1.5);
EXPECT_EQ(internal::GetCapturedStdout(), "1.5\n"); EXPECT_EQ(internal::GetCapturedStdout(), "1.5\n");
testing::internal::CaptureStdout(); testing::internal::CaptureStdout();
callback(1.5, 2.5); callback.call(1.5, 2.5);
EXPECT_EQ(internal::GetCapturedStdout(), "1.5\t2.5\n"); EXPECT_EQ(internal::GetCapturedStdout(), "1.5\t2.5\n");
testing::internal::CaptureStdout(); testing::internal::CaptureStdout();
callback.mHiddenData[LuaUtil::ScriptsContainer::sScriptIdKey] = sol::nil; callback.mHiddenData[LuaUtil::ScriptsContainer::sScriptIdKey] = sol::nil;
callback(1.5, 2.5); callback.call(1.5, 2.5);
EXPECT_EQ(internal::GetCapturedStdout(), "Ignored callback to the removed script some_script.lua\n"); EXPECT_EQ(internal::GetCapturedStdout(), "Ignored callback to the removed script some_script.lua\n");
} }

@ -252,7 +252,7 @@ namespace LuaUtil
bool isValid() const { return mHiddenData[ScriptsContainer::sScriptIdKey] != sol::nil; } bool isValid() const { return mHiddenData[ScriptsContainer::sScriptIdKey] != sol::nil; }
template <typename... Args> template <typename... Args>
sol::object operator()(Args&&... args) const sol::object call(Args&&... args) const
{ {
if (isValid()) if (isValid())
return LuaUtil::call(mFunc, std::forward<Args>(args)...); return LuaUtil::call(mFunc, std::forward<Args>(args)...);
@ -265,7 +265,7 @@ namespace LuaUtil
template <typename... Args> template <typename... Args>
void tryCall(Args&&... args) const void tryCall(Args&&... args) const
{ {
try { (*this)(std::forward<Args>(args)...); } try { this->call(std::forward<Args>(args)...); }
catch (std::exception& e) catch (std::exception& e)
{ {
Log(Debug::Error) << "Error in callback: " << e.what(); Log(Debug::Error) << "Error in callback: " << e.what();

@ -340,7 +340,7 @@ namespace LuaUi
{ {
auto it = mCallbacks.find(name); auto it = mCallbacks.find(name);
if (it != mCallbacks.end()) if (it != mCallbacks.end())
it->second(argument, mLayout); it->second.call(argument, mLayout);
} }
void WidgetExtension::keyPress(MyGUI::Widget*, MyGUI::KeyCode code, MyGUI::Char ch) void WidgetExtension::keyPress(MyGUI::Widget*, MyGUI::KeyCode code, MyGUI::Char ch)

@ -111,7 +111,7 @@ namespace LuaUi
auto it = w->mCallbacks.find(name); auto it = w->mCallbacks.find(name);
if (it != w->mCallbacks.end()) if (it != w->mCallbacks.end())
{ {
sol::object res = it->second(argumentFactory(w), w->mLayout); sol::object res = it->second.call(argumentFactory(w), w->mLayout);
shouldPropagate = res.is<bool>() && res.as<bool>(); shouldPropagate = res.is<bool>() && res.as<bool>();
} }
if (w->mParent && w->mPropagateEvents && shouldPropagate) if (w->mParent && w->mPropagateEvents && shouldPropagate)

Loading…
Cancel
Save