@@ -35,7 +35,7 @@
35#include <qtmir/mirserverapplication.h>
35#include <qtmir/mirserverapplication.h>
36#include <qtmir/windowmodelnotifier.h>
36#include <qtmir/windowmodelnotifier.h>
38−Q_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL, "toplevelwindowmodel", QtInfoMsg)
38+Q_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL, "toplevelwindowmodel")
40#define DEBUG_MSG qCDebug(TOPLEVELWINDOWMODEL).nospace().noquote() << __func__
40#define DEBUG_MSG qCDebug(TOPLEVELWINDOWMODEL).nospace().noquote() << __func__
41#define INFO_MSG qCInfo(TOPLEVELWINDOWMODEL).nospace().noquote() << __func__
41#define INFO_MSG qCInfo(TOPLEVELWINDOWMODEL).nospace().noquote() << __func__
@@ -136,6 +136,7 @@ void TopLevelWindowModel::setWorkspace(Workspace *workspace)
137 if (m_workspace) {
137 if (m_workspace) {
138 m_windowModel.clear();
138 m_windowModel.clear();
139+ m_allSurfaces.clear();
139 if (m_applicationManager) {
140 if (m_applicationManager) {
140 disconnect(m_applicationManager, 0, this, 0);
141 disconnect(m_applicationManager, 0, this, 0);
@@ -237,6 +238,7 @@ void TopLevelWindowModel::prependSurfaceHelper(unityapi::MirSurfaceInterface *su
237 Window *window = createWindow(surface);
238 Window *window = createWindow(surface);
239 m_windowModel.prepend(ModelEntry(window, application));
240 m_windowModel.prepend(ModelEntry(window, application));
241+ m_allSurfaces.insert(surface);
240 if (surface) {
242 if (surface) {
241 connectSurface(surface);
243 connectSurface(surface);
@@ -371,6 +373,7 @@ void TopLevelWindowModel::onSurfaceDestroyed(unityapi::MirSurfaceInterface *surf
371 auto window = m_windowModel[i].window;
373 auto window = m_windowModel[i].window;
372 window->setSurface(nullptr);
374 window->setSurface(nullptr);
373 window->setFocused(false);
375 window->setFocused(false);
376+ m_allSurfaces.remove(surface);
374 INFO_MSG << " Removed surface from entry. After: " << toString();
377 INFO_MSG << " Removed surface from entry. After: " << toString();
@@ -397,7 +400,7 @@ void TopLevelWindowModel::onSurfacesAddedToWorkspace(const std::shared_ptr<miral
397 if (workspace != m_workspace->workspace()) return;
400 if (workspace != m_workspace->workspace()) return;
399 Q_FOREACH(auto surface, surfaces) {
402 Q_FOREACH(auto surface, surfaces) {
400− DEBUG_MSG << "(" << surface << ")";
403+ if (m_allSurfaces.contains(surface)) continue;
402 if (surface->parentSurface()) {
405 if (surface->parentSurface()) {
403 // Wrap it in a Window so that we keep focusedWindow() up to date.
406 // Wrap it in a Window so that we keep focusedWindow() up to date.
@@ -444,6 +447,7 @@ void TopLevelWindowModel::removeAt(int index)
444 window->setFocused(false);
447 window->setFocused(false);
446 m_windowModel.removeAt(index);
449 m_windowModel.removeAt(index);
450+ m_allSurfaces.remove(window->surface());
448 if (m_modelState == RemovingState) {
452 if (m_modelState == RemovingState) {
449 endRemoveRows();
453 endRemoveRows();
@@ -765,7 +769,11 @@ void TopLevelWindowModel::activateTopMostWindowWithoutId(int forbiddenId)
766void TopLevelWindowModel::refreshWindows()
770void TopLevelWindowModel::refreshWindows()
768 m_windowModel.clear();
774 m_windowModel.clear();
775+ m_allSurfaces.clear();
769 WindowManagementPolicy::instance()->forEachWindowInWorkspace(m_workspace->workspace(), [this](const miral::Window &window) {
777 WindowManagementPolicy::instance()->forEachWindowInWorkspace(m_workspace->workspace(), [this](const miral::Window &window) {
770 auto surface = m_surfaceManager->surfaceFor(window);
778 auto surface = m_surfaceManager->surfaceFor(window);
771 if (surface) {
779 if (surface) {