diff --git a/engine.build.lua b/engine.build.lua index d2ddd58..ba05810 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -46,6 +46,7 @@ local platform_spec_module = Module("source/Platform/Win32", { "Win32Keyboard.cpp", "Win32Misc.cpp", "Win32Mouse.cpp", + "Win32EventQueue.cpp", "Win32MsgBuffer.cpp", "Win32System.cpp", "glad_wgl.c" diff --git a/include/Spectre/System/MessageQueue.h b/include/Spectre/System/MessageQueue.h index e1fcb34..de89c04 100644 --- a/include/Spectre/System/MessageQueue.h +++ b/include/Spectre/System/MessageQueue.h @@ -7,9 +7,14 @@ namespace sp { +class PlatformEventQueue; + class MessageQueue { public : + MessageQueue(); + ~MessageQueue(); + void postEvent(SysEvent event); bool pollEvent(SysEvent& event); @@ -18,6 +23,8 @@ public : protected : std::deque m_queue; + + PlatformEventQueue* m_impl; }; } // namespace sp diff --git a/source/System/MessageQueue.cpp b/source/System/MessageQueue.cpp index 4054c1e..b8d76c4 100644 --- a/source/System/MessageQueue.cpp +++ b/source/System/MessageQueue.cpp @@ -1,8 +1,26 @@ #include +#ifdef _WIN32 +#include +typedef sp::Win32EventQueue ImplType; +#else +#error "No MessageQueue implementation exists" +#endif + + namespace sp { +MessageQueue::MessageQueue() +{ + m_impl = new ImplType(); +} + +MessageQueue::~MessageQueue() +{ + delete m_impl; +} + void MessageQueue::postEvent(SysEvent event) { m_queue.push_back(event); @@ -10,6 +28,11 @@ void MessageQueue::postEvent(SysEvent event) bool MessageQueue::pollEvent(SysEvent& event) { + // Process platform events first. + if (m_impl->poll(event)) { + return true; + } + if (!isEmpty()) { event = m_queue.front(); m_queue.pop_front();