hedgewars/uCursor.pas
changeset 12793 575c0de98505
parent 12660 d3fb69e31165
child 12831 1fbc0d5a82d0
--- a/hedgewars/uCursor.pas	Sat Oct 28 07:59:41 2017 +0200
+++ b/hedgewars/uCursor.pas	Sat Oct 28 17:48:54 2017 +0200
@@ -6,6 +6,7 @@
 procedure resetPosition;
 procedure updatePosition;
 procedure handlePositionUpdate(x, y: LongInt);
+procedure setSystemCursor(enabled: boolean);
 
 implementation
 
@@ -18,28 +19,16 @@
 
 procedure resetPosition;
 begin
-    // Move curser by 1px in case it's already centered.
-    // The game camera in the Alpha for 0.9.23 screwed up if
-    // the game started with the mouse already being centered.
-    // This fixes it, but we might have overlooked a related
-    // bug somewhere else.
-    // No big deal since this function is (so far) only called once.
-    SDL_WarpMouse((cScreenWidth div 2) + 1, cScreenHeight div 2);
     SDL_WarpMouse(cScreenWidth div 2, cScreenHeight div 2);
 end;
 
 procedure updatePosition;
 var x, y: LongInt;
 begin
-    SDL_GetMouseState(@x, @y);
+    SDL_GetRelativeMouseState(@x, @y);
 
-    if(x <> cScreenWidth div 2) or (y <> cScreenHeight div 2) then
-    begin
-        handlePositionUpdate(x - cScreenWidth div 2, y - cScreenHeight div 2);
-
-        if cHasFocus then
-            SDL_WarpMouse(cScreenWidth div 2, cScreenHeight div 2);
-    end
+    if(x <> 0) or (y <> 0) then
+        handlePositionUpdate(x, y);
 end;
 
 procedure handlePositionUpdate(x, y: LongInt);
@@ -48,4 +37,21 @@
     CursorPoint.Y:= CursorPoint.Y - y;
 end;
 
+procedure setSystemCursor(enabled: boolean);
+begin
+    if enabled then
+        begin
+        SDL_SetRelativeMouseMode(false);
+        if cHasFocus then
+            resetPosition();
+        SDL_ShowCursor(1);
+        end
+    else
+        begin
+        SDL_ShowCursor(0);
+        SDL_GetRelativeMouseState(nil, nil);
+        SDL_SetRelativeMouseMode(true);
+        end;
+end;
+
 end.