Index

zydeco / 3c60e1a

Experiment in graphics programming, C++, OpenGL, simulation techniques.

Latest Commit

{#}TimeHashSubjectAuthor#(+)(-)GPG?
505 Aug 2023 23:143c60e1aUse GL3WJosh Stockin1357G

Blob @ zydeco / src / sdl2 / EventHandlerSDL2.cpp

text/plain5592 bytesdownload raw
1#include <SDL2/SDL.h>
2
3#include "ZydecoCommon.hpp"
4#include "CommonSDL2.hpp"
5#include "EventHandlerSDL2.hpp"
6
7#include "IEventKeyboardSubscriber.hpp"
8#include "IEventMouseSubscriber.hpp"
9#include "IEventQuitSubscriber.hpp"
10#include "IEventWindowSubscriber.hpp"
11
12
13static Logger LOGGER("EVENTHANDLER");
14
15
16#define DISPATCH_EVENT(TYPE, EVENT, VALS...) \
17 for (IEvent ## TYPE ## Subscriber *subscriber : m_event ## TYPE ## Subscribers) \
18 { \
19 if (subscriber == nullptr) { break; } \
20 LOGGER.Log(Logger::TRACE, "Dispatching " #TYPE "Event.On" #EVENT); \
21 subscriber->On##EVENT(VALS); \
22 } \
23 break;
24
25
26EventHandlerSDL2::EventHandlerSDL2()
27{
28 LOGGER.Log(Logger::DEBUG, "EventHandlerSDL2 creating");
29}
30
31EventHandlerSDL2::~EventHandlerSDL2()
32{
33 LOGGER.Log(Logger::DEBUG, "EventHandlerSDL2 destroying");
34}
35
36bool EventHandlerSDL2::Update(uint64_t time_since_last_update_us)
37{
38 LOGGER.Log(Logger::DEBUG, "Entering EventHandler loop");
39
40 bool quit = false;
41 SDL_Event event;
42
43 while (SDL_WaitEvent(&event))
44 {
45 LOGGER.Log(Logger::TRACE, "Received event {}", event.type);
46
47 switch (event.type)
48 {
49 case SDL_KEYDOWN: DISPATCH_EVENT(Keyboard, KeyPressEvent, event.key.keysym.sym, event.key.keysym.mod);
50 case SDL_KEYUP: DISPATCH_EVENT(Keyboard, KeyReleaseEvent, event.key.keysym.sym, event.key.keysym.mod);
51 case SDL_MOUSEBUTTONDOWN:
52 {
53 switch (event.button.button)
54 {
55 case SDL_BUTTON_LEFT: DISPATCH_EVENT(Mouse, MouseLeftDownEvent, event.button.x, event.button.y);
56 case SDL_BUTTON_MIDDLE: DISPATCH_EVENT(Mouse, MouseMiddleDownEvent, event.button.x, event.button.y);
57 case SDL_BUTTON_RIGHT: DISPATCH_EVENT(Mouse, MouseRightDownEvent, event.button.x, event.button.y);
58 default: break;
59 }
60 }
61 case SDL_MOUSEBUTTONUP:
62 {
63 switch (event.button.button)
64 {
65 case SDL_BUTTON_LEFT: DISPATCH_EVENT(Mouse, MouseLeftUpEvent, event.button.x, event.button.y);
66 case SDL_BUTTON_MIDDLE: DISPATCH_EVENT(Mouse, MouseMiddleUpEvent, event.button.x, event.button.y);
67 case SDL_BUTTON_RIGHT: DISPATCH_EVENT(Mouse, MouseRightUpEvent, event.button.x, event.button.y);
68 default: break;
69 }
70 }
71 case SDL_MOUSEMOTION: DISPATCH_EVENT(Mouse, MouseMoveEvent, event.motion.x, event.motion.y, event.motion.xrel, event.motion.yrel);
72 case SDL_MOUSEWHEEL: DISPATCH_EVENT(Mouse, MouseWheelScrollEvent, event.motion.xrel, event.motion.yrel);
73 case SDL_QUIT: quit = true; DISPATCH_EVENT(Quit, QuitEvent);
74 case SDL_WINDOWEVENT:
75 switch (event.window.type)
76 {
77 case SDL_WINDOWEVENT_MINIMIZED: DISPATCH_EVENT(Window, WindowMinimizedEvent);
78 case SDL_WINDOWEVENT_MAXIMIZED: DISPATCH_EVENT(Window, WindowMaximizedEvent);
79 case SDL_WINDOWEVENT_RESTORED: DISPATCH_EVENT(Window, WindowRestoredEvent);
80 case SDL_WINDOWEVENT_EXPOSED: DISPATCH_EVENT(Window, WindowExposedEvent);
81 case SDL_WINDOWEVENT_RESIZED: DISPATCH_EVENT(Window, WindowResizedEvent, event.window.data1, event.window.data2);
82 case SDL_WINDOWEVENT_CLOSE: DISPATCH_EVENT(Window, WindowRequestedCloseEvent);
83 default: break;
84 }
85 default: break;
86 }
87
88 if (quit) { break; }
89 }
90
91 LOGGER.Log(Logger::DEBUG, "Exiting EventHandler loop");
92
93 return true;
94}
95
96bool EventHandlerSDL2::RegisterKeyboardEventSubscriber(IEventKeyboardSubscriber *p_event_keyboard_subscriber)
97{
98 LOGGER.Log(Logger::VERBOSE, "Registering IEventKeyboardSubscriber");
99
100 if (m_eventKeyboardSubscribers.size() >= MAXIMUM_EVENT_SUBSCRIBERS)
101 {
102 LOGGER.Log(Logger::ERROR, "Failed to register IEventKeyboardSubscriber; too many registered");
103 return false;
104 }
105
106 m_eventKeyboardSubscribers.push_back(p_event_keyboard_subscriber);
107 return true;
108}
109
110bool EventHandlerSDL2::RegisterMouseEventSubscriber(IEventMouseSubscriber *p_event_mouse_subscriber)
111{
112 LOGGER.Log(Logger::VERBOSE, "Registering IEventMouseSubscriber");
113
114 if (m_eventMouseSubscribers.size() >= MAXIMUM_EVENT_SUBSCRIBERS)
115 {
116 LOGGER.Log(Logger::ERROR, "Failed to register IEventMouseSubscriber; too many registered");
117 return false;
118 }
119
120 m_eventMouseSubscribers.push_back(p_event_mouse_subscriber);
121 return true;
122}
123
124bool EventHandlerSDL2::RegisterQuitEventSubscriber(IEventQuitSubscriber *p_event_quit_subscriber)
125{
126 LOGGER.Log(Logger::VERBOSE, "Registering IEventQuitSubscriber");
127
128 if (m_eventQuitSubscribers.size() >= MAXIMUM_EVENT_SUBSCRIBERS)
129 {
130 LOGGER.Log(Logger::ERROR, "Failed to register IEventQuitSubscriber; too many registered");
131 return false;
132 }
133
134 m_eventQuitSubscribers.push_back(p_event_quit_subscriber);
135 return true;
136}
137
138bool EventHandlerSDL2::RegisterWindowEventSubscriber(IEventWindowSubscriber *p_event_window_subscriber)
139{
140 LOGGER.Log(Logger::VERBOSE, "Registering IEventWindowSubscriber");
141
142 if (m_eventWindowSubscribers.size() >= MAXIMUM_EVENT_SUBSCRIBERS)
143 {
144 LOGGER.Log(Logger::ERROR, "Failed to register IEventWindowSubscriber; too many registered");
145 return false;
146 }
147
148 m_eventWindowSubscribers.push_back(p_event_window_subscriber);
149 return true;
150}
151