int GameController::getBindForAxis(State & state, SDL_GameController * gamecontroller){ Stack * stack = state.stack; SDL_GameControllerButtonBind bind = SDL_GameControllerGetBindForAxis(gamecontroller, static_cast<SDL_GameControllerAxis>(stack->to<int>(1))); stack->newTable(); stack->setField<int>("bindType", bind.bindType); switch (bind.bindType){ case SDL_CONTROLLER_BINDTYPE_AXIS: stack->setField<int>("value", bind.value.axis); break; case SDL_CONTROLLER_BINDTYPE_BUTTON: stack->setField<int>("value", bind.value.button); break; case SDL_CONTROLLER_BINDTYPE_HAT: stack->push<const std::string &>("value"); stack->newTable(); stack->setField<int>("hat", bind.value.hat.hat); stack->setField<int>("mask", bind.value.hat.hat_mask); stack->setTable(); break; } return 1; }
Joystick::JoystickInput Joystick::getGamepadMapping(const GamepadInput &input) const { Joystick::JoystickInput jinput; jinput.type = INPUT_TYPE_MAX_ENUM; if (!isGamepad()) return jinput; SDL_GameControllerButtonBind sdlbind = {}; sdlbind.bindType = SDL_CONTROLLER_BINDTYPE_NONE; SDL_GameControllerButton sdlbutton; SDL_GameControllerAxis sdlaxis; switch (input.type) { case INPUT_TYPE_BUTTON: if (getConstant(input.button, sdlbutton)) sdlbind = SDL_GameControllerGetBindForButton(controller, sdlbutton); break; case INPUT_TYPE_AXIS: if (getConstant(input.axis, sdlaxis)) sdlbind = SDL_GameControllerGetBindForAxis(controller, sdlaxis); break; default: break; } switch (sdlbind.bindType) { case SDL_CONTROLLER_BINDTYPE_BUTTON: jinput.type = INPUT_TYPE_BUTTON; jinput.button = sdlbind.value.button; break; case SDL_CONTROLLER_BINDTYPE_AXIS: jinput.type = INPUT_TYPE_AXIS; jinput.axis = sdlbind.value.axis; break; case SDL_CONTROLLER_BINDTYPE_HAT: if (getConstant(sdlbind.value.hat.hat_mask, jinput.hat.value)) { jinput.type = INPUT_TYPE_HAT; jinput.hat.index = sdlbind.value.hat.hat; } break; case SDL_CONTROLLER_BINDTYPE_NONE: default: break; } return jinput; }
QString GameController::getBindStringForAxis(int index) { QString temp; SDL_GameControllerButtonBind bind = SDL_GameControllerGetBindForAxis(controller, (SDL_GameControllerAxis)index); if (bind.bindType != SDL_CONTROLLER_BINDTYPE_NONE) { if (bind.bindType == SDL_CONTROLLER_BINDTYPE_BUTTON) { temp.append("Button %1").arg(QString::number(bind.value.button)); } else if (bind.bindType == SDL_CONTROLLER_BINDTYPE_AXIS) { temp.append("Axis %1").arg(QString::number(bind.value.axis)); } } return temp; }
QString GameController::getBindStringForAxis(int index, bool trueIndex) { QString temp; SDL_GameControllerButtonBind bind = SDL_GameControllerGetBindForAxis(controller, (SDL_GameControllerAxis)index); if (bind.bindType != SDL_CONTROLLER_BINDTYPE_NONE) { int offset = trueIndex ? 0 : 1; if (bind.bindType == SDL_CONTROLLER_BINDTYPE_BUTTON) { temp.append(QString("Button %1").arg(bind.value.button + offset)); } else if (bind.bindType == SDL_CONTROLLER_BINDTYPE_AXIS) { temp.append(QString("Axis %1").arg(bind.value.axis + offset)); } } return temp; }
SDL_GameControllerButtonBind GameController::getBindForAxis(int index) { SDL_GameControllerButtonBind bind = SDL_GameControllerGetBindForAxis(controller, (SDL_GameControllerAxis)index); return bind; }
void GameController::readJoystickConfig(QXmlStreamReader *xml) { if (xml->isStartElement() && xml->name() == "joystick") { //reset(); transferReset(); QHash<unsigned int, SDL_GameControllerButton> buttons; QHash<unsigned int, SDL_GameControllerAxis> axes; QList<SDL_GameControllerButtonBind> hatButtons; for (int i=(int)SDL_CONTROLLER_BUTTON_A; i < (int)SDL_CONTROLLER_BUTTON_MAX; i++) { SDL_GameControllerButton currentButton = (SDL_GameControllerButton)i; SDL_GameControllerButtonBind bound = SDL_GameControllerGetBindForButton(this->controller, currentButton); if (bound.bindType == SDL_CONTROLLER_BINDTYPE_BUTTON) { buttons.insert(bound.value.button, currentButton); } else if (bound.bindType == SDL_CONTROLLER_BINDTYPE_HAT) { hatButtons.append(bound); } } for (int i=(int)SDL_CONTROLLER_AXIS_LEFTX; i < (int)SDL_CONTROLLER_AXIS_MAX; i++) { SDL_GameControllerAxis currentAxis = (SDL_GameControllerAxis)i; SDL_GameControllerButtonBind bound = SDL_GameControllerGetBindForAxis(this->controller, currentAxis); if (bound.bindType == SDL_CONTROLLER_BINDTYPE_AXIS) { axes.insert(bound.value.axis, currentAxis); } } xml->readNextStartElement(); while (!xml->atEnd() && (!xml->isEndElement() && xml->name() != "joystick")) { 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()) { GameControllerSet *currentSet = static_cast<GameControllerSet*>(joystick_sets.value(index)); currentSet->readJoystickConfig(xml, buttons, axes, hatButtons); } } else { // If none of the above, skip the element xml->skipCurrentElement(); } xml->readNextStartElement(); } } else if (xml->name() == "names" && xml->isStartElement()) { bool dpadNameExists = false; bool vdpadNameExists = false; 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()) { SDL_GameControllerButton current = buttons.value(index); if (current) { setButtonName(current, 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()) { SDL_GameControllerAxis current = axes.value(index); if (current) { if (current == SDL_CONTROLLER_AXIS_LEFTX) { setStickButtonName(0, buttonIndex, temp); } else if (current == SDL_CONTROLLER_AXIS_LEFTY) { setStickButtonName(0, buttonIndex, temp); } else if (current == SDL_CONTROLLER_AXIS_RIGHTX) { setStickButtonName(1, buttonIndex, temp); } else if (current == SDL_CONTROLLER_AXIS_RIGHTY) { setStickButtonName(1, buttonIndex, temp); } else if (current == SDL_CONTROLLER_AXIS_TRIGGERLEFT) { setAxisName(current, temp); } else if (current == SDL_CONTROLLER_AXIS_TRIGGERRIGHT) { setAxisName(current, 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()) { bool found = false; QListIterator<SDL_GameControllerButtonBind> iter(hatButtons); SDL_GameControllerButtonBind current; while (iter.hasNext()) { current = iter.next(); if (current.value.hat.hat == index) { found = true; iter.toBack(); } } if (found) { VDPad *dpad = getActiveSetJoystick()->getVDPad(0); if (dpad) { JoyDPadButton *dpadbutton = dpad->getJoyButton(buttonIndex); if (dpad && dpadbutton->getActionName().isEmpty()) { setVDPadButtonName(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()) { bool found = false; QListIterator<SDL_GameControllerButtonBind> iter(hatButtons); SDL_GameControllerButtonBind current; while (iter.hasNext()) { current = iter.next(); if (current.value.hat.hat == index) { found = true; iter.toBack(); } } if (found) { VDPad *dpad = getActiveSetJoystick()->getVDPad(0); if (dpad) { JoyDPadButton *dpadbutton = dpad->getJoyButton(buttonIndex); if (dpad && dpadbutton->getActionName().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()) { if (axes.contains(index)) { SDL_GameControllerAxis current = axes.value(index); setAxisName((int)current, 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() && !vdpadNameExists) { bool found = false; QListIterator<SDL_GameControllerButtonBind> iter(hatButtons); SDL_GameControllerButtonBind current; while (iter.hasNext()) { current = iter.next(); if (current.value.hat.hat == index) { found = true; iter.toBack(); } } if (found) { dpadNameExists = true; VDPad *dpad = getActiveSetJoystick()->getVDPad(0); if (dpad) { if (dpad->getDpadName().isEmpty()) { setVDPadName(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() && !dpadNameExists) { bool found = false; QListIterator<SDL_GameControllerButtonBind> iter(hatButtons); SDL_GameControllerButtonBind current; while (iter.hasNext()) { current = iter.next(); if (current.value.hat.hat == index) { found = true; iter.toBack(); } } if (found) { vdpadNameExists = true; VDPad *dpad = getActiveSetJoystick()->getVDPad(0); if (dpad) { if (dpad->getDpadName().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->setDeviceKeyPressTime(tempchoice); } } else if (xml->name() == "profilename" && xml->isStartElement()) { QString temptext = xml->readElementText(); this->setProfileName(temptext); } else { // If none of the above, skip the element xml->skipCurrentElement(); } xml->readNextStartElement(); } reInitButtons(); } }