From 59462545cab578014160efa6e1bab78ba20c8830 Mon Sep 17 00:00:00 2001 From: Matthew Budd Date: Sat, 27 Jun 2020 21:08:02 -0400 Subject: [PATCH] Gui controller calibration fixes and enhancements. --- src/drivers/Qt/GamePadConf.cpp | 173 +++++++++++++++++++++++++++++--- src/drivers/Qt/GamePadConf.h | 19 +++- src/drivers/Qt/input.cpp | 17 ++-- src/drivers/Qt/input.h | 19 ++-- src/drivers/Qt/sdl-joystick.cpp | 8 +- 5 files changed, 203 insertions(+), 33 deletions(-) diff --git a/src/drivers/Qt/GamePadConf.cpp b/src/drivers/Qt/GamePadConf.cpp index 102a006d..37f02f5f 100644 --- a/src/drivers/Qt/GamePadConf.cpp +++ b/src/drivers/Qt/GamePadConf.cpp @@ -11,11 +11,14 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent) : QDialog( parent ) { - QHBoxLayout *hbox1; + QHBoxLayout *hbox1, *hbox2; QGridLayout *grid; QCheckBox *efs_chkbox, *udlr_chkbox; QGroupBox *frame; + QPushButton *loadDefaultButton; + QPushButton *clearAllButton; QPushButton *closebutton; + QPushButton *clearButton[GAMEPAD_NUM_BUTTONS]; portNum = 0; configNo = 0; @@ -24,6 +27,7 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent) setWindowTitle("GamePad Config"); hbox1 = new QHBoxLayout(); + hbox2 = new QHBoxLayout(); QLabel *label = new QLabel(tr("Port:")); portSel = new QComboBox(); @@ -54,7 +58,7 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent) //frame->setFrameStyle( QFrame::Box ); frame->setLayout( grid ); - for (int i=0; i<10; i++) + for (int i=0; isetAlignment(Qt::AlignCenter); - buttonName = new QLabel(tr(text)); - keyName[i] = new QLabel(); - button[i] = new GamePadConfigButton_t(i); + buttonName = new QLabel(tr(text)); + keyName[i] = new QLabel(); + button[i] = new GamePadConfigButton_t(i); + clearButton[i] = new QPushButton("Clear"); - grid->addWidget( buttonName, i, 0, Qt::AlignCenter ); - grid->addWidget( keyName[i], i, 1, Qt::AlignCenter ); - grid->addWidget( button[i] , i, 2, Qt::AlignCenter ); + grid->addWidget( buttonName , i, 0, Qt::AlignCenter ); + grid->addWidget( keyName[i] , i, 1, Qt::AlignCenter ); + grid->addWidget( button[i] , i, 2, Qt::AlignCenter ); + grid->addWidget( clearButton[i], i, 3, Qt::AlignCenter ); } updateCntrlrDpy(); - closebutton = new QPushButton(tr("Close")); + loadDefaultButton = new QPushButton(tr("Load Defaults")); + clearAllButton = new QPushButton(tr("Clear All")); + closebutton = new QPushButton(tr("Close")); + + hbox2->addWidget( loadDefaultButton ); + hbox2->addWidget( clearAllButton ); + hbox2->addWidget( closebutton ); connect(button[0], SIGNAL(clicked()), this, SLOT(changeButton0(void)) ); connect(button[1], SIGNAL(clicked()), this, SLOT(changeButton1(void)) ); @@ -87,7 +99,21 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent) connect(button[7], SIGNAL(clicked()), this, SLOT(changeButton7(void)) ); connect(button[8], SIGNAL(clicked()), this, SLOT(changeButton8(void)) ); connect(button[9], SIGNAL(clicked()), this, SLOT(changeButton9(void)) ); - connect(closebutton, SIGNAL(clicked()), this, SLOT(closeWindow(void)) ); + + connect(clearButton[0], SIGNAL(clicked()), this, SLOT(clearButton0(void)) ); + connect(clearButton[1], SIGNAL(clicked()), this, SLOT(clearButton1(void)) ); + connect(clearButton[2], SIGNAL(clicked()), this, SLOT(clearButton2(void)) ); + connect(clearButton[3], SIGNAL(clicked()), this, SLOT(clearButton3(void)) ); + connect(clearButton[4], SIGNAL(clicked()), this, SLOT(clearButton4(void)) ); + connect(clearButton[5], SIGNAL(clicked()), this, SLOT(clearButton5(void)) ); + connect(clearButton[6], SIGNAL(clicked()), this, SLOT(clearButton6(void)) ); + connect(clearButton[7], SIGNAL(clicked()), this, SLOT(clearButton7(void)) ); + connect(clearButton[8], SIGNAL(clicked()), this, SLOT(clearButton8(void)) ); + connect(clearButton[9], SIGNAL(clicked()), this, SLOT(clearButton9(void)) ); + + connect(loadDefaultButton, SIGNAL(clicked()), this, SLOT(loadDefaults(void)) ); + connect(clearAllButton , SIGNAL(clicked()), this, SLOT(clearAllCallback(void)) ); + connect(closebutton , SIGNAL(clicked()), this, SLOT(closeWindow(void)) ); connect(portSel , SIGNAL(activated(int)), this, SLOT(controllerSelect(int)) ); connect(efs_chkbox , SIGNAL(stateChanged(int)), this, SLOT(ena4score(int)) ); @@ -99,7 +125,7 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent) mainLayout->addWidget( efs_chkbox ); mainLayout->addWidget( udlr_chkbox ); mainLayout->addWidget( frame ); - mainLayout->addWidget( closebutton, Qt::AlignRight ); + mainLayout->addLayout( hbox2 ); setLayout( mainLayout ); @@ -126,7 +152,7 @@ void GamePadConfDialog_t::updateCntrlrDpy(void) { char keyNameStr[128]; - for (int i=0; i<10; i++) + for (int i=0; isetOption (prefix + GamePadNames[x], GamePadConfig[padNo][x].ButtonNum[configNo]); - if (GamePadConfig[padNo][x].ButtType[0] == BUTTC_KEYBOARD) + if (GamePadConfig[padNo][x].ButtType[configNo] == BUTTC_KEYBOARD) { g_config->setOption (prefix + "DeviceType", "Keyboard"); } - else if (GamePadConfig[padNo][x].ButtType[0] == BUTTC_JOYSTICK) + else if (GamePadConfig[padNo][x].ButtType[configNo] == BUTTC_JOYSTICK) { g_config->setOption (prefix + "DeviceType", "Joystick"); } @@ -211,6 +237,23 @@ void GamePadConfDialog_t::changeButton(int padNo, int x) buttonConfigStatus = 1; } //---------------------------------------------------- +void GamePadConfDialog_t::clearButton( int padNo, int x ) +{ + char buf[256]; + std::string prefix; + + GamePadConfig[padNo][x].ButtonNum[configNo] = -1; + + keyName[x]->setText(""); + + snprintf (buf, sizeof(buf)-1, "SDL.Input.GamePad.%d.", padNo); + prefix = buf; + + g_config->setOption (prefix + GamePadNames[x], + GamePadConfig[padNo][x].ButtonNum[configNo]); + +} +//---------------------------------------------------- void GamePadConfDialog_t::closeEvent(QCloseEvent *event) { //printf("GamePad Close Window Event\n"); @@ -276,6 +319,106 @@ void GamePadConfDialog_t::changeButton9(void) changeButton( portNum, 9 ); } //---------------------------------------------------- +void GamePadConfDialog_t::clearButton0(void) +{ + clearButton( portNum, 0 ); +} +//---------------------------------------------------- +void GamePadConfDialog_t::clearButton1(void) +{ + clearButton( portNum, 1 ); +} +//---------------------------------------------------- +void GamePadConfDialog_t::clearButton2(void) +{ + clearButton( portNum, 2 ); +} +//---------------------------------------------------- +void GamePadConfDialog_t::clearButton3(void) +{ + clearButton( portNum, 3 ); +} +//---------------------------------------------------- +void GamePadConfDialog_t::clearButton4(void) +{ + clearButton( portNum, 4 ); +} +//---------------------------------------------------- +void GamePadConfDialog_t::clearButton5(void) +{ + clearButton( portNum, 5 ); +} +//---------------------------------------------------- +void GamePadConfDialog_t::clearButton6(void) +{ + clearButton( portNum, 6 ); +} +//---------------------------------------------------- +void GamePadConfDialog_t::clearButton7(void) +{ + clearButton( portNum, 7 ); +} +//---------------------------------------------------- +void GamePadConfDialog_t::clearButton8(void) +{ + clearButton( portNum, 8 ); +} +//---------------------------------------------------- +void GamePadConfDialog_t::clearButton9(void) +{ + clearButton( portNum, 9 ); +} +//---------------------------------------------------- +void GamePadConfDialog_t::clearAllCallback(void) +{ + for (int i=0; i 0 ) + { + clearAllCallback(); + return; + } + + snprintf (buf, sizeof(buf)-1, "SDL.Input.GamePad.%d.", portNum); + prefix = buf; + + for (int x=0; xsetOption (prefix + GamePadNames[x], + GamePadConfig[portNum][x].ButtonNum[configNo]); + + if (GamePadConfig[portNum][x].ButtType[configNo] == BUTTC_KEYBOARD) + { + g_config->setOption (prefix + "DeviceType", "Keyboard"); + } + else if (GamePadConfig[portNum][x].ButtType[configNo] == BUTTC_JOYSTICK) + { + g_config->setOption (prefix + "DeviceType", "Joystick"); + } + else + { + g_config->setOption (prefix + "DeviceType", "Unknown"); + } + g_config->setOption (prefix + "DeviceNum", + GamePadConfig[portNum][x].DeviceNum[configNo]); + } + updateCntrlrDpy(); +} +//---------------------------------------------------- GamePadConfigButton_t::GamePadConfigButton_t(int i) { idx = i; diff --git a/src/drivers/Qt/GamePadConf.h b/src/drivers/Qt/GamePadConf.h index 34e5b42d..0f83000c 100644 --- a/src/drivers/Qt/GamePadConf.h +++ b/src/drivers/Qt/GamePadConf.h @@ -14,6 +14,8 @@ #include #include +#include "Qt/main.h" + class GamePadConfigButton_t : public QPushButton { public: @@ -36,14 +38,15 @@ class GamePadConfDialog_t : public QDialog protected: QComboBox *portSel; - QLabel *keyName[10]; - GamePadConfigButton_t *button[10]; + QLabel *keyName[GAMEPAD_NUM_BUTTONS]; + GamePadConfigButton_t *button[GAMEPAD_NUM_BUTTONS]; int portNum; int configNo; int buttonConfigStatus; void changeButton( int port, int button ); + void clearButton( int port, int button ); void keyPressEvent(QKeyEvent *event); void keyReleaseEvent(QKeyEvent *event); void closeEvent(QCloseEvent *bar); @@ -63,6 +66,18 @@ class GamePadConfDialog_t : public QDialog void changeButton7(void); void changeButton8(void); void changeButton9(void); + void clearButton0(void); + void clearButton1(void); + void clearButton2(void); + void clearButton3(void); + void clearButton4(void); + void clearButton5(void); + void clearButton6(void); + void clearButton7(void); + void clearButton8(void); + void clearButton9(void); + void clearAllCallback(void); + void loadDefaults(void); void ena4score(int state); void oppDirEna(int state); void controllerSelect(int index); diff --git a/src/drivers/Qt/input.cpp b/src/drivers/Qt/input.cpp index 9cc4aaff..1e2162a0 100644 --- a/src/drivers/Qt/input.cpp +++ b/src/drivers/Qt/input.cpp @@ -1041,10 +1041,11 @@ DTestButton (ButtConfig * bc) #define MK(x) {{BUTTC_KEYBOARD},{0},{MKK(x)},1} #define MK2(x1,x2) {{BUTTC_KEYBOARD},{0},{MKK(x1),MKK(x2)},2} -#define MKZ() {{0},{0},{0},0} +#define MKZ() {{0},{0},{-1},0} #define GPZ() {MKZ(), MKZ(), MKZ(), MKZ()} -ButtConfig GamePadConfig[4][10] = { +ButtConfig GamePadConfig[ GAMEPAD_NUM_DEVICES ][ GAMEPAD_NUM_BUTTONS ] = +{ /* Gamepad 1 */ {MK (KP_3), MK (KP_2), MK (SLASH), MK (ENTER), MK (w), MK (z), MK (a), MK (s), MKZ (), MKZ ()}, @@ -1568,6 +1569,10 @@ const char * ButtonName (const ButtConfig * bc, int which) name[0] = 0; + if (bc->ButtonNum[which] == -1) + { + return name; + } switch (bc->ButtType[which]) { case BUTTC_KEYBOARD: @@ -2286,10 +2291,10 @@ const char *DefaultGamePadDevice[GAMEPAD_NUM_DEVICES] = { "Keyboard", "None", "None", "None" }; const int DefaultGamePad[GAMEPAD_NUM_DEVICES][GAMEPAD_NUM_BUTTONS] = { {SDLK_f, SDLK_d, SDLK_s, SDLK_RETURN, - SDLK_UP, SDLK_DOWN, SDLK_LEFT, SDLK_RIGHT, 0, 0}, -{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -{0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + SDLK_UP, SDLK_DOWN, SDLK_LEFT, SDLK_RIGHT, -1, -1}, +{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1} }; // PowerPad defaults diff --git a/src/drivers/Qt/input.h b/src/drivers/Qt/input.h index a62f3233..35361f56 100644 --- a/src/drivers/Qt/input.h +++ b/src/drivers/Qt/input.h @@ -4,14 +4,20 @@ #include "common/configSys.h" #define MAXBUTTCONFIG 4 -typedef struct { - uint8 ButtType[MAXBUTTCONFIG]; - uint8 DeviceNum[MAXBUTTCONFIG]; - //uint16 ButtonNum[MAXBUTTCONFIG]; + +enum { + BUTTC_KEYBOARD = 0, + BUTTC_JOYSTICK = 1, + BUTTC_MOUSE = 2 +}; +struct ButtConfig +{ + int ButtType[MAXBUTTCONFIG]; + int DeviceNum[MAXBUTTCONFIG]; int ButtonNum[MAXBUTTCONFIG]; uint32 NumC; //uint64 DeviceID[MAXBUTTCONFIG]; /* TODO */ -} ButtConfig; +}; extern int NoWaiting; @@ -26,9 +32,6 @@ void ButtonConfigEnd(); void ConfigButton(char *text, ButtConfig *bc); int DWaitButton(const uint8 *text, ButtConfig *bc, int wb, int *buttonConfigStatus = NULL); -#define BUTTC_KEYBOARD 0x00 -#define BUTTC_JOYSTICK 0x01 -#define BUTTC_MOUSE 0x02 #define FCFGD_GAMEPAD 1 #define FCFGD_POWERPAD 2 diff --git a/src/drivers/Qt/sdl-joystick.cpp b/src/drivers/Qt/sdl-joystick.cpp index 2e6d14a6..71148b2e 100644 --- a/src/drivers/Qt/sdl-joystick.cpp +++ b/src/drivers/Qt/sdl-joystick.cpp @@ -45,7 +45,11 @@ DTestButtonJoy(ButtConfig *bc) for(x = 0; x < bc->NumC; x++) { - if(bc->ButtonNum[x] & 0x2000) + if (bc->ButtonNum[x] == -1) + { + continue; + } + if (bc->ButtonNum[x] & 0x2000) { /* Hat "button" */ if(SDL_JoystickGetHat(s_Joysticks[bc->DeviceNum[x]], @@ -53,7 +57,7 @@ DTestButtonJoy(ButtConfig *bc) (bc->ButtonNum[x]&0xFF)) return 1; } - else if(bc->ButtonNum[x] & 0x8000) + else if (bc->ButtonNum[x] & 0x8000) { /* Axis "button" */ int pos;