mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-06-11 16:49:28 +02:00
ControllerInterface/DolphinQt: Make mapping "all devices" way less hacky.
This commit is contained in:
@ -4,9 +4,6 @@
|
||||
|
||||
#include "InputCommon/ControlReference/ControlReference.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "Common/Thread.h"
|
||||
// For InputGateOn()
|
||||
// This is a bad layering violation, but it's the cleanest
|
||||
// place I could find to put it.
|
||||
@ -15,12 +12,6 @@
|
||||
|
||||
using namespace ciface::ExpressionParser;
|
||||
|
||||
namespace
|
||||
{
|
||||
// Compared to an input's current state (ideally 1.0) minus abs(initial_state) (ideally 0.0).
|
||||
constexpr ControlState INPUT_DETECT_THRESHOLD = 0.55;
|
||||
} // namespace
|
||||
|
||||
bool ControlReference::InputGateOn()
|
||||
{
|
||||
return SConfig::GetInstance().m_BackgroundInput || Host_RendererHasFocus() ||
|
||||
@ -115,83 +106,3 @@ ControlState OutputReference::State(const ControlState state)
|
||||
m_parsed_expression->SetValue(state * range);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
// Wait for input on a particular device.
|
||||
// Inputs are considered if they are first seen in a neutral state.
|
||||
// This is useful for crazy flightsticks that have certain buttons that are always held down
|
||||
// and also properly handles detection when using "FullAnalogSurface" inputs.
|
||||
// Upon input, return a pointer to the detected Control, else return nullptr.
|
||||
ciface::Core::Device::Control* InputReference::Detect(const unsigned int ms,
|
||||
ciface::Core::Device* const device)
|
||||
{
|
||||
struct InputState
|
||||
{
|
||||
ciface::Core::Device::Input& input;
|
||||
ControlState initial_state;
|
||||
};
|
||||
|
||||
std::vector<InputState> input_states;
|
||||
for (auto* input : device->Inputs())
|
||||
{
|
||||
// Don't detect things like absolute cursor position.
|
||||
if (!input->IsDetectable())
|
||||
continue;
|
||||
|
||||
// Undesirable axes will have negative values here when trying to map a "FullAnalogSurface".
|
||||
input_states.push_back({*input, input->GetState()});
|
||||
}
|
||||
|
||||
if (input_states.empty())
|
||||
return nullptr;
|
||||
|
||||
unsigned int time = 0;
|
||||
while (time < ms)
|
||||
{
|
||||
Common::SleepCurrentThread(10);
|
||||
time += 10;
|
||||
|
||||
device->UpdateInput();
|
||||
for (auto& input_state : input_states)
|
||||
{
|
||||
// We want an input that was initially 0.0 and currently 1.0.
|
||||
const auto detection_score =
|
||||
(input_state.input.GetState() - std::abs(input_state.initial_state));
|
||||
|
||||
if (detection_score > INPUT_DETECT_THRESHOLD)
|
||||
return &input_state.input;
|
||||
}
|
||||
}
|
||||
|
||||
// No input was detected. :'(
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
//
|
||||
// OutputReference :: Detect
|
||||
//
|
||||
// Totally different from the inputReference detect / I have them combined so it was simpler to make
|
||||
// the GUI.
|
||||
// The GUI doesn't know the difference between an input and an output / it's odd but I was lazy and
|
||||
// it was easy
|
||||
//
|
||||
// set all binded outputs to <range> power for x milliseconds return false
|
||||
//
|
||||
ciface::Core::Device::Control* OutputReference::Detect(const unsigned int ms,
|
||||
ciface::Core::Device* const device)
|
||||
{
|
||||
// ignore device
|
||||
|
||||
// don't hang if we don't even have any controls mapped
|
||||
if (BoundCount() > 0)
|
||||
{
|
||||
State(1);
|
||||
unsigned int slept = 0;
|
||||
|
||||
// this loop is to make stuff like flashing keyboard LEDs work
|
||||
while (ms > (slept += 10))
|
||||
Common::SleepCurrentThread(10);
|
||||
|
||||
State(0);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
Reference in New Issue
Block a user