diff --git a/Source/Core/Common/Common.h b/Source/Core/Common/Common.h index 8027e31878..960e5a96d8 100644 --- a/Source/Core/Common/Common.h +++ b/Source/Core/Common/Common.h @@ -136,6 +136,7 @@ enum HOST_COMM WM_USER_STOP = 10, WM_USER_CREATE, WM_USER_SETCURSOR, + WM_USER_QUIT, }; // Used for notification on emulation state diff --git a/Source/Core/DolphinWX/Frame.cpp b/Source/Core/DolphinWX/Frame.cpp index 583275932c..5a7394a25e 100644 --- a/Source/Core/DolphinWX/Frame.cpp +++ b/Source/Core/DolphinWX/Frame.cpp @@ -778,6 +778,10 @@ void CFrame::OnHostMessage(wxCommandEvent& event) case IDM_STOPPED: OnStopped(); break; + + case WM_USER_QUIT: + Close(true); + break; } } diff --git a/Source/Core/DolphinWX/MainNoGUI.cpp b/Source/Core/DolphinWX/MainNoGUI.cpp index 9186742d46..313ad0b20f 100644 --- a/Source/Core/DolphinWX/MainNoGUI.cpp +++ b/Source/Core/DolphinWX/MainNoGUI.cpp @@ -49,7 +49,7 @@ void Host_RefreshDSPDebuggerWindow() {} static Common::Event updateMainFrameEvent; void Host_Message(int Id) { - if (Id == WM_USER_STOP) + if (Id == WM_USER_STOP || Id == WM_USER_QUIT) running = false; } diff --git a/Source/Core/InputCommon/ControllerInterface/ControllerInterface.cpp b/Source/Core/InputCommon/ControllerInterface/ControllerInterface.cpp index 6b8b11fd3a..2c87e77f01 100644 --- a/Source/Core/InputCommon/ControllerInterface/ControllerInterface.cpp +++ b/Source/Core/InputCommon/ControllerInterface/ControllerInterface.cpp @@ -134,6 +134,11 @@ void ControllerInterface::Shutdown() // void ControllerInterface::UpdateInput() { +#ifdef CIFACE_USE_SDL + // SDL currently also handles SIGINT and SIGTERM, + // so make sure to update it even if there is no SDL device. + ciface::SDL::UpdateInput(); +#endif for (ciface::Core::Device* d : m_devices) d->UpdateInput(); } diff --git a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp index 6cdfa470cd..6e60cf0f7a 100644 --- a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp +++ b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp @@ -7,6 +7,7 @@ #include #include "Common/StringUtil.h" +#include "Core/Host.h" #include "InputCommon/ControllerInterface/SDL/SDL.h" #ifdef _WIN32 @@ -67,6 +68,19 @@ void Init( std::vector& devices ) } } +void UpdateInput() +{ + // Using SDL_INIT_JOYSTICK implies SDL_INIT_EVENT which installs a signal handler for SIGINT and SIGTERM. + // In the future, we will be able to prevent this from happening: + // SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1"); + // but this was added after SDL 2.0.3 and is scheduled to be included in 2.0.4. + // Until then, handle SDL_QUIT events here and tell Dolphin to exit. + if (SDL_QuitRequested()) + Host_Message(WM_USER_QUIT); + + SDL_JoystickUpdate(); +} + Joystick::Joystick(SDL_Joystick* const joystick, const int sdl_index, const unsigned int index) : m_joystick(joystick) , m_sdl_index(sdl_index) @@ -283,12 +297,6 @@ void Joystick::LeftRightEffect::SetSDLHapticEffect(ControlState state) } #endif -void Joystick::UpdateInput() -{ - // each joystick is doin this, o well - SDL_JoystickUpdate(); -} - std::string Joystick::GetName() const { return StripSpaces(GetJoystickName(m_sdl_index)); diff --git a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.h b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.h index 751f40e9f4..65082847a2 100644 --- a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.h +++ b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.h @@ -25,6 +25,7 @@ namespace SDL { void Init( std::vector& devices ); +void UpdateInput(); class Joystick : public Core::Device { @@ -130,8 +131,6 @@ private: #endif public: - void UpdateInput() override; - Joystick(SDL_Joystick* const joystick, const int sdl_index, const unsigned int index); ~Joystick();