@@ -29,13 +29,13 @@
2929// local
3030#include "Window.h"
3131#include "Workspace.h"
32−#include "windowmanagementpolicy.h"
32+#include "wmpolicyinterface.h"
3333
3434// qtmir
3535#include <qtmir/mirserverapplication.h>
3636#include <qtmir/windowmodelnotifier.h>
3737
38−Q_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL, "toplevelwindowmodel")
38+Q_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL, "toplevelwindowmodel", QtInfoMsg)
3939
4040#define DEBUG_MSG qCDebug(TOPLEVELWINDOWMODEL).nospace().noquote() << __func__
4141#define INFO_MSG qCInfo(TOPLEVELWINDOWMODEL).nospace().noquote() << __func__
@@ -109,6 +109,8 @@ void TopLevelWindowModel::setSurfaceManager(unityapi::SurfaceManagerInterface *s
109109
110110 connect(m_surfaceManager, &unityapi::SurfaceManagerInterface::surfacesAddedToWorkspace,
111111 this, &TopLevelWindowModel::onSurfacesAddedToWorkspace);
112+ connect(m_surfaceManager, &unityapi::SurfaceManagerInterface::surfacesAboutToBeRemovedFromWorkspace,
113+ this, &TopLevelWindowModel::onSurfacesAboutToBeRemovedFromWorkspace);
112114
113115 if (m_workspace && m_applicationManager) {
114116 refreshWindows();
@@ -397,6 +399,7 @@ void TopLevelWindowModel::onSurfaceCreated(unityapi::MirSurfaceInterface */*surf
397399void TopLevelWindowModel::onSurfacesAddedToWorkspace(const std::shared_ptr<miral::Workspace>& workspace,
398400 const QVector<unity::shell::application::MirSurfaceInterface*> surfaces)
399401{
402+ if (!m_workspace || !m_applicationManager) return;
400403 if (workspace != m_workspace->workspace()) return;
401404
402405 Q_FOREACH(auto surface, surfaces) {
@@ -431,6 +434,59 @@ void TopLevelWindowModel::onSurfacesAddedToWorkspace(const std::shared_ptr<miral
431434 }
432435}
433436
437+void TopLevelWindowModel::onSurfacesAboutToBeRemovedFromWorkspace(const std::shared_ptr<miral::Workspace> &workspace,
438+ const QVector<unity::shell::application::MirSurfaceInterface *> surfaces)
439+{
440+ if (workspace != m_workspace->workspace()) return;
441+
442+ int start = -1;
443+ int end = -1;
444+ for (auto iter = surfaces.constBegin(); iter != surfaces.constEnd();) {
445+ auto surface = *iter;
446+ iter++;
447+
448+ // Do removals in adjacent blocks.
449+ start = end = indexOf(surface);
450+ if (start == -1) {
451+ // probably a child surface
452+ m_allSurfaces.remove(surface);
453+ continue;
454+ }
455+ while(iter != surfaces.constEnd()) {
456+ int index = indexOf(*iter);
457+ if (index != end+1) {
458+ break;
459+ }
460+ end++;
461+ iter++;
462+ }
463+
464+ if (m_modelState == IdleState) {
465+ beginRemoveRows(QModelIndex(), start, end);
466+ m_modelState = RemovingState;
467+ } else {
468+ Q_ASSERT(m_modelState == ResettingState);
469+ // No point in signaling anything if we're resetting the whole model
470+ }
471+
472+ for (int index = start; index <= end; index++) {
473+ auto window = m_windowModel[start].window;
474+ window->setSurface(nullptr);
475+ window->setFocused(false);
476+
477+ m_windowModel.removeAt(start);
478+ m_allSurfaces.remove(window->surface());
479+ }
480+
481+ if (m_modelState == RemovingState) {
482+ endRemoveRows();
483+ Q_EMIT countChanged();
484+ Q_EMIT listChanged();
485+ m_modelState = IdleState;
486+ }
487+ }
488+}
489+
434490void TopLevelWindowModel::removeAt(int index)
435491{
436492 if (m_modelState == IdleState) {
@@ -774,7 +830,8 @@ void TopLevelWindowModel::refreshWindows()
774830 m_windowModel.clear();
775831 m_allSurfaces.clear();
776832
777− WindowManagementPolicy::instance()->forEachWindowInWorkspace(m_workspace->workspace(), [this](const miral::Window &window) {
833+ if (!m_workspace || !m_applicationManager) return;
834+ WMPolicyInterface::instance()->forEachWindowInWorkspace(m_workspace->workspace(), [this](const miral::Window &window) {
778835 auto surface = m_surfaceManager->surfaceFor(window);
779836 if (surface) {
780837 if (surface->parentSurface()) {