/** * @brief Perform a release of all elements of a set. Stick and vdpad * releases will be handled by the associated button or axis. */ void SetJoystick::release() { QHashIterator<int, JoyAxis*> iterAxes(axes); while (iterAxes.hasNext()) { JoyAxis *axis = iterAxes.next().value(); axis->clearPendingEvent(); axis->joyEvent(axis->getCurrentThrottledDeadValue(), true); } QHashIterator<int, JoyDPad*> iterDPads(hats); while (iterDPads.hasNext()) { JoyDPad *dpad = iterDPads.next().value(); dpad->clearPendingEvent(); dpad->joyEvent(0, true); } QHashIterator<int, JoyButton*> iterButtons(buttons); while (iterButtons.hasNext()) { JoyButton *button = iterButtons.next().value(); button->clearPendingEvent(); button->joyEvent(false, true); } }
void InputDevice::setAxisButtonName(int axisIndex, int buttonIndex, QString tempName) { QHashIterator<int, SetJoystick*> iter(joystick_sets); while (iter.hasNext()) { SetJoystick *tempSet = iter.next().value(); disconnect(tempSet, SIGNAL(setAxisButtonNameChange(int,int)), this, SLOT(updateSetAxisButtonNames(int,int))); JoyAxis *axis = tempSet->getJoyAxis(axisIndex); if (axis) { JoyAxisButton *button = 0; if (buttonIndex == 0) { button = axis->getNAxisButton(); } else if (buttonIndex == 1) { button = axis->getPAxisButton(); } if (button) { button->setButtonName(tempName); } } connect(tempSet, SIGNAL(setAxisButtonNameChange(int,int)), this, SLOT(updateSetAxisButtonNames(int,int))); } }
void SetJoystick::propogateSetAxisNameChange() { JoyAxis *axis = static_cast<JoyAxis*>(sender()); disconnect(axis, SIGNAL(axisNameChanged()), this, SLOT(propogateSetAxisNameChange())); emit setAxisNameChange(axis->getIndex()); connect(axis, SIGNAL(axisNameChanged()), this, SLOT(propogateSetAxisNameChange())); }
/** * @brief Raise the dead zones for axes. Used when launching * the controller mapping window. */ void SetJoystick::raiseAxesDeadZones(int deadZone) { unsigned int tempDeadZone = deadZone; if (deadZone <= 0 || deadZone > 32767) { tempDeadZone = RAISEDDEADZONE; } QHashIterator<int, JoyAxis*> axisIter(axes); while (axisIter.hasNext()) { JoyAxis *temp = axisIter.next().value(); temp->disconnectPropertyUpdatedConnection(); temp->setDeadZone(tempDeadZone); temp->establishPropertyUpdatedConnection(); } /*QHashIterator<int, JoyControlStick*> stickIter(sticks); while (stickIter.hasNext()) { JoyControlStick *temp = stickIter.next().value(); temp->disconnectPropertyUpdatedConnection(); temp->setDeadZone(20000); temp->establishPropertyUpdatedConnection(); } */ }
void SetJoystick::setAxisThrottle(int axisNum, JoyAxis::ThrottleTypes throttle) { if (axes.contains(axisNum)) { JoyAxis *temp = axes.value(axisNum); temp->setInitialThrottle(throttle); } }
void InputDevice::updateSetAxisNames(int axisIndex) { JoyAxis *axis = getActiveSetJoystick()->getJoyAxis(axisIndex); if (axis) { setAxisName(axisIndex, axis->getAxisName()); } }
void SetJoystick::propogateSetAxisThrottleSetting(int index) { JoyAxis *axis = axes.value(index); if (axis) { emit setAssignmentAxisThrottleChanged(index, axis->getCurrentlyAssignedSet()); } }
void SetJoystick::copyAssignments(SetJoystick *destSet) { for (int i=0; i < device->getNumberAxes(); i++) { JoyAxis *sourceAxis = axes.value(i); JoyAxis *destAxis = destSet->axes.value(i); if (sourceAxis && destAxis) { sourceAxis->copyAssignments(destAxis); } } QHashIterator<int, JoyControlStick*> stickIter(sticks); while (stickIter.hasNext()) { stickIter.next(); int index = stickIter.key(); JoyControlStick *sourceStick = stickIter.value(); JoyControlStick *destStick = destSet->sticks.value(index); if (sourceStick && destStick) { sourceStick->copyAssignments(destStick); } } for (int i=0; i < device->getNumberHats(); i++) { JoyDPad *sourceDPad = hats.value(i); JoyDPad *destDPad = destSet->hats.value(i); if (sourceDPad && destDPad) { sourceDPad->copyAssignments(destDPad); } } QHashIterator<int, VDPad*> vdpadIter(vdpads); while (vdpadIter.hasNext()) { vdpadIter.next(); int index = vdpadIter.key(); VDPad *sourceVDpad = vdpadIter.value(); VDPad *destVDPad = destSet->vdpads.value(index); if (sourceVDpad && destVDPad) { sourceVDpad->copyAssignments(destVDPad); } } for (int i=0; i < device->getNumberButtons(); i++) { JoyButton *sourceButton = buttons.value(i); JoyButton *destButton = destSet->buttons.value(i); if (sourceButton && destButton) { sourceButton->copyAssignments(destButton); } } }
void SetJoystick::propogateSetAxisButtonRelease(int button) { JoyAxisButton *axisButton = static_cast<JoyAxisButton*>(sender()); JoyAxis *axis = axisButton->getAxis(); if (!axisButton->getIgnoreEventState()) { emit setAxisButtonRelease(index, axis->getIndex(), button); } }
void SetJoystick::currentAxesDeadZones(QList<int> *axesDeadZones) { QHashIterator<int, JoyAxis*> axisIter(axes); while (axisIter.hasNext()) { JoyAxis *temp = axisIter.next().value(); axesDeadZones->append(temp->getDeadZone()); } }
bool SetJoystick::isSetEmpty() { bool result = true; QHashIterator<int, JoyButton*> iter(buttons); while (iter.hasNext() && result) { JoyButton *button = iter.next().value(); if (!button->isDefault()) { result = false; } } QHashIterator<int, JoyAxis*> iter2(axes); while (iter2.hasNext() && result) { JoyAxis *axis = iter2.next().value(); if (!axis->isDefault()) { result = false; } } QHashIterator<int, JoyDPad*> iter3(hats); while (iter3.hasNext() && result) { JoyDPad *dpad = iter3.next().value(); if (!dpad->isDefault()) { result = false; } } QHashIterator<int, JoyControlStick*> iter4(sticks); while (iter4.hasNext() && result) { JoyControlStick *stick = iter4.next().value(); if (!stick->isDefault()) { result = false; } } QHashIterator<int, VDPad*> iter5(vdpads); while (iter5.hasNext() && result) { VDPad *vdpad = iter5.next().value(); if (!vdpad->isDefault()) { result = false; } } return result; }
void SetJoystick::writeConfig(QXmlStreamWriter *xml) { if (!isSetEmpty()) { xml->writeStartElement("set"); xml->writeAttribute("index", QString::number(index+1)); if (!name.isEmpty()) { xml->writeTextElement("name", name); } for (int i=0; i < getNumberSticks(); i++) { JoyControlStick *stick = getJoyStick(i); stick->writeConfig(xml); } for (int i=0; i < getNumberVDPads(); i++) { VDPad *vdpad = getVDPad(i); if (vdpad) { vdpad->writeConfig(xml); } } for (int i=0; i < getNumberAxes(); i++) { JoyAxis *axis = getJoyAxis(i); if (!axis->isPartControlStick() && axis->hasControlOfButtons()) { axis->writeConfig(xml); } } for (int i=0; i < getNumberHats(); i++) { JoyDPad *dpad = getJoyDPad(i); dpad->writeConfig(xml); } for (int i=0; i < getNumberButtons(); i++) { JoyButton *button = getJoyButton(i); if (button && !button->isPartVDPad()) { button->writeConfig(xml); } } xml->writeEndElement(); } }
void InputDevice::setAxisName(int axisIndex, QString tempName) { QHashIterator<int, SetJoystick*> iter(joystick_sets); while (iter.hasNext()) { SetJoystick *tempSet = iter.next().value(); disconnect(tempSet, SIGNAL(setAxisNameChange(int)), this, SLOT(updateSetAxisNames(int))); JoyAxis *axis = tempSet->getJoyAxis(axisIndex); if (axis) { axis->setAxisName(tempName); } connect(tempSet, SIGNAL(setAxisNameChange(int)), this, SLOT(updateSetAxisNames(int))); } }
QBitArray InputDaemon::createUnplugEventBitArray(InputDevice *device) { InputDeviceBitArrayStatus tempStatus(device, false); for (int i=0; i < device->getNumberRawAxes(); i++) { JoyAxis *axis = device->getActiveSetJoystick()->getJoyAxis(i); if (axis && axis->getThrottle() != JoyAxis::NormalThrottle) { tempStatus.changeAxesStatus(i, true); } } QBitArray unplugBitArray = tempStatus.generateFinalBitArray(); return unplugBitArray; }
void SetJoystick::setAxesDeadZones(QList<int> *axesDeadZones) { QListIterator<int> iter(*axesDeadZones); int axisNum = 0; while (iter.hasNext()) { int deadZoneValue = iter.next(); if (axes.contains(axisNum)) { JoyAxis *temp = getJoyAxis(axisNum); temp->disconnectPropertyUpdatedConnection(); temp->setDeadZone(deadZoneValue); temp->establishPropertyUpdatedConnection(); } axisNum++; } }
void SetJoystick::refreshAxes() { deleteAxes(); InputDevice *device = getInputDevice(); for (int i=0; i < device->getNumberRawAxes(); i++) { JoyAxis *axis = new JoyAxis(i, index, this, this); axes.insert(i, axis); if (device->hasCalibrationThrottle(i)) { JoyAxis::ThrottleTypes throttle = device->getCalibrationThrottle(i); axis->setInitialThrottle(throttle); } enableAxisConnections(axis); } }
void InputDevice::updateSetAxisButtonNames(int axisIndex, int buttonIndex) { JoyAxis *axis = getActiveSetJoystick()->getJoyAxis(axisIndex); if (axis) { JoyAxisButton *button = 0; if (buttonIndex == 0) { button = axis->getNAxisButton(); } else if (buttonIndex == 1) { button = axis->getPAxisButton(); } if (button) { setAxisButtonName(axisIndex, buttonIndex, button->getButtonName()); } } }
void SetJoystick::release() { QHashIterator<int, JoyButton*> iter(buttons); while (iter.hasNext()) { JoyButton *button = iter.next().value(); button->joyEvent(false, true); } QHashIterator<int, JoyAxis*> iter2(axes); while (iter2.hasNext()) { JoyAxis *axis = iter2.next().value(); axis->joyEvent(axis->getCurrentThrottledDeadValue(), true); } QHashIterator<int, JoyDPad*> iter3(hats); while (iter3.hasNext()) { JoyDPad *dpad = iter3.next().value(); dpad->joyEvent(0, true); } }
void InputDevice::propogateSetAxisThrottleChange(int index, int originset) { SetJoystick *currentSet = joystick_sets.value(originset); if (currentSet) { JoyAxis *axis = currentSet->getJoyAxis(index); if (axis) { int throttleSetting = axis->getThrottle(); QHashIterator<int, SetJoystick*> iter(joystick_sets); while (iter.hasNext()) { iter.next(); SetJoystick *temp = iter.value(); // Ignore change for set axis that initiated the change if (temp != currentSet) { temp->getJoyAxis(index)->setThrottle(throttleSetting); } } } } }
void GameController::writeConfig(QXmlStreamWriter *xml) { xml->writeStartElement(getXmlName()); xml->writeAttribute("configversion", QString::number(PadderCommon::LATESTCONFIGFILEVERSION)); xml->writeAttribute("appversion", PadderCommon::programVersion); xml->writeComment("The SDL name for a joystick is included for informational purposes only."); xml->writeTextElement("sdlname", getSDLName()); #ifdef USE_SDL_2 xml->writeComment("The GUID for a joystick is included for informational purposes only."); xml->writeTextElement("guid", getGUIDString()); #endif if (!profileName.isEmpty()) { xml->writeTextElement("profilename", profileName); } xml->writeStartElement("names"); // <names> SetJoystick *tempSet = getActiveSetJoystick(); for (int i=0; i < getNumberButtons(); i++) { JoyButton *button = tempSet->getJoyButton(i); if (button && !button->getButtonName().isEmpty()) { xml->writeStartElement("buttonname"); xml->writeAttribute("index", QString::number(button->getRealJoyNumber())); xml->writeCharacters(button->getButtonName()); xml->writeEndElement(); } } for (int i=0; i < getNumberAxes(); i++) { JoyAxis *axis = tempSet->getJoyAxis(i); if (axis) { if (!axis->getAxisName().isEmpty()) { xml->writeStartElement("axisname"); xml->writeAttribute("index", QString::number(axis->getRealJoyIndex())); xml->writeCharacters(axis->getAxisName()); xml->writeEndElement(); } JoyAxisButton *naxisbutton = axis->getNAxisButton(); if (!naxisbutton->getButtonName().isEmpty()) { xml->writeStartElement("axisbuttonname"); xml->writeAttribute("index", QString::number(axis->getRealJoyIndex())); xml->writeAttribute("button", QString::number(naxisbutton->getRealJoyNumber())); xml->writeCharacters(naxisbutton->getButtonName()); xml->writeEndElement(); } JoyAxisButton *paxisbutton = axis->getPAxisButton(); if (!paxisbutton->getButtonName().isEmpty()) { xml->writeStartElement("axisbuttonname"); xml->writeAttribute("index", QString::number(axis->getRealJoyIndex())); xml->writeAttribute("button", QString::number(paxisbutton->getRealJoyNumber())); xml->writeCharacters(paxisbutton->getButtonName()); xml->writeEndElement(); } } } for (int i=0; i < getNumberSticks(); i++) { JoyControlStick *stick = tempSet->getJoyStick(i); if (stick) { if (!stick->getStickName().isEmpty()) { xml->writeStartElement("controlstickname"); xml->writeAttribute("index", QString::number(stick->getRealJoyIndex())); xml->writeCharacters(stick->getStickName()); xml->writeEndElement(); } QHash<JoyControlStick::JoyStickDirections, JoyControlStickButton*> *buttons = stick->getButtons(); QHashIterator<JoyControlStick::JoyStickDirections, JoyControlStickButton*> iter(*buttons); while (iter.hasNext()) { JoyControlStickButton *button = iter.next().value(); if (button && !button->getButtonName().isEmpty()) { xml->writeStartElement("controlstickbuttonname"); xml->writeAttribute("index", QString::number(stick->getRealJoyIndex())); xml->writeAttribute("button", QString::number(button->getRealJoyNumber())); xml->writeCharacters(button->getButtonName()); xml->writeEndElement(); } } } } for (int i=0; i < getNumberVDPads(); i++) { VDPad *vdpad = getActiveSetJoystick()->getVDPad(i); if (vdpad) { if (!vdpad->getDpadName().isEmpty()) { xml->writeStartElement("dpadname"); xml->writeAttribute("index", QString::number(vdpad->getRealJoyNumber())); xml->writeCharacters(vdpad->getDpadName()); xml->writeEndElement(); } QHash<int, JoyDPadButton*> *temp = vdpad->getButtons(); QHashIterator<int, JoyDPadButton*> iter(*temp); while (iter.hasNext()) { JoyDPadButton *button = iter.next().value(); if (button && !button->getButtonName().isEmpty()) { xml->writeStartElement("dpadbutton"); xml->writeAttribute("index", QString::number(vdpad->getRealJoyNumber())); xml->writeAttribute("button", QString::number(button->getRealJoyNumber())); xml->writeCharacters(button->getButtonName()); xml->writeEndElement(); } } } } xml->writeEndElement(); // </names> if (keyPressTime > 0 && keyPressTime != DEFAULTKEYPRESSTIME) { xml->writeTextElement("keyPressTime", QString::number(keyPressTime)); } xml->writeStartElement("sets"); for (int i=0; i < joystick_sets.size(); i++) { joystick_sets.value(i)->writeConfig(xml); } xml->writeEndElement(); xml->writeEndElement(); }
InputDaemon::InputDaemon(QHash<SDL_JoystickID, InputDevice*> *joysticks, bool graphical, QObject *parent) : #else InputDaemon::InputDaemon(QHash<int, InputDevice*> *joysticks, bool graphical, QObject *parent) : #endif QObject(parent) { this->joysticks = joysticks; this->stopped = false; this->graphical = graphical; eventWorker = new SDLEventReader(joysticks); thread = new QThread(); eventWorker->moveToThread(thread); if (graphical) { connect(thread, SIGNAL(started()), eventWorker, SLOT(performWork())); connect(eventWorker, SIGNAL(eventRaised()), this, SLOT(run())); thread->start(); } refreshJoysticks(); } InputDaemon::~InputDaemon() { if (eventWorker) { quit(); } if (thread) { thread->quit(); thread->wait(); delete thread; thread = 0; } } void InputDaemon::run () { SDL_Event event; #ifdef USE_SDL_2 event.type = SDL_FIRSTEVENT; #else event.type = SDL_NOEVENT; #endif if (!stopped) { event = eventWorker->getCurrentEvent(); do { switch (event.type) { case SDL_JOYBUTTONDOWN: { #ifdef USE_SDL_2 InputDevice *joy = trackjoysticks.value(event.jbutton.which); #else InputDevice *joy = joysticks->value(event.jbutton.which); #endif if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyButton *button = set->getJoyButton(event.jbutton.button); if (button) { button->joyEvent(true); } } break; } case SDL_JOYBUTTONUP: { #ifdef USE_SDL_2 InputDevice *joy = trackjoysticks.value(event.jbutton.which); #else InputDevice *joy = joysticks->value(event.jbutton.which); #endif if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyButton *button = set->getJoyButton(event.jbutton.button); if (button) { button->joyEvent(false); } } break; } case SDL_JOYAXISMOTION: { #ifdef USE_SDL_2 InputDevice *joy = trackjoysticks.value(event.jaxis.which); #else InputDevice *joy = joysticks->value(event.jaxis.which); #endif if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyAxis *axis = set->getJoyAxis(event.jaxis.axis); if (axis) { axis->joyEvent(event.jaxis.value); } } break; } case SDL_JOYHATMOTION: { #ifdef USE_SDL_2 InputDevice *joy = trackjoysticks.value(event.jhat.which); #else InputDevice *joy = joysticks->value(event.jhat.which); #endif if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyDPad *dpad = set->getJoyDPad(event.jhat.hat); if (dpad) { dpad->joyEvent(event.jhat.value); } } break; } #ifdef USE_SDL_2 case SDL_CONTROLLERAXISMOTION: { InputDevice *joy = trackcontrollers.value(event.caxis.which); if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyAxis *axis = set->getJoyAxis(event.caxis.axis); if (axis) { axis->joyEvent(event.caxis.value); } } break; } case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONUP: { InputDevice *joy = trackcontrollers.value(event.cbutton.which); if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyButton *button = set->getJoyButton(event.cbutton.button); if (button) { button->joyEvent(event.type == SDL_CONTROLLERBUTTONDOWN ? true : false); } } break; } case SDL_JOYDEVICEREMOVED: { InputDevice *device = joysticks->value(event.jdevice.which); if (device) { removeDevice(device); } break; } case SDL_JOYDEVICEADDED: { addInputDevice(event.jdevice.which); break; } #endif case SDL_QUIT: { stopped = true; break; } default: break; } } while (SDL_PollEvent(&event) > 0); } if (stopped) { if (joysticks->count() > 0) { emit complete(joysticks->value(0)); } emit complete(); stopped = false; // Check for a grabbed instance of an SDL_QUIT event. If the last event was // not an SDL_QUIT event, push an event onto the queue so SdlEventReader // will finish properly. #ifdef USE_SDL_2 if (event.type != SDL_FIRSTEVENT && event.type != SDL_QUIT) #else if (event.type != SDL_NOEVENT && event.type != SDL_QUIT) #endif { event.type = SDL_QUIT; SDL_PushEvent(&event); QTimer::singleShot(0, eventWorker, SLOT(performWork())); } } else { QTimer::singleShot(0, eventWorker, SLOT(performWork())); } }
void SetJoystick::readConfig(QXmlStreamReader *xml) { if (xml->isStartElement() && xml->name() == "set") { //reset(); xml->readNextStartElement(); while (!xml->atEnd() && (!xml->isEndElement() && xml->name() != "set")) { if (xml->name() == "button" && xml->isStartElement()) { int index = xml->attributes().value("index").toString().toInt(); JoyButton *button = getJoyButton(index-1); if (button) { button->readConfig(xml); } else { xml->skipCurrentElement(); } } else if (xml->name() == "axis" && xml->isStartElement()) { int index = xml->attributes().value("index").toString().toInt(); JoyAxis *axis = getJoyAxis(index-1); if (axis) { axis->readConfig(xml); } else { xml->skipCurrentElement(); } } else if (xml->name() == "dpad" && xml->isStartElement()) { int index = xml->attributes().value("index").toString().toInt(); JoyDPad *dpad = getJoyDPad(index-1); if (dpad) { dpad->readConfig(xml); } else { xml->skipCurrentElement(); } } else if (xml->name() == "stick" && xml->isStartElement()) { int stickIndex = xml->attributes().value("index").toString().toInt(); if (stickIndex > 0) { stickIndex -= 1; JoyControlStick *stick = getJoyStick(stickIndex); if (stick) { stick->readConfig(xml); } else { xml->skipCurrentElement(); } } else { xml->skipCurrentElement(); } } else if (xml->name() == "vdpad" && xml->isStartElement()) { int index = xml->attributes().value("index").toString().toInt(); VDPad *vdpad = getVDPad(index-1); if (vdpad) { vdpad->readConfig(xml); } else { xml->skipCurrentElement(); } } else { // If none of the above, skip the element xml->skipCurrentElement(); } xml->readNextStartElement(); } } }
void InputDaemon::firstInputPass(QQueue<SDL_Event> *sdlEventQueue) { SDL_Event event; while (SDL_PollEvent(&event) > 0) { switch (event.type) { case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: { #ifdef USE_SDL_2 InputDevice *joy = trackjoysticks.value(event.jbutton.which); #else InputDevice *joy = joysticks->value(event.jbutton.which); #endif if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyButton *button = set->getJoyButton(event.jbutton.button); if (button) { InputDeviceBitArrayStatus *temp = createOrGrabBitStatusEntry(&releaseEventsGenerated, joy, false); temp->changeButtonStatus(event.jbutton.button, event.type == SDL_JOYBUTTONUP); InputDeviceBitArrayStatus *pending = createOrGrabBitStatusEntry(&pendingEventValues, joy); pending->changeButtonStatus(event.jbutton.button, event.type == SDL_JOYBUTTONDOWN ? true : false); sdlEventQueue->append(event); } } #ifdef USE_SDL_2 else { sdlEventQueue->append(event); } #endif break; } case SDL_JOYAXISMOTION: { #ifdef USE_SDL_2 InputDevice *joy = trackjoysticks.value(event.jaxis.which); #else InputDevice *joy = joysticks->value(event.jaxis.which); #endif if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyAxis *axis = set->getJoyAxis(event.jaxis.axis); if (axis) { InputDeviceBitArrayStatus *temp = createOrGrabBitStatusEntry(&releaseEventsGenerated, joy, false); temp->changeAxesStatus(event.jaxis.axis, event.jaxis.axis == 0); InputDeviceBitArrayStatus *pending = createOrGrabBitStatusEntry(&pendingEventValues, joy); pending->changeAxesStatus(event.jaxis.axis, !axis->inDeadZone(event.jaxis.value)); sdlEventQueue->append(event); } } #ifdef USE_SDL_2 else { sdlEventQueue->append(event); } #endif break; } case SDL_JOYHATMOTION: { #ifdef USE_SDL_2 InputDevice *joy = trackjoysticks.value(event.jhat.which); #else InputDevice *joy = joysticks->value(event.jhat.which); #endif if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyDPad *dpad = set->getJoyDPad(event.jhat.hat); if (dpad) { InputDeviceBitArrayStatus *temp = createOrGrabBitStatusEntry(&releaseEventsGenerated, joy, false); temp->changeHatStatus(event.jhat.hat, event.jhat.value == 0); InputDeviceBitArrayStatus *pending = createOrGrabBitStatusEntry(&pendingEventValues, joy); pending->changeHatStatus(event.jhat.hat, event.jhat.value != 0 ? true : false); sdlEventQueue->append(event); } } #ifdef USE_SDL_2 else { sdlEventQueue->append(event); } #endif break; } #ifdef USE_SDL_2 case SDL_CONTROLLERAXISMOTION: { InputDevice *joy = trackcontrollers.value(event.caxis.which); if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyAxis *axis = set->getJoyAxis(event.caxis.axis); if (axis) { InputDeviceBitArrayStatus *temp = createOrGrabBitStatusEntry(&releaseEventsGenerated, joy, false); if (event.caxis.axis != SDL_CONTROLLER_AXIS_TRIGGERLEFT && event.caxis.axis != SDL_CONTROLLER_AXIS_TRIGGERRIGHT) { temp->changeAxesStatus(event.caxis.axis, event.caxis.value == 0); } else { temp->changeAxesStatus(event.caxis.axis, event.caxis.value == GAMECONTROLLERTRIGGERRELEASE); } InputDeviceBitArrayStatus *pending = createOrGrabBitStatusEntry(&pendingEventValues, joy); pending->changeAxesStatus(event.caxis.axis, !axis->inDeadZone(event.caxis.value)); sdlEventQueue->append(event); } } break; } case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONUP: { InputDevice *joy = trackcontrollers.value(event.cbutton.which); if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyButton *button = set->getJoyButton(event.cbutton.button); if (button) { InputDeviceBitArrayStatus *temp = createOrGrabBitStatusEntry(&releaseEventsGenerated, joy, false); temp->changeButtonStatus(event.cbutton.button, event.type == SDL_CONTROLLERBUTTONUP); InputDeviceBitArrayStatus *pending = createOrGrabBitStatusEntry(&pendingEventValues, joy); pending->changeButtonStatus(event.cbutton.button, event.type == SDL_CONTROLLERBUTTONDOWN ? true : false); sdlEventQueue->append(event); } } break; } case SDL_JOYDEVICEREMOVED: case SDL_JOYDEVICEADDED: { sdlEventQueue->append(event); break; } #endif case SDL_QUIT: { sdlEventQueue->append(event); break; } } } }
void SetJoystick::setIgnoreEventState(bool ignore) { QHashIterator<int, JoyButton*> iter(buttons); while (iter.hasNext()) { JoyButton *button = iter.next().value(); if (button) { button->setIgnoreEventState(ignore); } } QHashIterator<int, JoyAxis*> iter2(axes); while (iter2.hasNext()) { JoyAxis *axis = iter2.next().value(); if (axis) { JoyAxisButton *naxisbutton = axis->getNAxisButton(); naxisbutton->setIgnoreEventState(ignore); JoyAxisButton *paxisbutton = axis->getPAxisButton(); paxisbutton->setIgnoreEventState(ignore); } } QHashIterator<int, JoyDPad*> iter3(hats); while (iter3.hasNext()) { JoyDPad *dpad = iter3.next().value(); if (dpad) { QHash<int, JoyDPadButton*>* dpadbuttons = dpad->getButtons(); QHashIterator<int, JoyDPadButton*> iterdpadbuttons(*dpadbuttons); while (iterdpadbuttons.hasNext()) { JoyDPadButton *dpadbutton = iterdpadbuttons.next().value(); if (dpadbutton) { dpadbutton->setIgnoreEventState(ignore); } } } } QHashIterator<int, JoyControlStick*> iter4(sticks); while (iter4.hasNext()) { JoyControlStick *stick = iter4.next().value(); if (stick) { QHash<JoyControlStick::JoyStickDirections, JoyControlStickButton*> *stickButtons = stick->getButtons(); QHashIterator<JoyControlStick::JoyStickDirections, JoyControlStickButton*> iterstickbuttons(*stickButtons); while (iterstickbuttons.hasNext()) { JoyControlStickButton *stickbutton = iterstickbuttons.next().value(); stickbutton->setIgnoreEventState(ignore); } } } QHashIterator<int, VDPad*> iter5(vdpads); while (iter5.hasNext()) { VDPad *vdpad = iter5.next().value(); if (vdpad) { QHash<int, JoyDPadButton*>* dpadbuttons = vdpad->getButtons(); QHashIterator<int, JoyDPadButton*> itervdpadbuttons(*dpadbuttons); while (itervdpadbuttons.hasNext()) { JoyDPadButton *dpadbutton = itervdpadbuttons.next().value(); dpadbutton->setIgnoreEventState(ignore); } } } }
void SetJoystick::propogateSetAxisActivated(int value) { JoyAxis *axis = static_cast<JoyAxis*>(sender()); emit setAxisActivated(this->index, axis->getIndex(), value); }
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); } } }
void InputDaemon::modifyUnplugEvents(QQueue<SDL_Event> *sdlEventQueue) { QHashIterator<InputDevice*, InputDeviceBitArrayStatus*> genIter(releaseEventsGenerated); while (genIter.hasNext()) { genIter.next(); InputDevice *device = genIter.key(); InputDeviceBitArrayStatus *generatedTemp = genIter.value(); QBitArray tempBitArray = generatedTemp->generateFinalBitArray(); //qDebug() << "ARRAY: " << tempBitArray; unsigned int bitArraySize = tempBitArray.size(); //qDebug() << "ARRAY SIZE: " << bitArraySize; if (bitArraySize > 0 && tempBitArray.count(true) == bitArraySize) { if (pendingEventValues.contains(device)) { InputDeviceBitArrayStatus *pendingTemp = pendingEventValues.value(device); QBitArray pendingBitArray = pendingTemp->generateFinalBitArray(); QBitArray unplugBitArray = createUnplugEventBitArray(device); unsigned int pendingBitArraySize = pendingBitArray.size(); if (bitArraySize == pendingBitArraySize && pendingBitArray == unplugBitArray) { QQueue<SDL_Event> tempQueue; while (!sdlEventQueue->isEmpty()) { SDL_Event event = sdlEventQueue->dequeue(); switch (event.type) { case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: { tempQueue.enqueue(event); break; } case SDL_JOYAXISMOTION: { if (event.jaxis.which != device->getSDLJoystickID()) { tempQueue.enqueue(event); } else { InputDevice *joy = trackjoysticks.value(event.jaxis.which); if (joy) { JoyAxis *axis = joy->getActiveSetJoystick()->getJoyAxis(event.jaxis.axis); if (axis) { if (axis->getThrottle() != JoyAxis::NormalThrottle) { event.jaxis.value = axis->getProperReleaseValue(); } } } tempQueue.enqueue(event); } break; } case SDL_JOYHATMOTION: { tempQueue.enqueue(event); break; } case SDL_CONTROLLERAXISMOTION: { if (event.caxis.which != device->getSDLJoystickID()) { tempQueue.enqueue(event); } else { InputDevice *joy = trackcontrollers.value(event.caxis.which); if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyAxis *axis = set->getJoyAxis(event.caxis.axis); if (axis) { if (event.caxis.axis == SDL_CONTROLLER_AXIS_TRIGGERLEFT || event.caxis.axis == SDL_CONTROLLER_AXIS_TRIGGERRIGHT) { event.caxis.value = axis->getProperReleaseValue(); } } } tempQueue.enqueue(event); } break; } case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONUP: { tempQueue.enqueue(event); break; } case SDL_JOYDEVICEREMOVED: case SDL_JOYDEVICEADDED: { tempQueue.enqueue(event); break; } default: { tempQueue.enqueue(event); } } } sdlEventQueue->swap(tempQueue); } } } } }
void InputDevice::readConfig(QXmlStreamReader *xml) { if (xml->isStartElement() && xml->name() == getXmlName()) { reset(); xml->readNextStartElement(); while (!xml->atEnd() && (!xml->isEndElement() && xml->name() != getXmlName())) { if (xml->name() == "sets" && xml->isStartElement()) { xml->readNextStartElement(); while (!xml->atEnd() && (!xml->isEndElement() && xml->name() != "sets")) { if (xml->name() == "set" && xml->isStartElement()) { int index = xml->attributes().value("index").toString().toInt(); index = index - 1; if (index >= 0 && index < joystick_sets.size()) { joystick_sets.value(index)->readConfig(xml); } } else { // If none of the above, skip the element xml->skipCurrentElement(); } xml->readNextStartElement(); } } else if (xml->name() == "stickAxisAssociation" && xml->isStartElement()) { int stickIndex = xml->attributes().value("index").toString().toInt(); int xAxis = xml->attributes().value("xAxis").toString().toInt(); int yAxis = xml->attributes().value("yAxis").toString().toInt(); if (stickIndex > 0 && xAxis > 0 && yAxis > 0) { xAxis -= 1; yAxis -= 1; stickIndex -= 1; for (int i=0; i <joystick_sets.size(); i++) { SetJoystick *currentset = joystick_sets.value(i); JoyAxis *axis1 = currentset->getJoyAxis(xAxis); JoyAxis *axis2 = currentset->getJoyAxis(yAxis); if (axis1 && axis2) { JoyControlStick *stick = new JoyControlStick(axis1, axis2, stickIndex, i, this); currentset->addControlStick(stickIndex, stick); } } xml->readNext(); } else { xml->skipCurrentElement(); } } else if (xml->name() == "vdpadButtonAssociations" && xml->isStartElement()) { int vdpadIndex = xml->attributes().value("index").toString().toInt(); if (vdpadIndex > 0) { for (int i=0; i <joystick_sets.size(); i++) { SetJoystick *currentset = joystick_sets.value(i); VDPad *vdpad = currentset->getVDPad(vdpadIndex-1); if (!vdpad) { vdpad = new VDPad(vdpadIndex-1, i, currentset); currentset->addVDPad(vdpadIndex-1, vdpad); } } xml->readNextStartElement(); while (!xml->atEnd() && (!xml->isEndElement() && xml->name() != "vdpadButtonAssociations")) { if (xml->name() == "vdpadButtonAssociation" && xml->isStartElement()) { int vdpadAxisIndex = xml->attributes().value("axis").toString().toInt(); int vdpadButtonIndex = xml->attributes().value("button").toString().toInt(); int vdpadDirection = xml->attributes().value("direction").toString().toInt(); if (vdpadAxisIndex > 0 && vdpadDirection > 0) { vdpadAxisIndex -= 1; for (int i=0; i < joystick_sets.size(); i++) { SetJoystick *currentset = joystick_sets.value(i); VDPad *vdpad = currentset->getVDPad(vdpadIndex-1); if (vdpad) { JoyAxis *axis = currentset->getJoyAxis(vdpadAxisIndex); if (axis) { JoyButton *button = 0; if (vdpadButtonIndex == 0) { button = axis->getNAxisButton(); } else if (vdpadButtonIndex == 1) { button = axis->getPAxisButton(); } if (button) { vdpad->addVButton((JoyDPadButton::JoyDPadDirections)vdpadDirection, button); } } } } } else if (vdpadButtonIndex > 0 && vdpadDirection > 0) { vdpadButtonIndex -= 1; for (int i=0; i < joystick_sets.size(); i++) { SetJoystick *currentset = joystick_sets.value(i); VDPad *vdpad = currentset->getVDPad(vdpadIndex-1); if (vdpad) { JoyButton *button = currentset->getJoyButton(vdpadButtonIndex); if (button) { vdpad->addVButton((JoyDPadButton::JoyDPadDirections)vdpadDirection, button); } } } } xml->readNext(); } else { xml->skipCurrentElement(); } xml->readNextStartElement(); } } for (int i=0; i < joystick_sets.size(); i++) { SetJoystick *currentset = joystick_sets.value(i); for (int j=0; j < currentset->getNumberVDPads(); j++) { VDPad *vdpad = currentset->getVDPad(j); if (vdpad && vdpad->isEmpty()) { currentset->removeVDPad(j); } } } } else if (xml->name() == "names" && xml->isStartElement()) { xml->readNextStartElement(); while (!xml->atEnd() && (!xml->isEndElement() && xml->name() != "names")) { if (xml->name() == "buttonname" && xml->isStartElement()) { int index = xml->attributes().value("index").toString().toInt(); QString temp = xml->readElementText(); index = index - 1; if (index >= 0 && !temp.isEmpty()) { setButtonName(index, temp); } } else if (xml->name() == "axisbuttonname" && xml->isStartElement()) { int index = xml->attributes().value("index").toString().toInt(); int buttonIndex = xml->attributes().value("button").toString().toInt(); QString temp = xml->readElementText(); index = index - 1; buttonIndex = buttonIndex - 1; if (index >= 0 && !temp.isEmpty()) { setAxisButtonName(index, buttonIndex, temp); } } else if (xml->name() == "controlstickbuttonname" && xml->isStartElement()) { int index = xml->attributes().value("index").toString().toInt(); int buttonIndex = xml->attributes().value("button").toString().toInt(); QString temp = xml->readElementText(); index = index - 1; if (index >= 0 && !temp.isEmpty()) { setStickButtonName(index, buttonIndex, temp); } } else if (xml->name() == "dpadbuttonname" && xml->isStartElement()) { int index = xml->attributes().value("index").toString().toInt(); int buttonIndex = xml->attributes().value("button").toString().toInt(); QString temp = xml->readElementText(); index = index - 1; if (index >= 0 && !temp.isEmpty()) { setDPadButtonName(index, buttonIndex, temp); } } else if (xml->name() == "vdpadbuttonname" && xml->isStartElement()) { int index = xml->attributes().value("index").toString().toInt(); int buttonIndex = xml->attributes().value("button").toString().toInt(); QString temp = xml->readElementText(); index = index - 1; if (index >= 0 && !temp.isEmpty()) { setVDPadButtonName(index, buttonIndex, temp); } } else if (xml->name() == "axisname" && xml->isStartElement()) { int index = xml->attributes().value("index").toString().toInt(); QString temp = xml->readElementText(); index = index - 1; if (index >= 0 && !temp.isEmpty()) { setAxisName(index, temp); } } else if (xml->name() == "controlstickname" && xml->isStartElement()) { int index = xml->attributes().value("index").toString().toInt(); QString temp = xml->readElementText(); index = index - 1; if (index >= 0 && !temp.isEmpty()) { setStickName(index, temp); } } else if (xml->name() == "dpadname" && xml->isStartElement()) { int index = xml->attributes().value("index").toString().toInt(); QString temp = xml->readElementText(); index = index - 1; if (index >= 0 && !temp.isEmpty()) { setDPadName(index, temp); } } else if (xml->name() == "vdpadname" && xml->isStartElement()) { int index = xml->attributes().value("index").toString().toInt(); QString temp = xml->readElementText(); index = index - 1; if (index >= 0 && !temp.isEmpty()) { setVDPadName(index, temp); } } else { // If none of the above, skip the element xml->skipCurrentElement(); } xml->readNextStartElement(); } } else if (xml->name() == "keyPressTime" && xml->isStartElement()) { QString temptext = xml->readElementText(); int tempchoice = temptext.toInt(); if (tempchoice >= 10) { this->setDeviceKeyDelay(tempchoice); } } else { // If none of the above, skip the element xml->skipCurrentElement(); } xml->readNextStartElement(); } } }
void InputDaemon::secondInputPass(QQueue<SDL_Event> *sdlEventQueue) { QHash<SDL_JoystickID, InputDevice*> activeDevices; while (!sdlEventQueue->isEmpty()) { SDL_Event event = sdlEventQueue->dequeue(); switch (event.type) { //qDebug() << QTime::currentTime() << " :"; case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: { #ifdef USE_SDL_2 InputDevice *joy = trackjoysticks.value(event.jbutton.which); #else InputDevice *joy = joysticks->value(event.jbutton.which); #endif if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyButton *button = set->getJoyButton(event.jbutton.button); if (button) { //button->joyEvent(event.type == SDL_JOYBUTTONDOWN ? true : false); button->queuePendingEvent(event.type == SDL_JOYBUTTONDOWN ? true : false); if (!activeDevices.contains(event.jbutton.which)) { activeDevices.insert(event.jbutton.which, joy); } } } #ifdef USE_SDL_2 else if (trackcontrollers.contains(event.jbutton.which)) { GameController *gamepad = trackcontrollers.value(event.jbutton.which); gamepad->rawButtonEvent(event.jbutton.button, event.type == SDL_JOYBUTTONDOWN ? true : false); } #endif break; } case SDL_JOYAXISMOTION: { #ifdef USE_SDL_2 InputDevice *joy = trackjoysticks.value(event.jaxis.which); #else InputDevice *joy = joysticks->value(event.jaxis.which); #endif if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyAxis *axis = set->getJoyAxis(event.jaxis.axis); if (axis) { //axis->joyEvent(event.jaxis.value); axis->queuePendingEvent(event.jaxis.value); if (!activeDevices.contains(event.jaxis.which)) { activeDevices.insert(event.jaxis.which, joy); } } joy->rawAxisEvent(event.jaxis.which, event.jaxis.value); } #ifdef USE_SDL_2 else if (trackcontrollers.contains(event.jaxis.which)) { GameController *gamepad = trackcontrollers.value(event.jaxis.which); gamepad->rawAxisEvent(event.jaxis.axis, event.jaxis.value); } #endif break; } case SDL_JOYHATMOTION: { #ifdef USE_SDL_2 InputDevice *joy = trackjoysticks.value(event.jhat.which); #else InputDevice *joy = joysticks->value(event.jhat.which); #endif if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyDPad *dpad = set->getJoyDPad(event.jhat.hat); if (dpad) { //dpad->joyEvent(event.jhat.value); dpad->joyEvent(event.jhat.value); if (!activeDevices.contains(event.jhat.which)) { activeDevices.insert(event.jhat.which, joy); } } } #ifdef USE_SDL_2 else if (trackcontrollers.contains(event.jhat.which)) { GameController *gamepad = trackcontrollers.value(event.jaxis.which); gamepad->rawDPadEvent(event.jhat.hat, event.jhat.value); } #endif break; } #ifdef USE_SDL_2 case SDL_CONTROLLERAXISMOTION: { InputDevice *joy = trackcontrollers.value(event.caxis.which); if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyAxis *axis = set->getJoyAxis(event.caxis.axis); if (axis) { //qDebug() << QTime::currentTime() << ": " << "Axis " << event.caxis.axis+1 // << ": " << event.caxis.value; //axis->joyEvent(event.caxis.value); axis->queuePendingEvent(event.caxis.value); if (!activeDevices.contains(event.caxis.which)) { activeDevices.insert(event.caxis.which, joy); } } } break; } case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONUP: { InputDevice *joy = trackcontrollers.value(event.cbutton.which); if (joy) { SetJoystick* set = joy->getActiveSetJoystick(); JoyButton *button = set->getJoyButton(event.cbutton.button); if (button) { //button->joyEvent(event.type == SDL_CONTROLLERBUTTONDOWN ? true : false); button->queuePendingEvent(event.type == SDL_CONTROLLERBUTTONDOWN ? true : false); if (!activeDevices.contains(event.cbutton.which)) { activeDevices.insert(event.cbutton.which, joy); } } } break; } case SDL_JOYDEVICEREMOVED: { InputDevice *device = joysticks->value(event.jdevice.which); if (device) { Logger::LogInfo(QString("Removing joystick #%1 [%2]") .arg(device->getRealJoyNumber()) .arg(QTime::currentTime().toString("hh:mm:ss.zzz"))); //activeDevices.remove(event.jdevice.which); removeDevice(device); } break; } case SDL_JOYDEVICEADDED: { Logger::LogInfo(QString("New joystick found - #%1 [%2]") .arg(event.jdevice.which+1) .arg(QTime::currentTime().toString("hh:mm:ss.zzz"))); addInputDevice(event.jdevice.which); break; } #endif case SDL_QUIT: { stopped = true; break; } default: break; } // Active possible queued events. QHashIterator<SDL_JoystickID, InputDevice*> activeDevIter(activeDevices); while (activeDevIter.hasNext()) { InputDevice *tempDevice = activeDevIter.next().value(); tempDevice->activatePossibleControlStickEvents(); tempDevice->activatePossibleAxisEvents(); tempDevice->activatePossibleDPadEvents(); tempDevice->activatePossibleVDPadEvents(); tempDevice->activatePossibleButtonEvents(); } if (JoyButton::shouldInvokeMouseEvents()) { // Do not wait for next event loop run. Execute immediately. JoyButton::invokeMouseEvents(); } } }
void InputDevice::writeConfig(QXmlStreamWriter *xml) { xml->writeStartElement(getXmlName()); xml->writeAttribute("configversion", QString::number(PadderCommon::LATESTCONFIGFILEVERSION)); xml->writeAttribute("appversion", PadderCommon::programVersion); xml->writeComment("The SDL name for a joystick is included for informational purposes only."); xml->writeTextElement("sdlname", getSDLName()); for (int i=0; i < getNumberSticks(); i++) { JoyControlStick *stick = getActiveSetJoystick()->getJoyStick(i); xml->writeStartElement("stickAxisAssociation"); xml->writeAttribute("index", QString::number(stick->getRealJoyIndex())); xml->writeAttribute("xAxis", QString::number(stick->getAxisX()->getRealJoyIndex())); xml->writeAttribute("yAxis", QString::number(stick->getAxisY()->getRealJoyIndex())); xml->writeEndElement(); } for (int i=0; i < getNumberVDPads(); i++) { VDPad *vdpad = getActiveSetJoystick()->getVDPad(i); xml->writeStartElement("vdpadButtonAssociations"); xml->writeAttribute("index", QString::number(vdpad->getRealJoyNumber())); JoyButton *button = vdpad->getVButton(JoyDPadButton::DpadUp); if (button) { xml->writeStartElement("vdpadButtonAssociation"); if (typeid(*button) == typeid(JoyAxisButton)) { JoyAxisButton *axisbutton = static_cast<JoyAxisButton*>(button); xml->writeAttribute("axis", QString::number(axisbutton->getAxis()->getRealJoyIndex())); xml->writeAttribute("button", QString::number(button->getJoyNumber())); } else { xml->writeAttribute("axis", QString::number(0)); xml->writeAttribute("button", QString::number(button->getRealJoyNumber())); } xml->writeAttribute("direction", QString::number(JoyDPadButton::DpadUp)); xml->writeEndElement(); } button = vdpad->getVButton(JoyDPadButton::DpadDown); if (button) { xml->writeStartElement("vdpadButtonAssociation"); if (typeid(*button) == typeid(JoyAxisButton)) { JoyAxisButton *axisbutton = static_cast<JoyAxisButton*>(button); xml->writeAttribute("axis", QString::number(axisbutton->getAxis()->getRealJoyIndex())); xml->writeAttribute("button", QString::number(button->getJoyNumber())); } else { xml->writeAttribute("axis", QString::number(0)); xml->writeAttribute("button", QString::number(button->getRealJoyNumber())); } xml->writeAttribute("direction", QString::number(JoyDPadButton::DpadDown)); xml->writeEndElement(); } button = vdpad->getVButton(JoyDPadButton::DpadLeft); if (button) { xml->writeStartElement("vdpadButtonAssociation"); if (typeid(*button) == typeid(JoyAxisButton)) { JoyAxisButton *axisbutton = static_cast<JoyAxisButton*>(button); xml->writeAttribute("axis", QString::number(axisbutton->getAxis()->getRealJoyIndex())); xml->writeAttribute("button", QString::number(button->getJoyNumber())); } else { xml->writeAttribute("axis", QString::number(0)); xml->writeAttribute("button", QString::number(button->getRealJoyNumber())); } xml->writeAttribute("direction", QString::number(JoyDPadButton::DpadLeft)); xml->writeEndElement(); } button = vdpad->getVButton(JoyDPadButton::DpadRight); if (button) { xml->writeStartElement("vdpadButtonAssociation"); if (typeid(*button) == typeid(JoyAxisButton)) { JoyAxisButton *axisbutton = static_cast<JoyAxisButton*>(button); xml->writeAttribute("axis", QString::number(axisbutton->getAxis()->getRealJoyIndex())); xml->writeAttribute("button", QString::number(button->getJoyNumber())); } else { xml->writeAttribute("axis", QString::number(0)); xml->writeAttribute("button", QString::number(button->getRealJoyNumber())); } xml->writeAttribute("direction", QString::number(JoyDPadButton::DpadRight)); xml->writeEndElement(); } xml->writeEndElement(); } xml->writeStartElement("names"); // <name> SetJoystick *tempSet = getActiveSetJoystick(); for (int i=0; i < getNumberButtons(); i++) { JoyButton *button = tempSet->getJoyButton(i); if (button && !button->getButtonName().isEmpty()) { xml->writeStartElement("buttonname"); xml->writeAttribute("index", QString::number(button->getRealJoyNumber())); xml->writeCharacters(button->getButtonName()); xml->writeEndElement(); } } for (int i=0; i < getNumberAxes(); i++) { JoyAxis *axis = tempSet->getJoyAxis(i); if (axis) { if (!axis->getAxisName().isEmpty()) { xml->writeStartElement("axisname"); xml->writeAttribute("index", QString::number(axis->getRealJoyIndex())); xml->writeCharacters(axis->getAxisName()); xml->writeEndElement(); } JoyAxisButton *naxisbutton = axis->getNAxisButton(); if (!naxisbutton->getButtonName().isEmpty()) { xml->writeStartElement("axisbuttonname"); xml->writeAttribute("index", QString::number(axis->getRealJoyIndex())); xml->writeAttribute("button", QString::number(naxisbutton->getRealJoyNumber())); xml->writeCharacters(naxisbutton->getButtonName()); xml->writeEndElement(); } JoyAxisButton *paxisbutton = axis->getPAxisButton(); if (!paxisbutton->getButtonName().isEmpty()) { xml->writeStartElement("axisbuttonname"); xml->writeAttribute("index", QString::number(axis->getRealJoyIndex())); xml->writeAttribute("button", QString::number(paxisbutton->getRealJoyNumber())); xml->writeCharacters(paxisbutton->getButtonName()); xml->writeEndElement(); } } } for (int i=0; i < getNumberSticks(); i++) { JoyControlStick *stick = tempSet->getJoyStick(i); if (stick) { if (!stick->getStickName().isEmpty()) { xml->writeStartElement("controlstickname"); xml->writeAttribute("index", QString::number(stick->getRealJoyIndex())); xml->writeCharacters(stick->getStickName()); xml->writeEndElement(); } QHash<JoyControlStick::JoyStickDirections, JoyControlStickButton*> *buttons = stick->getButtons(); QHashIterator<JoyControlStick::JoyStickDirections, JoyControlStickButton*> iter(*buttons); while (iter.hasNext()) { JoyControlStickButton *button = iter.next().value(); if (button && !button->getButtonName().isEmpty()) { xml->writeStartElement("controlstickbuttonname"); xml->writeAttribute("index", QString::number(stick->getRealJoyIndex())); xml->writeAttribute("button", QString::number(button->getRealJoyNumber())); xml->writeCharacters(button->getButtonName()); xml->writeEndElement(); } } } } for (int i=0; i < getNumberHats(); i++) { JoyDPad *dpad = tempSet->getJoyDPad(i); if (dpad) { if (!dpad->getDpadName().isEmpty()) { xml->writeStartElement("dpadname"); xml->writeAttribute("index", QString::number(dpad->getRealJoyNumber())); xml->writeCharacters(dpad->getDpadName()); xml->writeEndElement(); } QHash<int, JoyDPadButton*> *temp = dpad->getButtons(); QHashIterator<int, JoyDPadButton*> iter(*temp); while (iter.hasNext()) { JoyDPadButton *button = iter.next().value(); if (button && !button->getButtonName().isEmpty()) { xml->writeStartElement("dpadbuttonname"); xml->writeAttribute("index", QString::number(dpad->getRealJoyNumber())); xml->writeAttribute("button", QString::number(button->getRealJoyNumber())); xml->writeCharacters(button->getButtonName()); xml->writeEndElement(); } } } } for (int i=0; i < getNumberVDPads(); i++) { VDPad *vdpad = getActiveSetJoystick()->getVDPad(i); if (vdpad) { if (!vdpad->getDpadName().isEmpty()) { xml->writeStartElement("vdpadname"); xml->writeAttribute("index", QString::number(vdpad->getRealJoyNumber())); xml->writeCharacters(vdpad->getDpadName()); xml->writeEndElement(); } QHash<int, JoyDPadButton*> *temp = vdpad->getButtons(); QHashIterator<int, JoyDPadButton*> iter(*temp); while (iter.hasNext()) { JoyDPadButton *button = iter.next().value(); if (button && !button->getButtonName().isEmpty()) { xml->writeStartElement("vdpadbutton"); xml->writeAttribute("index", QString::number(vdpad->getRealJoyNumber())); xml->writeAttribute("button", QString::number(button->getRealJoyNumber())); xml->writeCharacters(button->getButtonName()); xml->writeEndElement(); } } } } xml->writeEndElement(); // </names> if (keyDelay > 0) { xml->writeTextElement("keyPressTime", QString::number(keyDelay)); } xml->writeStartElement("sets"); for (int i=0; i < joystick_sets.size(); i++) { joystick_sets.value(i)->writeConfig(xml); } xml->writeEndElement(); xml->writeEndElement(); }