KWin
Loading...
Searching...
No Matches
minimizeall_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: 2019 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9
10#include "kwin_wayland_test.h"
11
12#include "core/output.h"
13#include "scripting/scripting.h"
14#include "wayland_server.h"
15#include "window.h"
16#include "workspace.h"
17
18#include <KPackage/PackageLoader>
19#include <KWayland/Client/surface.h>
20
21#include <linux/input.h>
22
23namespace KWin
24{
25
26static const QString s_socketName = QStringLiteral("wayland_test_minimizeall-0");
27static const QString s_scriptName = QStringLiteral("minimizeall");
28
29class MinimizeAllScriptTest : public QObject
30{
31 Q_OBJECT
32
33private Q_SLOTS:
34 void initTestCase();
35 void init();
36 void cleanup();
37
38 void testMinimizeUnminimize();
39};
40
41void MinimizeAllScriptTest::initTestCase()
42{
43 qputenv("XDG_DATA_DIRS", QCoreApplication::applicationDirPath().toUtf8());
44
45 qRegisterMetaType<Window *>();
46
47 QSignalSpy applicationStartedSpy(kwinApp(), &Application::started);
48 QVERIFY(waylandServer()->init(s_socketName));
50 QRect(0, 0, 1280, 1024),
51 QRect(1280, 0, 1280, 1024),
52 });
53
54 kwinApp()->start();
55 QVERIFY(applicationStartedSpy.wait());
56 const auto outputs = workspace()->outputs();
57 QCOMPARE(outputs.count(), 2);
58 QCOMPARE(outputs[0]->geometry(), QRect(0, 0, 1280, 1024));
59 QCOMPARE(outputs[1]->geometry(), QRect(1280, 0, 1280, 1024));
60}
61
62static QString locateMainScript(const QString &pluginName)
63{
64 const QList<KPluginMetaData> offers = KPackage::PackageLoader::self()->findPackages(
65 QStringLiteral("KWin/Script"),
66 QStringLiteral("kwin/scripts"),
67 [&](const KPluginMetaData &metaData) {
68 return metaData.pluginId() == pluginName;
69 });
70 if (offers.isEmpty()) {
71 return QString();
72 }
73 const QFileInfo metaDataFileInfo(offers.first().fileName());
74 return metaDataFileInfo.path() + QLatin1String("/contents/code/main.js");
75}
76
77void MinimizeAllScriptTest::init()
78{
80
81 Scripting::self()->loadScript(locateMainScript(s_scriptName), s_scriptName);
82 QTRY_VERIFY(Scripting::self()->isScriptLoaded(s_scriptName));
83
84 AbstractScript *script = Scripting::self()->findScript(s_scriptName);
85 QVERIFY(script);
86 QSignalSpy runningChangedSpy(script, &AbstractScript::runningChanged);
87 script->run();
88 QTRY_COMPARE(runningChangedSpy.count(), 1);
89}
90
91void MinimizeAllScriptTest::cleanup()
92{
94
95 Scripting::self()->unloadScript(s_scriptName);
96 QTRY_VERIFY(!Scripting::self()->isScriptLoaded(s_scriptName));
97}
98
99void MinimizeAllScriptTest::testMinimizeUnminimize()
100{
101#if !KWIN_BUILD_GLOBALSHORTCUTS
102 QSKIP("Can't test shortcuts without shortcuts");
103 return;
104#endif
105
106 // This test verifies that all windows are minimized when Meta+Shift+D
107 // is pressed, and unminimized when the shortcut is pressed once again.
108
109 // Create a couple of test windows.
110 std::unique_ptr<KWayland::Client::Surface> surface1(Test::createSurface());
111 std::unique_ptr<Test::XdgToplevel> shellSurface1(Test::createXdgToplevelSurface(surface1.get()));
112 Window *window1 = Test::renderAndWaitForShown(surface1.get(), QSize(100, 50), Qt::blue);
113 QVERIFY(window1);
114 QVERIFY(window1->isActive());
115 QVERIFY(window1->isMinimizable());
116
117 std::unique_ptr<KWayland::Client::Surface> surface2(Test::createSurface());
118 std::unique_ptr<Test::XdgToplevel> shellSurface2(Test::createXdgToplevelSurface(surface2.get()));
119 Window *window2 = Test::renderAndWaitForShown(surface2.get(), QSize(100, 50), Qt::red);
120 QVERIFY(window2);
121 QVERIFY(window2->isActive());
122 QVERIFY(window2->isMinimizable());
123
124 // Minimize the windows.
125 quint32 timestamp = 1;
126 Test::keyboardKeyPressed(KEY_LEFTMETA, timestamp++);
127 Test::keyboardKeyPressed(KEY_LEFTSHIFT, timestamp++);
128 Test::keyboardKeyPressed(KEY_D, timestamp++);
129 Test::keyboardKeyReleased(KEY_D, timestamp++);
130 Test::keyboardKeyReleased(KEY_LEFTSHIFT, timestamp++);
131 Test::keyboardKeyReleased(KEY_LEFTMETA, timestamp++);
132
133 QTRY_VERIFY(window1->isMinimized());
134 QTRY_VERIFY(window2->isMinimized());
135
136 // Unminimize the windows.
137 Test::keyboardKeyPressed(KEY_LEFTMETA, timestamp++);
138 Test::keyboardKeyPressed(KEY_LEFTSHIFT, timestamp++);
139 Test::keyboardKeyPressed(KEY_D, timestamp++);
140 Test::keyboardKeyReleased(KEY_D, timestamp++);
141 Test::keyboardKeyReleased(KEY_LEFTSHIFT, timestamp++);
142 Test::keyboardKeyReleased(KEY_LEFTMETA, timestamp++);
143
144 QTRY_VERIFY(!window1->isMinimized());
145 QTRY_VERIFY(!window2->isMinimized());
146
147 // Destroy test windows.
148 shellSurface2.reset();
149 QVERIFY(Test::waitForWindowClosed(window2));
150 shellSurface1.reset();
151 QVERIFY(Test::waitForWindowClosed(window1));
152}
153
154}
155
157#include "minimizeall_test.moc"
void runningChanged(bool)
AbstractScript * findScript(const QString &pluginName) const
Q_SCRIPTABLE Q_INVOKABLE bool unloadScript(const QString &pluginName)
Q_SCRIPTABLE Q_INVOKABLE int loadScript(const QString &filePath, const QString &pluginName=QString())
static Scripting * self()
Definition scripting.h:393
QList< Output * > outputs() const
Definition workspace.h:762
#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 keyboardKeyReleased(quint32 key, quint32 time)
void destroyWaylandConnection()
void setOutputConfig(const QList< QRect > &geometries)
void keyboardKeyPressed(quint32 key, quint32 time)
bool setupWaylandConnection(AdditionalWaylandInterfaces flags=AdditionalWaylandInterfaces())
std::unique_ptr< KWayland::Client::Surface > createSurface()
XdgToplevel * createXdgToplevelSurface(KWayland::Client::Surface *surface, QObject *parent=nullptr)
bool waitForWindowClosed(Window *window)
WaylandServer * waylandServer()
Workspace * workspace()
Definition workspace.h:830