@@ -16,6 +16,7 @@
1616
1717#include "Screens.h"
1818#include "Screen.h"
19+#include "WorkspaceManager.h"
1920
2021// qtmirserver
2122#include <qtmir/qtmir.h>
@@ -39,10 +40,16 @@ Screens::Screens(QObject *parent)
3940 connect(m_wrapped.data(), &qtmir::Screens::activeScreenChanged, this, &Screens::activeScreenChanged);
4041
4142 Q_FOREACH(qtmir::Screen* screen, m_wrapped->screens()) {
42− m_screenList.push_back(new Screen(screen));
43+ m_screens.push_back(new Screen(screen));
4344 }
4445}
4546
47+Screens::Screens(const Screens &other)
48+ : QAbstractListModel(nullptr)
49+ , m_wrapped(other.m_wrapped)
50+{
51+}
52+
4653QHash<int, QByteArray> Screens::roleNames() const
4754{
4855 QHash<int, QByteArray> roles;
@@ -52,13 +59,13 @@ QHash<int, QByteArray> Screens::roleNames() const
5259
5360QVariant Screens::data(const QModelIndex &index, int role) const
5461{
55− if (!index.isValid() || index.row() >= m_screenList.size()) {
62+ if (!index.isValid() || index.row() >= m_screens.size()) {
5663 return QVariant();
5764 }
5865
5966 switch(role) {
6067 case ScreenRole:
61− return QVariant::fromValue(m_screenList.at(index.row()));
68+ return QVariant::fromValue(m_screens.at(index.row()));
6269 } // switch
6370
6471 return QVariant();
@@ -71,48 +78,66 @@ int Screens::rowCount(const QModelIndex &) const
7178
7279int Screens::count() const
7380{
74− return m_screenList.size();
81+ return m_screens.size();
7582}
7683
7784QVariant Screens::activeScreen() const
7885{
79− for (int i = 0; i < m_screenList.count(); i++) {
80− if (m_screenList[i]->isActive()) return i;
86+ for (int i = 0; i < m_screens.count(); i++) {
87+ if (m_screens[i]->isActive()) return i;
8188 }
8289 return QVariant();
8390}
8491
92+ScreensProxy *Screens::createProxy()
93+{
94+ return new ScreensProxy(this);
95+}
96+
97+void Screens::sync(Screens *proxy)
98+{
99+ if (!proxy) return;
100+
101+ const auto& proxyList = proxy->list();
102+ for (int i = 0; i < m_screens.count() && i < proxyList.count(); ++i) {
103+ m_screens[i]->sync(proxyList[i]);
104+ }
105+
106+ // need to clean up all the workspaces we unassigned.
107+ WorkspaceManager::instance()->destroyFloatingWorkspaces();
108+}
109+
85110void Screens::activateScreen(const QVariant& vindex)
86111{
87112 bool ok = false;
88113 int index = vindex.toInt(&ok);
89− if (!ok || index < 0 || m_screenList.count() <= index) return;
114+ if (!ok || index < 0 || m_screens.count() <= index) return;
90115
91− auto screen = m_screenList.at(index);
116+ auto screen = m_screens.at(index);
92117 screen->setActive(true);
93118}
94119
95−void Screens::onScreenAdded(qtmir::Screen *screen)
120+void Screens::onScreenAdded(qtmir::Screen *added)
96121{
97− Q_FOREACH(auto screenWrapper, m_screenList) {
98− if (screenWrapper->wrapped() == screen) return;
122+ Q_FOREACH(auto screenWrapper, m_screens) {
123+ if (screenWrapper->wrapped() == added) return;
99124 }
100125
101126 beginInsertRows(QModelIndex(), count(), count());
102− auto screenWrapper(new Screen(screen));
103− m_screenList.push_back(screenWrapper);
127+ auto screenWrapper(new Screen(added));
128+ m_screens.push_back(screenWrapper);
104129 endInsertRows();
105130 Q_EMIT screenAdded(screenWrapper);
106131 Q_EMIT countChanged();
107132}
108133
109−void Screens::onScreenRemoved(qtmir::Screen *screen)
134+void Screens::onScreenRemoved(qtmir::Screen *removed)
110135{
111136 int index = 0;
112− QMutableListIterator<Screen*> iter(m_screenList);
137+ QMutableVectorIterator<Screen*> iter(m_screens);
113138 while(iter.hasNext()) {
114139 auto screenWrapper = iter.next();
115− if (screenWrapper->wrapped() == screen) {
140+ if (screenWrapper->wrapped() == removed) {
116141
117142 beginRemoveRows(QModelIndex(), index, index);
118143 iter.remove();
@@ -127,3 +152,47 @@ void Screens::onScreenRemoved(qtmir::Screen *screen)
127152 index++;
128153 }
129154}
155+
156+ScreensProxy::ScreensProxy(Screens * const screens)
157+ : Screens(*screens)
158+ , m_original(screens)
159+{
160+ connect(screens, &Screens::screenAdded, this, [this](Screen *added) {
161+ Q_FOREACH(auto screen, m_screens) {
162+ auto proxy = static_cast<ScreenProxy*>(screen);
163+ if (proxy->proxyObject() == added) return;
164+ }
165+
166+ beginInsertRows(QModelIndex(), count(), count());
167+ auto screenWrapper(new ScreenProxy(added));
168+ m_screens.push_back(screenWrapper);
169+ endInsertRows();
170+ Q_EMIT screenAdded(screenWrapper);
171+ Q_EMIT countChanged();
172+ });
173+
174+ connect(screens, &Screens::screenAdded, this, [this](Screen *removed) {
175+ int index = 0;
176+ QMutableVectorIterator<Screen*> iter(m_screens);
177+ while(iter.hasNext()) {
178+ auto proxy = static_cast<ScreenProxy*>(iter.next());
179+ if (proxy->proxyObject() == removed) {
180+
181+ beginRemoveRows(QModelIndex(), index, index);
182+ iter.remove();
183+ endRemoveRows();
184+
185+ Q_EMIT screenRemoved(proxy);
186+ Q_EMIT countChanged();
187+
188+ delete proxy;
189+ break;
190+ }
191+ index++;
192+ }
193+ });
194+
195+ Q_FOREACH(Screen* screen, screens->list()) {
196+ m_screens.push_back(new ScreenProxy(screen));
197+ }
198+}