From 7c4b8758eabefe7794ea99bc06c18a4e52a1dec0 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Wed, 22 May 2024 21:10:01 -0500 Subject: [PATCH 1/2] Fix a few edge cases for cursor showing/not showing --- Source/Engine/Platform/Windows/WindowsWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Engine/Platform/Windows/WindowsWindow.cpp b/Source/Engine/Platform/Windows/WindowsWindow.cpp index f259ce337..1f53abe75 100644 --- a/Source/Engine/Platform/Windows/WindowsWindow.cpp +++ b/Source/Engine/Platform/Windows/WindowsWindow.cpp @@ -778,7 +778,7 @@ void WindowsWindow::UpdateCursor() if (!_lastCursorHidden) { _lastCursorHidden = true; - ::ShowCursor(FALSE); + while(::ShowCursor(FALSE) >= 0); } ::SetCursor(nullptr); return; @@ -786,7 +786,7 @@ void WindowsWindow::UpdateCursor() else if (_lastCursorHidden) { _lastCursorHidden = false; - ::ShowCursor(TRUE); + while(::ShowCursor(TRUE) < 0); } int32 index = 0; From f01784108dc738464b2bd7ae0f75c246c0005c78 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 30 May 2024 08:47:41 -0500 Subject: [PATCH 2/2] Add check to cursor hidden/showing loops. --- .../Engine/Platform/Windows/WindowsWindow.cpp | 22 +++++++++++++++++-- .../Engine/Platform/Windows/WindowsWindow.h | 1 + 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Source/Engine/Platform/Windows/WindowsWindow.cpp b/Source/Engine/Platform/Windows/WindowsWindow.cpp index 1f53abe75..78cea0a3c 100644 --- a/Source/Engine/Platform/Windows/WindowsWindow.cpp +++ b/Source/Engine/Platform/Windows/WindowsWindow.cpp @@ -778,7 +778,16 @@ void WindowsWindow::UpdateCursor() if (!_lastCursorHidden) { _lastCursorHidden = true; - while(::ShowCursor(FALSE) >= 0); + while(::ShowCursor(FALSE) >= 0) + { + if (_cursorHiddenSafetyCount >= 100) + { + LOG(Warning, "Cursor has failed to hide."); + break; + } + _cursorHiddenSafetyCount += 1; + } + _cursorHiddenSafetyCount = 0; } ::SetCursor(nullptr); return; @@ -786,7 +795,16 @@ void WindowsWindow::UpdateCursor() else if (_lastCursorHidden) { _lastCursorHidden = false; - while(::ShowCursor(TRUE) < 0); + while(::ShowCursor(TRUE) < 0) + { + if (_cursorHiddenSafetyCount >= 100) + { + LOG(Warning, "Cursor has failed to show."); + break; + } + _cursorHiddenSafetyCount += 1; + } + _cursorHiddenSafetyCount = 0; } int32 index = 0; diff --git a/Source/Engine/Platform/Windows/WindowsWindow.h b/Source/Engine/Platform/Windows/WindowsWindow.h index c2dad4a13..6c720ba07 100644 --- a/Source/Engine/Platform/Windows/WindowsWindow.h +++ b/Source/Engine/Platform/Windows/WindowsWindow.h @@ -29,6 +29,7 @@ private: bool _trackingMouse = false; bool _clipCursorSet = false; bool _lastCursorHidden = false; + int _cursorHiddenSafetyCount = 0; bool _isDuringMaximize = false; Windows::HANDLE _monitor = nullptr; Windows::LONG _clipCursorRect[4];