From c62d83a34b34fe591dca1d3c03354ff915c589f4 Mon Sep 17 00:00:00 2001 From: Michael Maltese Date: Tue, 7 Feb 2017 16:25:27 -0800 Subject: GCPadEmu: only connected if default device connected This lets Dolphin know if a configured GameCube Controller should actually be treated as connected or not. Talked to @JMC47 a bit about this last night. My use-case is that all of my controllers are the same hardware (Xbox One controllers) so share the same configuration (modulo device number). Treating them all as always connected isn't a problem for most games, but in some (Smash Bros.) it forces me to go find a keyboard/mouse and unconfigure any controllers that I don't actually have connected. Hotplugging devices (works on macOS, at least) + this patch remove my need to ever touch the Controller Config dialog while in a game. This patch makes the following changes: - A new `BooleanSetting` in `GCPadEmu` called "Always Connected", which defaults to false. - `ControllerEmu` tracks whether the default device is connected on every call to `UpdateReferences()`. - `GCPadEmu.GetStatus()` now sets err bit to `PAD_ERR_NO_CONTROLLER` if the default device isn't connected. - `SIDevice_GCController` handles `PAD_ERR_NO_CONTROLLER` by imitating the behaviour of `SIDevice_Null` (as far as I can tell, this is the only use of the error bit from `GCPadStatus`). I wanted to add an OSD message akin to the ones when Wiimotes get connected/disconnected, but I haven't yet found where to put the logic. --- Source/Core/InputCommon/ControllerEmu/ControllerEmu.cpp | 7 +++++++ Source/Core/InputCommon/ControllerEmu/ControllerEmu.h | 2 ++ Source/Core/InputCommon/ControllerInterface/Device.cpp | 6 ++++++ Source/Core/InputCommon/ControllerInterface/Device.h | 2 ++ 4 files changed, 17 insertions(+) (limited to 'Source/Core/InputCommon') diff --git a/Source/Core/InputCommon/ControllerEmu/ControllerEmu.cpp b/Source/Core/InputCommon/ControllerEmu/ControllerEmu.cpp index cf70fa8468..98b9e5828b 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControllerEmu.cpp +++ b/Source/Core/InputCommon/ControllerEmu/ControllerEmu.cpp @@ -34,6 +34,8 @@ std::unique_lock EmulatedController::GetStateLock() void EmulatedController::UpdateReferences(const ControllerInterface& devi) { const auto lock = GetStateLock(); + m_default_device_is_connected = devi.HasConnectedDevice(m_default_device); + for (auto& ctrlGroup : groups) { for (auto& control : ctrlGroup->controls) @@ -48,6 +50,11 @@ void EmulatedController::UpdateReferences(const ControllerInterface& devi) } } +bool EmulatedController::IsDefaultDeviceConnected() const +{ + return m_default_device_is_connected; +} + const ciface::Core::DeviceQualifier& EmulatedController::GetDefaultDevice() const { return m_default_device; diff --git a/Source/Core/InputCommon/ControllerEmu/ControllerEmu.h b/Source/Core/InputCommon/ControllerEmu/ControllerEmu.h index c9faf4457c..8b7925f7df 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControllerEmu.h +++ b/Source/Core/InputCommon/ControllerEmu/ControllerEmu.h @@ -33,6 +33,7 @@ public: virtual void LoadConfig(IniFile::Section* sec, const std::string& base = ""); virtual void SaveConfig(IniFile::Section* sec, const std::string& base = ""); + bool IsDefaultDeviceConnected() const; const ciface::Core::DeviceQualifier& GetDefaultDevice() const; void SetDefaultDevice(const std::string& device); void SetDefaultDevice(ciface::Core::DeviceQualifier devq); @@ -49,5 +50,6 @@ public: private: ciface::Core::DeviceQualifier m_default_device; + bool m_default_device_is_connected{false}; }; } // namespace ControllerEmu diff --git a/Source/Core/InputCommon/ControllerInterface/Device.cpp b/Source/Core/InputCommon/ControllerInterface/Device.cpp index f83dae268e..48d40cb9af 100644 --- a/Source/Core/InputCommon/ControllerInterface/Device.cpp +++ b/Source/Core/InputCommon/ControllerInterface/Device.cpp @@ -199,5 +199,11 @@ Device::Output* DeviceContainer::FindOutput(const std::string& name, const Devic { return def_dev->FindOutput(name); } + +bool DeviceContainer::HasConnectedDevice(const DeviceQualifier& qualifier) const +{ + const auto device = FindDevice(qualifier); + return device != nullptr && device->IsValid(); +} } } diff --git a/Source/Core/InputCommon/ControllerInterface/Device.h b/Source/Core/InputCommon/ControllerInterface/Device.h index 7b601cc775..5482b93ac0 100644 --- a/Source/Core/InputCommon/ControllerInterface/Device.h +++ b/Source/Core/InputCommon/ControllerInterface/Device.h @@ -158,6 +158,8 @@ public: std::string GetDefaultDeviceString() const; std::shared_ptr FindDevice(const DeviceQualifier& devq) const; + bool HasConnectedDevice(const DeviceQualifier& qualifier) const; + protected: mutable std::mutex m_devices_mutex; std::vector> m_devices; -- cgit v1.2.3