From a549d0bfed02801d642ef281697f8ac7c3dbc2cf Mon Sep 17 00:00:00 2001 From: Andrei E Date: Mon, 1 Aug 2022 21:28:36 +0100 Subject: [PATCH] Add setRelativeMode for SDL driver (#123) --- include/ICursorControl.h | 3 +++ source/Irrlicht/CIrrDeviceSDL.h | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) 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()