From 9e352da052ad9517549284e198e3939d0021e353 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 26 Nov 2020 00:06:03 +0100 Subject: [PATCH] Handle some undefined behavior regarding null pads --- rpcs3/Emu/Io/Null/NullPadHandler.h | 36 +++++++++++++++++++++++++- rpcs3/Input/ds3_pad_handler.cpp | 2 ++ rpcs3/Input/ds4_pad_handler.cpp | 2 ++ rpcs3/Input/evdev_joystick_handler.cpp | 2 ++ rpcs3/Input/keyboard_pad_handler.cpp | 2 ++ rpcs3/Input/mm_joystick_handler.cpp | 2 ++ rpcs3/Input/xinput_pad_handler.cpp | 2 ++ rpcs3/rpcs3qt/pad_settings_dialog.cpp | 10 ++++--- 8 files changed, 54 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/Io/Null/NullPadHandler.h b/rpcs3/Emu/Io/Null/NullPadHandler.h index b3bb43a163..b34a843431 100644 --- a/rpcs3/Emu/Io/Null/NullPadHandler.h +++ b/rpcs3/Emu/Io/Null/NullPadHandler.h @@ -12,8 +12,42 @@ public: return true; } - void init_config(pad_config* /*cfg*/, const std::string& /*name*/) override + void init_config(pad_config* cfg, const std::string& /*name*/) override { + if (!cfg) return; + + // This profile does not need a save location + cfg->cfg_name = ""; + + // Reset default button mapping + cfg->ls_left.def = ""; + cfg->ls_down.def = ""; + cfg->ls_right.def = ""; + cfg->ls_up.def = ""; + cfg->rs_left.def = ""; + cfg->rs_down.def = ""; + cfg->rs_right.def = ""; + cfg->rs_up.def = ""; + cfg->start.def = ""; + cfg->select.def = ""; + cfg->ps.def = ""; + cfg->square.def = ""; + cfg->cross.def = ""; + cfg->circle.def = ""; + cfg->triangle.def = ""; + cfg->left.def = ""; + cfg->down.def = ""; + cfg->right.def = ""; + cfg->up.def = ""; + cfg->r1.def = ""; + cfg->r2.def = ""; + cfg->r3.def = ""; + cfg->l1.def = ""; + cfg->l2.def = ""; + cfg->l3.def = ""; + + // Apply defaults + cfg->from_default(); } std::vector ListDevices() override diff --git a/rpcs3/Input/ds3_pad_handler.cpp b/rpcs3/Input/ds3_pad_handler.cpp index 7240e79862..f9ad39cc24 100644 --- a/rpcs3/Input/ds3_pad_handler.cpp +++ b/rpcs3/Input/ds3_pad_handler.cpp @@ -244,6 +244,8 @@ std::shared_ptr ds3_pad_handler::get_ds3_device(con void ds3_pad_handler::init_config(pad_config* cfg, const std::string& name) { + if (!cfg) return; + // Set this profile's save location cfg->cfg_name = name; diff --git a/rpcs3/Input/ds4_pad_handler.cpp b/rpcs3/Input/ds4_pad_handler.cpp index fe7a4ac87b..2185bc025a 100644 --- a/rpcs3/Input/ds4_pad_handler.cpp +++ b/rpcs3/Input/ds4_pad_handler.cpp @@ -136,6 +136,8 @@ ds4_pad_handler::ds4_pad_handler() : PadHandlerBase(pad_handler::ds4) void ds4_pad_handler::init_config(pad_config* cfg, const std::string& name) { + if (!cfg) return; + // Set this profile's save location cfg->cfg_name = name; diff --git a/rpcs3/Input/evdev_joystick_handler.cpp b/rpcs3/Input/evdev_joystick_handler.cpp index b6dab60314..b95613f20b 100644 --- a/rpcs3/Input/evdev_joystick_handler.cpp +++ b/rpcs3/Input/evdev_joystick_handler.cpp @@ -49,6 +49,8 @@ evdev_joystick_handler::~evdev_joystick_handler() void evdev_joystick_handler::init_config(pad_config* cfg, const std::string& name) { + if (!cfg) return; + // Set this profile's save location cfg->cfg_name = name; diff --git a/rpcs3/Input/keyboard_pad_handler.cpp b/rpcs3/Input/keyboard_pad_handler.cpp index cd0d743b71..43fd596733 100644 --- a/rpcs3/Input/keyboard_pad_handler.cpp +++ b/rpcs3/Input/keyboard_pad_handler.cpp @@ -33,6 +33,8 @@ keyboard_pad_handler::keyboard_pad_handler() void keyboard_pad_handler::init_config(pad_config* cfg, const std::string& name) { + if (!cfg) return; + // Set this profile's save location cfg->cfg_name = name; diff --git a/rpcs3/Input/mm_joystick_handler.cpp b/rpcs3/Input/mm_joystick_handler.cpp index 8b5d2c949d..76280b2ba8 100644 --- a/rpcs3/Input/mm_joystick_handler.cpp +++ b/rpcs3/Input/mm_joystick_handler.cpp @@ -32,6 +32,8 @@ mm_joystick_handler::~mm_joystick_handler() void mm_joystick_handler::init_config(pad_config* cfg, const std::string& name) { + if (!cfg) return; + // Set this profile's save location cfg->cfg_name = name; diff --git a/rpcs3/Input/xinput_pad_handler.cpp b/rpcs3/Input/xinput_pad_handler.cpp index f9b19bf287..5109f42df8 100644 --- a/rpcs3/Input/xinput_pad_handler.cpp +++ b/rpcs3/Input/xinput_pad_handler.cpp @@ -83,6 +83,8 @@ xinput_pad_handler::~xinput_pad_handler() void xinput_pad_handler::init_config(pad_config* cfg, const std::string& name) { + if (!cfg) return; + // Set this profile's save location cfg->cfg_name = name; diff --git a/rpcs3/rpcs3qt/pad_settings_dialog.cpp b/rpcs3/rpcs3qt/pad_settings_dialog.cpp index 22a2ed2dbe..ebeb0bb6ab 100644 --- a/rpcs3/rpcs3qt/pad_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/pad_settings_dialog.cpp @@ -1027,8 +1027,8 @@ void pad_settings_dialog::UpdateLabels(bool is_reset) entry.second.text = qstr(entry.second.key); } - // The button has to contain at least a space, because it would be square'ish otherwise - m_padButtons->button(entry.first)->setText(entry.second.text.isEmpty() ? QStringLiteral(" ") : entry.second.text); + // The button has to contain at least one character, because it would be square'ish otherwise + m_padButtons->button(entry.first)->setText(entry.second.text.isEmpty() ? QStringLiteral("-") : entry.second.text); } } @@ -1401,7 +1401,11 @@ void pad_settings_dialog::ChangeProfile() } // Load new config - m_handler_cfg.load(); + if (m_handler->m_type != pad_handler::null && !m_handler_cfg.load()) + { + cfg_log.error("Could not load pad config file '%s'", m_handler_cfg.cfg_name); + m_handler_cfg.from_default(); + } // Reload the buttons with the new handler and profile ReloadButtons();