From e9662a4b665144a5eca418925d331024ec71fa2c Mon Sep 17 00:00:00 2001 From: Morteza Jamshidi Date: Wed, 11 Sep 2024 09:20:21 +0200 Subject: [PATCH] Handle return of GetCursorPos window api function GetCursorPos api function can return false in some cases. In those cases no cursor position is returned, so we ignore it and instead return the last cached position. Fixes: QTBUG-44692 Change-Id: Ie961fe166ef9f1580bd504a55ddfe431e56b3aed Reviewed-by: Wladimir Leuschner Reviewed-by: Oliver Wolff --- src/plugins/platforms/windows/qwindowscursor.cpp | 7 +++++-- src/plugins/platforms/windows/qwindowscursor.h | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/plugins/platforms/windows/qwindowscursor.cpp b/src/plugins/platforms/windows/qwindowscursor.cpp index b4168861206..1fdc5dedcc3 100644 --- a/src/plugins/platforms/windows/qwindowscursor.cpp +++ b/src/plugins/platforms/windows/qwindowscursor.cpp @@ -523,6 +523,7 @@ CursorHandlePtr QWindowsCursor::standardWindowCursor(Qt::CursorShape shape) HCURSOR QWindowsCursor::m_overriddenCursor = nullptr; HCURSOR QWindowsCursor::m_overrideCursor = nullptr; +POINT QWindowsCursor::m_cursorPositionCache = {0,0}; /*! \brief Return cached pixmap cursor or create new one. @@ -633,8 +634,9 @@ void QWindowsCursor::clearOverrideCursor() QPoint QWindowsCursor::mousePosition() { POINT p; - GetCursorPos(&p); - return QPoint(p.x, p.y); + if (GetCursorPos(&p)) + m_cursorPositionCache = p; + return QPoint(m_cursorPositionCache.x, m_cursorPositionCache.y); } QWindowsCursor::State QWindowsCursor::cursorState() @@ -658,6 +660,7 @@ QPoint QWindowsCursor::pos() const void QWindowsCursor::setPos(const QPoint &pos) { + m_cursorPositionCache = {pos.x(), pos.y()}; SetCursorPos(pos.x() , pos.y()); } diff --git a/src/plugins/platforms/windows/qwindowscursor.h b/src/plugins/platforms/windows/qwindowscursor.h index d5c0388d1db..4f0c7bc093b 100644 --- a/src/plugins/platforms/windows/qwindowscursor.h +++ b/src/plugins/platforms/windows/qwindowscursor.h @@ -111,6 +111,7 @@ private: static HCURSOR m_overriddenCursor; static HCURSOR m_overrideCursor; + static POINT m_cursorPositionCache; }; QT_END_NAMESPACE