aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui/sdl
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-11-28 19:28:35 +0800
committerYuqian Yang <crupest@crupest.life>2025-11-28 19:28:35 +0800
commite4fd76c113e43aa0fa00cf05a14cb12db080ba78 (patch)
tree4174347e22625aa4e0151ece714708d46c10bfd1 /src/platform/gui/sdl
parentfa9e88a3a753de0f7a33efcf6a2671c28f099ba3 (diff)
downloadcru-e4fd76c113e43aa0fa00cf05a14cb12db080ba78.tar.gz
cru-e4fd76c113e43aa0fa00cf05a14cb12db080ba78.tar.bz2
cru-e4fd76c113e43aa0fa00cf05a14cb12db080ba78.zip
Impl cursor on sdl.
Diffstat (limited to 'src/platform/gui/sdl')
-rw-r--r--src/platform/gui/sdl/CMakeLists.txt1
-rw-r--r--src/platform/gui/sdl/Cursor.cpp48
-rw-r--r--src/platform/gui/sdl/Window.cpp21
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) {