diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index 778228724f..c40b33c7ea 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -189,6 +189,7 @@ struct EmuCallbacks std::function on_ready; std::function exit; std::function reset_pads; + std::function enable_pads; std::function handle_taskbar_progress; // (type, value) type: 0 for reset, 1 for increment, 2 for set_limit std::function()> get_kb_handler; std::function()> get_mouse_handler; diff --git a/rpcs3/pad_thread.cpp b/rpcs3/pad_thread.cpp index 7fdea51b9b..3e42d62211 100644 --- a/rpcs3/pad_thread.cpp +++ b/rpcs3/pad_thread.cpp @@ -142,11 +142,21 @@ void pad_thread::Reset() reset = active.load(); } +void pad_thread::SetEnabled(bool enabled) +{ + is_enabled = enabled; +} + void pad_thread::ThreadFunc() { active = true; while (active) { + if (!is_enabled) + { + std::this_thread::sleep_for(1ms); + continue; + } if (reset && reset.exchange(false)) { Init(); diff --git a/rpcs3/pad_thread.h b/rpcs3/pad_thread.h index e4a2f626a4..6ef1600c82 100644 --- a/rpcs3/pad_thread.h +++ b/rpcs3/pad_thread.h @@ -24,6 +24,7 @@ public: void SetRumble(const u32 pad, u8 largeMotor, bool smallMotor); void Init(); void Reset(); + void SetEnabled(bool enabled); protected: void ThreadFunc(); @@ -40,6 +41,7 @@ protected: atomic_t active{ false }; atomic_t reset{ false }; + atomic_t is_enabled{ true }; std::shared_ptr thread; }; diff --git a/rpcs3/rpcs3_app.cpp b/rpcs3/rpcs3_app.cpp index 6743277729..1691493433 100644 --- a/rpcs3/rpcs3_app.cpp +++ b/rpcs3/rpcs3_app.cpp @@ -146,6 +146,10 @@ void rpcs3_app::InitializeCallbacks() { pad::get_current_handler()->Reset(); }; + callbacks.enable_pads = [this](bool enable) + { + pad::get_current_handler()->SetEnabled(enable); + }; callbacks.get_kb_handler = [=]() -> std::shared_ptr { diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index fffc715d1f..3ad7e1b47c 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -1260,9 +1260,17 @@ void main_window::CreateConnects() } Emu.GetCallbacks().reset_pads(); }; + if (!Emu.IsStopped()) + { + Emu.GetCallbacks().enable_pads(false); + } pad_settings_dialog dlg(this); connect(&dlg, &QDialog::accepted, resetPadHandlers); dlg.exec(); + if (!Emu.IsStopped()) + { + Emu.GetCallbacks().enable_pads(true); + } }; connect(ui->confPadsAct, &QAction::triggered, openPadSettings); diff --git a/rpcs3/rpcs3qt/pad_settings_dialog.ui b/rpcs3/rpcs3qt/pad_settings_dialog.ui index b9ade1f0ef..a5b0cc097f 100644 --- a/rpcs3/rpcs3qt/pad_settings_dialog.ui +++ b/rpcs3/rpcs3qt/pad_settings_dialog.ui @@ -2,6 +2,9 @@ pad_settings_dialog + + Qt::WindowModal + 0