diff --git a/Source/Editor/Windows/GameWindow.cs b/Source/Editor/Windows/GameWindow.cs
index 7a85486d6..935ca9686 100644
--- a/Source/Editor/Windows/GameWindow.cs
+++ b/Source/Editor/Windows/GameWindow.cs
@@ -1179,9 +1179,10 @@ namespace FlaxEditor.Windows
_cursorVisible = Screen.CursorVisible;
_cursorLockMode = Screen.CursorLock;
- // Restore cursor visibility (could be hidden by the game)
+ // Restore cursor state, could be hidden or locked by the game
if (!_cursorVisible)
Screen.CursorVisible = true;
+ Screen.CursorLock = CursorLockMode.None;
}
}
diff --git a/Source/Engine/Input/Mouse.h b/Source/Engine/Input/Mouse.h
index bb10cb873..aecccd965 100644
--- a/Source/Engine/Input/Mouse.h
+++ b/Source/Engine/Input/Mouse.h
@@ -119,7 +119,8 @@ public:
///
/// Gets the current state of mouse relative mode.
///
- API_FUNCTION() FORCE_INLINE bool IsRelative() const
+ /// The window to check against, or null to check for any window.
+ virtual API_FUNCTION() bool IsRelative(Window* window = nullptr) const
{
return _relativeMode;
}
diff --git a/Source/Engine/Platform/Base/WindowBase.h b/Source/Engine/Platform/Base/WindowBase.h
index c271754f4..d53292ef4 100644
--- a/Source/Engine/Platform/Base/WindowBase.h
+++ b/Source/Engine/Platform/Base/WindowBase.h
@@ -45,6 +45,7 @@ protected:
bool _isHorizontalFlippingMouse = false;
bool _isVerticalFlippingMouse = false;
bool _isClippingCursor = false;
+ bool _restoreRelativeMode = false;
explicit WindowBase(const CreateWindowSettings& settings);
virtual ~WindowBase();
diff --git a/Source/Engine/Platform/SDL/SDLInput.cpp b/Source/Engine/Platform/SDL/SDLInput.cpp
index ff3f362a1..40c3e3b9d 100644
--- a/Source/Engine/Platform/SDL/SDLInput.cpp
+++ b/Source/Engine/Platform/SDL/SDLInput.cpp
@@ -432,6 +432,13 @@ public:
if (!SDL_SetWindowRelativeMouseMode(windowHandle, relativeMode))
LOG(Error, "Failed to set mouse relative mode: {0}", String(SDL_GetError()));
}
+
+ bool IsRelative(Window* window) const override
+ {
+ if (window == nullptr)
+ return _relativeMode;
+ return _relativeModeWindow == window && _relativeMode;
+ }
};
///
diff --git a/Source/Engine/Platform/SDL/SDLWindow.cpp b/Source/Engine/Platform/SDL/SDLWindow.cpp
index 8624e69ca..8c1fb8a3f 100644
--- a/Source/Engine/Platform/SDL/SDLWindow.cpp
+++ b/Source/Engine/Platform/SDL/SDLWindow.cpp
@@ -440,6 +440,9 @@ void SDLWindow::HandleEvent(SDL_Event& event)
if (inRelativeMode)
Input::Mouse->SetRelativeMode(true, this);
}
+ else if (_restoreRelativeMode)
+ Input::Mouse->SetRelativeMode(true, this);
+ _restoreRelativeMode = false;
return;
}
case SDL_EVENT_WINDOW_FOCUS_LOST:
@@ -448,6 +451,13 @@ void SDLWindow::HandleEvent(SDL_Event& event)
SDL_StopTextInput(_window);
if (_isClippingCursor)
SDL_SetWindowMouseRect(_window, nullptr);
+
+ if (Input::Mouse->IsRelative(this))
+ {
+ Input::Mouse->SetRelativeMode(false, this);
+ _restoreRelativeMode = true;
+ }
+
OnLostFocus();
return;
}