void InputDevice::setActiveSetNumber(int index) { if ((index >= 0 && index < NUMBER_JOYSETS) && (index != active_set)) { QList<bool> buttonstates; QList<int> axesstates; QList<int> dpadstates; // Grab current states for all elements in old set SetJoystick *current_set = joystick_sets.value(active_set); SetJoystick *old_set = current_set; for (int i = 0; i < current_set->getNumberButtons(); i++) { JoyButton *button = current_set->getJoyButton(i); buttonstates.append(button->getButtonState()); } for (int i = 0; i < current_set->getNumberAxes(); i++) { JoyAxis *axis = current_set->getJoyAxis(i); axesstates.append(axis->getCurrentRawValue()); } for (int i = 0; i < current_set->getNumberHats(); i++) { JoyDPad *dpad = current_set->getJoyDPad(i); dpadstates.append(dpad->getCurrentDirection()); } // Release all current pressed elements and change set number joystick_sets.value(active_set)->release(); active_set = index; // Activate all buttons in the switched set current_set = joystick_sets.value(active_set); for (int i = 0; i < current_set->getNumberButtons(); i++) { bool value = buttonstates.at(i); bool tempignore = true; JoyButton *button = current_set->getJoyButton(i); JoyButton *oldButton = old_set->getJoyButton(i); if (button->getChangeSetCondition() == JoyButton::SetChangeWhileHeld) { if (value) { if (oldButton->getChangeSetCondition() == JoyButton::SetChangeWhileHeld && oldButton->getWhileHeldStatus()) { // Button from old set involved in a while held set // change. Carry over to new set button to ensure // set changes are done in the proper order. button->setWhileHeldStatus(true); } else if (!button->getWhileHeldStatus()) { // Ensure that set change events are performed if needed. tempignore = false; } } else { // Ensure that set change events are performed if needed. button->setWhileHeldStatus(false); //tempignore = false; } } button->joyEvent(value, tempignore); } // Activate all axis buttons in the switched set for (int i = 0; i < current_set->getNumberAxes(); i++) { int value = axesstates.at(i); bool tempignore = true; JoyAxis *axis = current_set->getJoyAxis(i); JoyAxisButton *oldButton = old_set->getJoyAxis(i)->getAxisButtonByValue(value); JoyAxisButton *button = axis->getAxisButtonByValue(value); if (button && oldButton) { if (button->getChangeSetCondition() == JoyButton::SetChangeWhileHeld) { if (oldButton->getChangeSetCondition() == JoyButton::SetChangeWhileHeld && oldButton->getWhileHeldStatus()) { // Button from old set involved in a while held set // change. Carry over to new set button to ensure // set changes are done in the proper order. button->setWhileHeldStatus(true); } else if (!button->getWhileHeldStatus()) { // Ensure that set change events are performed if needed. tempignore = false; } } } else if (!button) { // Ensure that set change events are performed if needed. axis->getPAxisButton()->setWhileHeldStatus(false); axis->getNAxisButton()->setWhileHeldStatus(false); } axis->joyEvent(value, tempignore); } // Activate all dpad buttons in the switched set for (int i = 0; i < current_set->getNumberHats(); i++) { int value = dpadstates.at(i); bool tempignore = true; JoyDPad *dpad = current_set->getJoyDPad(i); JoyDPadButton *button = dpad->getJoyButton(value); JoyDPadButton *oldButton = old_set->getJoyDPad(i)->getJoyButton(value); if (button && oldButton) { if (button->getChangeSetCondition() == JoyButton::SetChangeWhileHeld) { if (value) { if (oldButton->getChangeSetCondition() == JoyButton::SetChangeWhileHeld && oldButton->getWhileHeldStatus()) { // Button from old set involved in a while held set // change. Carry over to new set button to ensure // set changes are done in the proper order. button->setWhileHeldStatus(true); } else if (!button->getWhileHeldStatus()) { // Ensure that set change events are performed if needed. tempignore = false; } } } } else if (!button) { QHashIterator<int, JoyDPadButton*> iter(*dpad->getJoyButtons()); while (iter.hasNext()) { // Ensure that set change events are performed if needed. JoyDPadButton *button = iter.next().value(); button->setWhileHeldStatus(false); } } dpad->joyEvent(value, tempignore); } } }