Qt: Fix resetting selected gamepad when opening settings dialog

I have a Wacom tablet always plugged in.  For unrelated asinine reasons,
SDL detects both the pen and the tablet itself as (completely useless)
gamepads, so they always show up in the list first.  I also have a Wii U
Bluetooth controller, which shows up third.

When the settings dialog is spawned, selectGamepad is bound to the
currentIndexChanged event, so picking a controller from the combobox
will call it.  The current index is initially -1 (because the combobox
is empty), and when updateJoysticks is called to populate it, the index
automatically changes to 0.  The event is fired and the current gamepad
is changed to the first one, which in my case is my tablet pen.
updateJoysticks tries to avoid this by explicitly reselecting the active
gamepad after refreshing the combobox, but at this point the "active"
gamepad has already changed.

The upshot of this was that opening the settings dialog for any reason
would disable my controller, unless I remembered to go change it back.
I've also seen the button configuration for the wacom pen or controller
be saved under each others' names.

The fix, which works on my machine™, is to disable signals altogether
while mucking with the contents of the combobox, explicitly reselect the
right gamepad, and then explicitly call selectGamepad.  (I dropped the
last two lines because the same thing is already done in refresh, which
is called by selectGamepad.)

Arguably this is still a little wrong:

- If I unplugged my Wacom tablet, my controller would shift upwards to
  slot 0.  This code would fail to notice and keep trying to use joystick
  2.  That's a pretty obscure case, though, and maybe difficult to fix
  correctly.

- This panel makes changes immediately, but it should wait for OK or Apply.
This commit is contained in:
Eevee (Lexy Munroe) 2017-05-05 19:10:45 -07:00 committed by endrift
parent 63197308b6
commit b58d216868
1 changed files with 5 additions and 5 deletions

View File

@ -396,14 +396,14 @@ void GBAKeyEditor::updateJoysticks() {
m_controller->updateJoysticks();
m_controller->recalibrateAxes();
// Block the currentIndexChanged signal while rearranging the combo box
auto wasBlocked = m_profileSelect->blockSignals(true);
m_profileSelect->clear();
m_profileSelect->addItems(m_controller->connectedGamepads(m_type));
int activeGamepad = m_controller->gamepad(m_type);
m_profileSelect->setCurrentIndex(activeGamepad);
m_profileSelect->blockSignals(wasBlocked);
selectGamepad(activeGamepad);
if (activeGamepad > 0) {
m_profileSelect->setCurrentIndex(activeGamepad);
}
lookupAxes(m_controller->map());
lookupHats(m_controller->map());
}
#endif