Index

zydeco / 3195a10

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

Latest Commit

{#}TimeHashSubjectAuthor#(+)(-)GPG?
631 Aug 2023 21:183195a10Update program flowJosh Stockin120G

Blob @ zydeco / src / sdl2 / EventHandlerSDL2.cpp

text/plain5620 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 {
76 switch (event.window.type)
77 {
78 case SDL_WINDOWEVENT_MINIMIZED: DISPATCH_EVENT(Window, WindowMinimizedEvent);
79 case SDL_WINDOWEVENT_MAXIMIZED: DISPATCH_EVENT(Window, WindowMaximizedEvent);
80 case SDL_WINDOWEVENT_RESTORED: DISPATCH_EVENT(Window, WindowRestoredEvent);
81 case SDL_WINDOWEVENT_EXPOSED: DISPATCH_EVENT(Window, WindowExposedEvent);
82 case SDL_WINDOWEVENT_RESIZED: DISPATCH_EVENT(Window, WindowResizedEvent, event.window.data1, event.window.data2);
83 case SDL_WINDOWEVENT_CLOSE: DISPATCH_EVENT(Window, WindowRequestedCloseEvent);
84 default: break;
85 }
86 }
87 default: break;
88 }
89
90 if (quit) { break; }
91 }
92
93 LOGGER.Log(Logger::DEBUG, "Exiting EventHandler loop");
94
95 return true;
96}
97
98bool EventHandlerSDL2::RegisterKeyboardEventSubscriber(IEventKeyboardSubscriber *p_event_keyboard_subscriber)
99{
100 LOGGER.Log(Logger::VERBOSE, "Registering IEventKeyboardSubscriber");
101
102 if (m_eventKeyboardSubscribers.size() >= MAXIMUM_EVENT_SUBSCRIBERS)
103 {
104 LOGGER.Log(Logger::ERROR, "Failed to register IEventKeyboardSubscriber; too many registered");
105 return false;
106 }
107
108 m_eventKeyboardSubscribers.push_back(p_event_keyboard_subscriber);
109 return true;
110}
111
112bool EventHandlerSDL2::RegisterMouseEventSubscriber(IEventMouseSubscriber *p_event_mouse_subscriber)
113{
114 LOGGER.Log(Logger::VERBOSE, "Registering IEventMouseSubscriber");
115
116 if (m_eventMouseSubscribers.size() >= MAXIMUM_EVENT_SUBSCRIBERS)
117 {
118 LOGGER.Log(Logger::ERROR, "Failed to register IEventMouseSubscriber; too many registered");
119 return false;
120 }
121
122 m_eventMouseSubscribers.push_back(p_event_mouse_subscriber);
123 return true;
124}
125
126bool EventHandlerSDL2::RegisterQuitEventSubscriber(IEventQuitSubscriber *p_event_quit_subscriber)
127{
128 LOGGER.Log(Logger::VERBOSE, "Registering IEventQuitSubscriber");
129
130 if (m_eventQuitSubscribers.size() >= MAXIMUM_EVENT_SUBSCRIBERS)
131 {
132 LOGGER.Log(Logger::ERROR, "Failed to register IEventQuitSubscriber; too many registered");
133 return false;
134 }
135
136 m_eventQuitSubscribers.push_back(p_event_quit_subscriber);
137 return true;
138}
139
140bool EventHandlerSDL2::RegisterWindowEventSubscriber(IEventWindowSubscriber *p_event_window_subscriber)
141{
142 LOGGER.Log(Logger::VERBOSE, "Registering IEventWindowSubscriber");
143
144 if (m_eventWindowSubscribers.size() >= MAXIMUM_EVENT_SUBSCRIBERS)
145 {
146 LOGGER.Log(Logger::ERROR, "Failed to register IEventWindowSubscriber; too many registered");
147 return false;
148 }
149
150 m_eventWindowSubscribers.push_back(p_event_window_subscriber);
151 return true;
152}
153