diff options
| author | Jordan Woyak <jordan.woyak@gmail.com> | 2021-04-28 18:21:07 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-04-28 18:21:07 -0500 |
| commit | 1daefeb20a5f047d6dff5c473a4cfbf3e3d9b0ba (patch) | |
| tree | f0a11edc41103e53842a5a03f79a63fbd3e0c3a3 /Source/Core/InputCommon/ControlReference/ExpressionParser.cpp | |
| parent | 20301592adf5c13e210c3b466290705979e8c7c7 (diff) | |
| parent | 799a368a7c673cfddd49a8663e4e0a827ab83b7f (diff) | |
Merge pull request #9674 from Filoppi/fix_hotkey_suppresion_crash
Fix hotkey suppression crash
Diffstat (limited to 'Source/Core/InputCommon/ControlReference/ExpressionParser.cpp')
| -rw-r--r-- | Source/Core/InputCommon/ControlReference/ExpressionParser.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
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<ControlExpression>* 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<std::function<void()>>([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<ControlExpression>& 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); } |
