mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-21 05:09:34 -06:00
Make the Wii U Gamecube adapter work with less magic.
The Wii U Gamecube controller adapter setup has always been a bit weird. It tries to be as automatic as possible to make the user experience as easy as possible. The problem with this approach is that it brings a large disconnect in the user experience because you have the Gamecube controller setup with regular gamepads and then for some reason below that you have a "direct connect" option which will cause the Gamecube Adapter to overwrite the regular inputs if something was connected. While this works and allows the user to only click one checkbox to get the device working, it breaks the user's experience because they don't really know what "direct connect" means and won't look it up to figure out what it is. Just expecting the device to work (At least one occurence of this in the IRC channel in the last week). This way around also had the terrible nature of making the code more filthy than it needed to be. The GCAdapter namespace was parasitic and hooked in to the regular GC Controller SI class to overwrite the data that it was getting from the default configuration. Now instead we have a specific SIDevice class for the Wii U Gamecube adapter. This class is fairly simple and is a child of the regular SI Gamecube Pad device and only reimplements what it needs to. This also gives the ability to configure controllers individually, which allows the user to configure rumble individually per pad input. Overall the code is cleaner, and it fits more in line with how the rest of Dolphin works.
This commit is contained in:
@ -30,20 +30,20 @@
|
||||
#include "Core/HW/WiimoteReal/WiimoteReal.h"
|
||||
#include "DolphinWX/ControllerConfigDiag.h"
|
||||
#include "DolphinWX/InputConfigDiag.h"
|
||||
#include "DolphinWX/Config/GCAdapterConfigDiag.h"
|
||||
#include "InputCommon/GCAdapter.h"
|
||||
|
||||
#if defined(HAVE_XRANDR) && HAVE_XRANDR
|
||||
#include "DolphinWX/X11Utils.h"
|
||||
#endif
|
||||
|
||||
wxDEFINE_EVENT(wxEVT_ADAPTER_UPDATE, wxCommandEvent);
|
||||
|
||||
ControllerConfigDiag::ControllerConfigDiag(wxWindow* const parent)
|
||||
: wxDialog(parent, wxID_ANY, _("Dolphin Controller Configuration"))
|
||||
{
|
||||
m_gc_pad_type_strs = {{
|
||||
_("None"),
|
||||
_("Standard Controller"),
|
||||
_("GameCube Adapter for Wii U"),
|
||||
_("Steering Wheel"),
|
||||
_("Dance Mat"),
|
||||
_("TaruKonga (Bongos)"),
|
||||
@ -68,7 +68,6 @@ ControllerConfigDiag::ControllerConfigDiag(wxWindow* const parent)
|
||||
SetLayoutAdaptationMode(wxDIALOG_ADAPTATION_MODE_ENABLED);
|
||||
SetSizerAndFit(main_sizer);
|
||||
Center();
|
||||
Bind(wxEVT_ADAPTER_UPDATE, &ControllerConfigDiag::UpdateAdapter, this);
|
||||
}
|
||||
|
||||
wxStaticBoxSizer* ControllerConfigDiag::CreateGamecubeSizer()
|
||||
@ -111,24 +110,27 @@ wxStaticBoxSizer* ControllerConfigDiag::CreateGamecubeSizer()
|
||||
case SIDEVICE_GC_CONTROLLER:
|
||||
pad_type_choices[i]->SetStringSelection(m_gc_pad_type_strs[1]);
|
||||
break;
|
||||
case SIDEVICE_GC_STEERING:
|
||||
case SIDEVICE_WIIU_ADAPTER:
|
||||
pad_type_choices[i]->SetStringSelection(m_gc_pad_type_strs[2]);
|
||||
break;
|
||||
case SIDEVICE_DANCEMAT:
|
||||
case SIDEVICE_GC_STEERING:
|
||||
pad_type_choices[i]->SetStringSelection(m_gc_pad_type_strs[3]);
|
||||
break;
|
||||
case SIDEVICE_GC_TARUKONGA:
|
||||
case SIDEVICE_DANCEMAT:
|
||||
pad_type_choices[i]->SetStringSelection(m_gc_pad_type_strs[4]);
|
||||
break;
|
||||
case SIDEVICE_GC_GBA:
|
||||
case SIDEVICE_GC_TARUKONGA:
|
||||
pad_type_choices[i]->SetStringSelection(m_gc_pad_type_strs[5]);
|
||||
break;
|
||||
case SIDEVICE_GC_GBA:
|
||||
pad_type_choices[i]->SetStringSelection(m_gc_pad_type_strs[6]);
|
||||
gamecube_configure_bt[i]->Disable();
|
||||
break;
|
||||
case SIDEVICE_GC_KEYBOARD:
|
||||
pad_type_choices[i]->SetStringSelection(m_gc_pad_type_strs[6]);
|
||||
pad_type_choices[i]->SetStringSelection(m_gc_pad_type_strs[7]);
|
||||
break;
|
||||
case SIDEVICE_AM_BASEBOARD:
|
||||
pad_type_choices[i]->SetStringSelection(m_gc_pad_type_strs[7]);
|
||||
pad_type_choices[i]->SetStringSelection(m_gc_pad_type_strs[8]);
|
||||
break;
|
||||
default:
|
||||
pad_type_choices[i]->SetStringSelection(m_gc_pad_type_strs[0]);
|
||||
@ -145,67 +147,9 @@ wxStaticBoxSizer* ControllerConfigDiag::CreateGamecubeSizer()
|
||||
gamecube_static_sizer->Add(gamecube_flex_sizer, 1, wxEXPAND, 5);
|
||||
gamecube_static_sizer->AddSpacer(5);
|
||||
|
||||
wxStaticBoxSizer* const gamecube_adapter_group = new wxStaticBoxSizer(wxVERTICAL, this, _("GameCube Adapter"));
|
||||
wxBoxSizer* const gamecube_adapter_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
||||
wxCheckBox* const gamecube_adapter = new wxCheckBox(this, wxID_ANY, _("Direct Connect"));
|
||||
gamecube_adapter->Bind(wxEVT_CHECKBOX, &ControllerConfigDiag::OnGameCubeAdapter, this);
|
||||
|
||||
wxCheckBox* const gamecube_rumble = new wxCheckBox(this, wxID_ANY, _("Rumble"));
|
||||
gamecube_rumble->SetValue(SConfig::GetInstance().m_AdapterRumble);
|
||||
gamecube_rumble->Bind(wxEVT_CHECKBOX, &ControllerConfigDiag::OnAdapterRumble, this);
|
||||
|
||||
m_adapter_status = new wxStaticText(this, wxID_ANY, _("Adapter Not Detected"));
|
||||
|
||||
gamecube_adapter_group->Add(m_adapter_status, 0, wxEXPAND);
|
||||
gamecube_adapter_sizer->Add(gamecube_adapter, 0, wxEXPAND);
|
||||
gamecube_adapter_sizer->Add(gamecube_rumble, 0, wxEXPAND);
|
||||
gamecube_adapter_group->Add(gamecube_adapter_sizer, 0, wxEXPAND);
|
||||
gamecube_static_sizer->Add(gamecube_adapter_group, 0, wxEXPAND);
|
||||
|
||||
#if defined(__LIBUSB__) || defined (_WIN32)
|
||||
gamecube_adapter->SetValue(SConfig::GetInstance().m_GameCubeAdapter);
|
||||
if (!SI_GCAdapter::IsDetected())
|
||||
{
|
||||
if (!SI_GCAdapter::IsDriverDetected())
|
||||
{
|
||||
m_adapter_status->SetLabelText(_("Driver Not Detected"));
|
||||
gamecube_adapter->Disable();
|
||||
gamecube_adapter->SetValue(false);
|
||||
gamecube_rumble->Disable();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_adapter_status->SetLabelText(_("Adapter Detected"));
|
||||
}
|
||||
if (Core::GetState() != Core::CORE_UNINITIALIZED)
|
||||
{
|
||||
gamecube_adapter->Disable();
|
||||
}
|
||||
SI_GCAdapter::SetAdapterCallback(std::bind(&ControllerConfigDiag::ScheduleAdapterUpdate, this));
|
||||
#endif
|
||||
|
||||
return gamecube_static_sizer;
|
||||
}
|
||||
|
||||
void ControllerConfigDiag::ScheduleAdapterUpdate()
|
||||
{
|
||||
wxQueueEvent(this, new wxCommandEvent(wxEVT_ADAPTER_UPDATE));
|
||||
}
|
||||
|
||||
void ControllerConfigDiag::UpdateAdapter(wxCommandEvent& ev)
|
||||
{
|
||||
#if defined(__LIBUSB__) || defined (_WIN32)
|
||||
bool unpause = Core::PauseAndLock(true);
|
||||
if (SI_GCAdapter::IsDetected())
|
||||
m_adapter_status->SetLabelText(_("Adapter Detected"));
|
||||
else
|
||||
m_adapter_status->SetLabelText(_("Adapter Not Detected"));
|
||||
Core::PauseAndLock(false, unpause);
|
||||
#endif
|
||||
}
|
||||
|
||||
wxStaticBoxSizer* ControllerConfigDiag::CreateWiimoteConfigSizer()
|
||||
{
|
||||
wxStaticText* wiimote_label[4];
|
||||
@ -502,30 +446,35 @@ void ControllerConfigDiag::OnGameCubePortChanged(wxCommandEvent& event)
|
||||
}
|
||||
else if (device_name == m_gc_pad_type_strs[2])
|
||||
{
|
||||
tempType = SIDEVICE_GC_STEERING;
|
||||
tempType = SIDEVICE_WIIU_ADAPTER;
|
||||
gamecube_configure_bt[device_num]->Enable();
|
||||
}
|
||||
else if (device_name == m_gc_pad_type_strs[3])
|
||||
{
|
||||
tempType = SIDEVICE_DANCEMAT;
|
||||
tempType = SIDEVICE_GC_STEERING;
|
||||
gamecube_configure_bt[device_num]->Enable();
|
||||
}
|
||||
else if (device_name == m_gc_pad_type_strs[4])
|
||||
{
|
||||
tempType = SIDEVICE_GC_TARUKONGA;
|
||||
tempType = SIDEVICE_DANCEMAT;
|
||||
gamecube_configure_bt[device_num]->Enable();
|
||||
}
|
||||
else if (device_name == m_gc_pad_type_strs[5])
|
||||
{
|
||||
tempType = SIDEVICE_GC_TARUKONGA;
|
||||
gamecube_configure_bt[device_num]->Enable();
|
||||
}
|
||||
else if (device_name == m_gc_pad_type_strs[6])
|
||||
{
|
||||
tempType = SIDEVICE_GC_GBA;
|
||||
gamecube_configure_bt[device_num]->Disable();
|
||||
}
|
||||
else if (device_name == m_gc_pad_type_strs[6])
|
||||
else if (device_name == m_gc_pad_type_strs[7])
|
||||
{
|
||||
tempType = SIDEVICE_GC_KEYBOARD;
|
||||
gamecube_configure_bt[device_num]->Enable();
|
||||
}
|
||||
else if (device_name == m_gc_pad_type_strs[7])
|
||||
else if (device_name == m_gc_pad_type_strs[8])
|
||||
{
|
||||
tempType = SIDEVICE_AM_BASEBOARD;
|
||||
gamecube_configure_bt[device_num]->Enable();
|
||||
@ -538,6 +487,13 @@ void ControllerConfigDiag::OnGameCubePortChanged(wxCommandEvent& event)
|
||||
|
||||
SConfig::GetInstance().m_SIDevice[device_num] = tempType;
|
||||
|
||||
#if defined(__LIBUSB__) || defined (_WIN32)
|
||||
if (GCAdapter::UseAdapter())
|
||||
GCAdapter::StartScanThread();
|
||||
else
|
||||
GCAdapter::StopScanThread();
|
||||
#endif
|
||||
|
||||
if (Core::IsRunning())
|
||||
SerialInterface::ChangeDevice(tempType, device_num);
|
||||
}
|
||||
@ -555,6 +511,11 @@ void ControllerConfigDiag::OnGameCubeConfigButton(wxCommandEvent& event)
|
||||
InputConfigDialog m_ConfigFrame(this, *key_plugin, _("GameCube Controller Configuration"), port_num);
|
||||
m_ConfigFrame.ShowModal();
|
||||
}
|
||||
else if (SConfig::GetInstance().m_SIDevice[port_num] == SIDEVICE_WIIU_ADAPTER)
|
||||
{
|
||||
GCAdapterConfigDiag m_ConfigFramg(this, _("Wii U Gamecube Controller Adapter Configuration"), port_num);
|
||||
m_ConfigFramg.ShowModal();
|
||||
}
|
||||
else
|
||||
{
|
||||
InputConfigDialog m_ConfigFrame(this, *pad_plugin, _("GameCube Controller Configuration"), port_num);
|
||||
@ -563,10 +524,3 @@ void ControllerConfigDiag::OnGameCubeConfigButton(wxCommandEvent& event)
|
||||
|
||||
HotkeyManagerEmu::Enable(true);
|
||||
}
|
||||
|
||||
ControllerConfigDiag::~ControllerConfigDiag()
|
||||
{
|
||||
#if defined(__LIBUSB__) || defined (_WIN32)
|
||||
SI_GCAdapter::SetAdapterCallback(nullptr);
|
||||
#endif
|
||||
}
|
||||
|
Reference in New Issue
Block a user