summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/manager-lib/applicationmanager.cpp20
-rw-r--r--src/manager-lib/qmlinprocessruntime.cpp17
-rw-r--r--src/manager-lib/qmlinprocessruntime.h1
3 files changed, 18 insertions, 20 deletions
diff --git a/src/manager-lib/applicationmanager.cpp b/src/manager-lib/applicationmanager.cpp
index b5041055..1dfe29da 100644
--- a/src/manager-lib/applicationmanager.cpp
+++ b/src/manager-lib/applicationmanager.cpp
@@ -619,8 +619,6 @@ bool ApplicationManager::startApplicationInternal(const QString &appId, const QS
if (app->isBlocked())
throw Exception("Application %1 is blocked - cannot start").arg( app->id());
- Application* realApp = app->nonAliased();
-
AbstractRuntime *runtime = app->currentRuntime();
auto runtimeManager = runtime ? runtime->manager() : RuntimeFactory::instance()->manager(app->runtimeName());
if (!runtimeManager)
@@ -769,7 +767,7 @@ bool ApplicationManager::startApplicationInternal(const QString &appId, const QS
attachRuntime = true;
}
if (!runtime)
- runtime = RuntimeFactory::instance()->create(container, realApp);
+ runtime = RuntimeFactory::instance()->create(container, app->nonAliased());
if (runtime)
emit internalSignals.newRuntimeCreated(runtime);
@@ -809,8 +807,6 @@ bool ApplicationManager::startApplicationInternal(const QString &appId, const QS
else if (!app->documentUrl().isNull())
runtime->openDocument(app->documentUrl(), documentMimeType);
- emitActivated(app);
-
qCDebug(LogSystem) << "Starting application" << app->id() << "in container" << containerId
<< "using runtime" << runtimeManager->identifier();
if (!documentUrl.isEmpty())
@@ -818,7 +814,9 @@ bool ApplicationManager::startApplicationInternal(const QString &appId, const QS
if (inProcess) {
bool ok = runtime->start();
- if (!ok)
+ if (ok)
+ emitActivated(app);
+ else
runtime->deleteLater();
return ok;
} else {
@@ -826,11 +824,13 @@ bool ApplicationManager::startApplicationInternal(const QString &appId, const QS
// Using a state-machine would be one option, but then we would need that state-machine
// object plus the per-app state. Relying on 2 lambdas is the easier choice for now.
- auto doStartInContainer = [realApp, attachRuntime, runtime]() -> bool {
- bool successfullyStarted = attachRuntime ? runtime->attachApplicationToQuickLauncher(realApp)
+ auto doStartInContainer = [this, app, attachRuntime, runtime]() -> bool {
+ bool successfullyStarted = attachRuntime ? runtime->attachApplicationToQuickLauncher(app->nonAliased())
: runtime->start();
- if (!successfullyStarted)
- runtime->deleteLater(); // ~Runtime() will clean realApp->m_runtime
+ if (successfullyStarted)
+ emitActivated(app);
+ else
+ runtime->deleteLater(); // ~Runtime() will clean app->nonAliased()->m_runtime
return successfullyStarted;
};
diff --git a/src/manager-lib/qmlinprocessruntime.cpp b/src/manager-lib/qmlinprocessruntime.cpp
index f3ac72d4..cd5e8987 100644
--- a/src/manager-lib/qmlinprocessruntime.cpp
+++ b/src/manager-lib/qmlinprocessruntime.cpp
@@ -131,7 +131,6 @@ bool QmlInProcessRuntime::start()
qCDebug(LogSystem) << "Updated Qml import paths:" << m_inProcessQmlEngine->importPathList();
}
- m_componentError = false;
QQmlComponent *component = new QQmlComponent(m_inProcessQmlEngine, m_app->nonAliasedInfo()->absoluteCodeFilePath());
if (!component->isReady()) {
@@ -143,7 +142,7 @@ bool QmlInProcessRuntime::start()
// We are running each application in it's own, separate Qml context.
// This way, we can export an unique ApplicationInterface object for each app
- QQmlContext *appContext = new QQmlContext(m_inProcessQmlEngine->rootContext());
+ QQmlContext *appContext = new QQmlContext(m_inProcessQmlEngine->rootContext(), this);
m_applicationIf = new QmlInProcessApplicationInterface(this);
appContext->setContextProperty(qSL("ApplicationInterface"), m_applicationIf);
connect(m_applicationIf, &QmlInProcessApplicationInterface::quitAcknowledged,
@@ -154,16 +153,17 @@ bool QmlInProcessRuntime::start()
QObject *obj = component->beginCreate(appContext);
- QMetaObject::invokeMethod(this, [component, appContext, obj, this]() {
+ QMetaObject::invokeMethod(this, [component, obj, this]() {
component->completeCreate();
- if (!obj || m_componentError) {
+ delete component;
+ if (!obj) {
qCCritical(LogSystem) << "could not load" << m_app->nonAliasedInfo()->absoluteCodeFilePath() << ": no root object";
- delete obj;
- delete appContext;
- delete m_applicationIf;
- m_applicationIf = nullptr;
finish(3, Am::NormalExit);
} else {
+ if (state() == Am::ShuttingDown) {
+ delete obj;
+ return;
+ }
#if !defined(AM_HEADLESS)
if (!qobject_cast<QmlInProcessApplicationManagerWindow*>(obj)) {
QQuickItem *item = qobject_cast<QQuickItem*>(obj);
@@ -179,7 +179,6 @@ bool QmlInProcessRuntime::start()
openDocument(m_document, QString());
setState(Am::Running);
}
- delete component;
}, Qt::QueuedConnection);
return true;
}
diff --git a/src/manager-lib/qmlinprocessruntime.h b/src/manager-lib/qmlinprocessruntime.h
index f2d57eb6..72a96a09 100644
--- a/src/manager-lib/qmlinprocessruntime.h
+++ b/src/manager-lib/qmlinprocessruntime.h
@@ -100,7 +100,6 @@ private:
QString m_document;
QmlInProcessApplicationInterface *m_applicationIf = nullptr;
- bool m_componentError;
bool m_stopIfNoVisibleSurfaces = false;