Custom events are thread safe
This commit is contained in:
parent
518ecf2a8f
commit
5a0086c4ea
3 changed files with 19 additions and 23 deletions
|
|
@ -5,7 +5,8 @@
|
|||
|
||||
namespace CustomEvents {
|
||||
|
||||
std::queue<std::any> eventDataQueue;
|
||||
std::queue<std::shared_ptr<void>> eventDataQueue;
|
||||
std::mutex eventDataQueueMutex;
|
||||
|
||||
bool alreadyInitialized = false;
|
||||
|
||||
|
|
@ -18,10 +19,6 @@ void init() {
|
|||
}
|
||||
}
|
||||
|
||||
void pop_event() {
|
||||
eventDataQueue.pop();
|
||||
}
|
||||
|
||||
uint32_t PasteEvent::EVENT_NUM;
|
||||
uint32_t OpenInfiniPaintFileEvent::EVENT_NUM;
|
||||
uint32_t AddFileToCanvasEvent::EVENT_NUM;
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
18
src/main.cpp
18
src/main.cpp
|
|
@ -761,18 +761,12 @@ SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) {
|
|||
case SDL_EVENT_SCREEN_KEYBOARD_HIDDEN:
|
||||
break;
|
||||
default: {
|
||||
if(event->type == CustomEvents::PasteEvent::EVENT_NUM) {
|
||||
mS.m->input_paste_callback(CustomEvents::get_event<CustomEvents::PasteEvent>());
|
||||
CustomEvents::pop_event();
|
||||
}
|
||||
else if(event->type == CustomEvents::OpenInfiniPaintFileEvent::EVENT_NUM) {
|
||||
mS.m->input_open_infinipaint_file_callback(CustomEvents::get_event<CustomEvents::OpenInfiniPaintFileEvent>());
|
||||
CustomEvents::pop_event();
|
||||
}
|
||||
else if(event->type == CustomEvents::AddFileToCanvasEvent::EVENT_NUM) {
|
||||
mS.m->input_add_file_to_canvas_callback(CustomEvents::get_event<CustomEvents::AddFileToCanvasEvent>());
|
||||
CustomEvents::pop_event();
|
||||
}
|
||||
if(event->type == CustomEvents::PasteEvent::EVENT_NUM)
|
||||
mS.m->input_paste_callback(*CustomEvents::get_event<CustomEvents::PasteEvent>());
|
||||
else if(event->type == CustomEvents::OpenInfiniPaintFileEvent::EVENT_NUM)
|
||||
mS.m->input_open_infinipaint_file_callback(*CustomEvents::get_event<CustomEvents::OpenInfiniPaintFileEvent>());
|
||||
else if(event->type == CustomEvents::AddFileToCanvasEvent::EVENT_NUM)
|
||||
mS.m->input_add_file_to_canvas_callback(*CustomEvents::get_event<CustomEvents::AddFileToCanvasEvent>());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue