[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
parent
6049b9ff3c
commit
5558d62220
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue