diff --git a/rpcs3/Emu/Io/PadHandler.cpp b/rpcs3/Emu/Io/PadHandler.cpp index fc5ce667e6..1aceb59b38 100644 --- a/rpcs3/Emu/Io/PadHandler.cpp +++ b/rpcs3/Emu/Io/PadHandler.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "PadHandler.h" #include "Emu/system_utils.hpp" +#include "Emu/system_config.h" #include "Input/pad_thread.h" #include "Input/product_info.h" @@ -766,6 +767,19 @@ void PadHandlerBase::process() } case connection::disconnected: { + if (g_cfg.io.keep_pads_connected) + { + if (!last_connection_status[i]) + { + input_log.success("%s device %d connected by force", m_type, i); + pad->m_port_status |= CELL_PAD_STATUS_CONNECTED; + pad->m_port_status |= CELL_PAD_STATUS_ASSIGN_CHANGES; + last_connection_status[i] = true; + connected_devices++; + } + continue; + } + if (last_connection_status[i]) { input_log.error("%s device %d disconnected", m_type, i); diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp index 257e4e983a..71ac55ff4c 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp @@ -75,6 +75,7 @@ namespace rsx : home_menu_settings_page(x, y, width, height, use_separators, parent, get_localized_string(localized_string_id::HOME_MENU_SETTINGS_INPUT)) { add_checkbox(&g_cfg.io.background_input_enabled, "Background Input Enabled"); + add_checkbox(&g_cfg.io.keep_pads_connected, "Keep Pads Connected"); add_checkbox(&g_cfg.io.show_move_cursor, "Show PS Move Cursor"); if (g_cfg.io.camera == camera_handler::qt) diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index 425d25a281..0bda85b625 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -273,6 +273,7 @@ struct cfg_root : cfg::node cfg::_enum turntable{this, "Turntable emulated controller", turntable_handler::null}; cfg::_enum ghltar{this, "GHLtar emulated controller", ghltar_handler::null}; cfg::_enum pad_mode{this, "Pad handler mode", pad_handler_mode::single_threaded, true}; + cfg::_bool keep_pads_connected{this, "Keep pads connected", false, true}; cfg::uint<0, 100'000> pad_sleep{this, "Pad handler sleep (microseconds)", 1'000, true}; cfg::_bool background_input_enabled{this, "Background input enabled", true, true}; cfg::_bool show_move_cursor{this, "Show move cursor", false, true}; diff --git a/rpcs3/rpcs3qt/emu_settings_type.h b/rpcs3/rpcs3qt/emu_settings_type.h index a1bdad2754..140e7fcad4 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.h +++ b/rpcs3/rpcs3qt/emu_settings_type.h @@ -145,6 +145,7 @@ enum class emu_settings_type BackgroundInput, ShowMoveCursor, PadHandlerMode, + PadConnection, KeyboardHandler, MouseHandler, Camera, @@ -326,6 +327,7 @@ inline static const QMap settings_location = { emu_settings_type::BackgroundInput, { "Input/Output", "Background input enabled"}}, { emu_settings_type::ShowMoveCursor, { "Input/Output", "Show move cursor"}}, { emu_settings_type::PadHandlerMode, { "Input/Output", "Pad handler mode"}}, + { emu_settings_type::PadConnection, { "Input/Output", "Keep pads connected" }}, { emu_settings_type::KeyboardHandler, { "Input/Output", "Keyboard"}}, { emu_settings_type::MouseHandler, { "Input/Output", "Mouse"}}, { emu_settings_type::Camera, { "Input/Output", "Camera"}}, diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index a6904b79ef..5b2e4517b5 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -1254,6 +1254,9 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std m_emu_settings->EnhanceCheckBox(ui->backgroundInputBox, emu_settings_type::BackgroundInput); SubscribeTooltip(ui->backgroundInputBox, tooltips.settings.background_input); + m_emu_settings->EnhanceCheckBox(ui->padConnectionBox, emu_settings_type::PadConnection); + SubscribeTooltip(ui->padConnectionBox, tooltips.settings.pad_connection); + m_emu_settings->EnhanceCheckBox(ui->showMoveCursorBox, emu_settings_type::ShowMoveCursor); SubscribeTooltip(ui->showMoveCursorBox, tooltips.settings.show_move_cursor); diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 59582bd5b1..cbb7d40b76 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -1810,6 +1810,13 @@ + + + + Keep Pads Connected + + + diff --git a/rpcs3/rpcs3qt/tooltips.h b/rpcs3/rpcs3qt/tooltips.h index 4a1065e930..7f2e2576b6 100644 --- a/rpcs3/rpcs3qt/tooltips.h +++ b/rpcs3/rpcs3qt/tooltips.h @@ -210,6 +210,7 @@ public: // input const QString pad_mode = tr("Single-threaded: All pad handlers run on the same thread sequentially.\nMulti-threaded: Each pad handler has its own thread.\nOnly use multi-threaded if you can spare the extra threads."); + const QString pad_connection = tr("Shows all configured pads as always connected ingame even if they are physically disconnected."); const QString keyboard_handler = tr("Some games support native keyboard input.\nBasic will work in these cases."); const QString mouse_handler = tr("Some games support native mouse input.\nBasic will work in these cases."); const QString music_handler = tr("Currently only used for cellMusic emulation.\nSelect Qt to use the default output device of your operating system.\nThis may not be able to play all audio formats.");