diff --git a/include/ICursorControl.h b/include/ICursorControl.h index 13c99c45..de9c4995 100644 --- a/include/ICursorControl.h +++ b/include/ICursorControl.h @@ -160,6 +160,9 @@ namespace gui \param rect: A pointer to an reference rectangle or 0 to disable the reference rectangle.*/ virtual void setReferenceRect(core::rect* rect=0) = 0; + //! Internally fixes the mouse position, and reports relative mouse movement compared to the old position + /** Specific to SDL */ + virtual void setRelativeMode(bool relative) {}; //! Sets the active cursor icon /** Setting cursor icons is so far only supported on Win32 and Linux */ diff --git a/source/Irrlicht/CIrrDeviceSDL.h b/source/Irrlicht/CIrrDeviceSDL.h index e2e3654d..e8583997 100644 --- a/source/Irrlicht/CIrrDeviceSDL.h +++ b/source/Irrlicht/CIrrDeviceSDL.h @@ -146,6 +146,12 @@ namespace irr void setPosition(s32 x, s32 y) override { SDL_WarpMouseInWindow(Device->Window, x, y); + + if (SDL_GetRelativeMouseMode()) { + // There won't be an event for this warp (details on libsdl-org/SDL/issues/6034) + Device->MouseX = x; + Device->MouseY = y; + } } //! Returns the current position of the mouse cursor. @@ -169,6 +175,17 @@ namespace irr { } + virtual void setRelativeMode(bool relative) _IRR_OVERRIDE_ + { + // Only change it when necessary, as it flushes mouse motion when enabled + if ( relative != SDL_GetRelativeMouseMode()) { + if ( relative ) + SDL_SetRelativeMouseMode( SDL_TRUE ); + else + SDL_SetRelativeMouseMode( SDL_FALSE ); + } + } + private: void updateCursorPos()