Index

zydeco / 5f524c5

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

Latest Commit

{#}TimeHashSubjectAuthor#(+)(-)GPG?
703 Sep 2023 16:015f524c5OpenGL render abstractionsJosh Stockin15757G

Blob @ zydeco / src / sdl2 / EventHandlerSDL2.cpp

text/plain5532 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("EventHandlerSDL2");
14
15
16#define DISPATCH_EVENT(TYPE, EVENT, VALS...) \
17 LOGGER.Log(Logger::TRACE, "Update(): Dispatching On" #EVENT); \
18 for (IEvent ## TYPE ## Subscriber *subscriber : m_event ## TYPE ## Subscribers) \
19 { \
20 subscriber->On##EVENT(VALS); \
21 } \
22 break;
23
24
25EventHandlerSDL2::EventHandlerSDL2()
26{
27 LOGGER.Log(Logger::TRACE, "EventHandlerSDL2()");
28}
29
30EventHandlerSDL2::~EventHandlerSDL2()
31{
32 LOGGER.Log(Logger::TRACE, "~EventHandlerSDL2()");
33}
34
35bool EventHandlerSDL2::Update()
36{
37 bool quit = false;
38
39 SDL_Event event;
40 SDL_WaitEvent(&event);
41
42 switch (event.type)
43 {
44 case SDL_KEYDOWN: DISPATCH_EVENT(Keyboard, KeyPressEvent, event.key.keysym.sym, event.key.keysym.mod);
45 case SDL_KEYUP: DISPATCH_EVENT(Keyboard, KeyReleaseEvent, event.key.keysym.sym, event.key.keysym.mod);
46 case SDL_MOUSEBUTTONDOWN:
47 {
48 switch (event.button.button)
49 {
50 case SDL_BUTTON_LEFT: DISPATCH_EVENT(Mouse, MouseLeftDownEvent, event.button.x, event.button.y);
51 case SDL_BUTTON_MIDDLE: DISPATCH_EVENT(Mouse, MouseMiddleDownEvent, event.button.x, event.button.y);
52 case SDL_BUTTON_RIGHT: DISPATCH_EVENT(Mouse, MouseRightDownEvent, event.button.x, event.button.y);
53 default: break;
54 }
55 }
56 case SDL_MOUSEBUTTONUP:
57 {
58 switch (event.button.button)
59 {
60 case SDL_BUTTON_LEFT: DISPATCH_EVENT(Mouse, MouseLeftUpEvent, event.button.x, event.button.y);
61 case SDL_BUTTON_MIDDLE: DISPATCH_EVENT(Mouse, MouseMiddleUpEvent, event.button.x, event.button.y);
62 case SDL_BUTTON_RIGHT: DISPATCH_EVENT(Mouse, MouseRightUpEvent, event.button.x, event.button.y);
63 default: break;
64 }
65 }
66 case SDL_MOUSEMOTION: DISPATCH_EVENT(Mouse, MouseMoveEvent, event.motion.x, event.motion.y, event.motion.xrel, event.motion.yrel);
67 case SDL_MOUSEWHEEL: DISPATCH_EVENT(Mouse, MouseWheelScrollEvent, event.motion.xrel, event.motion.yrel);
68 case SDL_QUIT:
69 {
70 quit = true;
71 DISPATCH_EVENT(Quit, QuitEvent);
72 }
73 case SDL_WINDOWEVENT:
74 {
75 switch (event.window.event)
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 }
86 default: break;
87 }
88
89 if (quit)
90 {
91 LOGGER.Log(Logger::DEBUG, "Update(): Exiting EventHandler loop");
92 return true;
93 }
94
95 return false;
96}
97
98bool EventHandlerSDL2::RegisterKeyboardEventSubscriber(IEventKeyboardSubscriber *p_event_keyboard_subscriber)
99{
100 LOGGER.Log(Logger::DEBUG, "RegisterKeyboardEventSubscriber(): Registering IEventKeyboardSubscriber");
101
102 if (m_eventKeyboardSubscribers.size() >= MAXIMUM_EVENT_SUBSCRIBERS)
103 {
104 LOGGER.Log(Logger::ERROR, "RegisterKeyboardEventSubscriber(): 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::DEBUG, "RegisterMouseEventSubscriber(): Registering IEventMouseSubscriber");
115
116 if (m_eventMouseSubscribers.size() >= MAXIMUM_EVENT_SUBSCRIBERS)
117 {
118 LOGGER.Log(Logger::ERROR, "RegisterMouseEventSubscriber(): 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::DEBUG, "RegisterQuitEventSubscriber(): Registering IEventQuitSubscriber");
129
130 if (m_eventQuitSubscribers.size() >= MAXIMUM_EVENT_SUBSCRIBERS)
131 {
132 LOGGER.Log(Logger::ERROR, "RegisterQuitEventSubscriber(): 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::DEBUG, "RegisterWindowEventSubscriber(): Registering IEventWindowSubscriber");
143
144 if (m_eventWindowSubscribers.size() >= MAXIMUM_EVENT_SUBSCRIBERS)
145 {
146 LOGGER.Log(Logger::ERROR, "RegisterWindowEventSubscriber(): 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