# HG changeset patch # User Wuzzy # Date 1510504861 -3600 # Node ID 1fbc0d5a82d0b5caf6c0d398da6b386952e63e00 # Parent ffa905c96dd8f21f39d1a469c0b2f1ae70070ede Backed out changeset 575c0de98505 Reason: We suspect that this patch might break Windows builds and render the mouse on Windows unusable. This suspicion is based on the bug report of one user: https://hedgewars.org/node/6837#comment-33593 In return, this changeset will definitely re-introduce bug 512. diff -r ffa905c96dd8 -r 1fbc0d5a82d0 ChangeLog.txt --- a/ChangeLog.txt Sun Nov 12 17:25:17 2017 +0100 +++ b/ChangeLog.txt Sun Nov 12 17:41:01 2017 +0100 @@ -67,7 +67,6 @@ + Temporarily suspend Heavy Wind mode while turn timer is not running + Engine supports now really gigantic maps * Fixed cursor often jumping back to screen center when putting target location while moving cursor - * Fixed cursor not working at all when using custom mouse sensitivity set by the xinput program * Fixed team getting infinite ammo when stockpiling >= 100 ammo (max. finite ammo is now limited to 99) * Fixed failure to collect crate across wrap world edge * Remove buggy “/finish” chat command diff -r ffa905c96dd8 -r 1fbc0d5a82d0 hedgewars/SDLh.pas --- a/hedgewars/SDLh.pas Sun Nov 12 17:25:17 2017 +0100 +++ b/hedgewars/SDLh.pas Sun Nov 12 17:41:01 2017 +0100 @@ -1106,7 +1106,6 @@ function SDL_RenderSetViewport(window: PSDL_Window; rect: PSDL_Rect): LongInt; cdecl; external SDLLibName; function SDL_GetRelativeMouseState(x, y: PLongInt): Byte; cdecl; external SDLLibName; -procedure SDL_SetRelativeMouseMode(enabled: Boolean); cdecl; external SDLLibName; function SDL_PixelFormatEnumToMasks(format: TSDL_ArrayByteOrder; bpp: PLongInt; Rmask, Gmask, Bmask, Amask: PLongInt): Boolean; cdecl; external SDLLibName; procedure SDL_WarpMouseInWindow(window: PSDL_Window; x, y: LongInt); cdecl; external SDLLibName; diff -r ffa905c96dd8 -r 1fbc0d5a82d0 hedgewars/hwengine.pas --- a/hedgewars/hwengine.pas Sun Nov 12 17:25:17 2017 +0100 +++ b/hedgewars/hwengine.pas Sun Nov 12 17:41:01 2017 +0100 @@ -372,7 +372,6 @@ if not allOK then exit; //SDL_StartTextInput(); SDL_ShowCursor(0); - SDL_SetRelativeMouseMode(true); {$IFDEF USE_VIDEO_RECORDING} diff -r ffa905c96dd8 -r 1fbc0d5a82d0 hedgewars/uCursor.pas --- a/hedgewars/uCursor.pas Sun Nov 12 17:25:17 2017 +0100 +++ b/hedgewars/uCursor.pas Sun Nov 12 17:41:01 2017 +0100 @@ -6,7 +6,6 @@ procedure resetPosition; procedure updatePosition; procedure handlePositionUpdate(x, y: LongInt); -procedure setSystemCursor(enabled: boolean); implementation @@ -19,16 +18,28 @@ 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_GetRelativeMouseState(@x, @y); + SDL_GetMouseState(@x, @y); - if(x <> 0) or (y <> 0) then - handlePositionUpdate(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 end; procedure handlePositionUpdate(x, y: LongInt); @@ -37,21 +48,4 @@ 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. diff -r ffa905c96dd8 -r 1fbc0d5a82d0 hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Sun Nov 12 17:25:17 2017 +0100 +++ b/hedgewars/uWorld.pas Sun Nov 12 17:41:01 2017 +0100 @@ -2014,10 +2014,10 @@ procedure updateCursorVisibility; begin - if isPaused or isAFK or (GameState = gsConfirm) then - uCursor.setSystemCursor(true) + if isPaused or isAFK then + SDL_ShowCursor(1) else - uCursor.setSystemCursor(false); + SDL_ShowCursor(ord(GameState = gsConfirm)) end; procedure SetUtilityWidgetState(ammoType: TAmmoType);