From da084fb184fcae15b89ca464e3a0380bced55d37 Mon Sep 17 00:00:00 2001 From: mjbudd77 Date: Mon, 2 Aug 2021 21:02:02 -0400 Subject: [PATCH] For Qt GUI, added option to have up to 3 alternate gamepad button bindings in addition to the primary mapping. --- src/drivers/Qt/GamePadConf.cpp | 56 +++++-- src/drivers/Qt/GamePadConf.h | 4 + src/drivers/Qt/input.cpp | 107 +++++++------ src/drivers/Qt/sdl-joystick.cpp | 256 +++++++++++--------------------- src/drivers/Qt/sdl-joystick.h | 15 +- 5 files changed, 205 insertions(+), 233 deletions(-) diff --git a/src/drivers/Qt/GamePadConf.cpp b/src/drivers/Qt/GamePadConf.cpp index 917a4785..a7cf19d7 100644 --- a/src/drivers/Qt/GamePadConf.cpp +++ b/src/drivers/Qt/GamePadConf.cpp @@ -137,6 +137,7 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent) mainWidget = new QWidget(); portNum = 0; + configIndex = 0; buttonConfigStatus = 1; inputTimer = new QTimer(this); @@ -295,9 +296,24 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent) g_config->getOption("SDL.Input.EnableOppositeDirectionals", &opposite_dirs); udlr_chkbox->setChecked(opposite_dirs); + confTabBar = new QTabBar(); frame2 = new QGroupBox(tr("Current Active Button Mappings:")); grid = new QGridLayout(); + confTabBar->addTab( tr("Pri") ); + confTabBar->addTab( tr("Alt 1") ); + confTabBar->addTab( tr("Alt 2") ); + confTabBar->addTab( tr("Alt 3") ); + + confTabBar->setTabToolTip( 0, tr("Primary Button Map") ); + confTabBar->setTabToolTip( 1, tr("Alternate Button Map #1") ); + confTabBar->setTabToolTip( 2, tr("Alternate Button Map #2") ); + confTabBar->setTabToolTip( 3, tr("Alternate Button Map #3") ); + + confTabBar->setCurrentIndex(0); + + connect( confTabBar, SIGNAL(currentChanged(int)), this, SLOT(btnConfigChanged(int)) ); + //grid-> setHorizontalSpacing(10); frame2->setLayout(grid); @@ -391,6 +407,7 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent) vbox1->addWidget(frame1); vbox1->addLayout(hbox2); + vbox2->addWidget(confTabBar); vbox2->addWidget(frame2); vbox2->addLayout(hbox1); @@ -705,14 +722,14 @@ void GamePadConfDialog_t::updateCntrlrDpy(void) for (int i = 0; i < GAMEPAD_NUM_BUTTONS; i++) { - if (GamePad[portNum].bmap[i].ButtType == BUTTC_KEYBOARD) + if (GamePad[portNum].bmap[configIndex][i].ButtType == BUTTC_KEYBOARD) { snprintf(keyNameStr, sizeof(keyNameStr), "%s", - SDL_GetKeyName(GamePad[portNum].bmap[i].ButtonNum)); + SDL_GetKeyName(GamePad[portNum].bmap[configIndex][i].ButtonNum)); } else { - strcpy(keyNameStr, ButtonName(&GamePad[portNum].bmap[i])); + strcpy(keyNameStr, ButtonName(&GamePad[portNum].bmap[configIndex][i])); } keyName[i]->setText(tr(keyNameStr)); @@ -819,14 +836,14 @@ void GamePadConfDialog_t::changeButton(int padNo, int x) button[x]->setText("Waiting"); button[x]->setStyleSheet("background-color: green; color: white;"); - DWaitButton(NULL, &GamePad[padNo].bmap[x], &buttonConfigStatus); + DWaitButton(NULL, &GamePad[padNo].bmap[configIndex][x], &buttonConfigStatus); button[x]->setText("Change"); button[x]->setStyleSheet(NULL); if (buttonConfigStatus != 0) { - keyNameStr = ButtonName(&GamePad[padNo].bmap[x]); + keyNameStr = ButtonName(&GamePad[padNo].bmap[configIndex][x]); keyName[x]->setText( tr(keyNameStr) ); lcl[padNo].btn[x].needsSave = 1; } @@ -838,7 +855,7 @@ void GamePadConfDialog_t::changeButton(int padNo, int x) //---------------------------------------------------- void GamePadConfDialog_t::clearButton(int padNo, int x) { - GamePad[padNo].bmap[x].ButtonNum = -1; + GamePad[padNo].bmap[configIndex][x].ButtonNum = -1; //keyName[x]->setText( tr("") ); keyName[x]->clear(); @@ -996,6 +1013,13 @@ void GamePadConfDialog_t::clearAllCallback(void) } } //---------------------------------------------------- +void GamePadConfDialog_t::btnConfigChanged(int idx) +{ + configIndex = idx; + + updateCntrlrDpy(); +} +//---------------------------------------------------- void GamePadConfDialog_t::saveConfig(void) { int i; @@ -1592,7 +1616,7 @@ void GamePadView_t::paintEvent(QPaintEvent *event) painter.fillRect(cBtn, black); - if (GamePad[portNum].bmap[4].state) + if (GamePad[portNum].bmapState[4]) { painter.fillRect(upBtn, green); } @@ -1601,7 +1625,7 @@ void GamePadView_t::paintEvent(QPaintEvent *event) painter.fillRect(upBtn, black); } - if (GamePad[portNum].bmap[5].state) + if (GamePad[portNum].bmapState[5]) { painter.fillRect(dnBtn, green); } @@ -1610,7 +1634,7 @@ void GamePadView_t::paintEvent(QPaintEvent *event) painter.fillRect(dnBtn, black); } - if (GamePad[portNum].bmap[6].state) + if (GamePad[portNum].bmapState[6]) { painter.fillRect(lBtn, green); } @@ -1619,7 +1643,7 @@ void GamePadView_t::paintEvent(QPaintEvent *event) painter.fillRect(lBtn, black); } - if (GamePad[portNum].bmap[7].state) + if (GamePad[portNum].bmapState[7]) { painter.fillRect(rBtn, green); } @@ -1637,7 +1661,7 @@ void GamePadView_t::paintEvent(QPaintEvent *event) selBtn.setRect(x + (bw / 3), y, bw, bh); stBtn.setRect(x + (5 * bw) / 3, y, bw, bh); - if (GamePad[portNum].bmap[2].state) + if (GamePad[portNum].bmapState[2]) { painter.fillRect(selBtn, green); } @@ -1646,7 +1670,7 @@ void GamePadView_t::paintEvent(QPaintEvent *event) painter.fillRect(selBtn, gray); } - if (GamePad[portNum].bmap[3].state) + if (GamePad[portNum].bmapState[3]) { painter.fillRect(stBtn, green); } @@ -1689,7 +1713,7 @@ void GamePadView_t::paintEvent(QPaintEvent *event) bBtn.setRect(x + ws, y, bw, bh); aBtn.setRect(x + bw + (2 * ws), y, bw, bh); - if (GamePad[portNum].bmap[9].state) + if (GamePad[portNum].bmapState[9]) { painter.setBrush(Qt::green); } @@ -1701,7 +1725,7 @@ void GamePadView_t::paintEvent(QPaintEvent *event) painter.drawEllipse(tbBtn); drawLetterOnButton(painter, tbBtn, black, 'B'); - if (GamePad[portNum].bmap[8].state) + if (GamePad[portNum].bmapState[8]) { painter.setBrush(Qt::green); } @@ -1713,7 +1737,7 @@ void GamePadView_t::paintEvent(QPaintEvent *event) painter.drawEllipse(taBtn); drawLetterOnButton(painter, taBtn, black, 'A'); - if (GamePad[portNum].bmap[1].state) + if (GamePad[portNum].bmapState[1]) { painter.setBrush(Qt::green); } @@ -1725,7 +1749,7 @@ void GamePadView_t::paintEvent(QPaintEvent *event) painter.drawEllipse(bBtn); drawLetterOnButton(painter, bBtn, black, 'B'); - if (GamePad[portNum].bmap[0].state) + if (GamePad[portNum].bmapState[0]) { painter.setBrush(Qt::green); } diff --git a/src/drivers/Qt/GamePadConf.h b/src/drivers/Qt/GamePadConf.h index 2f1011ec..19ca1409 100644 --- a/src/drivers/Qt/GamePadConf.h +++ b/src/drivers/Qt/GamePadConf.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -178,6 +179,7 @@ protected: QLabel *keyState[GAMEPAD_NUM_BUTTONS]; GamePadConfigButton_t *button[GAMEPAD_NUM_BUTTONS]; GamePadView_t *gpView; + QTabBar *confTabBar; QPushButton *newKeyBindBtn; QPushButton *editKeyBindBtn; @@ -185,6 +187,7 @@ protected: QTreeWidget *keyBindTree; int portNum; + int configIndex; int buttonConfigStatus; int changeSeqStatus; // status of sequentally changing buttons mechanism // 0 - we can start new change process @@ -231,6 +234,7 @@ private slots: void clearButton8(void); void clearButton9(void); void clearAllCallback(void); + void btnConfigChanged(int index); void ena4score(int state); void oppDirEna(int state); void portSelect(int index); diff --git a/src/drivers/Qt/input.cpp b/src/drivers/Qt/input.cpp index 1bf1c543..59c89f78 100644 --- a/src/drivers/Qt/input.cpp +++ b/src/drivers/Qt/input.cpp @@ -1412,9 +1412,10 @@ UpdateGamepad(void) } uint32 JS = 0; - int x; + int x,c; int wg; bool fire; + char btns[GAMEPAD_NUM_BUTTONS]; int opposite_dirs; g_config->getOption("SDL.Input.EnableOppositeDirectionals", &opposite_dirs); @@ -1424,59 +1425,71 @@ UpdateGamepad(void) { bool left = false; bool up = false; - // a, b, select, start, up, down, left, right - for (x = 0; x < 8; x++) + memset( btns, 0, sizeof(btns) ); + + for (c = 0; c < GamePad_t::NUM_CONFIG; c++) { - if (DTestButton(&GamePad[wg].bmap[x])) + // a, b, select, start, up, down, left, right + for (x = 0; x < 8; x++) { - //printf("GamePad%i Button Hit: %i \n", wg, x ); - if (opposite_dirs == 0) + if (DTestButton(&GamePad[wg].bmap[c][x])) { - // test for left+right and up+down - if (x == 4) + btns[x] = 1; + //printf("GamePad%i Button Hit: %i \n", wg, x ); + if (opposite_dirs == 0) { - up = true; + // test for left+right and up+down + if (x == 4) + { + up = true; + } + if ((x == 5) && (up == true)) + { + continue; + } + if (x == 6) + { + left = true; + } + if ((x == 7) && (left == true)) + { + continue; + } } - if ((x == 5) && (up == true)) - { - continue; - } - if (x == 6) - { - left = true; - } - if ((x == 7) && (left == true)) - { - continue; - } - } - JS |= (1 << x) << (wg << 3); - } - } - - int four_button_exit; - g_config->getOption("SDL.ABStartSelectExit", &four_button_exit); - // if a+b+start+select is pressed, exit - if (four_button_exit && JS == 15) - { - FCEUI_printf("all buttons pressed, exiting\n"); - CloseGame(); - FCEUI_Kill(); - exit(0); - } - - // rapid-fire a, rapid-fire b - for (x = 0; x < 2; x++) - { - if (DTestButton(&GamePad[wg].bmap[8 + x])) - { - fire = GetAutoFireState(x); - - if (fire) - { JS |= (1 << x) << (wg << 3); } } + + int four_button_exit; + g_config->getOption("SDL.ABStartSelectExit", &four_button_exit); + // if a+b+start+select is pressed, exit + if (four_button_exit && JS == 15) + { + FCEUI_printf("all buttons pressed, exiting\n"); + CloseGame(); + FCEUI_Kill(); + exit(0); + } + + // rapid-fire a, rapid-fire b + for (x = 0; x < 2; x++) + { + if (DTestButton(&GamePad[wg].bmap[c][8 + x])) + { + fire = GetAutoFireState(x); + + if (fire) + { + JS |= (1 << x) << (wg << 3); + } + btns[8+x] = 1; + } + } + } + + for (x = 0; x < GAMEPAD_NUM_BUTTONS; x++) + { + GamePad[wg].bmapState[x] = btns[x]; } } @@ -2768,7 +2781,7 @@ void UpdateInput(Config *config) // Definitions from main.h: // GamePad defaults const char *GamePadNames[GAMEPAD_NUM_BUTTONS] = {"A", "B", "Select", "Start", - "Up", "Down", "Left", "Right", "TurboA", "TurboB"}; + "Up", "Down", "Left", "Right", "TurboA", "TurboB"}; const char *DefaultGamePadDevice[GAMEPAD_NUM_DEVICES] = {"Keyboard", "None", "None", "None"}; const int DefaultGamePad[GAMEPAD_NUM_DEVICES][GAMEPAD_NUM_BUTTONS] = diff --git a/src/drivers/Qt/sdl-joystick.cpp b/src/drivers/Qt/sdl-joystick.cpp index b1f5aece..5bfd68f8 100644 --- a/src/drivers/Qt/sdl-joystick.cpp +++ b/src/drivers/Qt/sdl-joystick.cpp @@ -236,23 +236,28 @@ void nesGamePadMap_t::clearMapping(void) guid[0] = 0; name[0] = 0; os[0] = 0; - for (int i = 0; i < GAMEPAD_NUM_BUTTONS; i++) + + for (int c = 0; c < 4; c++) { - btn[i][0] = 0; + for (int i = 0; i < GAMEPAD_NUM_BUTTONS; i++) + { + conf[c].btn[i][0] = 0; + } } } //******************************************************************************** int nesGamePadMap_t::parseMapping(const char *map) { - int i, j, k, bIdx; + int i, j, k, c, bIdx; char id[32][64]; char val[32][64]; - clearMapping(); + //clearMapping(); i = 0; j = 0; k = 0; + c = 0; while (map[i]) { @@ -304,7 +309,11 @@ int nesGamePadMap_t::parseMapping(const char *map) //printf(" '%s' = '%s' %i \n", id[i], val[i], bIdx ); if (bIdx >= 0) { - strcpy(btn[bIdx], val[i]); + strcpy( conf[c].btn[bIdx], val[i]); + } + else if (strcmp(id[i], "config") == 0) + { + c = atoi(val[i]); } else if (strcmp(id[i], "platform") == 0) { @@ -319,12 +328,15 @@ GamePad_t::GamePad_t(void) devIdx = -1; portNum = 0; - for (int i = 0; i < GAMEPAD_NUM_BUTTONS; i++) + for (int c = 0; c < NUM_CONFIG; c++) { - bmap[i].ButtType = BUTTC_KEYBOARD; - bmap[i].DeviceNum = -1; - bmap[i].ButtonNum = -1; - bmap[i].state = 0; + for (int i = 0; i < GAMEPAD_NUM_BUTTONS; i++) + { + bmap[c][i].ButtType = BUTTC_KEYBOARD; + bmap[c][i].DeviceNum = -1; + bmap[c][i].ButtonNum = -1; + bmap[c][i].state = 0; + } } } //******************************************************************************** @@ -548,95 +560,20 @@ int GamePad_t::convText2ButtConfig( const char *txt, ButtConfig *bmap ) //******************************************************************************** int GamePad_t::setMapping(nesGamePadMap_t *gpm) { - for (int i = 0; i < GAMEPAD_NUM_BUTTONS; i++) + for (int c = 0; c < NUM_CONFIG; c++) { - bmap[i].ButtType = BUTTC_KEYBOARD; - bmap[i].DeviceNum = -1; - bmap[i].ButtonNum = -1; - - if (gpm->btn[i][0] == 0) + for (int i = 0; i < GAMEPAD_NUM_BUTTONS; i++) { - continue; + bmap[c][i].ButtType = BUTTC_KEYBOARD; + bmap[c][i].DeviceNum = -1; + bmap[c][i].ButtonNum = -1; + + if (gpm->conf[c].btn[i][0] == 0) + { + continue; + } + convText2ButtConfig( gpm->conf[c].btn[i], &bmap[c][i] ); } - convText2ButtConfig( gpm->btn[i], &bmap[i] ); - - //if (gpm->btn[i][0] == 'k') - //{ - // SDL_Keycode key; - - // bmap[i].ButtType = BUTTC_KEYBOARD; - // bmap[i].DeviceNum = -1; - - // key = SDL_GetKeyFromName(&gpm->btn[i][1]); - - // if (key != SDLK_UNKNOWN) - // { - // bmap[i].ButtonNum = key; - // } - // else - // { - // bmap[i].ButtonNum = -1; - // } - //} - //else if ((gpm->btn[i][0] == 'b') && isdigit(gpm->btn[i][1])) - //{ - // bmap[i].ButtType = BUTTC_JOYSTICK; - // bmap[i].DeviceNum = devIdx; - // bmap[i].ButtonNum = atoi(&gpm->btn[i][1]); - //} - //else if ((gpm->btn[i][0] == 'h') && isdigit(gpm->btn[i][1]) && - // (gpm->btn[i][2] == '.') && isdigit(gpm->btn[i][3])) - //{ - // int hatIdx, hatVal; - - // hatIdx = gpm->btn[i][1] - '0'; - // hatVal = atoi(&gpm->btn[i][3]); - - // bmap[i].ButtType = BUTTC_JOYSTICK; - // bmap[i].DeviceNum = devIdx; - // bmap[i].ButtonNum = 0x2000 | ((hatIdx & 0x1F) << 8) | (hatVal & 0xFF); - //} - //else if ((gpm->btn[i][0] == 'a') || (gpm->btn[i][1] == 'a')) - //{ - // int l = 0, axisIdx = 0, axisSign = 0; - - // l = 0; - // if (gpm->btn[i][l] == '-') - // { - // axisSign = 1; - // l++; - // } - // else if (gpm->btn[i][l] == '+') - // { - // axisSign = 0; - // l++; - // } - - // if (gpm->btn[i][l] == 'a') - // { - // l++; - // } - // if (isdigit(gpm->btn[i][l])) - // { - // axisIdx = atoi(&gpm->btn[i][l]); - - // while (isdigit(gpm->btn[i][l])) - // l++; - // } - // if (gpm->btn[i][l] == '-') - // { - // axisSign = 1; - // l++; - // } - // else if (gpm->btn[i][l] == '+') - // { - // axisSign = 0; - // l++; - // } - // bmap[i].ButtType = BUTTC_JOYSTICK; - // bmap[i].DeviceNum = devIdx; - // bmap[i].ButtonNum = 0x8000 | (axisSign ? 0x4000 : 0) | (axisIdx & 0xFF); - //} } return 0; } @@ -651,14 +588,12 @@ int GamePad_t::setMapping(const char *map) return 0; } //******************************************************************************** -int GamePad_t::getMapFromFile(const char *filename, char *out) +int GamePad_t::getMapFromFile(const char *filename, nesGamePadMap_t *gpm) { - int i = 0, j = 0; + int i = 0; FILE *fp; char line[256]; - out[0] = 0; - fp = ::fopen(filename, "r"); if (fp == NULL) @@ -682,27 +617,15 @@ int GamePad_t::getMapFromFile(const char *filename, char *out) continue; // need at least 32 chars for a valid line entry i = 0; - j = 0; while (isspace(line[i])) i++; - while (line[i] != 0) - { - out[j] = line[i]; - i++; - j++; - } - out[j] = 0; - - if (j < 34) - continue; - - break; + gpm->parseMapping( &line[i] ); } ::fclose(fp); - return (j < 34); + return 0; } //******************************************************************************** int GamePad_t::deleteHotKeyMappings(void) @@ -842,13 +765,11 @@ int GamePad_t::loadHotkeyMapFromFile(const char *filename) return 0; } //******************************************************************************** -int GamePad_t::getDefaultMap(char *out, const char *guid) +int GamePad_t::getDefaultMap(const char *guid) { - char txtMap[256]; const char *baseDir = FCEUI_GetBaseDirectory(); std::string path; - - out[0] = 0; + nesGamePadMap_t gpm; if (devIdx < 0) { @@ -868,10 +789,10 @@ int GamePad_t::getDefaultMap(char *out, const char *guid) path = std::string(baseDir) + "/input/" + std::string(guid) + "/default.txt"; - if (getMapFromFile(path.c_str(), txtMap) == 0) + if (getMapFromFile(path.c_str(), &gpm) == 0) { - printf("Using Mapping From File: %s\n", path.c_str()); - strcpy(out, txtMap); + //printf("Using Mapping From File: %s\n", path.c_str()); + setMapping(&gpm); loadHotkeyMapFromFile( path.c_str() ); return 0; } @@ -887,7 +808,9 @@ int GamePad_t::getDefaultMap(char *out, const char *guid) if (sdlMapping == NULL) return -1; - strcpy(out, sdlMapping); + gpm.parseMapping(sdlMapping); + + setMapping(&gpm); SDL_free(sdlMapping); @@ -900,9 +823,9 @@ int GamePad_t::getDefaultMap(char *out, const char *guid) { for (int x = 0; x < GAMEPAD_NUM_BUTTONS; x++) { - bmap[x].ButtType = BUTTC_KEYBOARD; - bmap[x].DeviceNum = 0; - bmap[x].ButtonNum = DefaultGamePad[portNum][x]; + bmap[0][x].ButtType = BUTTC_KEYBOARD; + bmap[0][x].DeviceNum = 0; + bmap[0][x].ButtonNum = DefaultGamePad[portNum][x]; } } } @@ -911,20 +834,14 @@ int GamePad_t::getDefaultMap(char *out, const char *guid) //******************************************************************************** int GamePad_t::loadDefaults(void) { - char txtMap[256]; - - if (getDefaultMap(txtMap) == 0) - { - //printf("Map:%s\n", txtMap ); - setMapping(txtMap); - } + getDefaultMap(); return 0; } //******************************************************************************** int GamePad_t::loadProfile(const char *name, const char *guid) { - char txtMap[256]; + nesGamePadMap_t gpm; const char *baseDir = FCEUI_GetBaseDirectory(); std::string path; @@ -949,9 +866,9 @@ int GamePad_t::loadProfile(const char *name, const char *guid) //printf("Using File: %s\n", path.c_str() ); - if (getMapFromFile(path.c_str(), txtMap) == 0) + if (getMapFromFile(path.c_str(), &gpm) == 0) { - setMapping(txtMap); + setMapping( &gpm ); loadHotkeyMapFromFile( path.c_str() ); return 0; } @@ -961,7 +878,7 @@ int GamePad_t::loadProfile(const char *name, const char *guid) //******************************************************************************** int GamePad_t::saveCurrentMapToFile(const char *name) { - int i; + int i,c; char stmp[256]; const char *guid = NULL; const char *baseDir = FCEUI_GetBaseDirectory(); @@ -988,50 +905,57 @@ int GamePad_t::saveCurrentMapToFile(const char *name) path += "/" + std::string(name) + ".txt"; - output.assign(guid); - output.append(","); - output.append(name); - output.append(","); - - for (i = 0; i < GAMEPAD_NUM_BUTTONS; i++) + for (c = 0; c < NUM_CONFIG; c++) { - if (bmap[i].ButtType == BUTTC_KEYBOARD) + output.append(guid); + output.append(","); + output.append(name); + output.append(","); + output.append("config:"); + sprintf( stmp, "%i,", c ); + output.append(stmp); + + for (i = 0; i < GAMEPAD_NUM_BUTTONS; i++) { - sprintf(stmp, "k%s", SDL_GetKeyName(bmap[i].ButtonNum)); - } - else - { - if (bmap[i].ButtonNum & 0x2000) + if (bmap[c][i].ButtType == BUTTC_KEYBOARD) { - /* Hat "button" */ - sprintf(stmp, "h%i.%i", - (bmap[i].ButtonNum >> 8) & 0x1F, bmap[i].ButtonNum & 0xFF); - } - else if (bmap[i].ButtonNum & 0x8000) - { - /* Axis "button" */ - sprintf(stmp, "%ca%i", - (bmap[i].ButtonNum & 0x4000) ? '-' : '+', bmap[i].ButtonNum & 0x3FFF); + sprintf(stmp, "k%s", SDL_GetKeyName(bmap[c][i].ButtonNum)); } else { - /* Button */ - sprintf(stmp, "b%i", bmap[i].ButtonNum); + if (bmap[c][i].ButtonNum & 0x2000) + { + /* Hat "button" */ + sprintf(stmp, "h%i.%i", + (bmap[c][i].ButtonNum >> 8) & 0x1F, bmap[c][i].ButtonNum & 0xFF); + } + else if (bmap[c][i].ButtonNum & 0x8000) + { + /* Axis "button" */ + sprintf(stmp, "%ca%i", + (bmap[c][i].ButtonNum & 0x4000) ? '-' : '+', bmap[c][i].ButtonNum & 0x3FFF); + } + else + { + /* Button */ + sprintf(stmp, "b%i", bmap[c][i].ButtonNum); + } } + output.append(buttonNames[i]); + output.append(":"); + output.append(stmp); + output.append(","); } - output.append(buttonNames[i]); - output.append(":"); - output.append(stmp); - output.append(","); + output.append("\n"); } for (it=gpKeySeqList.begin(); it!=gpKeySeqList.end(); it++) { gamepad_function_key_t *fk = *it; - printf("hk[0]=%i hk[1]=%i keySeq[0]=%s keySeq[1]=%s bmap[0].buttType=%i bmap[1].buttType=%i\n", - fk->hk[0], fk->hk[1], fk->keySeq[0].name.c_str(), fk->keySeq[1].name.c_str(), - fk->bmap[0].ButtType, fk->bmap[1].ButtType ); + //printf("hk[0]=%i hk[1]=%i keySeq[0]=%s keySeq[1]=%s bmap[0].buttType=%i bmap[1].buttType=%i\n", + // fk->hk[0], fk->hk[1], fk->keySeq[0].name.c_str(), fk->keySeq[1].name.c_str(), + // fk->bmap[0].ButtType, fk->bmap[1].ButtType ); if ( fk->bmap[1].ButtType >= 0 ) { diff --git a/src/drivers/Qt/sdl-joystick.h b/src/drivers/Qt/sdl-joystick.h index 8ba3a12d..e2f9b54c 100644 --- a/src/drivers/Qt/sdl-joystick.h +++ b/src/drivers/Qt/sdl-joystick.h @@ -15,9 +15,12 @@ struct nesGamePadMap_t { char guid[64]; char name[128]; - char btn[GAMEPAD_NUM_BUTTONS][32]; char os[64]; + struct { + char btn[GAMEPAD_NUM_BUTTONS][32]; + } conf[4]; + nesGamePadMap_t(void); ~nesGamePadMap_t(void); @@ -55,7 +58,11 @@ private: class GamePad_t { public: - ButtConfig bmap[GAMEPAD_NUM_BUTTONS]; + static const int NUM_CONFIG = 4; + + ButtConfig bmap[NUM_CONFIG][GAMEPAD_NUM_BUTTONS]; + + char bmapState[GAMEPAD_NUM_BUTTONS]; GamePad_t(void); ~GamePad_t(void); @@ -72,8 +79,8 @@ public: int setMapping(nesGamePadMap_t *map); int createProfile(const char *name); - int getMapFromFile(const char *filename, char *out); - int getDefaultMap(char *out, const char *guid = NULL); + int getMapFromFile(const char *filename, nesGamePadMap_t *gpm); + int getDefaultMap(const char *guid = NULL); int saveMappingToFile(const char *filename, const char *txtMap); int saveCurrentMapToFile(const char *filename); int deleteMapping(const char *name);