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,7 +4,9 @@
using namespace geode::prelude; using namespace geode::prelude;
void EventListenerProtocol::enable() { void EventListenerProtocol::enable() {
if (!ranges::contains(Event::listeners(), this)) {
Event::listeners().push_back(this); Event::listeners().push_back(this);
}
} }
void EventListenerProtocol::disable() { void EventListenerProtocol::disable() {
@ -20,6 +22,15 @@ Event::~Event() {}
void Event::postFrom(Mod* m) { void Event::postFrom(Mod* m) {
if (m) this->sender = 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(); std::vector<EventListenerProtocol*> listeners_copy = Event::listeners();
for (auto h : listeners_copy) { for (auto h : listeners_copy) {
@ -30,7 +41,6 @@ void Event::postFrom(Mod* m) {
break; break;
} }
} }
Event::removedListeners().clear();
} }
std::unordered_set<EventListenerProtocol*>& Event::removedListeners() { 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) { bool geode::cocos::nodeIsVisible(cocos2d::CCNode* node) {
if (!node->isVisible()) return false; if (!node->isVisible()) {
if (node->getParent()) return nodeIsVisible(node->getParent()); return false;
}
if (node->getParent()) {
return nodeIsVisible(node->getParent());
}
return true; return true;
} }