Index

zydeco / 7457fba

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

Latest Commit

{#}TimeHashSubjectAuthor#(+)(-)GPG?
803 Sep 2023 23:177457fbaImGui bringupJosh Stockin112G

Blob @ zydeco / src / sdl2 / EventHandlerSDL2.cpp

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