aboutsummaryrefslogtreecommitdiff
path: root/src/win/native/cursor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/win/native/cursor.cpp')
-rw-r--r--src/win/native/cursor.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/win/native/cursor.cpp b/src/win/native/cursor.cpp
new file mode 100644
index 00000000..987d2d54
--- /dev/null
+++ b/src/win/native/cursor.cpp
@@ -0,0 +1,51 @@
+#include "cru/win/native/cursor.hpp"
+
+#include "cru/common/format.hpp"
+#include "cru/platform/debug.hpp"
+#include "cru/win/native/exception.hpp"
+
+#include <stdexcept>
+
+namespace cru::platform::native::win {
+WinCursor::WinCursor(HCURSOR handle, bool auto_delete) {
+ handle_ = handle;
+ auto_delete_ = auto_delete;
+}
+
+WinCursor::~WinCursor() {
+ if (auto_delete_) {
+ if (!::DestroyCursor(handle_)) {
+ DebugMessage(
+ util::Format(L"Failed to destroy a cursor. Last error code: {}",
+ ::GetLastError())); // This is not a fetal error but
+ // might still need notice.
+ }
+ }
+}
+
+namespace {
+WinCursor* LoadWinCursor(const wchar_t* name) {
+ const auto handle = ::LoadCursorW(NULL, name);
+ if (handle == NULL) {
+ throw Win32Error(::GetLastError(), "Failed to get system cursor.");
+ }
+ return new WinCursor(handle, false);
+}
+} // namespace
+
+WinCursorManager::WinCursorManager()
+ : sys_arrow_(LoadWinCursor(IDC_ARROW)),
+ sys_hand_(LoadWinCursor(IDC_HAND)) {}
+
+std::shared_ptr<WinCursor> WinCursorManager::GetSystemWinCursor(
+ SystemCursor type) {
+ switch (type) {
+ case SystemCursor::Arrow:
+ return sys_arrow_;
+ case SystemCursor::Hand:
+ return sys_hand_;
+ default:
+ throw std::runtime_error("Unknown system cursor value.");
+ }
+}
+} // namespace cru::platform::native::win