@@ -18,8 +18,10 @@
19#include "ApplicationInfo.h"
19#include "ApplicationInfo.h"
20#include "VirtualKeyboard.h"
20#include "VirtualKeyboard.h"
21+#include "../../WindowManager/windowmanagementpolicy.h"
22#include <paths.h>
23#include <paths.h>
24+#include <mirtest/mir/test/doubles/stub_surface.h>
24#define SURFACEMANAGER_DEBUG 1
26#define SURFACEMANAGER_DEBUG 1
@@ -31,6 +33,12 @@
32namespace unityapi = unity::shell::application;
34namespace unityapi = unity::shell::application;
36+uint qHash(const WindowWrapper &key, uint)
38+ std::shared_ptr<mir::scene::Surface> surface = key.window;
39+ return (quintptr)surface.get();
34SurfaceManager *SurfaceManager::m_instance = nullptr;
42SurfaceManager *SurfaceManager::m_instance = nullptr;
36SurfaceManager *SurfaceManager::instance()
44SurfaceManager *SurfaceManager::instance()
@@ -38,17 +46,27 @@ SurfaceManager *SurfaceManager::instance()
38 return m_instance;
46 return m_instance;
41−MirSurfaceInterface *SurfaceManager::surfaceFor(const miral::Window&)
46SurfaceManager::SurfaceManager(QObject *)
49SurfaceManager::SurfaceManager(QObject *)
48 DEBUG_MSG("");
51 DEBUG_MSG("");
50 Q_ASSERT(m_instance == nullptr);
53 Q_ASSERT(m_instance == nullptr);
51 m_instance = this;
54 m_instance = this;
56+ connect(WindowManagementPolicy::instance(), &WindowManagementPolicy::windowAdded,
57+ this, [this](const miral::Window& window) {
58+ Q_EMIT surfaceCreated(surfaceFor(window));
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));
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));
54SurfaceManager::~SurfaceManager()
72SurfaceManager::~SurfaceManager()
@@ -63,6 +81,29 @@ SurfaceManager::~SurfaceManager()
63 m_instance = nullptr;
81 m_instance = nullptr;
86+QVector<MirSurfaceInterface*> SurfaceManager::find(const std::vector<miral::Window> &windows) const
88+ QVector<unityapi::MirSurfaceInterface*> surfaces;
89+ for (size_t i = 0; i < windows.size(); i++) {
90+ auto mirSurface = surfaceFor(windows[i]);
92+ surfaces.push_back(mirSurface);
98+MirSurfaceInterface *SurfaceManager::surfaceFor(const miral::Window& window) const
100+ auto iter = m_windowToSurface.find({window});
101+ if (iter != m_windowToSurface.end()) {
66MirSurface *SurfaceManager::createSurface(const QString& name,
107MirSurface *SurfaceManager::createSurface(const QString& name,
67 Mir::Type type,
108 Mir::Type type,
68 Mir::State state,
109 Mir::State state,
@@ -80,7 +121,12 @@ MirSurface *SurfaceManager::createSurface(const QString& name,
81void SurfaceManager::registerSurface(MirSurface *surface)
122void SurfaceManager::registerSurface(MirSurface *surface)
124+ auto fakeSurface = std::make_shared<mir::test::doubles::StubSurface>();
125+ WindowWrapper window{miral::Window(nullptr, fakeSurface), fakeSurface};
83 m_surfaces.prepend(surface);
127 m_surfaces.prepend(surface);
128+ m_windowToSurface.insert(window, surface);
129+ m_surfaceToWindow.insert(surface, window);
85 if (!surface->parentSurface()) {
131 if (!surface->parentSurface()) {
86 surface->setMinimumWidth(m_newSurfaceMinimumWidth);
132 surface->setMinimumWidth(m_newSurfaceMinimumWidth);
@@ -97,6 +143,8 @@ void SurfaceManager::registerSurface(MirSurface *surface)
98 const QString persistentId = surface->persistentId();
144 const QString persistentId = surface->persistentId();
99 connect(surface, &QObject::destroyed, this, [=]() {
145 connect(surface, &QObject::destroyed, this, [=]() {
146+ WindowWrapper key = m_surfaceToWindow.take(surface);
147+ m_windowToSurface.remove(key);
100 this->onSurfaceDestroyed(surface, persistentId);
148 this->onSurfaceDestroyed(surface, persistentId);
@@ -104,7 +152,12 @@ void SurfaceManager::registerSurface(MirSurface *surface)
105void SurfaceManager::notifySurfaceCreated(unityapi::MirSurfaceInterface *surface)
153void SurfaceManager::notifySurfaceCreated(unityapi::MirSurfaceInterface *surface)
155+ if (Q_UNLIKELY(!m_surfaceToWindow.contains(surface))) {
107− Q_EMIT surfaceCreated(surface);
156+ Q_EMIT surfaceCreated(surface);
160+ WindowManagementPolicy::instance()->addWindow(m_surfaceToWindow[surface].window);
110void SurfaceManager::setNewSurfaceMinimumWidth(int value)
163void SurfaceManager::setNewSurfaceMinimumWidth(int value)