summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerry Boland <gerry.boland@canonical.com>2015-08-21 01:00:16 +0100
committerPaul Olav Tvete <paul.tvete@theqtcompany.com>2015-08-26 11:49:42 +0000
commite2bc7e2cd5ce77efbadda75a471a345a73968ba1 (patch)
tree49e572e19ab2989ed0f27e48042f1a292903ec0c
parent92bef99fa04a902f88b3d15663de8e09bd40e590 (diff)
AppMan: if app destroys surface while in Running state, it is probably shutting down, so preempt it by removing it from the model
Change-Id: Icd0419d5fed8212f16dd283c4b7e005392bb7e05 Reviewed-by: Paul Olav Tvete <paul.tvete@theqtcompany.com>
-rw-r--r--src/modules/Unity/Application/application_manager.cpp19
-rw-r--r--src/modules/Unity/Application/application_manager.h2
2 files changed, 21 insertions, 0 deletions
diff --git a/src/modules/Unity/Application/application_manager.cpp b/src/modules/Unity/Application/application_manager.cpp
index 249a4c0..9879dea 100644
--- a/src/modules/Unity/Application/application_manager.cpp
+++ b/src/modules/Unity/Application/application_manager.cpp
@@ -82,6 +82,8 @@ void connectToSessionListener(ApplicationManager *manager, SessionListener *list
manager, &ApplicationManager::onSessionStopping);
QObject::connect(listener, &SessionListener::sessionCreatedSurface,
manager, &ApplicationManager::onSessionCreatedSurface);
+ QObject::connect(listener, &SessionListener::sessionDestroyingSurface,
+ manager, &ApplicationManager::onSessionDestroyingSurface);
}
void connectToSessionAuthorizer(ApplicationManager *manager, SessionAuthorizer *authorizer)
@@ -671,6 +673,23 @@ void ApplicationManager::onSessionCreatedSurface(ms::Session const* session,
}
}
+void ApplicationManager::onSessionDestroyingSurface(ms::Session const* session,
+ std::shared_ptr<ms::Surface> const& surface)
+{
+ qCDebug(QTMIR_APPLICATIONS) << "ApplicationManager::onSessionDestroyingSurface - sessionName=" << session->name().c_str();
+ Q_UNUSED(surface);
+
+ Application* application = findApplicationWithSession(session);
+ if (application && application->state() == Application::Running) {
+ // If app in Running state but it destroys its surface, it's probably shutting down,
+ // in which case, we can preempt it and remove it from the App list immediately.
+ // FIXME: this is not desktop application friendly, but resolves issue where trust-prompt
+ // helpers take a long time to shut down, but destroys their surface quickly.
+ remove(application);
+ application->deleteLater();
+ }
+}
+
Application* ApplicationManager::findApplicationWithSession(const std::shared_ptr<ms::Session> &session)
{
return findApplicationWithSession(session.get());
diff --git a/src/modules/Unity/Application/application_manager.h b/src/modules/Unity/Application/application_manager.h
index 46cfa26..807e260 100644
--- a/src/modules/Unity/Application/application_manager.h
+++ b/src/modules/Unity/Application/application_manager.h
@@ -121,6 +121,8 @@ public Q_SLOTS:
void onSessionStopping(std::shared_ptr<mir::scene::Session> const& session);
void onSessionCreatedSurface(mir::scene::Session const*, std::shared_ptr<mir::scene::Surface> const&);
+ void onSessionDestroyingSurface(mir::scene::Session const* session,
+ std::shared_ptr<mir::scene::Surface> const& surface);
void onProcessStarting(const QString& appId);
void onProcessStopped(const QString& appId);