1
0
mirror of synced 2024-12-15 17:21:16 +01:00
ImHex/lib/libimhex/source/api/event_manager.cpp

24 lines
536 B
C++
Raw Normal View History

#include <hex/api/event_manager.hpp>
namespace hex {
fix: Event unsubscribe not working correcetly when using same key for multiple events (#1309) <!-- Please provide as much information as possible about what your PR aims to do. PRs with no description will most likely be closed until more information is provided. If you're planing on changing fundamental behaviour or add big new features, please open a GitHub Issue first before starting to work on it. If it's not something big and you still want to contact us about it, feel free to do so ! --> ### Problem description <!-- Describe the bug that you fixed/feature request that you implemented, or link to an existing issue describing it --> Fixed possible bug of `EventManager::unsubscribe` `std::map` only allows unique key, but the same token can subscribe to multiple events. https://github.com/WerWolv/ImHex/blob/1a2a926b772f32d4f5e4c723c48e0e6e65a16b0a/lib/libimhex/include/hex/api/event.hpp#L104-L107 If the previous token has already subscribed to an event, then when subscribing again, `getTokenStore().insert` will not do anything (Because its type is `std::map`) https://github.com/WerWolv/ImHex/blob/1a2a926b772f32d4f5e4c723c48e0e6e65a16b0a/lib/libimhex/include/hex/api/event.hpp#L122-L134 At this point in `unsubscribe`, the `iter` may not be able to find the correct event and erase it ### Implementation description <!-- Explain what you did to correct the problem --> Change `tokenStore` to `std::multimap` instead of `std::map`, which cannot unsubscribe multiple events correctly ### Screenshots <!-- If your change is visual, take a screenshot showing it. Ideally, make before/after sceenshots --> ### Additional things <!-- Anything else you would like to say -->
2023-10-07 23:35:35 +02:00
std::multimap<void *, EventManager::EventList::iterator>& EventManager::getTokenStore() {
static std::multimap<void *, EventManager::EventList::iterator> tokenStore;
return tokenStore;
}
EventManager::EventList& EventManager::getEvents() {
static EventManager::EventList events;
return events;
}
2023-11-04 23:16:38 +01:00
std::recursive_mutex& EventManager::getEventMutex() {
static std::recursive_mutex mutex;
return mutex;
}
}