aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui/win/Cursor.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-05-15 13:56:40 +0800
committercrupest <crupest@outlook.com>2022-05-15 13:56:40 +0800
commit9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752 (patch)
tree7342f6991771fa31b16fd6a5ed892ff6025f3d05 /src/platform/gui/win/Cursor.cpp
parent41de54bad2c0f857821fcc83f41af3334d068b6d (diff)
downloadcru-9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752.tar.gz
cru-9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752.tar.bz2
cru-9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752.zip
...
Diffstat (limited to 'src/platform/gui/win/Cursor.cpp')
-rw-r--r--src/platform/gui/win/Cursor.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/platform/gui/win/Cursor.cpp b/src/platform/gui/win/Cursor.cpp
new file mode 100644
index 00000000..c2efff1b
--- /dev/null
+++ b/src/platform/gui/win/Cursor.cpp
@@ -0,0 +1,54 @@
+#include "cru/platform/gui/win/Cursor.h"
+
+#include "cru/common/log/Logger.h"
+#include "cru/platform/gui/win/Exception.h"
+
+#include <stdexcept>
+
+namespace cru::platform::gui::win {
+WinCursor::WinCursor(HCURSOR handle, bool auto_destroy) {
+ handle_ = handle;
+ auto_destroy_ = auto_destroy;
+}
+
+WinCursor::~WinCursor() {
+ if (auto_destroy_) {
+ if (!::DestroyCursor(handle_)) {
+ // This is not a fetal error but might still need notice because it may
+ // cause leak.
+ CRU_LOG_WARN(u"Failed to destroy a cursor. Last error code: {}",
+ ::GetLastError());
+ }
+ }
+}
+
+namespace {
+WinCursor* LoadWinCursor(const wchar_t* name) {
+ const auto handle = static_cast<HCURSOR>(::LoadImageW(
+ NULL, name, IMAGE_CURSOR, SM_CYCURSOR, SM_CYCURSOR, LR_SHARED));
+ if (handle == NULL) {
+ throw Win32Error(::GetLastError(), u"Failed to load system cursor.");
+ }
+ return new WinCursor(handle, false);
+}
+} // namespace
+
+WinCursorManager::WinCursorManager()
+ : sys_arrow_(LoadWinCursor(IDC_ARROW)),
+ sys_hand_(LoadWinCursor(IDC_HAND)),
+ sys_ibeam_(LoadWinCursor(IDC_IBEAM)) {}
+
+std::shared_ptr<WinCursor> WinCursorManager::GetSystemWinCursor(
+ SystemCursorType type) {
+ switch (type) {
+ case SystemCursorType::Arrow:
+ return sys_arrow_;
+ case SystemCursorType::Hand:
+ return sys_hand_;
+ case SystemCursorType::IBeam:
+ return sys_ibeam_;
+ default:
+ throw std::runtime_error("Unknown system cursor value.");
+ }
+}
+} // namespace cru::platform::gui::win