aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/platform/gui/sdl/UiApplication.cpp43
-rw-r--r--src/platform/gui/sdl/Window.cpp8
2 files changed, 51 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
diff --git a/src/platform/gui/sdl/Window.cpp b/src/platform/gui/sdl/Window.cpp
index b0fcded4..3ab8cf4d 100644
--- a/src/platform/gui/sdl/Window.cpp
+++ b/src/platform/gui/sdl/Window.cpp
@@ -18,6 +18,8 @@ namespace cru::platform::gui::sdl {
SdlWindow::SdlWindow(SdlUiApplication* application)
: application_(application),
+ sdl_window_(nullptr),
+ sdl_window_id_(0),
client_rect_(100, 100, 400, 200),
parent_(nullptr) {
application->RegisterWindow(this);
@@ -214,6 +216,11 @@ void SdlWindow::DoCreateWindow() {
throw SdlException("Failed to create window.");
}
+ sdl_window_id_ = SDL_GetWindowID(sdl_window_);
+ if (sdl_window_id_ == 0) {
+ throw SdlException("Failed to get ID of created window.");
+ }
+
CreateEvent_.Raise(nullptr);
CheckSdlReturn(
@@ -309,6 +316,7 @@ bool SdlWindow::HandleEvent(const SDL_Event* event) {
VisibilityChangeEvent_.Raise(WindowVisibilityType::Hide);
DestroyEvent_.Raise(nullptr);
sdl_window_ = nullptr;
+ sdl_window_id_ = 0;
return true;
}
case SDL_EVENT_MOUSE_BUTTON_DOWN: {