@@ -18,8 +18,10 @@
1818
1919#include "ApplicationInfo.h"
2020#include "VirtualKeyboard.h"
21+#include "../../WindowManager/windowmanagementpolicy.h"
2122
2223#include <paths.h>
24+#include <mirtest/mir/test/doubles/stub_surface.h>
2325
2426#define SURFACEMANAGER_DEBUG 1
2527
@@ -31,6 +33,12 @@
3133
3234namespace unityapi = unity::shell::application;
3335
36+uint qHash(const WindowWrapper &key, uint)
37+{
38+ std::shared_ptr<mir::scene::Surface> surface = key.window;
39+ return (quintptr)surface.get();
40+}
41+
3442SurfaceManager *SurfaceManager::m_instance = nullptr;
3543
3644SurfaceManager *SurfaceManager::instance()
@@ -38,17 +46,27 @@ SurfaceManager *SurfaceManager::instance()
3846 return m_instance;
3947}
4048
41−MirSurfaceInterface *SurfaceManager::surfaceFor(const miral::Window&)
42−{
43− return nullptr;
44−}
45−
4649SurfaceManager::SurfaceManager(QObject *)
4750{
4851 DEBUG_MSG("");
4952
5053 Q_ASSERT(m_instance == nullptr);
5154 m_instance = this;
55+
56+ connect(WindowManagementPolicy::instance(), &WindowManagementPolicy::windowAdded,
57+ this, [this](const miral::Window& window) {
58+ Q_EMIT surfaceCreated(surfaceFor(window));
59+ });
60+
61+ connect(WindowManagementPolicy::instance(), &WindowManagementPolicy::windowsAddedToWorkspace,
62+ this, [this](const std::shared_ptr<miral::Workspace> &workspace, const std::vector<miral::Window> &windows) {
63+ Q_EMIT surfacesAddedToWorkspace(workspace, find(windows));
64+ });
65+
66+ connect(WindowManagementPolicy::instance(), &WindowManagementPolicy::windowsAboutToBeRemovedFromWorkspace,
67+ this, [this](const std::shared_ptr<miral::Workspace> &workspace, const std::vector<miral::Window> &windows) {
68+ Q_EMIT surfacesAboutToBeRemovedFromWorkspace(workspace, find(windows));
69+ });
5270}
5371
5472SurfaceManager::~SurfaceManager()
@@ -63,6 +81,29 @@ SurfaceManager::~SurfaceManager()
6381 m_instance = nullptr;
6482}
6583
84+
85+
86+QVector<MirSurfaceInterface*> SurfaceManager::find(const std::vector<miral::Window> &windows) const
87+{
88+ QVector<unityapi::MirSurfaceInterface*> surfaces;
89+ for (size_t i = 0; i < windows.size(); i++) {
90+ auto mirSurface = surfaceFor(windows[i]);
91+ if (mirSurface) {
92+ surfaces.push_back(mirSurface);
93+ }
94+ }
95+ return surfaces;
96+}
97+
98+MirSurfaceInterface *SurfaceManager::surfaceFor(const miral::Window& window) const
99+{
100+ auto iter = m_windowToSurface.find({window});
101+ if (iter != m_windowToSurface.end()) {
102+ return *iter;
103+ }
104+ return nullptr;
105+}
106+
66107MirSurface *SurfaceManager::createSurface(const QString& name,
67108 Mir::Type type,
68109 Mir::State state,
@@ -80,7 +121,12 @@ MirSurface *SurfaceManager::createSurface(const QString& name,
80121
81122void SurfaceManager::registerSurface(MirSurface *surface)
82123{
124+ auto fakeSurface = std::make_shared<mir::test::doubles::StubSurface>();
125+ WindowWrapper window{miral::Window(nullptr, fakeSurface), fakeSurface};
126+
83127 m_surfaces.prepend(surface);
128+ m_windowToSurface.insert(window, surface);
129+ m_surfaceToWindow.insert(surface, window);
84130
85131 if (!surface->parentSurface()) {
86132 surface->setMinimumWidth(m_newSurfaceMinimumWidth);
@@ -97,6 +143,8 @@ void SurfaceManager::registerSurface(MirSurface *surface)
97143
98144 const QString persistentId = surface->persistentId();
99145 connect(surface, &QObject::destroyed, this, [=]() {
146+ WindowWrapper key = m_surfaceToWindow.take(surface);
147+ m_windowToSurface.remove(key);
100148 this->onSurfaceDestroyed(surface, persistentId);
101149 });
102150
@@ -104,7 +152,12 @@ void SurfaceManager::registerSurface(MirSurface *surface)
104152
105153void SurfaceManager::notifySurfaceCreated(unityapi::MirSurfaceInterface *surface)
106154{
107− Q_EMIT surfaceCreated(surface);
155+ if (Q_UNLIKELY(!m_surfaceToWindow.contains(surface))) {
156+ Q_EMIT surfaceCreated(surface);
157+ return;
158+ }
159+
160+ WindowManagementPolicy::instance()->addWindow(m_surfaceToWindow[surface].window);
108161}
109162
110163void SurfaceManager::setNewSurfaceMinimumWidth(int value)