mirror of
https://github.com/ddnet/ddnet.git
synced 2024-09-20 01:24:18 +00:00
Merge pull request #5453 from Robyt3/Joystick-Close-Before-SDL-Quit
Fix segfault in `SDL_JoystickClose` on client quit
This commit is contained in:
commit
af1f0de5fb
|
@ -3354,6 +3354,7 @@ void CClient::Run()
|
||||||
m_NetClient[i].Close();
|
m_NetClient[i].Close();
|
||||||
|
|
||||||
delete m_pEditor;
|
delete m_pEditor;
|
||||||
|
m_pInput->Shutdown();
|
||||||
m_pGraphics->Shutdown();
|
m_pGraphics->Shutdown();
|
||||||
|
|
||||||
// shutdown SDL
|
// shutdown SDL
|
||||||
|
|
|
@ -62,12 +62,6 @@ CInput::CInput()
|
||||||
m_aEditingText[0] = 0;
|
m_aEditingText[0] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
CInput::~CInput()
|
|
||||||
{
|
|
||||||
SDL_free(m_pClipboardText);
|
|
||||||
CloseJoysticks();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CInput::Init()
|
void CInput::Init()
|
||||||
{
|
{
|
||||||
m_pGraphics = Kernel()->RequestInterface<IEngineGraphics>();
|
m_pGraphics = Kernel()->RequestInterface<IEngineGraphics>();
|
||||||
|
@ -80,6 +74,12 @@ void CInput::Init()
|
||||||
InitJoysticks();
|
InitJoysticks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CInput::Shutdown()
|
||||||
|
{
|
||||||
|
SDL_free(m_pClipboardText);
|
||||||
|
CloseJoysticks();
|
||||||
|
}
|
||||||
|
|
||||||
void CInput::InitJoysticks()
|
void CInput::InitJoysticks()
|
||||||
{
|
{
|
||||||
if(!SDL_WasInit(SDL_INIT_JOYSTICK))
|
if(!SDL_WasInit(SDL_INIT_JOYSTICK))
|
||||||
|
@ -167,18 +167,13 @@ CInput::CJoystick::CJoystick(CInput *pInput, int Index, SDL_Joystick *pDelegate)
|
||||||
|
|
||||||
void CInput::CloseJoysticks()
|
void CInput::CloseJoysticks()
|
||||||
{
|
{
|
||||||
for(auto &Joystick : m_vJoysticks)
|
if(SDL_WasInit(SDL_INIT_JOYSTICK))
|
||||||
Joystick.Close();
|
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
|
||||||
|
|
||||||
m_vJoysticks.clear();
|
m_vJoysticks.clear();
|
||||||
m_pActiveJoystick = nullptr;
|
m_pActiveJoystick = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CInput::CJoystick::Close()
|
|
||||||
{
|
|
||||||
if(SDL_JoystickGetAttached(m_pDelegate))
|
|
||||||
SDL_JoystickClose(m_pDelegate);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CInput::SelectNextJoystick()
|
void CInput::SelectNextJoystick()
|
||||||
{
|
{
|
||||||
const int Num = m_vJoysticks.size();
|
const int Num = m_vJoysticks.size();
|
||||||
|
|
|
@ -43,7 +43,6 @@ public:
|
||||||
int GetHatValue(int Hat) override;
|
int GetHatValue(int Hat) override;
|
||||||
bool Relative(float *pX, float *pY) override;
|
bool Relative(float *pX, float *pY) override;
|
||||||
bool Absolute(float *pX, float *pY) override;
|
bool Absolute(float *pX, float *pY) override;
|
||||||
void Close();
|
|
||||||
|
|
||||||
static int GetJoystickHatKey(int Hat, int HatValue);
|
static int GetJoystickHatKey(int Hat, int HatValue);
|
||||||
};
|
};
|
||||||
|
@ -97,9 +96,9 @@ private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CInput();
|
CInput();
|
||||||
~CInput();
|
|
||||||
|
|
||||||
void Init() override;
|
void Init() override;
|
||||||
|
void Shutdown() override;
|
||||||
|
|
||||||
bool ModifierIsPressed() const override { return KeyState(KEY_LCTRL) || KeyState(KEY_RCTRL) || KeyState(KEY_LGUI) || KeyState(KEY_RGUI); }
|
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); }
|
bool KeyIsPressed(int Key) const override { return KeyState(Key); }
|
||||||
|
|
|
@ -128,6 +128,7 @@ class IEngineInput : public IInput
|
||||||
MACRO_INTERFACE("engineinput", 0)
|
MACRO_INTERFACE("engineinput", 0)
|
||||||
public:
|
public:
|
||||||
virtual void Init() = 0;
|
virtual void Init() = 0;
|
||||||
|
virtual void Shutdown() = 0;
|
||||||
virtual int Update() = 0;
|
virtual int Update() = 0;
|
||||||
virtual int VideoRestartNeeded() = 0;
|
virtual int VideoRestartNeeded() = 0;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue