fix event listeners vector containing freed listeners

This commit is contained in:
HJfod 2023-04-03 21:04:56 +03:00
parent 4801f6725f
commit c1d4a89f8b
2 changed files with 19 additions and 5 deletions

View file

@ -4,8 +4,10 @@
using namespace geode::prelude;
void EventListenerProtocol::enable() {
if (!ranges::contains(Event::listeners(), this)) {
Event::listeners().push_back(this);
}
}
void EventListenerProtocol::disable() {
Event::removedListeners().insert(this);
@ -20,6 +22,15 @@ Event::~Event() {}
void Event::postFrom(Mod* m) {
if (m) this->sender = m;
auto& listeners = Event::listeners();
listeners.erase(std::remove_if(
listeners.begin(),
listeners.end(),
[](auto& a) {
return Event::removedListeners().contains(a);
}
), listeners.end());
Event::removedListeners().clear();
std::vector<EventListenerProtocol*> listeners_copy = Event::listeners();
for (auto h : listeners_copy) {
@ -30,7 +41,6 @@ void Event::postFrom(Mod* m) {
break;
}
}
Event::removedListeners().clear();
}
std::unordered_set<EventListenerProtocol*>& Event::removedListeners() {

View file

@ -328,8 +328,12 @@ void geode::cocos::limitNodeSize(cocos2d::CCNode* spr, cocos2d::CCSize const& si
}
bool geode::cocos::nodeIsVisible(cocos2d::CCNode* node) {
if (!node->isVisible()) return false;
if (node->getParent()) return nodeIsVisible(node->getParent());
if (!node->isVisible()) {
return false;
}
if (node->getParent()) {
return nodeIsVisible(node->getParent());
}
return true;
}