소스 검색

Merge pull request #4627 from Morph1984/fix-dinput-controller-disconnect

sdl_impl: Erase the SDLJoystick entry after removing a controller
bunnei 5 년 전
부모
커밋
e03dc4d569
1개의 변경된 파일13개의 추가작업 그리고 15개의 파일을 삭제
  1. 13 15
      src/input_common/sdl/sdl_impl.cpp

+ 13 - 15
src/input_common/sdl/sdl_impl.cpp

@@ -273,21 +273,19 @@ void SDLState::InitJoystick(int joystick_index) {
 void SDLState::CloseJoystick(SDL_Joystick* sdl_joystick) {
     const std::string guid = GetGUID(sdl_joystick);
 
-    std::shared_ptr<SDLJoystick> found_joystick;
-    {
-        std::lock_guard lock{joystick_map_mutex};
-        // This call to guid is safe since the joystick is guaranteed to be in the map
-        const auto& joystick_guid_list = joystick_map[guid];
-        const auto joystick_it = std::find_if(joystick_guid_list.begin(), joystick_guid_list.end(),
-                                              [&sdl_joystick](const auto& joystick) {
-                                                  return joystick->GetSDLJoystick() == sdl_joystick;
-                                              });
-        found_joystick = *joystick_it;
-    }
-
-    // Destruct SDL_Joystick outside the lock guard because SDL can internally call the
-    // event callback which locks the mutex again.
-    found_joystick->SetSDLJoystick(nullptr, nullptr);
+    std::lock_guard lock{joystick_map_mutex};
+    auto& joystick_guid_list = joystick_map[guid];
+    auto joystick_it = std::find_if(
+        joystick_guid_list.begin(), joystick_guid_list.end(),
+        [&sdl_joystick](auto& joystick) { return joystick->GetSDLJoystick() == sdl_joystick; });
+
+    if (joystick_it != joystick_guid_list.end()) {
+        (*joystick_it)->SetSDLJoystick(nullptr, nullptr);
+        joystick_guid_list.erase(joystick_it);
+        if (joystick_guid_list.empty()) {
+            joystick_map.erase(guid);
+        }
+    }
 }
 
 void SDLState::HandleGameControllerEvent(const SDL_Event& event) {