Merge pull request #5453 from Robyt3/Joystick-Close-Before-SDL-Quit

Fix segfault in `SDL_JoystickClose` on client quit
This commit is contained in:
Dennis Felsing 2022-06-20 23:47:59 +02:00 committed by GitHub
commit af1f0de5fb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 12 additions and 16 deletions

View file

@ -3354,6 +3354,7 @@ void CClient::Run()
m_NetClient[i].Close();
delete m_pEditor;
m_pInput->Shutdown();
m_pGraphics->Shutdown();
// shutdown SDL

View file

@ -62,12 +62,6 @@ CInput::CInput()
m_aEditingText[0] = 0;
}
CInput::~CInput()
{
SDL_free(m_pClipboardText);
CloseJoysticks();
}
void CInput::Init()
{
m_pGraphics = Kernel()->RequestInterface<IEngineGraphics>();
@ -80,6 +74,12 @@ void CInput::Init()
InitJoysticks();
}
void CInput::Shutdown()
{
SDL_free(m_pClipboardText);
CloseJoysticks();
}
void CInput::InitJoysticks()
{
if(!SDL_WasInit(SDL_INIT_JOYSTICK))
@ -167,18 +167,13 @@ CInput::CJoystick::CJoystick(CInput *pInput, int Index, SDL_Joystick *pDelegate)
void CInput::CloseJoysticks()
{
for(auto &Joystick : m_vJoysticks)
Joystick.Close();
if(SDL_WasInit(SDL_INIT_JOYSTICK))
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
m_vJoysticks.clear();
m_pActiveJoystick = nullptr;
}
void CInput::CJoystick::Close()
{
if(SDL_JoystickGetAttached(m_pDelegate))
SDL_JoystickClose(m_pDelegate);
}
void CInput::SelectNextJoystick()
{
const int Num = m_vJoysticks.size();

View file

@ -43,7 +43,6 @@ public:
int GetHatValue(int Hat) override;
bool Relative(float *pX, float *pY) override;
bool Absolute(float *pX, float *pY) override;
void Close();
static int GetJoystickHatKey(int Hat, int HatValue);
};
@ -97,9 +96,9 @@ private:
public:
CInput();
~CInput();
void Init() override;
void Shutdown() override;
bool ModifierIsPressed() const override { return KeyState(KEY_LCTRL) || KeyState(KEY_RCTRL) || KeyState(KEY_LGUI) || KeyState(KEY_RGUI); }
bool KeyIsPressed(int Key) const override { return KeyState(Key); }

View file

@ -128,6 +128,7 @@ class IEngineInput : public IInput
MACRO_INTERFACE("engineinput", 0)
public:
virtual void Init() = 0;
virtual void Shutdown() = 0;
virtual int Update() = 0;
virtual int VideoRestartNeeded() = 0;
};