diff options
| -rw-r--r-- | src/input_common/drivers/sdl_driver.cpp | 15 | ||||
| -rw-r--r-- | src/input_common/drivers/sdl_driver.h | 3 | ||||
| -rw-r--r-- | src/input_common/main.cpp | 10 | ||||
| -rw-r--r-- | src/input_common/main.h | 3 | ||||
| -rw-r--r-- | src/yuzu/main.cpp | 12 | ||||
| -rw-r--r-- | src/yuzu/main.h | 2 | 
6 files changed, 35 insertions, 10 deletions
| diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index 45ce588f0..8de86b61e 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp @@ -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);      } diff --git a/src/input_common/drivers/sdl_driver.h b/src/input_common/drivers/sdl_driver.h index d1b4471cf..366bcc496 100644 --- a/src/input_common/drivers/sdl_driver.h +++ b/src/input_common/drivers/sdl_driver.h @@ -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 diff --git a/src/input_common/main.cpp b/src/input_common/main.cpp index b2064ef95..cd42344aa 100644 --- a/src/input_common/main.cpp +++ b/src/input_common/main.cpp @@ -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"); diff --git a/src/input_common/main.h b/src/input_common/main.h index ced252383..6218c37f6 100644 --- a/src/input_common/main.h +++ b/src/input_common/main.h @@ -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; diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 4081af391..7c225cccc 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -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(); diff --git a/src/yuzu/main.h b/src/yuzu/main.h index 6a9992d05..4f9c3b450 100644 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -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; | 
