diff --git a/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp b/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp index 66162e6ccd..c96ea0599c 100644 --- a/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp +++ b/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp @@ -64,7 +64,7 @@ private: void RemoveSuppression(Device::Input* modifier, Device::Input* final_input) { auto it = m_suppressions.find({final_input, modifier}); - if ((--it->second) == 0) + if (it != m_suppressions.end() && (--it->second) == 0) m_suppressions.erase(it); } @@ -303,7 +303,7 @@ bool HotkeySuppressions::IsSuppressedIgnoringModifiers(Device::Input* input, // We need to ignore L_Ctrl R_Ctrl when supplied Ctrl and vice-versa. const auto is_same_modifier = [](Device::Input* i1, Device::Input* i2) { - return i1 == i2 || i1->IsChild(i2) || i2->IsChild(i1); + return i1 && i2 && (i1 == i2 || i1->IsChild(i2) || i2->IsChild(i1)); }; return std::any_of(it, it_end, [&](auto& s) { @@ -317,7 +317,13 @@ HotkeySuppressions::MakeSuppressor(const Modifiers* modifiers, const std::unique_ptr* final_input) { for (auto& modifier : *modifiers) - ++m_suppressions[{(*final_input)->GetInput(), modifier->GetInput()}]; + { + // Inputs might be null, don't add nullptr to the map + if ((*final_input)->GetInput() && modifier->GetInput()) + { + ++m_suppressions[{(*final_input)->GetInput(), modifier->GetInput()}]; + } + } return Suppressor(std::make_unique>([this, modifiers, final_input]() { for (auto& modifier : *modifiers) @@ -484,6 +490,7 @@ public: ControlState GetValue() const override { + // True if we have no modifiers const bool modifiers_pressed = std::all_of(m_modifiers.begin(), m_modifiers.end(), [](const std::unique_ptr& input) { return input->GetValue() > CONDITION_THRESHOLD; @@ -497,7 +504,7 @@ public: const bool is_suppressed = s_hotkey_suppressions.IsSuppressedIgnoringModifiers( m_final_input->GetInput(), m_modifiers); - if (final_input_state < CONDITION_THRESHOLD) + if (final_input_state <= CONDITION_THRESHOLD) m_is_blocked = false; // If some other hotkey suppressed us, require a release of final input to be ready again. @@ -540,13 +547,13 @@ public: // We must update our suppression with valid pointers. if (m_suppressor) - EnableSuppression(); + EnableSuppression(true); } private: - void EnableSuppression() const + void EnableSuppression(bool force = false) const { - if (!m_suppressor) + if (!m_suppressor || force) m_suppressor = s_hotkey_suppressions.MakeSuppressor(&m_modifiers, &m_final_input); }