1
0
Fork 0

System/SystemEvent: Merge with Input/InputEvent into just Event.

This commit is contained in:
Henrik Hautakoski 2020-01-30 22:40:09 +01:00
parent 858e721451
commit 10198484e7
No known key found for this signature in database
GPG key ID: 96765B12FEAC4745
12 changed files with 152 additions and 80 deletions

View file

@ -27,7 +27,7 @@ local system_module = Module("source/System", {
"Path.cpp", "Path.cpp",
"MessageHandler.cpp", "MessageHandler.cpp",
"MessageQueue.cpp", "MessageQueue.cpp",
"SystemEvent.cpp", "Event.cpp",
"Log.cpp" "Log.cpp"
}) })

View file

@ -0,0 +1,74 @@
#ifndef SPECTRE_SYSTEM_EVENT_H
#define SPECTRE_SYSTEM_EVENT_H
#include <Spectre/Input/Mouse.h>
#include <Spectre/Input/Keyboard.h>
namespace sp {
class Display;
struct Event
{
public :
enum Type {
None,
Quit,
Size,
Key,
MouseButton,
MouseMove
};
struct KeyEvent {
Keyboard::Key code;
bool pressed; /* true if pressed, false if released. */
std::string getKeyName() const; /* Get the key name */
};
struct MouseButtonEvent {
Mouse::Button button;
bool pressed; /* true if pressed, false if released. */
std::string getName() const;
};
struct MouseMoveEvent {
unsigned int x;
unsigned int y;
};
struct SizeEvent
{
Display *display;
int width;
int height;
};
Type type;
union {
struct SizeEvent size;
struct KeyEvent key;
struct MouseMoveEvent mouseMove;
struct MouseButtonEvent mouseButton;
};
Event(Type type = None);
// Helper methods
static Event createSize(Display *display, int width, int height);
static Event createKey(Keyboard::Key code, bool pressed);
static Event createMouseButton(Mouse::Button button, bool pressed);
static Event createMouseMove(unsigned int x, unsigned int y);
};
} // namespace sp
#endif /* SPECTRE_SYSTEM_EVENT_H */

View file

