Index: autotests/integration/decoration_input_test.cpp =================================================================== --- autotests/integration/decoration_input_test.cpp +++ autotests/integration/decoration_input_test.cpp @@ -288,15 +288,15 @@ QTest::addColumn("expectedSection"); QTest::addColumn("type"); - QTest::newRow("topLeft") << QPoint(0, 0) << Qt::TopLeftSection << Test::ShellSurfaceType::WlShell; - QTest::newRow("top") << QPoint(250, 0) << Qt::TopSection << Test::ShellSurfaceType::WlShell; - QTest::newRow("topRight") << QPoint(499, 0) << Qt::TopRightSection << Test::ShellSurfaceType::WlShell; - QTest::newRow("topLeft|xdgv5") << QPoint(0, 0) << Qt::TopLeftSection << Test::ShellSurfaceType::XdgShellV5; - QTest::newRow("top|xdgv5") << QPoint(250, 0) << Qt::TopSection << Test::ShellSurfaceType::XdgShellV5; - QTest::newRow("topRight|xdgv5") << QPoint(499, 0) << Qt::TopRightSection << Test::ShellSurfaceType::XdgShellV5; - QTest::newRow("topLeft|xdgv6") << QPoint(0, 0) << Qt::TopLeftSection << Test::ShellSurfaceType::XdgShellV6; - QTest::newRow("top|xdgv6") << QPoint(250, 0) << Qt::TopSection << Test::ShellSurfaceType::XdgShellV6; - QTest::newRow("topRight|xdgv6") << QPoint(499, 0) << Qt::TopRightSection << Test::ShellSurfaceType::XdgShellV6; + QTest::newRow("topLeft") << QPoint(10, 10) << Qt::TopLeftSection << Test::ShellSurfaceType::WlShell; + QTest::newRow("top") << QPoint(260, 10) << Qt::TopSection << Test::ShellSurfaceType::WlShell; + QTest::newRow("topRight") << QPoint(509, 10) << Qt::TopRightSection << Test::ShellSurfaceType::WlShell; + QTest::newRow("topLeft|xdgv5") << QPoint(10, 10) << Qt::TopLeftSection << Test::ShellSurfaceType::XdgShellV5; + QTest::newRow("top|xdgv5") << QPoint(260, 10) << Qt::TopSection << Test::ShellSurfaceType::XdgShellV5; + QTest::newRow("topRight|xdgv5") << QPoint(509, 10) << Qt::TopRightSection << Test::ShellSurfaceType::XdgShellV5; + QTest::newRow("topLeft|xdgv6") << QPoint(10, 10) << Qt::TopLeftSection << Test::ShellSurfaceType::XdgShellV6; + QTest::newRow("top|xdgv6") << QPoint(260, 10) << Qt::TopSection << Test::ShellSurfaceType::XdgShellV6; + QTest::newRow("topRight|xdgv6") << QPoint(509, 10) << Qt::TopRightSection << Test::ShellSurfaceType::XdgShellV6; } @@ -326,7 +326,10 @@ QVERIFY(!c->isOnAllDesktops()); // test top most deco pixel, BUG: 362860 - c->move(0, 0); + // + // Not directly at (0, 0), otherwise ScreenEdgeInputFilter catches + // event before DecorationEventFilter. + c->move(10, 10); QFETCH(QPoint, decoPoint); // double click kwinApp()->platform()->touchDown(0, decoPoint, timestamp++); Index: plugins/platforms/virtual/screens_virtual.h =================================================================== --- plugins/platforms/virtual/screens_virtual.h +++ plugins/platforms/virtual/screens_virtual.h @@ -19,24 +19,20 @@ *********************************************************************/ #ifndef KWIN_SCREENS_VIRTUAL_H #define KWIN_SCREENS_VIRTUAL_H -#include "screens.h" +#include "outputscreens.h" #include namespace KWin { class VirtualBackend; -class VirtualScreens : public Screens +class VirtualScreens : public OutputScreens { Q_OBJECT public: VirtualScreens(VirtualBackend *backend, QObject *parent = nullptr); virtual ~VirtualScreens(); void init() override; - QRect geometry(int screen) const override; - int number(const QPoint &pos) const override; - QSize size(int screen) const override; - void updateCount() override; private: void createOutputs(); Index: plugins/platforms/virtual/screens_virtual.cpp =================================================================== --- plugins/platforms/virtual/screens_virtual.cpp +++ plugins/platforms/virtual/screens_virtual.cpp @@ -25,7 +25,7 @@ { VirtualScreens::VirtualScreens(VirtualBackend *backend, QObject *parent) - : Screens(parent) + : OutputScreens(backend, parent) , m_backend(backend) { } @@ -40,7 +40,7 @@ connect(m_backend, &VirtualBackend::virtualOutputsSet, this, [this] (bool countChanged) { if (countChanged) { - setCount(m_backend->outputCount()); + setCount(m_backend->outputs().size()); } else { emit changed(); } @@ -50,45 +50,4 @@ emit changed(); } -QRect VirtualScreens::geometry(int screen) const -{ - const auto outputs = m_backend->outputs(); - if (screen >= outputs.size()) { - return QRect(); - } - return outputs.at(screen)->geometry(); -} - -QSize VirtualScreens::size(int screen) const -{ - return geometry(screen).size(); -} - -void VirtualScreens::updateCount() -{ - setCount(m_backend->outputCount()); -} - -int VirtualScreens::number(const QPoint &pos) const -{ - int bestScreen = 0; - 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(); - if (geo.contains(pos)) { - return i; - } - int distance = QPoint(geo.topLeft() - pos).manhattanLength(); - distance = qMin(distance, QPoint(geo.topRight() - pos).manhattanLength()); - distance = qMin(distance, QPoint(geo.bottomRight() - pos).manhattanLength()); - distance = qMin(distance, QPoint(geo.bottomLeft() - pos).manhattanLength()); - if (distance < minDistance) { - minDistance = distance; - bestScreen = i; - } - } - return bestScreen; -} - } Index: plugins/platforms/virtual/virtual_backend.h =================================================================== --- plugins/platforms/virtual/virtual_backend.h +++ plugins/platforms/virtual/virtual_backend.h @@ -45,16 +45,6 @@ virtual ~VirtualBackend(); void init() override; - int outputCount() const { - return m_outputs.size(); - } - const QVector outputs() const { - return m_outputs; - } - qreal outputScale() const { - return m_outputScale; - } - bool saveFrames() const { return !m_screenshotDir.isNull(); } @@ -66,10 +56,6 @@ Q_INVOKABLE void setVirtualOutputs(int count, QVector geometries = QVector()); - Q_INVOKABLE void setOutputScale(qreal scale) { - m_outputScale = scale; - } - int drmFd() const { return m_drmFd; } @@ -94,10 +80,6 @@ void virtualOutputsSet(bool countChanged); private: - QVector m_outputs; - - qreal m_outputScale = 1; - QScopedPointer m_screenshotDir; int m_drmFd = -1; gbm_device *m_gbmDevice = nullptr; Index: plugins/platforms/virtual/virtual_backend.cpp =================================================================== --- plugins/platforms/virtual/virtual_backend.cpp +++ plugins/platforms/virtual/virtual_backend.cpp @@ -76,8 +76,9 @@ */ if (!m_outputs.size()) { VirtualOutput *dummyOutput = new VirtualOutput(this); - dummyOutput->m_geo = QRect(QPoint(0, 0), initialWindowSize()); - m_outputs = { dummyOutput }; + dummyOutput->setGeometry(QRect(QPoint(0, 0), initialWindowSize())); + m_outputs << dummyOutput ; + m_enabledOutputs << dummyOutput ; } @@ -120,29 +121,32 @@ bool countChanged = m_outputs.size() != count; qDeleteAll(m_outputs.begin(), m_outputs.end()); m_outputs.resize(count); + m_enabledOutputs.resize(count); int sumWidth = 0; for (int i = 0; i < count; i++) { VirtualOutput *vo = new VirtualOutput(this); if (geometries.size()) { - 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(); + vo->setGeometry(geometries.at(i)); + } else if (!vo->geometry().isValid()) { + vo->setGeometry(QRect(QPoint(sumWidth, 0), initialWindowSize())); + sumWidth += initialWindowSize().width(); } - m_outputs[i] = vo; + m_outputs[i] = m_enabledOutputs[i] = vo; } emit virtualOutputsSet(countChanged); } int VirtualBackend::gammaRampSize(int screen) const { - return m_outputs[screen]->m_gammaSize; + auto *out = qobject_cast(m_outputs[screen]); + return out->m_gammaSize; } bool VirtualBackend::setGammaRamp(int screen, ColorCorrect::GammaRamp &gamma) { Q_UNUSED(gamma); - return m_outputs[screen]->m_gammaResult; + auto *out = qobject_cast(m_outputs[screen]); + return out->m_gammaResult; } } Index: plugins/platforms/virtual/virtual_output.h =================================================================== --- plugins/platforms/virtual/virtual_output.h +++ plugins/platforms/virtual/virtual_output.h @@ -20,31 +20,32 @@ #ifndef KWIN_VIRTUAL_OUTPUT_H #define KWIN_VIRTUAL_OUTPUT_H +#include "output.h" + #include #include namespace KWin { class VirtualBackend; -class VirtualOutput : public QObject +class VirtualOutput : public Output { Q_OBJECT public: VirtualOutput(QObject *parent = nullptr); VirtualOutput(const VirtualOutput &o); virtual ~VirtualOutput(); - QRect geometry() const { - return m_geo; - } + QSize pixelSize() const override; + + void setGeometry(const QRect &geo); private: friend class VirtualBackend; - QRect m_geo; - qreal m_outputScale = 1; + QSize m_pixelSize; int m_gammaSize = 200; bool m_gammaResult = true; Index: plugins/platforms/virtual/virtual_output.cpp =================================================================== --- plugins/platforms/virtual/virtual_output.cpp +++ plugins/platforms/virtual/virtual_output.cpp @@ -23,13 +23,15 @@ { VirtualOutput::VirtualOutput(QObject *parent) - : QObject(parent) + : Output() { + Q_UNUSED(parent); + + setScale(1.); } VirtualOutput::VirtualOutput(const VirtualOutput &o) - : m_geo(o.m_geo), - m_outputScale(o.m_outputScale), + : m_pixelSize(o.m_pixelSize), m_gammaSize(o.m_gammaSize), m_gammaResult(o.m_gammaResult) { @@ -39,4 +41,15 @@ { } +QSize VirtualOutput::pixelSize() const +{ + return m_pixelSize; +} + +void VirtualOutput::setGeometry(const QRect &geo) +{ + m_pixelSize = geo.size(); + setGlobalPos(geo.topLeft()); +} + }