diff -r 8fa21750470f -r 575c0de98505 hedgewars/uCursor.pas --- 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.