diff options
author | Gerry Boland <gerry.boland@canonical.com> | 2015-08-21 01:00:16 +0100 |
---|---|---|
committer | Paul Olav Tvete <paul.tvete@theqtcompany.com> | 2015-08-26 11:49:42 +0000 |
commit | e2bc7e2cd5ce77efbadda75a471a345a73968ba1 (patch) | |
tree | 49e572e19ab2989ed0f27e48042f1a292903ec0c | |
parent | 92bef99fa04a902f88b3d15663de8e09bd40e590 (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.cpp | 19 | ||||
-rw-r--r-- | src/modules/Unity/Application/application_manager.h | 2 |
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); |