diff options
| author | Yuqian Yang <crupest@crupest.life> | 2025-11-28 18:46:52 +0800 |
|---|---|---|
| committer | Yuqian Yang <crupest@crupest.life> | 2025-11-28 18:46:52 +0800 |
| commit | fa9e88a3a753de0f7a33efcf6a2671c28f099ba3 (patch) | |
| tree | a0836203b9d178ff6cd1cf0acb3620852d7566ac /src/platform/gui | |
| parent | 9e596ff10782455615f69b9b54ce22176145b020 (diff) | |
| download | cru-fa9e88a3a753de0f7a33efcf6a2671c28f099ba3.tar.gz cru-fa9e88a3a753de0f7a33efcf6a2671c28f099ba3.tar.bz2 cru-fa9e88a3a753de0f7a33efcf6a2671c28f099ba3.zip | |
sdl add event dispatch logic.
Diffstat (limited to 'src/platform/gui')
| -rw-r--r-- | src/platform/gui/sdl/UiApplication.cpp | 43 | ||||
| -rw-r--r-- | src/platform/gui/sdl/Window.cpp | 8 |
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: { |
