input_common: Pump sdl events from main thread
This commit is contained in:
		| @@ -361,6 +361,12 @@ void SDLDriver::CloseJoystick(SDL_Joystick* sdl_joystick) { | ||||
|     } | ||||
| } | ||||
|  | ||||
| void SDLDriver::PumpEvents() const { | ||||
|     if (initialized) { | ||||
|         SDL_PumpEvents(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void SDLDriver::HandleGameControllerEvent(const SDL_Event& event) { | ||||
|     switch (event.type) { | ||||
|     case SDL_JOYBUTTONUP: { | ||||
| @@ -451,14 +457,6 @@ SDLDriver::SDLDriver(std::string input_engine_) : InputEngine(std::move(input_en | ||||
|  | ||||
|     initialized = true; | ||||
|     if (start_thread) { | ||||
|         poll_thread = std::thread([this] { | ||||
|             Common::SetCurrentThreadName("SDL_MainLoop"); | ||||
|             using namespace std::chrono_literals; | ||||
|             while (initialized) { | ||||
|                 SDL_PumpEvents(); | ||||
|                 std::this_thread::sleep_for(1ms); | ||||
|             } | ||||
|         }); | ||||
|         vibration_thread = std::thread([this] { | ||||
|             Common::SetCurrentThreadName("SDL_Vibration"); | ||||
|             using namespace std::chrono_literals; | ||||
| @@ -481,7 +479,6 @@ SDLDriver::~SDLDriver() { | ||||
|  | ||||
|     initialized = false; | ||||
|     if (start_thread) { | ||||
|         poll_thread.join(); | ||||
|         vibration_thread.join(); | ||||
|         SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER); | ||||
|     } | ||||
|   | ||||
| @@ -36,6 +36,8 @@ public: | ||||
|     /// Unregisters SDL device factories and shut them down. | ||||
|     ~SDLDriver() override; | ||||
|  | ||||
|     void PumpEvents() const; | ||||
|  | ||||
|     /// Handle SDL_Events for joysticks from SDL_PollEvent | ||||
|     void HandleGameControllerEvent(const SDL_Event& event); | ||||
|  | ||||
| @@ -128,7 +130,6 @@ private: | ||||
|     bool start_thread = false; | ||||
|     std::atomic<bool> initialized = false; | ||||
|  | ||||
|     std::thread poll_thread; | ||||
|     std::thread vibration_thread; | ||||
| }; | ||||
| } // namespace InputCommon | ||||
|   | ||||
| @@ -324,6 +324,12 @@ struct InputSubsystem::Impl { | ||||
| #endif | ||||
|     } | ||||
|  | ||||
|     void PumpEvents() const { | ||||
| #ifdef HAVE_SDL2 | ||||
|         sdl->PumpEvents(); | ||||
| #endif | ||||
|     } | ||||
|  | ||||
|     void RegisterInput(const MappingData& data) { | ||||
|         mapping_factory->RegisterInput(data); | ||||
|     } | ||||
| @@ -472,6 +478,10 @@ void InputSubsystem::StopMapping() const { | ||||
|     impl->mapping_factory->StopMapping(); | ||||
| } | ||||
|  | ||||
| void InputSubsystem::PumpEvents() const { | ||||
|     impl->PumpEvents(); | ||||
| } | ||||
|  | ||||
| std::string GenerateKeyboardParam(int key_code) { | ||||
|     Common::ParamPackage param; | ||||
|     param.Set("engine", "keyboard"); | ||||
|   | ||||
| @@ -147,6 +147,9 @@ public: | ||||
|     /// Stop polling from all backends. | ||||
|     void StopMapping() const; | ||||
|  | ||||
|     /// Signals SDL driver for new input events | ||||
|     void PumpEvents() const; | ||||
|  | ||||
| private: | ||||
|     struct Impl; | ||||
|     std::unique_ptr<Impl> impl; | ||||
|   | ||||
| @@ -167,6 +167,7 @@ __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1; | ||||
|  | ||||
| constexpr int default_mouse_hide_timeout = 2500; | ||||
| constexpr int default_mouse_center_timeout = 10; | ||||
| constexpr int default_input_update_timeout = 1; | ||||
|  | ||||
| /** | ||||
|  * "Callouts" are one-time instructional messages shown to the user. In the config settings, there | ||||
| @@ -404,6 +405,10 @@ GMainWindow::GMainWindow(std::unique_ptr<Config> config_, bool has_broken_vulkan | ||||
|     mouse_center_timer.setInterval(default_mouse_center_timeout); | ||||
|     connect(&mouse_center_timer, &QTimer::timeout, this, &GMainWindow::CenterMouseCursor); | ||||
|  | ||||
|     update_input_timer.setInterval(default_input_update_timeout); | ||||
|     connect(&update_input_timer, &QTimer::timeout, this, &GMainWindow::UpdateInputDrivers); | ||||
|     update_input_timer.start(); | ||||
|  | ||||
|     MigrateConfigFiles(); | ||||
|  | ||||
|     if (has_broken_vulkan) { | ||||
| @@ -3636,6 +3641,13 @@ void GMainWindow::UpdateUISettings() { | ||||
|     UISettings::values.first_start = false; | ||||
| } | ||||
|  | ||||
| void GMainWindow::UpdateInputDrivers() { | ||||
|     if (!input_subsystem) { | ||||
|         return; | ||||
|     } | ||||
|     input_subsystem->PumpEvents(); | ||||
| } | ||||
|  | ||||
| void GMainWindow::HideMouseCursor() { | ||||
|     if (emu_thread == nullptr && UISettings::values.hide_mouse) { | ||||
|         mouse_hide_timer.stop(); | ||||
|   | ||||
| @@ -353,6 +353,7 @@ private: | ||||
|     void UpdateGPUAccuracyButton(); | ||||
|     void UpdateStatusButtons(); | ||||
|     void UpdateUISettings(); | ||||
|     void UpdateInputDrivers(); | ||||
|     void HideMouseCursor(); | ||||
|     void ShowMouseCursor(); | ||||
|     void CenterMouseCursor(); | ||||
| @@ -404,6 +405,7 @@ private: | ||||
|     bool auto_muted = false; | ||||
|     QTimer mouse_hide_timer; | ||||
|     QTimer mouse_center_timer; | ||||
|     QTimer update_input_timer; | ||||
|  | ||||
|     QString startup_icon_theme; | ||||
|     bool os_dark_mode = false; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user