[backends/virtual] Add possibility to have multiple virtual screens

Very basic: all screens have same size and are ordered from left to
right. It's mostly meant to allow easy test cases with multi-screen.

The quick tiling test demonstrates how it's used.
icc-effect-5.14.5
Martin Gräßlin 2015-10-14 16:32:43 +02:00
parent 6049b9ff3c
commit 5558d62220
4 changed files with 43 additions and 10 deletions

View File

@ -70,9 +70,13 @@ void QuickTilingTest::initTestCase()
QSignalSpy workspaceCreatedSpy(kwinApp(), &Application::workspaceCreated);
QVERIFY(workspaceCreatedSpy.isValid());
waylandServer()->backend()->setInitialWindowSize(QSize(1280, 1024));
QMetaObject::invokeMethod(waylandServer()->backend(), "setOutputCount", Qt::DirectConnection, Q_ARG(int, 2));
waylandServer()->init(s_socketName.toLocal8Bit());
kwinApp()->start();
QVERIFY(workspaceCreatedSpy.wait());
QCOMPARE(screens()->count(), 2);
QCOMPARE(screens()->geometry(0), QRect(0, 0, 1280, 1024));
QCOMPARE(screens()->geometry(1), QRect(1280, 0, 1280, 1024));
}
void QuickTilingTest::init()
@ -120,6 +124,8 @@ void QuickTilingTest::init()
QVERIFY(m_shm->isValid());
m_shell = registry.createShell(shellSpy.first().first().value<quint32>(), shellSpy.first().last().value<quint32>(), this);
QVERIFY(m_shell->isValid());
screens()->setCurrent(0);
}
void QuickTilingTest::cleanup()

View File

@ -42,29 +42,46 @@ void VirtualScreens::init()
QRect VirtualScreens::geometry(int screen) const
{
if (screen == 0) {
return QRect(QPoint(0, 0), size(screen));
if (screen >= m_geometries.count()) {
return QRect();
}
return QRect();
return m_geometries.at(screen);
}
QSize VirtualScreens::size(int screen) const
{
if (screen == 0) {
return m_backend->size();
}
return QSize();
return geometry(screen).size();
}
void VirtualScreens::updateCount()
{
setCount(1);
m_geometries.clear();
const QSize size = m_backend->size();
for (int i = 0; i < m_backend->outputCount(); ++i) {
m_geometries.append(QRect(size.width() * i, 0, size.width(), size.height()));
}
setCount(m_backend->outputCount());
}
int VirtualScreens::number(const QPoint &pos) const
{
Q_UNUSED(pos)
return 0;
int bestScreen = 0;
int minDistance = INT_MAX;
for (int i = 0; i < m_geometries.count(); ++i) {
const QRect &geo = m_geometries.at(i);
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;
}
}

View File

@ -20,6 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef KWIN_SCREENS_VIRTUAL_H
#define KWIN_SCREENS_VIRTUAL_H
#include "screens.h"
#include <QVector>
namespace KWin
{
@ -39,6 +40,7 @@ public:
private:
VirtualBackend *m_backend;
QVector<QRect> m_geometries;
};
}

View File

@ -45,6 +45,9 @@ public:
QSize size() const {
return m_size;
}
int outputCount() const {
return m_outputCount;
}
bool saveFrames() const {
return !m_screenshotDir.isNull();
@ -55,11 +58,16 @@ public:
QPainterBackend* createQPainterBackend() override;
OpenGLBackend *createOpenGLBackend() override;
Q_INVOKABLE void setOutputCount(int count) {
m_outputCount = count;
}
Q_SIGNALS:
void sizeChanged();
private:
QSize m_size;
int m_outputCount = 1;
QScopedPointer<QTemporaryDir> m_screenshotDir;
};