on xenial help sign in
fixed proxy syncing
commitd55f7836b1bd4ff4a6d8b07ad100191e4e0691ba authorNick Dedekind <nick.dedekind@canonical.com> dateMon 27 Mar 2017, 14:54 (10 years ago) parent3667e72
6 files changed+46−41
plugins/WindowManager/Screen.cpp+8−7 plugins/WindowManager/Screen.h+5−5 plugins/WindowManager/Screens.cpp+12−11 plugins/WindowManager/Screens.h+5−4 plugins/WindowManager/WorkspaceModel.cpp+11−9 plugins/WindowManager/WorkspaceModel.h+5−5
plugins/WindowManager/Screen.cpp+8−7
@@ -185,11 +185,6 @@ QString Screen::outputTypeName() const
185185 return QString();
186186}
187187
188−void Screen::setSyncing(bool syncing)
189−{
190− workspaces()->setSyncing(syncing);
191−}
192−
193188void Screen::sync(Screen *proxy)
194189{
195190 if (!proxy) return;
@@ -258,9 +253,10 @@ void ConcreteScreen::setCurrentWorkspace(Workspace *workspace)
258253 }
259254}
260255
261−ProxyScreen::ProxyScreen(Screen *const screen)
262− : m_workspaces(new ProxyWorkspaceModel(screen->workspaces()))
256+ProxyScreen::ProxyScreen(Screen *const screen, ProxyScreens* screens)
257+ : m_workspaces(new ProxyWorkspaceModel(screen->workspaces(), this))
263258 , m_original(screen)
259+ , m_screens(screens)
264260{
265261 connectToScreen(screen);
266262
@@ -296,3 +292,8 @@ void ProxyScreen::setCurrentWorkspace(Workspace *workspace)
296292 m_original->setCurrentWorkspace(p->proxyObject());
297293 }
298294}
295+
296+bool ProxyScreen::isSyncing() const
297+{
298+ return m_screens->isSyncing();
299+}
plugins/WindowManager/Screen.h+5−5
@@ -8,7 +8,7 @@
88#include "WorkspaceModel.h"
99
1010class ProxyScreen;
11−class ScreenAttached;
11+class ProxyScreens;
1212
1313class Screen: public QObject
1414{
@@ -56,7 +56,6 @@ public:
5656 virtual Workspace *currentWorkspace() const = 0;
5757 virtual void setCurrentWorkspace(Workspace* workspace) = 0;
5858
59− void setSyncing(bool);
6059 void sync(Screen* proxy);
6160
6261 qtmir::Screen* wrapped() const { return m_wrapped; }
@@ -102,8 +101,6 @@ public:
102101 Workspace *currentWorkspace() const override;
103102 void setCurrentWorkspace(Workspace* workspace) override;
104103
105− static ScreenAttached *qmlAttachedProperties(QObject *owner);
106−
107104protected:
108105 void resetCurrentWorkspace();
109106
@@ -115,7 +112,7 @@ class ProxyScreen : public Screen
115112{
116113 Q_OBJECT
117114public:
118− explicit ProxyScreen(Screen*const screen);
115+ explicit ProxyScreen(Screen*const screen, ProxyScreens* screens);
119116
120117 // From qtmir::Screen
121118 WorkspaceModel* workspaces() const override;
@@ -124,9 +121,12 @@ public:
124121
125122 Screen* proxyObject() const { return m_original.data(); }
126123
124+ bool isSyncing() const;
125+
127126private:
128127 const QScopedPointer<WorkspaceModel> m_workspaces;
129128 const QPointer<Screen> m_original;
129+ const ProxyScreens* m_screens;
130130 QPointer<Workspace> m_currentWorspace;
131131};
132132
plugins/WindowManager/Screens.cpp+12−11
@@ -127,22 +127,17 @@ ProxyScreens *ConcreteScreens::createProxy()
127127 return new ProxyScreens(this);
128128}
129129
130−void ConcreteScreens::sync(Screens *proxy)
130+void ConcreteScreens::sync(ProxyScreens *proxy)
131131{
132132 if (!proxy) return;
133−
134− for (auto screen : m_screens) {
135− screen->setSyncing(true);
136− }
133+ proxy->setSyncing(true);
137134
138135 const auto& proxyList = proxy->list();
139136 for (int i = 0; i < m_screens.count() && i < proxyList.count(); ++i) {
140137 m_screens[i]->sync(proxyList[i]);
141138 }
142139
143− for (auto screen : m_screens) {
144− screen->setSyncing(false);
145− }
140+ proxy->setSyncing(true);
146141}
147142
148143void ConcreteScreens::onScreenAdded(qtmir::Screen *added)
@@ -189,6 +184,7 @@ void ConcreteScreens::onScreenRemoved(qtmir::Screen *removed)
189184ProxyScreens::ProxyScreens(Screens * const screens)
190185 : Screens(screens->m_wrapped)
191186 , m_original(screens)
187+ , m_syncing(false)
192188{
193189 connect(screens, &Screens::screenAdded, this, [this](Screen *added) {
194190 Q_FOREACH(auto screen, m_screens) {
@@ -197,7 +193,7 @@ ProxyScreens::ProxyScreens(Screens * const screens)
197193 }
198194
199195 beginInsertRows(QModelIndex(), count(), count());
200− auto screenWrapper(new ProxyScreen(added));
196+ auto screenWrapper(new ProxyScreen(added, this));
201197 QQmlEngine::setObjectOwnership(screenWrapper, QQmlEngine::CppOwnership);
202198 m_screens.push_back(screenWrapper);
203199 endInsertRows();
@@ -227,8 +223,13 @@ ProxyScreens::ProxyScreens(Screens * const screens)
227223 });
228224
229225 Q_FOREACH(Screen* screen, screens->list()) {
230− auto screenWrapper(new ProxyScreen(screen));
226+ auto screenWrapper(new ProxyScreen(screen, this));
231227 QQmlEngine::setObjectOwnership(screenWrapper, QQmlEngine::CppOwnership);
232− m_screens.push_back(new ProxyScreen(screen));
228+ m_screens.push_back(screenWrapper);
233229 }
234230}
231+
232+void ProxyScreens::setSyncing(bool syncing)
233+{
234+ m_syncing = syncing;
235+}
plugins/WindowManager/Screens.h+5−4
@@ -52,8 +52,6 @@ public:
5252 int count() const;
5353 QVariant activeScreen() const;
5454
55− bool isSyncing() const { return m_syncing; }
56−
5755 const QVector<Screen*>& list() const { return m_screens; }
5856
5957public Q_SLOTS:
@@ -71,7 +69,6 @@ protected:
7169
7270 QVector<Screen*> m_screens;
7371 const QSharedPointer<qtmir::Screens> m_wrapped;
74− bool m_syncing;
7572
7673 friend class ProxyScreens;
7774};
@@ -84,7 +81,7 @@ public:
8481 ~ConcreteScreens();
8582
8683 Q_INVOKABLE ProxyScreens *createProxy();
87− Q_INVOKABLE void sync(Screens *proxy);
84+ Q_INVOKABLE void sync(ProxyScreens *proxy);
8885
8986 static ConcreteScreens *self();
9087
@@ -103,8 +100,12 @@ class ProxyScreens : public Screens
103100public:
104101 explicit ProxyScreens(Screens*const screens);
105102
103+ void setSyncing(bool syncing);
104+ bool isSyncing() const { return m_syncing; }
105+
106106private:
107107 const QPointer<Screens> m_original;
108+ bool m_syncing;
108109};
109110
110111#endif // SCREENS_H
plugins/WindowManager/WorkspaceModel.cpp+11−9
@@ -17,6 +17,7 @@
1717#include "WorkspaceModel.h"
1818#include "WorkspaceManager.h"
1919#include "Workspace.h"
20+#include "Screen.h"
2021
2122#include <QQmlEngine>
2223
@@ -119,11 +120,6 @@ QVariant WorkspaceModel::data(const QModelIndex &index, int role) const
119120 }
120121}
121122
122−void WorkspaceModel::setSyncing(bool syncing)
123−{
124− m_syncing = syncing;
125−}
126−
127123void WorkspaceModel::sync(WorkspaceModel *proxy)
128124{
129125 if (!proxy) return;
@@ -206,8 +202,9 @@ void WorkspaceModel::insertUnassigned(Workspace *workspace)
206202}
207203
208204
209−ProxyWorkspaceModel::ProxyWorkspaceModel(WorkspaceModel * const model)
205+ProxyWorkspaceModel::ProxyWorkspaceModel(WorkspaceModel * const model, ProxyScreen* screen)
210206 : m_original(model)
207+ , m_screen(screen)
211208{
212209 Q_FOREACH(auto workspace, model->list()) {
213210 auto proxy = new ProxyWorkspace(workspace);
@@ -215,12 +212,12 @@ ProxyWorkspaceModel::ProxyWorkspaceModel(WorkspaceModel * const model)
215212 proxy->assign(this);
216213 }
217214 connect(m_original, &WorkspaceModel::workspaceInserted, this, [this](int index, Workspace* inserted) {
218− if (m_original->isSyncing()) return;
215+ if (isSyncing()) return;
219216
220217 (new ProxyWorkspace(inserted))->assign(this, index);
221218 });
222219 connect(m_original, &WorkspaceModel::workspaceRemoved, this, [this](Workspace* removed) {
223− if (m_original->isSyncing()) return;
220+ if (isSyncing()) return;
224221
225222 for (int i = 0; i < rowCount(); i++) {
226223 auto workspaceProxy = qobject_cast<ProxyWorkspace*>(get(i));
@@ -232,7 +229,7 @@ ProxyWorkspaceModel::ProxyWorkspaceModel(WorkspaceModel * const model)
232229 }
233230 });
234231 connect(m_original, &WorkspaceModel::workspaceMoved, this, [this](int from, int to) {
235− if (m_original->isSyncing()) return;
232+ if (isSyncing()) return;
236233
237234 move(from, to);
238235 });
@@ -243,6 +240,11 @@ void ProxyWorkspaceModel::move(int from, int to)
243240 WorkspaceModel::move(from, to);
244241}
245242
243+bool ProxyWorkspaceModel::isSyncing() const
244+{
245+ return m_screen->isSyncing();
246+}
247+
246248void ProxyWorkspaceModel::addWorkspace()
247249{
248250 auto newWorkspace = WorkspaceManager::instance()->createWorkspace();
plugins/WindowManager/WorkspaceModel.h+5−5
@@ -25,6 +25,7 @@ Q_DECLARE_LOGGING_CATEGORY(WORKSPACES)
2525
2626class Workspace;
2727class ProxyWorkspaceModel;
28+class ProxyScreen;
2829
2930class WorkspaceModel : public QAbstractListModel
3031{
@@ -61,12 +62,9 @@ public:
6162
6263 const QVector<Workspace*>& list() const { return m_workspaces; }
6364
64− void setSyncing(bool);
6565 void sync(WorkspaceModel* proxy);
6666 void finishSync();
6767
68− bool isSyncing() { return m_syncing; }
69−
7068Q_SIGNALS:
7169 void countChanged();
7270
@@ -79,7 +77,6 @@ protected:
7977
8078 QVector<Workspace*> m_workspaces;
8179 QSet<Workspace*> m_unassignedWorkspaces;
82− bool m_syncing;
8380
8481 friend class ProxyWorkspaceModel;
8582};
@@ -88,15 +85,18 @@ class ProxyWorkspaceModel : public WorkspaceModel
8885{
8986 Q_OBJECT
9087public:
91− explicit ProxyWorkspaceModel(WorkspaceModel*const model);
88+ explicit ProxyWorkspaceModel(WorkspaceModel*const model, ProxyScreen* screen);
9289
9390 Q_INVOKABLE void move(int from, int to) override;
9491
92+ bool isSyncing() const;
93+
9594public Q_SLOTS:
9695 void addWorkspace();
9796
9897protected:
9998 const QPointer<WorkspaceModel> m_original;
99+ const ProxyScreen* m_screen;
100100};
101101
102102#endif // WORKSPACEMODEL_H