on xenial help sign in
merged with prereq
commitca7d40dcb21a7bbb0109c8a80f2bae8f1c27f250 authorNick Dedekind <nick.dedekind@canonical.com> dateFri 17 Mar 2017, 09:38 (10 years ago) parent83d36b3e174ec3
19 files changed+190−114
plugins/WindowManager/CMakeLists.txt+2 plugins/WindowManager/Screen.cpp+7−1 plugins/WindowManager/Screen.h+1−2 plugins/WindowManager/ScreenAttached.cpp+1−1 plugins/WindowManager/TopLevelWindowModel.cpp+10−29 plugins/WindowManager/TopLevelWindowModel.h+5−30 plugins/WindowManager/WindowManagerObjects.cpp+47 plugins/WindowManager/WindowManagerObjects.h+64 plugins/WindowManager/WindowManagerPlugin.cpp+8−1 plugins/WindowManager/Workspace.cpp+2 plugins/WindowManager/Workspace.h+5−3 plugins/WindowManager/WorkspaceManager.cpp+7−13 plugins/WindowManager/WorkspaceManager.h−9 qml/Shell.qml+10−13 qml/ShellApplication.qml+7−2 qml/Stage/Spread/WorkspacePreview.qml+3−8 qml/Stage/Spread/Workspaces.qml+1−1 tests/mocks/WindowManager/CMakeLists.txt+2 tests/mocks/WindowManager/WindowManagerPlugin.cpp+8−1
plugins/WindowManager/CMakeLists.txt+2
@@ -16,10 +16,12 @@ set(WINDOWMANAGER_SRC
1616 ScreenAttached.cpp
1717 Screens.cpp
1818 ScreenWindow.cpp
19+ WindowManagerObjects.cpp
1920 Workspace.cpp
2021 WorkspaceManager.cpp
2122 WorkspaceModel.cpp
2223 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
24+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
2325 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
2426 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
2527 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceListInterface.h
plugins/WindowManager/Screen.cpp+7−1
@@ -39,6 +39,12 @@ void ScreenInterface::connectToScreen(qtmir::Screen *screen)
3939 connect(screen, &qtmir::Screen::availableModesChanged, this, &ScreenInterface::availableModesChanged);
4040}
4141
42+void ScreenInterface::connectToScreen(ScreenInterface *screen)
43+{
44+ connectToScreen(screen->wrapped());
45+ connect(screen, &ScreenInterface::currentWorkspaceChanged, this, &ScreenInterface::currentWorkspaceChanged);
46+}
47+
4248qtmir::OutputId ScreenInterface::outputId() const
4349{
4450 if (!m_wrapped) return qtmir::OutputId(-1);
@@ -253,7 +259,7 @@ ScreenProxy::ScreenProxy(ScreenInterface *const screen)
253259 : m_workspaces(new WorkspaceModelProxy(screen->workspaces()))
254260 , m_original(screen)
255261{
256− connectToScreen(screen->wrapped());
262+ connectToScreen(screen);
257263
258264 auto updateCurrentWorkspaceFn = [this](Workspace* realWorkspace) {
259265 Q_FOREACH(Workspace* workspace, m_workspaces->list()) {
plugins/WindowManager/Screen.h+1−2
@@ -15,7 +15,6 @@ class ScreenInterface: public QObject
1515 Q_OBJECT
1616
1717 Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged)
18−
1918 Q_PROPERTY(bool used READ used NOTIFY usedChanged)
2019 Q_PROPERTY(QString name READ name NOTIFY nameChanged)
2120 Q_PROPERTY(qtmir::OutputTypes outputType READ outputType NOTIFY outputTypeChanged)
@@ -28,7 +27,6 @@ class ScreenInterface: public QObject
2827 Q_PROPERTY(QQmlListProperty<qtmir::ScreenMode> availableModes READ availableModes NOTIFY availableModesChanged)
2928 Q_PROPERTY(QSizeF physicalSize READ physicalSize NOTIFY physicalSizeChanged)
3029 Q_PROPERTY(QString outputTypeName READ outputTypeName NOTIFY outputTypeChanged)
31−
3230 Q_PROPERTY(WorkspaceModel* workspaces READ workspaces CONSTANT)
3331 Q_PROPERTY(Workspace* currentWorkspace READ currentWorkspace WRITE setCurrentWorkspace NOTIFY currentWorkspaceChanged)
3432public:
@@ -82,6 +80,7 @@ protected:
8280 ScreenInterface(QObject* parent = 0);
8381
8482 void connectToScreen(qtmir::Screen* screen);
83+ void connectToScreen(ScreenInterface* screen);
8584
8685protected:
8786 QPointer<qtmir::Screen> m_wrapped;
plugins/WindowManager/ScreenAttached.cpp+1−1
@@ -140,7 +140,7 @@ void ScreenAttached::screenChanged2(ScreenInterface* screen)
140140 Q_EMIT availableModesChanged();
141141 }
142142
143− connectToScreen(screen->wrapped());
143+ connectToScreen(screen);
144144}
145145
146146ScreenAttached *WMScreen::qmlAttachedProperties(QObject *owner)
plugins/WindowManager/TopLevelWindowModel.cpp+10−29
@@ -15,6 +15,7 @@
1515 */
1616
1717#include "TopLevelWindowModel.h"
18+#include "WindowManagerObjects.h"
1819
1920// unity-api
2021#include <unity/shell/application/ApplicationInfoInterface.h>
@@ -42,8 +43,16 @@ Q_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL, "toplevelwindowmodel", QtInfoMsg)
4243
4344namespace unityapi = unity::shell::application;
4445
45−TopLevelWindowModel::TopLevelWindowModel()
46+TopLevelWindowModel::TopLevelWindowModel(Workspace* workspace)
47+ : m_workspace(workspace)
4648{
49+ connect(WindowManagerObjects::instance(), &WindowManagerObjects::applicationManagerChanged,
50+ this, &TopLevelWindowModel::setApplicationManager);
51+ connect(WindowManagerObjects::instance(), &WindowManagerObjects::surfaceManagerChanged,
52+ this, &TopLevelWindowModel::setSurfaceManager);
53+
54+ setApplicationManager(WindowManagerObjects::instance()->applicationManager());
55+ setSurfaceManager(WindowManagerObjects::instance()->surfaceManager());
4756}
4857
4958void TopLevelWindowModel::setApplicationManager(unityapi::ApplicationManagerInterface* value)
@@ -86,7 +95,6 @@ void TopLevelWindowModel::setApplicationManager(unityapi::ApplicationManagerInte
8695 });
8796 }
8897
89− Q_EMIT applicationManagerChanged(m_applicationManager);
9098 refreshWindows();
9199
92100 endResetModel();
@@ -125,33 +133,6 @@ void TopLevelWindowModel::setSurfaceManager(unityapi::SurfaceManagerInterface *s
125133 }
126134
127135 refreshWindows();
128− Q_EMIT surfaceManagerChanged(m_surfaceManager);
129−
130− endResetModel();
131− m_modelState = IdleState;
132−}
133−
134−void TopLevelWindowModel::setWorkspace(Workspace *workspace)
135−{
136− if (workspace == m_workspace) {
137− return;
138− }
139−
140− DEBUG_MSG << "(" << workspace << ")";
141−
142− Q_ASSERT(m_modelState == IdleState);
143− m_modelState = ResettingState;
144−
145− beginResetModel();
146−
147− if (m_workspace) {
148− disconnect(m_workspace, 0, this, 0);
149− }
150−
151− m_workspace = workspace;
152−
153− refreshWindows();
154− Q_EMIT workspaceChanged(workspace);
155136
156137 endResetModel();
157138 m_modelState = IdleState;
plugins/WindowManager/TopLevelWindowModel.h+5−30
@@ -75,21 +75,6 @@ class TopLevelWindowModel : public QAbstractListModel
7575 */
7676 Q_PROPERTY(Window* focusedWindow READ focusedWindow NOTIFY focusedWindowChanged)
7777
78− Q_PROPERTY(Workspace* workspace
79− READ workspace
80− WRITE setWorkspace
81− NOTIFY workspaceChanged)
82−
83− Q_PROPERTY(unity::shell::application::SurfaceManagerInterface* surfaceManager
84− READ surfaceManager
85− WRITE setSurfaceManager
86− NOTIFY surfaceManagerChanged)
87−
88− Q_PROPERTY(unity::shell::application::ApplicationManagerInterface* applicationManager
89− READ applicationManager
90− WRITE setApplicationManager
91− NOTIFY applicationManagerChanged)
92−
9378 /**
9479 The id to be used on the next entry created
9580 Useful for tests
@@ -108,7 +93,7 @@ public:
10893 ApplicationRole = Qt::UserRole + 1,
10994 };
11095
111− TopLevelWindowModel();
96+ TopLevelWindowModel(Workspace* workspace);
11297
11398 // From QAbstractItemModel
11499 int rowCount(const QModelIndex &parent = QModelIndex()) const override;
@@ -119,20 +104,11 @@ public:
119104 return roleNames;
120105 }
121106
122− // Own API
123−
124− Workspace* workspace() const { return m_workspace; }
125− void setWorkspace(Workspace* workspace);
107+ // Own API;
126108
127109 unity::shell::application::MirSurfaceInterface* inputMethodSurface() const;
128110 Window* focusedWindow() const;
129111
130− unity::shell::application::ApplicationManagerInterface *applicationManager() const { return m_applicationManager; }
131− void setApplicationManager(unity::shell::application::ApplicationManagerInterface*);
132−
133− unity::shell::application::SurfaceManagerInterface *surfaceManager() const { return m_surfaceManager; }
134− void setSurfaceManager(unity::shell::application::SurfaceManagerInterface*);
135−
136112 int nextId() const { return m_nextId; }
137113
138114public:
@@ -179,8 +155,6 @@ Q_SIGNALS:
179155 void countChanged();
180156 void inputMethodSurfaceChanged(unity::shell::application::MirSurfaceInterface* inputMethodSurface);
181157 void focusedWindowChanged(Window *focusedWindow);
182− void applicationManagerChanged(unity::shell::application::ApplicationManagerInterface*);
183− void surfaceManagerChanged(unity::shell::application::SurfaceManagerInterface*);
184158
185159 /**
186160 * @brief Emitted when the list changes
@@ -191,9 +165,10 @@ Q_SIGNALS:
191165
192166 void nextIdChanged();
193167
194− void workspaceChanged(Workspace*);
195−
196168private Q_SLOTS:
169+ void setApplicationManager(unity::shell::application::ApplicationManagerInterface*);
170+ void setSurfaceManager(unity::shell::application::SurfaceManagerInterface*);
171+
197172 void onSurfaceCreated(unity::shell::application::MirSurfaceInterface *surface);
198173 void onSurfacesAddedToWorkspace(const std::shared_ptr<miral::Workspace>& workspace,
199174 const QVector<unity::shell::application::MirSurfaceInterface*> surfaces);
plugins/WindowManager/WindowManagerObjects.cppnew file+47
@@ -0,0 +1,47 @@
1+/*
2+ * Copyright (C) 2017 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "WindowManagerObjects.h"
18+
19+WindowManagerObjects::WindowManagerObjects(QObject *parent)
20+ : QObject(parent)
21+ , m_surfaceManager(nullptr)
22+ , m_applicationManager(nullptr)
23+{
24+}
25+
26+WindowManagerObjects *WindowManagerObjects::instance()
27+{
28+ static WindowManagerObjects* objects(new WindowManagerObjects());
29+ return objects;
30+}
31+
32+
33+void WindowManagerObjects::setSurfaceManager(unity::shell::application::SurfaceManagerInterface *surfaceManager)
34+{
35+ if (m_surfaceManager == surfaceManager) return;
36+
37+ m_surfaceManager = surfaceManager;
38+ Q_EMIT surfaceManagerChanged(surfaceManager);
39+}
40+
41+void WindowManagerObjects::setApplicationManager(unity::shell::application::ApplicationManagerInterface *applicationManager)
42+{
43+ if (m_applicationManager == applicationManager) return;
44+
45+ m_applicationManager = applicationManager;
46+ Q_EMIT applicationManagerChanged(applicationManager);
47+}
plugins/WindowManager/WindowManagerObjects.hnew file+64
@@ -0,0 +1,64 @@
1+/*
2+ * Copyright (C) 2017 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef WINDOWMANAGEROBJECTS_H
18+#define WINDOWMANAGEROBJECTS_H
19+
20+#include <QObject>
21+
22+namespace unity {
23+ namespace shell {
24+ namespace application {
25+ class SurfaceManagerInterface;
26+ class ApplicationManagerInterface;
27+ }
28+ }
29+}
30+
31+class WindowManagerObjects : public QObject
32+{
33+ Q_OBJECT
34+
35+ Q_PROPERTY(unity::shell::application::SurfaceManagerInterface* surfaceManager
36+ READ surfaceManager
37+ WRITE setSurfaceManager
38+ NOTIFY surfaceManagerChanged)
39+
40+ Q_PROPERTY(unity::shell::application::ApplicationManagerInterface* applicationManager
41+ READ applicationManager
42+ WRITE setApplicationManager
43+ NOTIFY applicationManagerChanged)
44+public:
45+ explicit WindowManagerObjects(QObject *parent = 0);
46+
47+ static WindowManagerObjects *instance();
48+
49+ unity::shell::application::SurfaceManagerInterface *surfaceManager() const { return m_surfaceManager; }
50+ void setSurfaceManager(unity::shell::application::SurfaceManagerInterface*);
51+
52+ unity::shell::application::ApplicationManagerInterface *applicationManager() const { return m_applicationManager; }
53+ void setApplicationManager(unity::shell::application::ApplicationManagerInterface*);
54+
55+Q_SIGNALS:
56+ void surfaceManagerChanged(unity::shell::application::SurfaceManagerInterface*);
57+ void applicationManagerChanged(unity::shell::application::ApplicationManagerInterface*);
58+
59+private:
60+ unity::shell::application::SurfaceManagerInterface* m_surfaceManager;
61+ unity::shell::application::ApplicationManagerInterface* m_applicationManager;
62+};
63+
64+#endif // WINDOWMANAGEROBJECTS_H
plugins/WindowManager/WindowManagerPlugin.cpp+8−1
@@ -22,6 +22,7 @@
2222#include "ScreenWindow.h"
2323#include "TopLevelWindowModel.h"
2424#include "Window.h"
25+#include "WindowManagerObjects.h"
2526#include "WorkspaceManager.h"
2627#include "Workspace.h"
2728#include "WorkspaceModel.h"
@@ -42,19 +43,25 @@ QObject* screensSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
4243 Q_UNUSED(scriptEngine);
4344 return new Screens(qtmir::get_screen_model());
4445}
46+QObject* objectsSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
47+ Q_UNUSED(engine);
48+ Q_UNUSED(scriptEngine);
49+ return WindowManagerObjects::instance();
50+}
4551
4652void WindowManagerPlugin::registerTypes(const char *uri)
4753{
48− qmlRegisterType<TopLevelWindowModel>(uri, 1, 0, "TopLevelWindowModel");
4954 qmlRegisterSingletonType<WorkspaceManager>(uri, 1, 0, "WorkspaceManager", workspace_manager);
5055 qmlRegisterUncreatableType<WorkspaceModel>(uri, 1, 0, "WorkspaceModel", notInstantiatable);
5156 qmlRegisterSingletonType<Screens>(uri, 1, 0, "Screens", screensSingleton);
5257 qmlRegisterUncreatableType<qtmir::ScreenMode>(uri, 1, 0, "ScreenMode", notInstantiatable);
5358 qmlRegisterUncreatableType<Workspace>(uri, 1, 0, "Workspace", notInstantiatable);
59+ qmlRegisterSingletonType<WindowManagerObjects>(uri, 1, 0, "WindowManagerObjects", objectsSingleton);
5460
5561 qRegisterMetaType<Screen*>("Screen*");
5662 qRegisterMetaType<ScreensProxy*>("ScreensProxy*");
5763 qRegisterMetaType<Workspace*>("Workspace*");
64+ qRegisterMetaType<TopLevelWindowModel*>("TopLevelWindowModel*");
5865
5966 qRegisterMetaType<Window*>("Window*");
6067 qRegisterMetaType<QAbstractListModel*>("QAbstractListModel*");
plugins/WindowManager/Workspace.cpp+2
@@ -27,6 +27,7 @@ Workspace::Workspace(QObject *parent)
2727 : QObject(parent)
2828 , m_workspace(WMPolicyInterface::instance()->createWorkspace())
2929 , m_model(nullptr)
30+ , m_windowModel(new TopLevelWindowModel(this))
3031 , m_active(false)
3132{
3233 setObjectName((QString("Wks%1").arg(nextWorkspace++)));
@@ -48,6 +49,7 @@ Workspace::Workspace(const Workspace &other)
4849 : QObject(nullptr)
4950 , m_workspace(other.m_workspace)
5051 , m_model(nullptr)
52+ , m_windowModel(other.m_windowModel)
5153 , m_active(other.m_active)
5254{
5355 setObjectName(other.objectName());
plugins/WindowManager/Workspace.h+5−3
@@ -41,6 +41,7 @@ class Workspace : public QObject
4141{
4242 Q_OBJECT
4343 Q_PROPERTY(bool active READ isActive NOTIFY activeChanged)
44+ Q_PROPERTY(TopLevelWindowModel* windowModel READ windowModel NOTIFY windowModelChanged)
4445public:
4546 ~Workspace();
4647
@@ -49,10 +50,10 @@ public:
4950 void release();
5051
5152 virtual bool isActive() const { return m_active; }
52− bool isAssigned() const;
5353
54+ TopLevelWindowModel *windowModel() const { return m_windowModel; }
5455 std::shared_ptr<miral::Workspace> workspace() const { return m_workspace; }
55−
56+ bool isAssigned() const;
5657
5758public Q_SLOTS:
5859 virtual void activate();
@@ -62,6 +63,7 @@ Q_SIGNALS:
6263 void unassigned();
6364
6465 void activeChanged(bool);
66+ void windowModelChanged();
6567
6668protected:
6769 Workspace(QObject *parent = 0);
@@ -69,6 +71,7 @@ protected:
6971
7072 std::shared_ptr<miral::Workspace> m_workspace;
7173 WorkspaceModel* m_model;
74+ TopLevelWindowModel* m_windowModel;
7275 bool m_active;
7376
7477 friend class WorkspaceManager;
@@ -83,7 +86,6 @@ public:
8386 Q_INVOKABLE void assign(WorkspaceModel* model, const QVariant& index = QVariant()) override;
8487
8588 bool isActive() const override;
86−
8789 void activate() override;
8890
8991 Workspace* proxyObject() const { return m_original.data(); }
plugins/WindowManager/WorkspaceManager.cpp+7−13
@@ -17,6 +17,7 @@
1717#include "WorkspaceManager.h"
1818#include "Workspace.h"
1919#include "TopLevelWindowModel.h"
20+#include "WindowManagerObjects.h"
2021#include <unity/shell/application/SurfaceManagerInterface.h>
2122
2223// Qt
@@ -32,7 +33,6 @@ WorkspaceManager *WorkspaceManager::instance()
3233
3334WorkspaceManager::WorkspaceManager()
3435 : m_activeWorkspace(nullptr)
35− , m_surfaceManager(nullptr)
3636{
3737}
3838
@@ -99,25 +99,19 @@ void WorkspaceManager::destroyFloatingWorkspaces()
9999 }
100100}
101101
102−void WorkspaceManager::setSurfaceManager(unity::shell::application::SurfaceManagerInterface *surfaceManager)
103−{
104− if (m_surfaceManager == surfaceManager) return;
105−
106− m_surfaceManager = surfaceManager;
107− Q_EMIT surfaceManagerChanged();
108−}
109−
110102void WorkspaceManager::moveSurfaceToWorkspace(unity::shell::application::MirSurfaceInterface *surface, Workspace *workspace)
111103{
112− if (m_surfaceManager) {
113− m_surfaceManager->moveSurfaceToWorkspace(surface, workspace->workspace());
104+ auto surfaceManager = WindowManagerObjects::instance()->surfaceManager();
105+ if (surfaceManager) {
106+ surfaceManager->moveSurfaceToWorkspace(surface, workspace->workspace());
114107 }
115108}
116109
117110void WorkspaceManager::moveWorkspaceContentToWorkspace(Workspace *from, Workspace *to)
118111{
119− if (m_surfaceManager) {
120− m_surfaceManager->moveWorkspaceContentToWorkspace(from->workspace(), to->workspace());
112+ auto surfaceManager = WindowManagerObjects::instance()->surfaceManager();
113+ if (surfaceManager) {
114+ surfaceManager->moveWorkspaceContentToWorkspace(from->workspace(), to->workspace());
121115 }
122116}
123117
plugins/WindowManager/WorkspaceManager.h−9
@@ -37,11 +37,6 @@ class WorkspaceManager : public QObject
3737 Q_OBJECT
3838 Q_PROPERTY(Workspace* activeWorkspace READ activeWorkspace WRITE setActiveWorkspace2 NOTIFY activeWorkspaceChanged)
3939
40− Q_PROPERTY(unity::shell::application::SurfaceManagerInterface* surfaceManager
41− READ surfaceManager
42− WRITE setSurfaceManager
43− NOTIFY surfaceManagerChanged)
44−
4540public:
4641 static WorkspaceManager* instance();
4742
@@ -54,9 +49,6 @@ public:
5449 QQmlListProperty<Workspace> floatingWorkspaces();
5550 void destroyFloatingWorkspaces();
5651
57− unity::shell::application::SurfaceManagerInterface *surfaceManager() const { return m_surfaceManager; }
58− void setSurfaceManager(unity::shell::application::SurfaceManagerInterface*);
59−
6052 Q_INVOKABLE void moveSurfaceToWorkspace(unity::shell::application::MirSurfaceInterface* surface,
6153 Workspace* workspace);
6254
@@ -65,7 +57,6 @@ public:
6557Q_SIGNALS:
6658 void activeWorkspaceChanged();
6759 void floatingWorkspacesChanged();
68− void surfaceManagerChanged();
6960
7061private:
7162 WorkspaceManager();
qml/Shell.qml+10−13
@@ -98,6 +98,11 @@ StyledItem {
9898
9999 readonly property var mainApp: stage.mainApp
100100
101+ readonly property var topLevelSurfaceList: {
102+ if (!WMScreen.currentWorkspace) return null;
103+ return WMScreen.currentWorkspace.windowModel
104+ }
105+
101106 onMainAppChanged: {
102107 if (mainApp) {
103108 _onMainAppChanged(mainApp.appId);
@@ -274,14 +279,6 @@ StyledItem {
274279 width: parent.width
275280 height: parent.height
276281
277− TopLevelWindowModel {
278− id: topLevelSurfaceList
279− objectName: "topLevelSurfaceList"
280− applicationManager: ApplicationManager // it's a singleton
281− surfaceManager: SurfaceManager
282− workspace: screenWindow.screen.currentWorkspace
283− }
284−
285282 Stage {
286283 id: stage
287284 objectName: "stage"
@@ -292,7 +289,7 @@ StyledItem {
292289 background: wallpaperResolver.background
293290
294291 applicationManager: ApplicationManager
295− topLevelSurfaceList: topLevelSurfaceList
292+ topLevelSurfaceList: shell.topLevelSurfaceList
296293 inputMethodRect: inputMethod.visibleRect
297294 rightEdgePushProgress: rightEdgeBarrier.progress
298295
@@ -362,7 +359,7 @@ StyledItem {
362359 InputMethod {
363360 id: inputMethod
364361 objectName: "inputMethod"
365− surface: topLevelSurfaceList.inputMethodSurface
362+ surface: shell.topLevelSurfaceList.inputMethodSurface
366363 anchors {
367364 fill: parent
368365 topMargin: panel.panelHeight
@@ -546,8 +543,8 @@ StyledItem {
546543 && !stage.spreadShown
547544 }
548545
549− readonly property bool focusedSurfaceIsFullscreen: topLevelSurfaceList.focusedWindow
550− ? topLevelSurfaceList.focusedWindow.state === Mir.FullscreenState
546+ readonly property bool focusedSurfaceIsFullscreen: shell.topLevelSurfaceList.focusedWindow
547+ ? shell.topLevelSurfaceList.focusedWindow.state === Mir.FullscreenState
551548 : false
552549 fullscreenMode: (focusedSurfaceIsFullscreen && !LightDMService.greeter.active && launcher.progress == 0 && !stage.spreadShown)
553550 || greeter.hasLockedApp
@@ -876,7 +873,7 @@ StyledItem {
876873
877874 // non-visual objects
878875 KeymapSwitcher {
879− focusedSurface: topLevelSurfaceList.focusedWindow ? topLevelSurfaceList.focusedWindow.surface : null
876+ focusedSurface: shell.topLevelSurfaceList.focusedWindow ? shell.topLevelSurfaceList.focusedWindow.surface : null
880877 }
881878 BrightnessControl {}
882879
qml/ShellApplication.qml+7−2
@@ -47,9 +47,14 @@ Instantiator {
4747 primary: index == 0
4848 }
4949
50− property var workspaceManagerSurfaceManagerBinding: Binding {
51− target: WorkspaceManager
50+ property var windowManagerSurfaceManagerBinding: Binding {
51+ target: WindowManagerObjects
5252 property: "surfaceManager"
5353 value: SurfaceManager
5454 }
55+ property var windowManagerApplicationManagerBinding: Binding {
56+ target: WindowManagerObjects
57+ property: "applicationManager"
58+ value: ApplicationManager
59+ }
5560}
qml/Stage/Spread/WorkspacePreview.qml+3−8
@@ -9,6 +9,8 @@ Item {
99 id: previewSpace
1010 clip: true
1111
12+ property var workspace
13+
1214 property string background
1315 property int screenHeight
1416
@@ -26,16 +28,9 @@ Item {
2628 sourceSize.width: width
2729 sourceSize.height: height
2830
29− TopLevelWindowModel {
30− id: windowModel
31− applicationManager: ApplicationManager
32− surfaceManager: SurfaceManager
33− workspace: model.workspace
34− }
35−
3631 Repeater {
3732 id: topLevelSurfaceRepeater
38− model: visible ? windowModel : null
33+ model: visible ? workspace.windowModel : null
3934 delegate: Rectangle {
4035 width: surfaceItem.width
4136 height: surfaceItem.height + decorationHeight * previewScale
qml/Stage/Spread/Workspaces.qml+1−1
@@ -243,6 +243,7 @@ Item {
243243 containsDragLeft: listView.hoveredWorkspaceIndex == index && listView.hoveredHalf == "left"
244244 containsDragRight: listView.hoveredWorkspaceIndex == index && listView.hoveredHalf == "right"
245245 isActive: model.workspace.active
246+ workspace: model.workspace
246247 }
247248 MouseArea {
248249 anchors.fill: parent
@@ -366,7 +367,6 @@ Item {
366367 Drag.active: hoverMouseArea.drag.active
367368 Drag.keys: ['workspace']
368369
369− property var workspace
370370 property bool inDropArea: false
371371
372372 Rectangle {
tests/mocks/WindowManager/CMakeLists.txt+2
@@ -26,6 +26,7 @@ set(WINDOWMANAGER_SRC
2626 ${CMAKE_SOURCE_DIR}/plugins/WindowManager/ScreenWindow.cpp
2727 ${CMAKE_SOURCE_DIR}/plugins/WindowManager/TopLevelWindowModel.cpp
2828 ${CMAKE_SOURCE_DIR}/plugins/WindowManager/Window.cpp
29+ ${CMAKE_SOURCE_DIR}/plugins/WindowManager/WindowManagerObjects.cpp
2930 ${CMAKE_SOURCE_DIR}/plugins/WindowManager/WorkspaceManager.cpp
3031 ${CMAKE_SOURCE_DIR}/plugins/WindowManager/WorkspaceModel.cpp
3132 ${CMAKE_SOURCE_DIR}/plugins/WindowManager/Workspace.cpp
@@ -33,6 +34,7 @@ set(WINDOWMANAGER_SRC
3334 MockScreenWindow.cpp
3435 WindowManagerPlugin.cpp
3536 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
37+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
3638 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
3739 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
3840 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceListInterface.h
tests/mocks/WindowManager/WindowManagerPlugin.cpp+8−1
@@ -27,6 +27,7 @@
2727#include "Workspace.h"
2828#include "WorkspaceModel.h"
2929#include "WindowManagementPolicy.h"
30+#include "WindowManagerObjects.h"
3031
3132#include <QtQml>
3233
@@ -43,19 +44,25 @@ QObject* screensSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
4344 Q_UNUSED(scriptEngine);
4445 return new Screens(MockScreens::instance());
4546}
47+QObject* objectsSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
48+ Q_UNUSED(engine);
49+ Q_UNUSED(scriptEngine);
50+ return WindowManagerObjects::instance();
51+}
4652
4753void WindowManagerPlugin::registerTypes(const char *uri)
4854{
49− qmlRegisterType<TopLevelWindowModel>(uri, 1, 0, "TopLevelWindowModel");
5055 qmlRegisterSingletonType<WorkspaceManager>(uri, 1, 0, "WorkspaceManager", workspace_manager);
5156 qmlRegisterUncreatableType<WorkspaceModel>(uri, 1, 0, "WorkspaceModel", notInstantiatable);
5257 qmlRegisterSingletonType<Screens>(uri, 1, 0, "Screens", screensSingleton);
5358 qmlRegisterUncreatableType<qtmir::ScreenMode>(uri, 1, 0, "ScreenMode", notInstantiatable);
5459 qmlRegisterUncreatableType<Workspace>(uri, 1, 0, "Workspace", notInstantiatable);
60+ qmlRegisterSingletonType<WindowManagerObjects>(uri, 1, 0, "WindowManagerObjects", objectsSingleton);
5561
5662 qRegisterMetaType<Screen*>("Screen*");
5763 qRegisterMetaType<ScreensProxy*>("ScreensProxy*");
5864 qRegisterMetaType<Workspace*>("Workspace*");
65+ qRegisterMetaType<TopLevelWindowModel*>("TopLevelWindowModel*");
5966
6067 qRegisterMetaType<Window*>("Window*");
6168 qRegisterMetaType<QAbstractListModel*>("QAbstractListModel*");