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 |
|
13 | static 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 |
|
25 | EventHandlerSDL2::EventHandlerSDL2() |
26 | { |
27 | LOGGER.Log(Logger::TRACE, "EventHandlerSDL2()"); |
28 | } |
29 |
|
30 | EventHandlerSDL2::~EventHandlerSDL2() |
31 | { |
32 | LOGGER.Log(Logger::TRACE, "~EventHandlerSDL2()"); |
33 | } |
34 |
|
35 | bool 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 |
|
98 | bool 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 |
|
112 | bool 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 |
|
126 | bool 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 |
|
140 | bool 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 |
|