aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui/sdl/UiApplication.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/gui/sdl/UiApplication.cpp')
-rw-r--r--src/platform/gui/sdl/UiApplication.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/platform/gui/sdl/UiApplication.cpp b/src/platform/gui/sdl/UiApplication.cpp
index c876ad19..d2275a37 100644
--- a/src/platform/gui/sdl/UiApplication.cpp
+++ b/src/platform/gui/sdl/UiApplication.cpp
@@ -11,6 +11,7 @@
#include <algorithm>
#include <chrono>
#include <functional>
+#include <optional>
namespace cru::platform::gui::sdl {
SdlUiApplication::SdlUiApplication(graphics::IGraphicsFactory* graphics_factory,
@@ -48,6 +49,8 @@ int SdlUiApplication::Run() {
break;
}
+ DispatchEvent(event);
+
delete_later_pool_.Clean();
}
@@ -153,4 +156,44 @@ long long SdlUiApplication::SetTimer(std::chrono::milliseconds milliseconds,
PostEmptyEvent();
return timers_.Add(std::move(action), milliseconds, repeat);
}
+
+namespace {
+std::optional<SDL_WindowID> GetEventWindowId(const SDL_Event& event) {
+ switch (event.type) {
+ case SDL_EVENT_WINDOW_MOVED:
+ case SDL_EVENT_WINDOW_RESIZED:
+ case SDL_EVENT_WINDOW_SHOWN:
+ case SDL_EVENT_WINDOW_HIDDEN:
+ case SDL_EVENT_WINDOW_MINIMIZED:
+ case SDL_EVENT_WINDOW_FOCUS_GAINED:
+ case SDL_EVENT_WINDOW_FOCUS_LOST:
+ case SDL_EVENT_WINDOW_MOUSE_ENTER:
+ case SDL_EVENT_WINDOW_MOUSE_LEAVE:
+ case SDL_EVENT_WINDOW_DESTROYED:
+ return event.window.windowID;
+ case SDL_EVENT_MOUSE_BUTTON_DOWN:
+ case SDL_EVENT_MOUSE_BUTTON_UP:
+ return event.button.windowID;
+ case SDL_EVENT_MOUSE_WHEEL:
+ return event.wheel.windowID;
+ case SDL_EVENT_KEY_DOWN:
+ case SDL_EVENT_KEY_UP:
+ return event.key.windowID;
+ default:
+ return std::nullopt;
+ }
+}
+} // namespace
+
+bool SdlUiApplication::DispatchEvent(const SDL_Event& event) {
+ if (auto window_id = GetEventWindowId(event)) {
+ for (auto window : windows_) {
+ if (window->sdl_window_id_ == *window_id && window->HandleEvent(&event)) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
} // namespace cru::platform::gui::sdl