| 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 |
|