|
|
@@ -405,23 +405,31 @@ int InputHandler::getNumTouchFingers() const
|
|
|
|
|
|
void InputHandler::dispatchMainThread(const std::function<void()> & functor)
|
|
|
{
|
|
|
- auto heapFunctor = new std::function<void()>(functor);
|
|
|
+ auto heapFunctor = std::make_unique<std::function<void()>>(functor);
|
|
|
|
|
|
SDL_Event event;
|
|
|
event.user.type = SDL_USEREVENT;
|
|
|
event.user.code = 0;
|
|
|
- event.user.data1 = static_cast <void*>(heapFunctor);
|
|
|
+ event.user.data1 = static_cast <void*>(heapFunctor.get());
|
|
|
event.user.data2 = nullptr;
|
|
|
SDL_PushEvent(&event);
|
|
|
+
|
|
|
+ // NOTE: approach with dispatchedTasks container is a bit excessive
|
|
|
+ // used mostly to prevent false-positives leaks in analyzers
|
|
|
+ dispatchedTasks.push(std::move(heapFunctor));
|
|
|
}
|
|
|
|
|
|
void InputHandler::handleUserEvent(const SDL_UserEvent & current)
|
|
|
{
|
|
|
- auto heapFunctor = static_cast<std::function<void()>*>(current.data1);
|
|
|
+ std::unique_ptr<std::function<void()>> task;
|
|
|
+
|
|
|
+ if (!dispatchedTasks.try_pop(task))
|
|
|
+ throw std::runtime_error("InputHandler::handleUserEvent received without active task!");
|
|
|
|
|
|
- (*heapFunctor)();
|
|
|
+ if (current.data1 != task.get())
|
|
|
+ throw std::runtime_error("InputHandler::handleUserEvent received unknown pointer!");
|
|
|
|
|
|
- delete heapFunctor;
|
|
|
+ (*task)();
|
|
|
}
|
|
|
|
|
|
const Point & InputHandler::getCursorPosition() const
|