@ -2,7 +2,7 @@
#ifndef SPECTRE_SYSTEM_MESSAGEHANDLER_H #ifndef SPECTRE_SYSTEM_MESSAGEHANDLER_H
#define SPECTRE_SYSTEM_MESSAGEHANDLER_H #define SPECTRE_SYSTEM_MESSAGEHANDLER_H
#include "SystemEvent.h" #include <Spectre/System/Event.h>
namespace sp { namespace sp {

View file

@ -2,7 +2,7 @@
#ifndef SPECTRE_MESSAGE_QUEUE_H #ifndef SPECTRE_MESSAGE_QUEUE_H
#define SPECTRE_MESSAGE_QUEUE_H #define SPECTRE_MESSAGE_QUEUE_H
#include <Spectre/System/SystemEvent.h> #include <Spectre/System/Event.h>
#include <queue> #include <queue>
namespace sp { namespace sp {
@ -15,14 +15,14 @@ public :
MessageQueue(); MessageQueue();
~MessageQueue(); ~MessageQueue();
void postEvent(SysEvent event); void postEvent(Event event);
bool pollEvent(SysEvent& event); bool pollEvent(Event& event);
bool isEmpty() const; bool isEmpty() const;
protected : protected :
std::deque<SysEvent> m_queue; std::deque<Event> m_queue;
PlatformEventQueue* m_impl; PlatformEventQueue* m_impl;
}; };

View file

@ -1,41 +0,0 @@
#ifndef SYSTEM_EVENT_H
#define SYSTEM_EVENT_H
namespace sp {
class Display;
struct SysEvent
{
public :
enum Type {
None,
Quit,
Size,
};
Type type;
struct Size
{
Display *display;
int width;
int height;
};
union {
struct Size size;
};
SysEvent(Type type = None);
// Helper methods
static SysEvent sizeEvent(Display *display, int width, int height);
};
} // namespace sp
#endif /* SYSTEM_EVENT_H */

View file

@ -56,6 +56,9 @@ void Game::gameLoop()
processEvents(); processEvents();
// Update input.
getInput()->update();
if (time.beginFrame()) { if (time.beginFrame()) {
while(time.tick()) { while(time.tick()) {
@ -71,18 +74,18 @@ void Game::gameLoop()
void Game::processEvents() void Game::processEvents()
{ {
MessageQueue& queue = m_platform->getMessageQueue(); MessageQueue& queue = m_platform->getMessageQueue();
SysEvent event; Event event;
while(queue.pollEvent(event)) { while(queue.pollEvent(event)) {
if (event.type == SysEvent::Quit) { if (event.type == Event::Quit) {
exit(); exit();
break; break;
} }
// Call message handler. // Call message handler.
if (event.type == SysEvent::Size) { if (event.type == Event::Size) {
m_messageHandler->onSizeChanged(event.size.display, event.size.width, event.size.height); m_messageHandler->onSizeChanged(event.size.display, event.size.width, event.size.height);
} }
} }

View file

@ -3,7 +3,7 @@
namespace sp { namespace sp {
struct SysEvent; struct Event;
// Interface for platform specific event queue. // Interface for platform specific event queue.
class PlatformEventQueue class PlatformEventQueue
@ -13,7 +13,7 @@ public :
// Poll one event from the platform's event queue. // Poll one event from the platform's event queue.
// Returns false if there was no events. // Returns false if there was no events.
// NOTE: This method is guaranteed to be non-blocking. // NOTE: This method is guaranteed to be non-blocking.
virtual bool poll(SysEvent& event) = 0; virtual bool poll(Event& event) = 0;
}; };
} // namespace sp } // namespace sp

View file

@ -6,7 +6,7 @@
namespace sp { namespace sp {
bool Win32EventQueue::poll(SysEvent& event) bool Win32EventQueue::poll(Event& event)
{ {
MSG msg; MSG msg;
@ -19,11 +19,11 @@ bool Win32EventQueue::poll(SysEvent& event)
return false; return false;
} }
LRESULT Win32EventQueue::processMessage(MSG msg, SysEvent& event) LRESULT Win32EventQueue::processMessage(MSG msg, Event& event)
{ {
switch(msg.message) { switch(msg.message) {
case WM_QUIT : case WM_QUIT :
event.type = SysEvent::Quit; event.type = Event::Quit;
return 0; return 0;
// Input, Forward to devices. // Input, Forward to devices.
case WM_KEYDOWN : case WM_KEYDOWN :

View file

@ -2,7 +2,7 @@
#define PLATFORM_WIN32_EVENT_QUEUE_H #define PLATFORM_WIN32_EVENT_QUEUE_H
#include <windows.h> #include <windows.h>
#include <Spectre/System/SystemEvent.h> #include <Spectre/System/Event.h>
#include <Platform/PlatformEventQueue.h> #include <Platform/PlatformEventQueue.h>
namespace sp { namespace sp {
@ -10,11 +10,11 @@ namespace sp {
class Win32EventQueue : public PlatformEventQueue class Win32EventQueue : public PlatformEventQueue
{ {
public : public :
virtual bool poll(SysEvent& event); virtual bool poll(Event& event);
private : private :
LRESULT processMessage(MSG msg, SysEvent& event); LRESULT processMessage(MSG msg, Event& event);
}; };
} // namespace sp } // namespace sp

56
source/System/Event.cpp Normal file
View file

@ -0,0 +1,56 @@
#include <Spectre/System/Event.h>
namespace sp {
Event::Event(Type type) :
type (type)
{
}
std::string Event::KeyEvent::getKeyName() const
{
return Keyboard::getKeyName(code);
}
std::string Event::MouseButtonEvent::getName() const
{
return Mouse::getButtonName(button);
}
// Helper methods
Event Event::createSize(Display *display, int width, int height)
{
Event event(Size);
event.size.display = display;
event.size.width = width;
event.size.height = height;
return event;
}
Event Event::createKey(Keyboard::Key code, bool pressed)
{
Event event(Key);
event.key.code = code;
event.key.pressed = pressed;
return event;
}
Event Event::createMouseButton(Mouse::Button button, bool pressed)
{
Event event(MouseButton);
event.mouseButton.button = button;
event.mouseButton.pressed = pressed;
return event;
}
Event Event::createMouseMove(unsigned int x, unsigned int y)
{
Event event(MouseMove);
event.mouseMove.x = x;
event.mouseMove.y = y;
return event;
}
} // namespace sp

View file

@ -21,12 +21,12 @@ MessageQueue::~MessageQueue()
delete m_impl; delete m_impl;
} }
void MessageQueue::postEvent(SysEvent event) void MessageQueue::postEvent(Event event)
{ {
m_queue.push_back(event); m_queue.push_back(event);
} }
bool MessageQueue::pollEvent(SysEvent& event) bool MessageQueue::pollEvent(Event& event)
{ {
// Process platform events first. // Process platform events first.
if (m_impl->poll(event)) { if (m_impl->poll(event)) {

View file

@ -1,20 +0,0 @@
#include <Spectre/System/SystemEvent.h>
namespace sp {
SysEvent::SysEvent(Type type) :
type (type)
{
}
SysEvent SysEvent::sizeEvent(Display *display, int width, int height)
{
SysEvent event(Size);
event.size.display = display;
event.size.width = width;
event.size.height = height;
return event;
}
} // namespace sp