Warning, file /plasma/kwin/autotests/integration/fractional_scaling_test.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2022 David Edmundson <davidedmundson@kde.org>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 #include "kwin_wayland_test.h"
0010 
0011 #include "core/output.h"
0012 #include "core/outputbackend.h"
0013 #include "wayland/clientconnection.h"
0014 #include "wayland/display.h"
0015 #include "wayland_server.h"
0016 #include "window.h"
0017 #include "workspace.h"
0018 
0019 #include <KWayland/Client/compositor.h>
0020 #include <KWayland/Client/connection_thread.h>
0021 #include <KWayland/Client/output.h>
0022 #include <KWayland/Client/server_decoration.h>
0023 #include <KWayland/Client/surface.h>
0024 
0025 #include <QDBusConnection>
0026 
0027 // system
0028 #include <sys/socket.h>
0029 #include <sys/types.h>
0030 #include <unistd.h>
0031 
0032 #include <csignal>
0033 
0034 using namespace KWin;
0035 
0036 static const QString s_socketName = QStringLiteral("wayland_test_kwin_fractionalScale-0");
0037 
0038 class TestFractionalScale : public QObject
0039 {
0040     Q_OBJECT
0041 private Q_SLOTS:
0042     void initTestCase();
0043     void init();
0044     void cleanup();
0045 
0046     void testShow();
0047 };
0048 
0049 void TestFractionalScale::initTestCase()
0050 {
0051     qRegisterMetaType<KWin::Window *>();
0052     qRegisterMetaType<KWayland::Client::Output *>();
0053 
0054     QSignalSpy applicationStartedSpy(kwinApp(), &Application::started);
0055     QVERIFY(waylandServer()->init(s_socketName));
0056     QMetaObject::invokeMethod(kwinApp()->outputBackend(),
0057                               "setVirtualOutputs",
0058                               Qt::DirectConnection,
0059                               Q_ARG(QVector<QRect>, QVector<QRect>() << QRect(0, 0, 1280, 1024) << QRect(1280, 0, 1280, 1024)),
0060                               Q_ARG(QVector<qreal>, QVector<qreal>() << 1.25 << 2.0));
0061 
0062     kwinApp()->start();
0063     QVERIFY(applicationStartedSpy.wait());
0064     const auto outputs = workspace()->outputs();
0065     QCOMPARE(outputs.count(), 2);
0066     QCOMPARE(outputs[0]->geometry(), QRect(0, 0, 1024, 819));
0067     QCOMPARE(outputs[1]->geometry(), QRect(1280, 0, 640, 512));
0068     QCOMPARE(outputs[0]->scale(), 1.25);
0069     QCOMPARE(outputs[1]->scale(), 2.0);
0070 }
0071 
0072 void TestFractionalScale::init()
0073 {
0074     QVERIFY(Test::setupWaylandConnection(Test::AdditionalWaylandInterface::FractionalScaleManagerV1));
0075 
0076     workspace()->setActiveOutput(QPoint(640, 512));
0077     // put mouse in the middle of screen one
0078     KWin::Cursors::self()->mouse()->setPos(QPoint(640, 512));
0079 }
0080 
0081 void TestFractionalScale::cleanup()
0082 {
0083     Test::destroyWaylandConnection();
0084 }
0085 
0086 void TestFractionalScale::testShow()
0087 {
0088     std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface());
0089     std::unique_ptr<Test::FractionalScaleV1> fractionalScale(Test::createFractionalScaleV1(surface.get()));
0090     std::unique_ptr<Test::XdgToplevel> shellSurface(Test::createXdgToplevelSurface(surface.get()));
0091 
0092     // above call commits the surface and blocks for the configure event. We should have received the scale already
0093     // We are sent the value in 120ths
0094     QCOMPARE(fractionalScale->preferredScale(), 1.25 * 120);
0095 
0096     auto window = Test::renderAndWaitForShown(surface.get(), QSize(100, 50), Qt::blue);
0097     QVERIFY(window);
0098 
0099     QCOMPARE(fractionalScale->preferredScale(), 1.25 * 120);
0100 }
0101 
0102 WAYLANDTEST_MAIN(TestFractionalScale)
0103 #include "fractional_scaling_test.moc"