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("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 |
|
26 | EventHandlerSDL2::EventHandlerSDL2() |
27 | { |
28 | LOGGER.Log(Logger::DEBUG, "EventHandlerSDL2 creating"); |
29 | } |
30 |
|
31 | EventHandlerSDL2::~EventHandlerSDL2() |
32 | { |
33 | LOGGER.Log(Logger::DEBUG, "EventHandlerSDL2 destroying"); |
34 | } |
35 |
|
36 | bool 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 |
|
96 | bool 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 |
|
110 | bool 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 |
|
124 | bool 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 |
|
138 | bool 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 |
|