Fix missing joystick if device is reinitialized

This commit is contained in:
Benau 2020-07-15 14:16:19 +08:00
parent 2cf5e29272
commit fa943c70e3
4 changed files with 37 additions and 1 deletions

View File

@ -61,7 +61,7 @@ CIrrDeviceSDL::CIrrDeviceSDL(const SIrrlichtCreationParameters& param)
// noparachute prevents SDL from catching fatal errors. // noparachute prevents SDL from catching fatal errors.
SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1"); SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1");
SDL_SetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, "0"); SDL_SetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, "0");
u32 init_flags = SDL_INIT_TIMER| SDL_INIT_VIDEO| SDL_INIT_GAMECONTROLLER; u32 init_flags = SDL_INIT_TIMER | SDL_INIT_VIDEO;
#if SDL_VERSION_ATLEAST(2, 0, 9) #if SDL_VERSION_ATLEAST(2, 0, 9)
init_flags |= SDL_INIT_SENSOR; init_flags |= SDL_INIT_SENSOR;
#endif #endif

View File

@ -1027,6 +1027,9 @@ void IrrDriver::applyResolutionSettings(bool recreate_device)
// Input manager set first so it recieves SDL joystick event // Input manager set first so it recieves SDL joystick event
// Re-init GUI engine // Re-init GUI engine
GUIEngine::init(m_device, m_video_driver, StateManager::get()); GUIEngine::init(m_device, m_video_driver, StateManager::get());
// If not recreate device we need to add the previous joystick manually
if (!recreate_device)
input_manager->addJoystick();
setMaxTextureSize(); setMaxTextureSize();
//material_manager->reInit(); //material_manager->reInit();

View File

@ -87,6 +87,38 @@ InputManager::InputManager() : m_mode(BOOTSTRAP),
m_timer_in_use = false; m_timer_in_use = false;
m_master_player_only = false; m_master_player_only = false;
m_timer = 0; m_timer = 0;
#ifndef SERVER_ONLY
SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER);
#endif
}
// -----------------------------------------------------------------------------
void InputManager::addJoystick()
{
#ifndef SERVER_ONLY
// When irrlicht device is reinitialized the joystick added event may be
// lost, we look for them and add it back
for (int i = 0; i < SDL_NumJoysticks(); i++)
{
try
{
SDL_Joystick* joystick = SDL_JoystickOpen(i);
if (!joystick)
continue;
SDL_JoystickID id = SDL_JoystickInstanceID(joystick);
if (m_sdl_controller.find(id) != m_sdl_controller.end())
continue;
std::unique_ptr<SDLController> c(
new SDLController(i));
id = c->getInstanceID();
m_sdl_controller[id] = std::move(c);
}
catch (std::exception& e)
{
Log::error("SDLController", "%s", e.what());
}
}
#endif
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------

View File

@ -126,6 +126,7 @@ public:
void dispatchInput(Input::InputType, int deviceID, int btnID, void dispatchInput(Input::InputType, int deviceID, int btnID,
Input::AxisDirection direction, int value, Input::AxisDirection direction, int value,
bool shift_mask = false); bool shift_mask = false);
void addJoystick();
}; };
extern InputManager *input_manager; extern InputManager *input_manager;