diff --git a/OpenRA.Game/Graphics/HardwareCursor.cs b/OpenRA.Game/Graphics/HardwareCursor.cs index 373037ecfc..9c59b9b3ac 100644 --- a/OpenRA.Game/Graphics/HardwareCursor.cs +++ b/OpenRA.Game/Graphics/HardwareCursor.cs @@ -138,15 +138,13 @@ namespace OpenRA.Graphics void Update() { - if (cursor == null) + if (cursor != null && frame >= cursor.Length) + frame %= cursor.Length; + + if (cursor == null || isLocked) Game.Renderer.Window.SetHardwareCursor(null); else - { - if (frame >= cursor.Length) - frame = frame % cursor.Length; - Game.Renderer.Window.SetHardwareCursor(hardwareCursors[cursor.Name][frame]); - } } public void Render(Renderer renderer) @@ -171,12 +169,14 @@ namespace OpenRA.Graphics lockedPosition = Viewport.LastMousePos; Game.Renderer.Window.SetRelativeMouseMode(true); isLocked = true; + Update(); } public void Unlock() { Game.Renderer.Window.SetRelativeMouseMode(false); isLocked = false; + Update(); } public void Dispose() diff --git a/OpenRA.Platforms.Default/Sdl2Input.cs b/OpenRA.Platforms.Default/Sdl2Input.cs index cc66f84a54..92b696fa74 100644 --- a/OpenRA.Platforms.Default/Sdl2Input.cs +++ b/OpenRA.Platforms.Default/Sdl2Input.cs @@ -130,9 +130,14 @@ namespace OpenRA.Platforms.Default case SDL.SDL_EventType.SDL_MOUSEMOTION: { - var input = lockedMousePosition ?? new int2(e.motion.x, e.motion.y); + var mousePos = new int2(e.motion.x, e.motion.y); + var input = lockedMousePosition ?? mousePos; var pos = EventPosition(device, input.X, input.Y); - var delta = EventPosition(device, e.motion.xrel, e.motion.yrel); + + var delta = lockedMousePosition == null + ? EventPosition(device, e.motion.xrel, e.motion.yrel) + : mousePos - lockedMousePosition.Value; + pendingMotion = new MouseInput( MouseInputEvent.Move, lastButtonBits, pos, delta, mods, 0); diff --git a/OpenRA.Platforms.Default/Sdl2PlatformWindow.cs b/OpenRA.Platforms.Default/Sdl2PlatformWindow.cs index 945042d145..6aac86eee1 100644 --- a/OpenRA.Platforms.Default/Sdl2PlatformWindow.cs +++ b/OpenRA.Platforms.Default/Sdl2PlatformWindow.cs @@ -284,11 +284,9 @@ namespace OpenRA.Platforms.Default int x, y; SDL.SDL_GetMouseState(out x, out y); lockedMousePosition = new int2(x, y); - SDL.SDL_SetRelativeMouseMode(SDL.SDL_bool.SDL_TRUE); } else { - SDL.SDL_SetRelativeMouseMode(SDL.SDL_bool.SDL_FALSE); if (lockedMousePosition.HasValue) SDL.SDL_WarpMouseInWindow(window, lockedMousePosition.Value.X, lockedMousePosition.Value.Y); @@ -352,6 +350,9 @@ namespace OpenRA.Platforms.Default { VerifyThreadAffinity(); input.PumpInput(this, inputHandler, lockedMousePosition); + + if (lockedMousePosition.HasValue) + SDL.SDL_WarpMouseInWindow(window, lockedMousePosition.Value.X, lockedMousePosition.Value.Y); } public string GetClipboardText()