KWin
Loading...
Searching...
No Matches
fractional_scaling_test.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2022 David Edmundson <davidedmundson@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9#include "kwin_wayland_test.h"
10
11#include "core/output.h"
12#include "pointer_input.h"
14#include "wayland/display.h"
15#include "wayland_server.h"
16#include "window.h"
17#include "workspace.h"
18
19#include <KWayland/Client/compositor.h>
20#include <KWayland/Client/connection_thread.h>
21#include <KWayland/Client/output.h>
22#include <KWayland/Client/surface.h>
23
24#include <QDBusConnection>
25
26// system
27#include <sys/socket.h>
28#include <sys/types.h>
29#include <unistd.h>
30
31#include <csignal>
32
33using namespace KWin;
34
35static const QString s_socketName = QStringLiteral("wayland_test_kwin_fractionalScale-0");
36
37class TestFractionalScale : public QObject
38{
39 Q_OBJECT
40private Q_SLOTS:
41 void initTestCase();
42 void init();
43 void cleanup();
44
45 void testShow();
46};
47
48void TestFractionalScale::initTestCase()
49{
50 qRegisterMetaType<KWin::Window *>();
51 qRegisterMetaType<KWayland::Client::Output *>();
52
53 QSignalSpy applicationStartedSpy(kwinApp(), &Application::started);
54 QVERIFY(waylandServer()->init(s_socketName));
57 .geometry = QRect(0, 0, 1280 / 1.25, 1024 / 1.25),
58 .scale = 1.25,
59 },
61 .geometry = QRect(1280, 0, 1280 / 2, 1024 / 2),
62 .scale = 2.0,
63 },
64 });
65
66 kwinApp()->start();
67 QVERIFY(applicationStartedSpy.wait());
68 const auto outputs = workspace()->outputs();
69 QCOMPARE(outputs.count(), 2);
70 QCOMPARE(outputs[0]->geometry(), QRect(0, 0, 1024, 819));
71 QCOMPARE(outputs[1]->geometry(), QRect(1280, 0, 640, 512));
72 QCOMPARE(outputs[0]->scale(), 1.25);
73 QCOMPARE(outputs[1]->scale(), 2.0);
74}
75
76void TestFractionalScale::init()
77{
78 QVERIFY(Test::setupWaylandConnection(Test::AdditionalWaylandInterface::FractionalScaleManagerV1));
79
80 workspace()->setActiveOutput(QPoint(640, 512));
81 // put mouse in the middle of screen one
82 KWin::input()->pointer()->warp(QPoint(640, 512));
83}
84
85void TestFractionalScale::cleanup()
86{
88}
89
90void TestFractionalScale::testShow()
91{
92 std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface());
93 std::unique_ptr<Test::FractionalScaleV1> fractionalScale(Test::createFractionalScaleV1(surface.get()));
94 std::unique_ptr<Test::XdgToplevel> shellSurface(Test::createXdgToplevelSurface(surface.get()));
95
96 // above call commits the surface and blocks for the configure event. We should have received the scale already
97 // We are sent the value in 120ths
98 QCOMPARE(fractionalScale->preferredScale(), 1.25 * 120);
99
100 auto window = Test::renderAndWaitForShown(surface.get(), QSize(100, 50), Qt::blue);
101 QVERIFY(window);
102
103 QCOMPARE(fractionalScale->preferredScale(), 1.25 * 120);
104}
105
107#include "fractional_scaling_test.moc"
PointerInputRedirection * pointer() const
Definition input.h:220
void warp(const QPointF &pos)
QList< Output * > outputs() const
Definition workspace.h:762
void setActiveOutput(Output *output)
#define WAYLANDTEST_MAIN(TestObject)
Window * renderAndWaitForShown(KWayland::Client::Surface *surface, const QSize &size, const QColor &color, const QImage::Format &format=QImage::Format_ARGB32, int timeout=5000)
void destroyWaylandConnection()
void setOutputConfig(const QList< QRect > &geometries)
bool setupWaylandConnection(AdditionalWaylandInterfaces flags=AdditionalWaylandInterfaces())
QList< KWayland::Client::Output * > outputs
std::unique_ptr< KWayland::Client::Surface > createSurface()
XdgToplevel * createXdgToplevelSurface(KWayland::Client::Surface *surface, QObject *parent=nullptr)
FractionalScaleV1 * createFractionalScaleV1(KWayland::Client::Surface *surface)
WaylandServer * waylandServer()
Workspace * workspace()
Definition workspace.h:830
InputRedirection * input()
Definition input.h:549