Custom events are thread safe
This commit is contained in:
parent
518ecf2a8f
commit
5a0086c4ea
3 changed files with 19 additions and 23 deletions
|
|
@ -1,34 +1,39 @@
|
|||
#pragma once
|
||||
#include <cstdint>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <optional>
|
||||
#include <queue>
|
||||
#include <SDL3/SDL.h>
|
||||
#include <SDL3/SDL_events.h>
|
||||
#include <mutex>
|
||||
#include "RichText/TextBox.hpp"
|
||||
|
||||
namespace CustomEvents {
|
||||
void init();
|
||||
|
||||
extern std::queue<std::any> eventDataQueue;
|
||||
extern std::queue<std::shared_ptr<void>> eventDataQueue;
|
||||
extern std::mutex eventDataQueueMutex;
|
||||
|
||||
template <typename T> bool emit_event(const T& data) {
|
||||
std::scoped_lock l{eventDataQueueMutex};
|
||||
SDL_Event event;
|
||||
SDL_zero(event);
|
||||
event.type = T::EVENT_NUM;
|
||||
if(SDL_PushEvent(&event)) {
|
||||
eventDataQueue.push(data);
|
||||
eventDataQueue.push(std::make_shared<T>(data));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
template <typename T> const T& get_event() {
|
||||
return std::any_cast<const T&>(eventDataQueue.front());
|
||||
template <typename T> std::shared_ptr<T> get_event() {
|
||||
std::scoped_lock l{eventDataQueueMutex};
|
||||
std::shared_ptr<T> toRet = std::static_pointer_cast<T>(eventDataQueue.front());
|
||||
eventDataQueue.pop();
|
||||
return toRet;
|
||||
}
|
||||
|
||||
void pop_event();
|
||||
|
||||
struct PasteEvent {
|
||||
static uint32_t EVENT_NUM;
|
||||
enum class DataType {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue