diff options
Diffstat (limited to 'src/platform/gui/sdl')
| -rw-r--r-- | src/platform/gui/sdl/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/platform/gui/sdl/Cursor.cpp | 48 | ||||
| -rw-r--r-- | src/platform/gui/sdl/Window.cpp | 21 |
3 files changed, 65 insertions, 5 deletions
diff --git a/src/platform/gui/sdl/CMakeLists.txt b/src/platform/gui/sdl/CMakeLists.txt index fa4a6397..fac9d859 100644 --- a/src/platform/gui/sdl/CMakeLists.txt +++ b/src/platform/gui/sdl/CMakeLists.txt @@ -1,5 +1,6 @@ add_library(CruPlatformGuiSdl Base.cpp + Cursor.cpp Input.cpp UiApplication.cpp Window.cpp diff --git a/src/platform/gui/sdl/Cursor.cpp b/src/platform/gui/sdl/Cursor.cpp new file mode 100644 index 00000000..901c2bff --- /dev/null +++ b/src/platform/gui/sdl/Cursor.cpp @@ -0,0 +1,48 @@ +#include "cru/platform/gui/sdl/Cursor.h" +#include "cru/base/Base.h" +#include "cru/platform/gui/Cursor.h" +#include "cru/platform/gui/sdl/Base.h" + +#include <memory> + +namespace cru::platform::gui::sdl { +std::shared_ptr<SdlCursor> SdlCursor::CreateSystem(SDL_SystemCursor cursor) { + auto c = SDL_CreateSystemCursor(cursor); + if (!c) { + throw SdlException("Failed to create system cursor."); + } + return std::make_shared<SdlCursor>(c, true); +} + +SdlCursor::SdlCursor(SDL_Cursor* cursor, bool auto_destroy) + : cursor_(cursor), auto_destroy_(auto_destroy) {} + +SdlCursor::~SdlCursor() { + if (auto_destroy_) { + SDL_DestroyCursor(cursor_); + } +} + +SDL_Cursor* SdlCursor::GetSdlCursor() { return cursor_; } + +SdlCursorManager::SdlCursorManager() { + arrow_cursor_ = SdlCursor::CreateSystem(SDL_SYSTEM_CURSOR_DEFAULT); + hand_cursor_ = SdlCursor::CreateSystem(SDL_SYSTEM_CURSOR_POINTER); + ibeam_cursor_ = SdlCursor::CreateSystem(SDL_SYSTEM_CURSOR_TEXT); +} + +std::shared_ptr<ICursor> SdlCursorManager::GetSystemCursor( + SystemCursorType type) { + switch (type) { + case SystemCursorType::Arrow: + return std::static_pointer_cast<ICursor>(arrow_cursor_); + case SystemCursorType::Hand: + return std::static_pointer_cast<ICursor>(hand_cursor_); + case SystemCursorType::IBeam: + return std::static_pointer_cast<ICursor>(ibeam_cursor_); + default: + UnreachableCode(); + } +} + +} // namespace cru::platform::gui::sdl diff --git a/src/platform/gui/sdl/Window.cpp b/src/platform/gui/sdl/Window.cpp index 3ab8cf4d..77cec606 100644 --- a/src/platform/gui/sdl/Window.cpp +++ b/src/platform/gui/sdl/Window.cpp @@ -1,10 +1,12 @@ #include "cru/platform/gui/sdl/Window.h" #include "cru/base/Base.h" +#include "cru/platform/Base.h" #include "cru/platform/GraphicsBase.h" #include "cru/platform/graphics/NullPainter.h" #include "cru/platform/graphics/Painter.h" #include "cru/platform/gui/Window.h" #include "cru/platform/gui/sdl/Base.h" +#include "cru/platform/gui/sdl/Cursor.h" #include "cru/platform/gui/sdl/Input.h" #include "cru/platform/gui/sdl/UiApplication.h" @@ -155,8 +157,10 @@ bool SdlWindow::ReleaseMouse() { } void SdlWindow::SetCursor(std::shared_ptr<ICursor> cursor) { - if (!sdl_window_) return; - NotImplemented(); + cursor_ = std::move(cursor); + if (sdl_window_) { + DoUpdateCursor(); + } } void SdlWindow::SetToForeground() { @@ -225,9 +229,9 @@ void SdlWindow::DoCreateWindow() { CheckSdlReturn( SDL_SetWindowPosition(sdl_window_, client_rect_.left, client_rect_.top)); - CheckSdlReturn(SDL_SetWindowParent( - sdl_window_, parent_ == nullptr ? nullptr : parent_->sdl_window_)); - CheckSdlReturn(SDL_SyncWindow(sdl_window_)); + + DoUpdateParent(); + DoUpdateCursor(); } void SdlWindow::DoUpdateClientRect() { @@ -259,6 +263,13 @@ void SdlWindow::DoUpdateTitle() { CheckSdlReturn(SDL_SyncWindow(sdl_window_)); } +void SdlWindow::DoUpdateCursor() { + assert(sdl_window_); + auto cursor = CheckPlatform<SdlCursor>(cursor_, GetPlatformId()); + CheckSdlReturn(SDL_SetCursor(cursor->GetSdlCursor())); + CheckSdlReturn(SDL_SyncWindow(sdl_window_)); +} + namespace { NativeMouseButtonEventArgs ConvertMouseButtonEvent( const SDL_MouseButtonEvent& event) { |
