aboutsummaryrefslogtreecommitdiffhomepage
path: root/win32/ScintillaWin.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'win32/ScintillaWin.cxx')
-rw-r--r--win32/ScintillaWin.cxx44
1 files changed, 44 insertions, 0 deletions
diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx
index cd56105d0..28b6e950c 100644
--- a/win32/ScintillaWin.cxx
+++ b/win32/ScintillaWin.cxx
@@ -269,6 +269,37 @@ public:
class GlobalMemory;
+class ReverseArrowCursor {
+ UINT dpi = USER_DEFAULT_SCREEN_DPI;
+ HCURSOR cursor {};
+
+public:
+ ReverseArrowCursor() noexcept {}
+ // Deleted so ReverseArrowCursor objects can not be copied.
+ ReverseArrowCursor(const ReverseArrowCursor &) = delete;
+ ReverseArrowCursor(ReverseArrowCursor &&) = delete;
+ ReverseArrowCursor &operator=(const ReverseArrowCursor &) = delete;
+ ReverseArrowCursor &operator=(ReverseArrowCursor &&) = delete;
+ ~ReverseArrowCursor() {
+ if (cursor) {
+ ::DestroyCursor(cursor);
+ }
+ }
+
+ HCURSOR Load(UINT dpi_) noexcept {
+ if (cursor) {
+ if (dpi == dpi_) {
+ return cursor;
+ }
+ ::DestroyCursor(cursor);
+ }
+
+ dpi = dpi_;
+ cursor = LoadReverseArrowCursor(dpi_);
+ return cursor ? cursor : ::LoadCursor({}, IDC_ARROW);
+ }
+};
+
}
/**
@@ -287,6 +318,7 @@ class ScintillaWin :
int wheelDelta; ///< Wheel delta from roll
UINT dpi = USER_DEFAULT_SCREEN_DPI;
+ ReverseArrowCursor reverseArrowCursor;
HRGN hRgnUpdate;
@@ -336,6 +368,7 @@ class ScintillaWin :
enum : UINT_PTR { invalidTimerID, standardTimerID, idleTimerID, fineTimerStart };
+ void DisplayCursor(Window::Cursor c) override;
bool DragThreshold(Point ptStart, Point ptNow) override;
void StartDrag() override;
static int MouseModifiers(uptr_t wParam) noexcept;
@@ -654,6 +687,17 @@ HWND ScintillaWin::MainHWND() const noexcept {
return HwndFromWindow(wMain);
}
+void ScintillaWin::DisplayCursor(Window::Cursor c) {
+ if (cursorMode != SC_CURSORNORMAL) {
+ c = static_cast<Window::Cursor>(cursorMode);
+ }
+ if (c == Window::cursorReverseArrow) {
+ ::SetCursor(reverseArrowCursor.Load(dpi));
+ } else {
+ wMain.SetCursor(c);
+ }
+}
+
bool ScintillaWin::DragThreshold(Point ptStart, Point ptNow) {
const Point ptDifference = ptStart - ptNow;
const XYPOSITION xMove = std::trunc(std::abs(ptDifference.x));