diff --git a/NAS2D/EventHandler.cpp b/NAS2D/EventHandler.cpp index 267393a4..1d5948aa 100644 --- a/NAS2D/EventHandler.cpp +++ b/NAS2D/EventHandler.cpp @@ -21,6 +21,21 @@ extern SDL_Window* underlyingWindow; using namespace NAS2D; + +namespace NAS2D +{ + /** + * Posts a quit event to the event system. + */ + void postQuitEvent() + { + SDL_Event event; + event.type = SDL_QUIT; + SDL_PushEvent(&event); + } +} + + /** * Maximum number of events to process each frame. * @@ -610,85 +625,91 @@ void EventHandler::pump() int count = 0; while ((SDL_PollEvent(&event) != 0) && (count < MaxMessageProcessing)) { - switch (event.type) + onMessage(event); + count++; + } +} + + +void EventHandler::onMessage(const SDL_Event& event) +{ + switch (event.type) + { + case SDL_MOUSEMOTION: + mMouseMotionSignal({event.motion.x, event.motion.y}, {event.motion.xrel, event.motion.yrel}); + break; + + case SDL_KEYDOWN: + mKeyDownSignal(static_cast(event.key.keysym.sym), static_cast(event.key.keysym.mod), event.key.repeat != 0 ? true : false); + break; + + case SDL_KEYUP: + mKeyUpSignal(static_cast(event.key.keysym.sym), static_cast(event.key.keysym.mod)); + break; + + case SDL_TEXTINPUT: + mTextInputSignal(event.text.text); + break; + + case SDL_MOUSEBUTTONDOWN: + if (event.button.clicks == 2) { - case SDL_MOUSEMOTION: - mMouseMotionSignal({event.motion.x, event.motion.y}, {event.motion.xrel, event.motion.yrel}); - break; - - case SDL_KEYDOWN: - mKeyDownSignal(static_cast(event.key.keysym.sym), static_cast(event.key.keysym.mod), event.key.repeat != 0 ? true : false); - break; - - case SDL_KEYUP: - mKeyUpSignal(static_cast(event.key.keysym.sym), static_cast(event.key.keysym.mod)); - break; - - case SDL_TEXTINPUT: - mTextInputSignal(event.text.text); - break; - - case SDL_MOUSEBUTTONDOWN: - if (event.button.clicks == 2) - { - mMouseDoubleClickSignal(static_cast(event.button.button), {event.button.x, event.button.y}); - } - - mMouseButtonDownSignal(static_cast(event.button.button), {event.button.x, event.button.y}); - break; - - case SDL_MOUSEBUTTONUP: - mMouseButtonUpSignal(static_cast(event.button.button), {event.button.x, event.button.y}); - break; - - case SDL_MOUSEWHEEL: - mMouseWheelSignal({event.wheel.x, event.wheel.y}); - break; - - case SDL_JOYAXISMOTION: - mJoystickAxisMotionSignal(event.jaxis.which, event.jaxis.axis, event.jaxis.value); - break; - - case SDL_JOYBALLMOTION: - mJoystickBallMotionSignal(event.jball.which, event.jball.ball, {event.jball.xrel, event.jball.yrel}); - break; - - case SDL_JOYHATMOTION: - mJoystickHatMotionSignal(event.jhat.which, event.jhat.hat, event.jhat.value); - break; - - case SDL_JOYBUTTONDOWN: - mJoystickButtonDownSignal(event.jbutton.which, event.jbutton.button); - break; - - case SDL_JOYBUTTONUP: - mJoystickButtonUpSignal(event.jbutton.which, event.jbutton.button); - break; - - case SDL_WINDOWEVENT: - // Not completely happy with this but meh, it works. - if (event.window.event == SDL_WINDOWEVENT_FOCUS_GAINED) { mActivateSignal(true); } - else if (event.window.event == SDL_WINDOWEVENT_FOCUS_LOST) { mActivateSignal(false); } - else if (event.window.event == SDL_WINDOWEVENT_SHOWN) { mWindowHiddenSignal(false); } - else if (event.window.event == SDL_WINDOWEVENT_HIDDEN) { mWindowHiddenSignal(true); } - else if (event.window.event == SDL_WINDOWEVENT_EXPOSED) { mWindowExposedSignal(); } - else if (event.window.event == SDL_WINDOWEVENT_MINIMIZED) { mWindowMinimizedSignal(); } - else if (event.window.event == SDL_WINDOWEVENT_MAXIMIZED) { mWindowMaximizedSignal(); } - else if (event.window.event == SDL_WINDOWEVENT_RESTORED) { mWindowRestoredSignal(); } - else if (event.window.event == SDL_WINDOWEVENT_ENTER) { mWindowMouseEnterSignal(); } - else if (event.window.event == SDL_WINDOWEVENT_LEAVE) { mWindowMouseLeaveSignal(); } - else if (event.window.event == SDL_WINDOWEVENT_RESIZED) { mWindowResizedSignal({event.window.data1, event.window.data2}); } - break; - - case SDL_QUIT: - mQuitSignal(); - break; - - default: - // Ignore any cases not handled. - break; + mMouseDoubleClickSignal(static_cast(event.button.button), {event.button.x, event.button.y}); } - count++; + + mMouseButtonDownSignal(static_cast(event.button.button), {event.button.x, event.button.y}); + break; + + case SDL_MOUSEBUTTONUP: + mMouseButtonUpSignal(static_cast(event.button.button), {event.button.x, event.button.y}); + break; + + case SDL_MOUSEWHEEL: + mMouseWheelSignal({event.wheel.x, event.wheel.y}); + break; + + case SDL_JOYAXISMOTION: + mJoystickAxisMotionSignal(event.jaxis.which, event.jaxis.axis, event.jaxis.value); + break; + + case SDL_JOYBALLMOTION: + mJoystickBallMotionSignal(event.jball.which, event.jball.ball, {event.jball.xrel, event.jball.yrel}); + break; + + case SDL_JOYHATMOTION: + mJoystickHatMotionSignal(event.jhat.which, event.jhat.hat, event.jhat.value); + break; + + case SDL_JOYBUTTONDOWN: + mJoystickButtonDownSignal(event.jbutton.which, event.jbutton.button); + break; + + case SDL_JOYBUTTONUP: + mJoystickButtonUpSignal(event.jbutton.which, event.jbutton.button); + break; + + case SDL_WINDOWEVENT: + // Not completely happy with this but meh, it works. + if (event.window.event == SDL_WINDOWEVENT_FOCUS_GAINED) { mActivateSignal(true); } + else if (event.window.event == SDL_WINDOWEVENT_FOCUS_LOST) { mActivateSignal(false); } + else if (event.window.event == SDL_WINDOWEVENT_SHOWN) { mWindowHiddenSignal(false); } + else if (event.window.event == SDL_WINDOWEVENT_HIDDEN) { mWindowHiddenSignal(true); } + else if (event.window.event == SDL_WINDOWEVENT_EXPOSED) { mWindowExposedSignal(); } + else if (event.window.event == SDL_WINDOWEVENT_MINIMIZED) { mWindowMinimizedSignal(); } + else if (event.window.event == SDL_WINDOWEVENT_MAXIMIZED) { mWindowMaximizedSignal(); } + else if (event.window.event == SDL_WINDOWEVENT_RESTORED) { mWindowRestoredSignal(); } + else if (event.window.event == SDL_WINDOWEVENT_ENTER) { mWindowMouseEnterSignal(); } + else if (event.window.event == SDL_WINDOWEVENT_LEAVE) { mWindowMouseLeaveSignal(); } + else if (event.window.event == SDL_WINDOWEVENT_RESIZED) { mWindowResizedSignal({event.window.data1, event.window.data2}); } + break; + + case SDL_QUIT: + mQuitSignal(); + break; + + default: + // Ignore any cases not handled. + break; } } @@ -814,17 +835,3 @@ void EventHandler::disconnectAll() mMouseWheelSignal.clear(); mQuitSignal.clear(); } - - -namespace NAS2D -{ - /** - * Posts a quit event to the event system. - */ - void postQuitEvent() - { - SDL_Event event; - event.type = SDL_QUIT; - SDL_PushEvent(&event); - } -} diff --git a/NAS2D/EventHandler.h b/NAS2D/EventHandler.h index d86d1eb3..6f66f2f3 100644 --- a/NAS2D/EventHandler.h +++ b/NAS2D/EventHandler.h @@ -17,6 +17,9 @@ #include +union SDL_Event; + + namespace NAS2D { enum class KeyModifier : uint16_t; @@ -24,6 +27,9 @@ namespace NAS2D enum class MouseButton; + void postQuitEvent(); + + /** * Handles and dispatches low-level events. */ @@ -109,6 +115,9 @@ namespace NAS2D void disconnectAll(); + protected: + void onMessage(const SDL_Event& event); + private: ActivateSignal mActivateSignal{}; @@ -140,6 +149,4 @@ namespace NAS2D QuitSignal mQuitSignal{}; }; - - void postQuitEvent(); } // namespace