diff --git a/plugins/platforms/virtual/screens_virtual.cpp b/plugins/platforms/virtual/screens_virtual.cpp --- a/plugins/platforms/virtual/screens_virtual.cpp +++ b/plugins/platforms/virtual/screens_virtual.cpp @@ -56,7 +56,7 @@ if (screen >= outputs.size()) { return QRect(); } - return outputs.at(screen).geometry(); + return outputs.at(screen)->geometry(); } QSize VirtualScreens::size(int screen) const @@ -75,7 +75,7 @@ int minDistance = INT_MAX; const auto outputs = m_backend->outputs(); for (int i = 0; i < outputs.size(); ++i) { - const QRect &geo = outputs.at(i).geometry(); + const QRect &geo = outputs.at(i)->geometry(); if (geo.contains(pos)) { return i; } diff --git a/plugins/platforms/virtual/virtual_backend.h b/plugins/platforms/virtual/virtual_backend.h --- a/plugins/platforms/virtual/virtual_backend.h +++ b/plugins/platforms/virtual/virtual_backend.h @@ -20,7 +20,6 @@ #ifndef KWIN_VIRTUAL_BACKEND_H #define KWIN_VIRTUAL_BACKEND_H #include "platform.h" -#include "virtual_output.h" #include @@ -33,7 +32,7 @@ namespace KWin { -struct ColorCorrect::GammaRamp; +class VirtualOutput; class KWIN_EXPORT VirtualBackend : public Platform { @@ -49,7 +48,7 @@ int outputCount() const { return m_outputs.size(); } - const QVector outputs() const { + const QVector outputs() const { return m_outputs; } qreal outputScale() const { @@ -95,7 +94,7 @@ void virtualOutputsSet(bool countChanged); private: - QVector m_outputs; + QVector m_outputs; qreal m_outputScale = 1; diff --git a/plugins/platforms/virtual/virtual_backend.cpp b/plugins/platforms/virtual/virtual_backend.cpp --- a/plugins/platforms/virtual/virtual_backend.cpp +++ b/plugins/platforms/virtual/virtual_backend.cpp @@ -18,6 +18,7 @@ along with this program. If not, see . *********************************************************************/ #include "virtual_backend.h" +#include "virtual_output.h" #include "scene_qpainter_virtual_backend.h" #include "screens_virtual.h" #include "wayland_server.h" @@ -33,7 +34,6 @@ #if HAVE_GBM #include #endif -#include namespace KWin { @@ -75,8 +75,8 @@ * TODO: rewrite all tests to explicitly set the outputs. */ if (!m_outputs.size()) { - auto dummyOutput = VirtualOutput(this); - dummyOutput.m_geo = QRect(QPoint(0, 0), initialWindowSize()); + VirtualOutput *dummyOutput = new VirtualOutput(this); + dummyOutput->m_geo = QRect(QPoint(0, 0), initialWindowSize()); m_outputs = { dummyOutput }; } @@ -118,29 +118,31 @@ Q_ASSERT(geometries.size() == 0 || geometries.size() == count); bool countChanged = m_outputs.size() != count; + qDeleteAll(m_outputs.begin(), m_outputs.end()); m_outputs.resize(count); int sumWidth = 0; for (int i = 0; i < count; i++) { - VirtualOutput& o = m_outputs[i]; + VirtualOutput *vo = new VirtualOutput(this); if (geometries.size()) { - o.m_geo = geometries.at(i); - } else if (!o.m_geo.isValid()) { - o.m_geo = QRect(QPoint(sumWidth, 0), initialWindowSize()); - sumWidth += o.m_geo.width(); + vo->m_geo = geometries.at(i); + } else if (!vo->m_geo.isValid()) { + vo->m_geo = QRect(QPoint(sumWidth, 0), initialWindowSize()); + sumWidth += vo->m_geo.width(); } + m_outputs[i] = vo; } emit virtualOutputsSet(countChanged); } int VirtualBackend::gammaRampSize(int screen) const { - return m_outputs[screen].m_gammaSize; + return m_outputs[screen]->m_gammaSize; } bool VirtualBackend::setGammaRamp(int screen, ColorCorrect::GammaRamp &gamma) { Q_UNUSED(gamma); - return m_outputs[screen].m_gammaResult; + return m_outputs[screen]->m_gammaResult; } }