@@ -16,6 +16,7 @@
17#include "Screens.h"
17#include "Screens.h"
18#include "Screen.h"
18#include "Screen.h"
19+#include "WorkspaceManager.h"
20// qtmirserver
21// qtmirserver
21#include <qtmir/qtmir.h>
22#include <qtmir/qtmir.h>
@@ -39,10 +40,16 @@ Screens::Screens(QObject *parent)
39 connect(m_wrapped.data(), &qtmir::Screens::activeScreenChanged, this, &Screens::activeScreenChanged);
40 connect(m_wrapped.data(), &qtmir::Screens::activeScreenChanged, this, &Screens::activeScreenChanged);
41 Q_FOREACH(qtmir::Screen* screen, m_wrapped->screens()) {
42 Q_FOREACH(qtmir::Screen* screen, m_wrapped->screens()) {
42− m_screenList.push_back(new Screen(screen));
43+ m_screens.push_back(new Screen(screen));
47+Screens::Screens(const Screens &other)
48+ : QAbstractListModel(nullptr)
49+ , m_wrapped(other.m_wrapped)
46QHash<int, QByteArray> Screens::roleNames() const
53QHash<int, QByteArray> Screens::roleNames() const
48 QHash<int, QByteArray> roles;
55 QHash<int, QByteArray> roles;
@@ -52,13 +59,13 @@ QHash<int, QByteArray> Screens::roleNames() const
53QVariant Screens::data(const QModelIndex &index, int role) const
60QVariant Screens::data(const QModelIndex &index, int role) const
55− if (!index.isValid() || index.row() >= m_screenList.size()) {
62+ if (!index.isValid() || index.row() >= m_screens.size()) {
56 return QVariant();
63 return QVariant();
59 switch(role) {
66 switch(role) {
60 case ScreenRole:
67 case ScreenRole:
61− return QVariant::fromValue(m_screenList.at(index.row()));
68+ return QVariant::fromValue(m_screens.at(index.row()));
62 } // switch
69 } // switch
64 return QVariant();
71 return QVariant();
@@ -71,48 +78,66 @@ int Screens::rowCount(const QModelIndex &) const
72int Screens::count() const
79int Screens::count() const
74− return m_screenList.size();
81+ return m_screens.size();
77QVariant Screens::activeScreen() const
84QVariant Screens::activeScreen() const
79− for (int i = 0; i < m_screenList.count(); i++) {
86+ for (int i = 0; i < m_screens.count(); i++) {
80− if (m_screenList[i]->isActive()) return i;
87+ if (m_screens[i]->isActive()) return i;
82 return QVariant();
89 return QVariant();
92+ScreensProxy *Screens::createProxy()
94+ return new ScreensProxy(this);
97+void Screens::sync(Screens *proxy)
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]);
106+ // need to clean up all the workspaces we unassigned.
107+ WorkspaceManager::instance()->destroyFloatingWorkspaces();
85void Screens::activateScreen(const QVariant& vindex)
110void Screens::activateScreen(const QVariant& vindex)
87 bool ok = false;
112 bool ok = false;
88 int index = vindex.toInt(&ok);
113 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;
91− auto screen = m_screenList.at(index);
116+ auto screen = m_screens.at(index);
92 screen->setActive(true);
117 screen->setActive(true);
95−void Screens::onScreenAdded(qtmir::Screen *screen)
120+void Screens::onScreenAdded(qtmir::Screen *added)
97− Q_FOREACH(auto screenWrapper, m_screenList) {
122+ Q_FOREACH(auto screenWrapper, m_screens) {
98− if (screenWrapper->wrapped() == screen) return;
123+ if (screenWrapper->wrapped() == added) return;
101 beginInsertRows(QModelIndex(), count(), count());
126 beginInsertRows(QModelIndex(), count(), count());
102− auto screenWrapper(new Screen(screen));
127+ auto screenWrapper(new Screen(added));
103− m_screenList.push_back(screenWrapper);
128+ m_screens.push_back(screenWrapper);
104 endInsertRows();
129 endInsertRows();
105 Q_EMIT screenAdded(screenWrapper);
130 Q_EMIT screenAdded(screenWrapper);
106 Q_EMIT countChanged();
131 Q_EMIT countChanged();
109−void Screens::onScreenRemoved(qtmir::Screen *screen)
134+void Screens::onScreenRemoved(qtmir::Screen *removed)
111 int index = 0;
136 int index = 0;
112− QMutableListIterator<Screen*> iter(m_screenList);
137+ QMutableVectorIterator<Screen*> iter(m_screens);
113 while(iter.hasNext()) {
138 while(iter.hasNext()) {
114 auto screenWrapper = iter.next();
139 auto screenWrapper = iter.next();
115− if (screenWrapper->wrapped() == screen) {
140+ if (screenWrapper->wrapped() == removed) {
117 beginRemoveRows(QModelIndex(), index, index);
142 beginRemoveRows(QModelIndex(), index, index);
118 iter.remove();
143 iter.remove();
@@ -127,3 +152,47 @@ void Screens::onScreenRemoved(qtmir::Screen *screen)
156+ScreensProxy::ScreensProxy(Screens * const screens)
158+ , m_original(screens)
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;
166+ beginInsertRows(QModelIndex(), count(), count());
167+ auto screenWrapper(new ScreenProxy(added));
168+ m_screens.push_back(screenWrapper);
170+ Q_EMIT screenAdded(screenWrapper);
171+ Q_EMIT countChanged();
174+ connect(screens, &Screens::screenAdded, this, [this](Screen *removed) {
176+ QMutableVectorIterator<Screen*> iter(m_screens);
177+ while(iter.hasNext()) {
178+ auto proxy = static_cast<ScreenProxy*>(iter.next());
179+ if (proxy->proxyObject() == removed) {
181+ beginRemoveRows(QModelIndex(), index, index);
185+ Q_EMIT screenRemoved(proxy);
186+ Q_EMIT countChanged();
195+ Q_FOREACH(Screen* screen, screens->list()) {
196+ m_screens.push_back(new ScreenProxy(screen));