diff --git a/src/common.cpp b/src/common.cpp index d251710b..550499d1 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -126,7 +126,7 @@ namespace PadderCommon void lockInputDevices() { - waitMutex.lock(); + sdlWaitMutex.lock(); /*editingLock.lockForWrite(); editingBindings = true; editingLock.unlock(); @@ -139,7 +139,7 @@ namespace PadderCommon void unlockInputDevices() { - waitMutex.unlock(); + sdlWaitMutex.unlock(); /*editingLock.lockForWrite(); editingBindings = false; editingLock.unlock(); @@ -149,7 +149,8 @@ namespace PadderCommon } QWaitCondition waitThisOut; - QMutex waitMutex; + QMutex sdlWaitMutex; + QMutex inputDaemonMutex; QReadWriteLock editingLock; bool editingBindings = false; MouseHelper mouseHelperObj; diff --git a/src/common.h b/src/common.h index 58fab2c9..ea4f133d 100644 --- a/src/common.h +++ b/src/common.h @@ -128,7 +128,8 @@ namespace PadderCommon .arg(ANTIMICRO_MINOR_VERSION); extern QWaitCondition waitThisOut; - extern QMutex waitMutex; + extern QMutex sdlWaitMutex; + extern QMutex inputDaemonMutex; extern bool editingBindings; extern QReadWriteLock editingLock; extern MouseHelper mouseHelperObj; diff --git a/src/inputdaemon.cpp b/src/inputdaemon.cpp index 2035b7d9..2379f5c3 100644 --- a/src/inputdaemon.cpp +++ b/src/inputdaemon.cpp @@ -103,6 +103,8 @@ void InputDaemon::startWorker() void InputDaemon::run () { + PadderCommon::inputDaemonMutex.lock(); + // SDL has found events. The timeout is not necessary. pollResetTimer.stop(); @@ -138,6 +140,8 @@ void InputDaemon::run () QTimer::singleShot(0, eventWorker, SLOT(performWork())); pollResetTimer.start(); } + + PadderCommon::inputDaemonMutex.unlock(); } void InputDaemon::refreshJoysticks() @@ -340,6 +344,7 @@ void InputDaemon::refreshMapping(QString mapping, InputDevice *device) SDL_GameController *controller = SDL_GameControllerOpen(i); GameController *damncontroller = new GameController(controller, i, settings, this); + connect(damncontroller, SIGNAL(requestWait()), eventWorker, SLOT(haltServices())); SDL_Joystick *sdlStick = SDL_GameControllerGetJoystick(controller); joystickID = SDL_JoystickInstanceID(sdlStick); joysticks->insert(joystickID, damncontroller); @@ -366,9 +371,6 @@ void InputDaemon::removeDevice(InputDevice *device) refreshIndexes(); emit deviceRemoved(deviceID); - - device->closeSDLDevice(); - device->deleteLater(); } } @@ -418,6 +420,7 @@ void InputDaemon::addInputDevice(int index) if (!joysticks->contains(tempJoystickID)) { GameController *damncontroller = new GameController(controller, index, settings, this); + connect(damncontroller, SIGNAL(requestWait()), eventWorker, SLOT(haltServices())); joysticks->insert(tempJoystickID, damncontroller); trackcontrollers.insert(tempJoystickID, damncontroller); diff --git a/src/inputdevice.cpp b/src/inputdevice.cpp index 3132f049..82b92b9a 100644 --- a/src/inputdevice.cpp +++ b/src/inputdevice.cpp @@ -2208,3 +2208,9 @@ void InputDevice::haltServices() { emit requestWait(); } + +void InputDevice::finalRemoval() +{ + this->closeSDLDevice(); + this->deleteLater(); +} diff --git a/src/inputdevice.h b/src/inputdevice.h index 63f61301..c8fff0dc 100644 --- a/src/inputdevice.h +++ b/src/inputdevice.h @@ -188,6 +188,7 @@ public slots: void profileEdited(); void setProfileName(QString value); void haltServices(); + void finalRemoval(); virtual void readConfig(QXmlStreamReader *xml); virtual void writeConfig(QXmlStreamWriter *xml); diff --git a/src/joycontrolstickeditdialog.cpp b/src/joycontrolstickeditdialog.cpp index 0634b04b..cdaf51ff 100644 --- a/src/joycontrolstickeditdialog.cpp +++ b/src/joycontrolstickeditdialog.cpp @@ -377,6 +377,8 @@ void JoyControlStickEditDialog::refreshStickStats(int x, int y) Q_UNUSED(x); Q_UNUSED(y); + PadderCommon::inputDaemonMutex.lock(); + QString xCoorString = QString::number(stick->getXCoordinate()); if (stick->getCircleAdjust() > 0.0) { @@ -396,6 +398,8 @@ void JoyControlStickEditDialog::refreshStickStats(int x, int y) double validDistance = stick->getDistanceFromDeadZone() * 100.0; ui->fromSafeZoneValueLabel->setText(QString::number(validDistance)); + + PadderCommon::inputDaemonMutex.unlock(); } void JoyControlStickEditDialog::checkMaxZone(int value) diff --git a/src/joycontrolstickstatusbox.cpp b/src/joycontrolstickstatusbox.cpp index e20515ed..a1067725 100644 --- a/src/joycontrolstickstatusbox.cpp +++ b/src/joycontrolstickstatusbox.cpp @@ -23,6 +23,7 @@ #include #include "joycontrolstickstatusbox.h" +#include "common.h" JoyControlStickStatusBox::JoyControlStickStatusBox(QWidget *parent) : QWidget(parent) @@ -81,6 +82,8 @@ void JoyControlStickStatusBox::paintEvent(QPaintEvent *event) { Q_UNUSED(event); + PadderCommon::inputDaemonMutex.lock(); + if (stick->getJoyMode() == JoyControlStick::StandardMode || stick->getJoyMode() == JoyControlStick::EightWayMode) { @@ -94,6 +97,8 @@ void JoyControlStickStatusBox::paintEvent(QPaintEvent *event) { drawFourWayDiagonalBox(); } + + PadderCommon::inputDaemonMutex.unlock(); } void JoyControlStickStatusBox::drawEightWayBox() diff --git a/src/main.cpp b/src/main.cpp index 940b6c74..81b4e520 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -116,7 +116,7 @@ int main(int argc, char *argv[]) qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); - qRegisterMetaType(); + qRegisterMetaType("SDL_JoystickID"); qRegisterMetaType("JoyButtonSlot::JoySlotInputAction"); #if defined(Q_OS_UNIX) && defined(WITH_X11) @@ -203,7 +203,7 @@ int main(int argc, char *argv[]) AntiMicroSettings settings(PadderCommon::configFilePath, QSettings::IniFormat); InputDaemon *joypad_worker = new InputDaemon(joysticks, &settings, false); MainWindow w(joysticks, &cmdutility, &settings, false); - //w.fillButtons(); + w.fillButtons(); if (!cmdutility.hasError() && cmdutility.hasProfile()) { @@ -543,6 +543,7 @@ int main(int argc, char *argv[]) QObject::connect(a, SIGNAL(aboutToQuit()), joypad_worker, SLOT(deleteLater()), Qt::BlockingQueuedConnection); + //JoyButton::establishMouseTimerConnections(); w->makeJoystickTabs(); QTimer::singleShot(0, w, SLOT(controllerMapOpening())); @@ -724,11 +725,9 @@ int main(int argc, char *argv[]) w, SLOT(testMappingUpdateNow(int,InputDevice*))); QObject::connect(joypad_worker, SIGNAL(deviceRemoved(SDL_JoystickID)), - w, SLOT(removeJoyTab(SDL_JoystickID)), - Qt::BlockingQueuedConnection); + w, SLOT(removeJoyTab(SDL_JoystickID))); QObject::connect(joypad_worker, SIGNAL(deviceAdded(InputDevice*)), - w, SLOT(addJoyTab(InputDevice*)), - Qt::BlockingQueuedConnection); + w, SLOT(addJoyTab(InputDevice*))); #endif #ifdef Q_OS_WIN diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index ceb56f6b..1a1e1b04 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1463,6 +1463,7 @@ void MainWindow::removeJoyTab(SDL_JoystickID deviceID) // the tab before deleting tab. ui->tabWidget->disableFlashes(tab->getJoystick()); ui->tabWidget->removeTab(i); + QMetaObject::invokeMethod(tab->getJoystick(), "finalRemoval"); delete tab; tab = 0; found = true;