diff --git a/src/plugins/ios/iosrunfactories.cpp b/src/plugins/ios/iosrunfactories.cpp index e9c82197842..c4ad3fcafea 100644 --- a/src/plugins/ios/iosrunfactories.cpp +++ b/src/plugins/ios/iosrunfactories.cpp @@ -157,7 +157,26 @@ bool IosRunControlFactory::canRun(RunConfiguration *runConfiguration, { if (mode != NormalRunMode && mode != DebugRunMode) return false; - return qobject_cast(runConfiguration); + IosRunConfiguration *rc = qobject_cast(runConfiguration); + if (!rc) + return false; + + IDevice::ConstPtr device = DeviceKitInformation::device(rc->target()->kit()); + if (!device || device->deviceState() != IDevice::DeviceReadyToUse) + return false; + + // The device can only run the same application once, any subsequent runs will + // not launch a second instance. Disable the Run button if the application is already + // running on the device. + if (m_activeRunControls.contains(device->id())) { + QPointer activeRunControl = m_activeRunControls[device->id()]; + if (activeRunControl && activeRunControl.data()->isRunning()) + return false; + else + m_activeRunControls.remove(device->id()); + } + + return rc; } RunControl *IosRunControlFactory::create(RunConfiguration *runConfig, @@ -166,10 +185,15 @@ RunControl *IosRunControlFactory::create(RunConfiguration *runConfig, Q_ASSERT(canRun(runConfig, mode)); IosRunConfiguration *rc = qobject_cast(runConfig); Q_ASSERT(rc); + RunControl *res = 0; if (mode == NormalRunMode) - return new Ios::Internal::IosRunControl(rc); + res = new Ios::Internal::IosRunControl(rc); else - return IosDebugSupport::createDebugRunControl(rc, errorMessage); + res = IosDebugSupport::createDebugRunControl(rc, errorMessage); + IDevice::ConstPtr device = DeviceKitInformation::device(rc->target()->kit()); + if (device) + m_activeRunControls[device->id()] = res; + return res; } } // namespace Internal diff --git a/src/plugins/ios/iosrunfactories.h b/src/plugins/ios/iosrunfactories.h index 8f4641c331c..bf6272fea91 100644 --- a/src/plugins/ios/iosrunfactories.h +++ b/src/plugins/ios/iosrunfactories.h @@ -83,6 +83,8 @@ public: ProjectExplorer::RunControl *create(ProjectExplorer::RunConfiguration *runConfiguration, ProjectExplorer::RunMode mode, QString *errorMessage) QTC_OVERRIDE; +private: + mutable QMap > m_activeRunControls; }; } // namespace Internal