mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-06-25 03:21:36 +02:00
InputCommon: Fix occasional misidentification of analog input detection.
This commit is contained in:
@ -26,11 +26,6 @@ constexpr auto INPUT_DETECT_MAXIMUM_TIME = std::chrono::seconds(5);
|
|||||||
// Ignore the mouse-click when queuing more buttons with "alternate mappings" enabled.
|
// Ignore the mouse-click when queuing more buttons with "alternate mappings" enabled.
|
||||||
constexpr auto INPUT_DETECT_ENDING_IGNORE_TIME = std::chrono::milliseconds(50);
|
constexpr auto INPUT_DETECT_ENDING_IGNORE_TIME = std::chrono::milliseconds(50);
|
||||||
|
|
||||||
bool ContainsAnalogInput(const ciface::Core::InputDetector::Results& results)
|
|
||||||
{
|
|
||||||
return std::ranges::any_of(results, [](auto& detection) { return detection.smoothness > 1; });
|
|
||||||
}
|
|
||||||
|
|
||||||
class MappingProcessor : public QObject
|
class MappingProcessor : public QObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -102,7 +97,7 @@ public:
|
|||||||
// Skip "Modifier" mappings when using analog inputs.
|
// Skip "Modifier" mappings when using analog inputs.
|
||||||
auto* next_button = m_clicked_mapping_buttons.front();
|
auto* next_button = m_clicked_mapping_buttons.front();
|
||||||
if (next_button->GetControlType() == MappingButton::ControlType::ModifierInput &&
|
if (next_button->GetControlType() == MappingButton::ControlType::ModifierInput &&
|
||||||
ContainsAnalogInput(results))
|
std::ranges::any_of(results, &ciface::Core::InputDetector::Detection::IsAnalogPress))
|
||||||
{
|
{
|
||||||
// Clear "Modifier" mapping and queue the next button.
|
// Clear "Modifier" mapping and queue the next button.
|
||||||
SetButtonExpression(next_button, "");
|
SetButtonExpression(next_button, "");
|
||||||
|
@ -217,6 +217,8 @@ public:
|
|||||||
Clock::time_point press_time;
|
Clock::time_point press_time;
|
||||||
std::optional<Clock::time_point> release_time;
|
std::optional<Clock::time_point> release_time;
|
||||||
ControlState smoothness = 0;
|
ControlState smoothness = 0;
|
||||||
|
|
||||||
|
bool IsAnalogPress() const { return smoothness > 1.00001; }
|
||||||
};
|
};
|
||||||
|
|
||||||
Device::Input* FindInput(std::string_view name, const Device* def_dev) const;
|
Device::Input* FindInput(std::string_view name, const Device* def_dev) const;
|
||||||
|
@ -139,7 +139,7 @@ void RemoveSpuriousTriggerCombinations(Core::InputDetector::Results* detections)
|
|||||||
const auto is_spurious = [&](const auto& detection) {
|
const auto is_spurious = [&](const auto& detection) {
|
||||||
return std::ranges::any_of(*detections, [&](const auto& d) {
|
return std::ranges::any_of(*detections, [&](const auto& d) {
|
||||||
// This is a spurious digital detection if a "smooth" (analog) detection is temporally near.
|
// This is a spurious digital detection if a "smooth" (analog) detection is temporally near.
|
||||||
return &d != &detection && d.smoothness > 1 && d.smoothness > detection.smoothness &&
|
return &d != &detection && d.IsAnalogPress() && !detection.IsAnalogPress() &&
|
||||||
abs(d.press_time - detection.press_time) < SPURIOUS_TRIGGER_COMBO_THRESHOLD;
|
abs(d.press_time - detection.press_time) < SPURIOUS_TRIGGER_COMBO_THRESHOLD;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user