From 5a0086c4eaa0a078bc923e5969311e308d7cb774 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Fri, 17 Apr 2026 11:12:48 +0300 Subject: [PATCH] Custom events are thread safe --- src/CustomEvents.cpp | 7 ++----- src/CustomEvents.hpp | 17 +++++++++++------ src/main.cpp | 18 ++++++------------ 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/CustomEvents.cpp b/src/CustomEvents.cpp index 7e2d3fe..fcef3fe 100644 --- a/src/CustomEvents.cpp +++ b/src/CustomEvents.cpp @@ -5,7 +5,8 @@ namespace CustomEvents { -std::queue eventDataQueue; +std::queue> 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; diff --git a/src/CustomEvents.hpp b/src/CustomEvents.hpp index a3f948f..2f2d45a 100644 --- a/src/CustomEvents.hpp +++ b/src/CustomEvents.hpp @@ -1,34 +1,39 @@ #pragma once #include +#include #include #include #include #include #include +#include #include "RichText/TextBox.hpp" namespace CustomEvents { void init(); - extern std::queue eventDataQueue; + extern std::queue> eventDataQueue; + extern std::mutex eventDataQueueMutex; template 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(data)); return true; } return false; } - template const T& get_event() { - return std::any_cast(eventDataQueue.front()); + template std::shared_ptr get_event() { + std::scoped_lock l{eventDataQueueMutex}; + std::shared_ptr toRet = std::static_pointer_cast(eventDataQueue.front()); + eventDataQueue.pop(); + return toRet; } - void pop_event(); - struct PasteEvent { static uint32_t EVENT_NUM; enum class DataType { diff --git a/src/main.cpp b/src/main.cpp index a2ce416..841c264 100755 --- a/src/main.cpp +++ b/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::pop_event(); - } - else if(event->type == CustomEvents::OpenInfiniPaintFileEvent::EVENT_NUM) { - mS.m->input_open_infinipaint_file_callback(CustomEvents::get_event()); - CustomEvents::pop_event(); - } - else if(event->type == CustomEvents::AddFileToCanvasEvent::EVENT_NUM) { - mS.m->input_add_file_to_canvas_callback(CustomEvents::get_event()); - CustomEvents::pop_event(); - } + if(event->type == CustomEvents::PasteEvent::EVENT_NUM) + mS.m->input_paste_callback(*CustomEvents::get_event()); + else if(event->type == CustomEvents::OpenInfiniPaintFileEvent::EVENT_NUM) + mS.m->input_open_infinipaint_file_callback(*CustomEvents::get_event()); + else if(event->type == CustomEvents::AddFileToCanvasEvent::EVENT_NUM) + mS.m->input_add_file_to_canvas_callback(*CustomEvents::get_event()); break; } }