15#include "virtualdesktops.h"
20#include <KWayland/Client/surface.h>
22#include <QDBusConnection>
23#include <QDBusMessage>
24#include <QDBusPendingReply>
25#include <QTemporaryFile>
29static const QString s_socketName = QStringLiteral(
"wayland_test_kwin_kwinbindings-0");
39 void testSwitchWindow();
40 void testSwitchWindowScript();
41 void testWindowToDesktop_data();
42 void testWindowToDesktop();
45void KWinBindingsTest::initTestCase()
47 qRegisterMetaType<KWin::Window *>();
51 QRect(0, 0, 1280, 1024),
52 QRect(1280, 0, 1280, 1024),
55 kwinApp()->setConfig(KSharedConfig::openConfig(QString(), KConfig::SimpleConfig));
58 QVERIFY(applicationStartedSpy.wait());
61void KWinBindingsTest::init()
68void KWinBindingsTest::cleanup()
73void KWinBindingsTest::testSwitchWindow()
89 QVERIFY(c4->isActive());
95 c1->move(QPoint(0, 0));
96 c2->move(QPoint(200, 0));
97 c3->move(QPoint(200, 200));
98 c4->move(QPoint(0, 200));
103 auto invokeShortcut = [](
const QString &shortcut) {
104 auto msg = QDBusMessage::createMethodCall(
105 QStringLiteral(
"org.kde.kglobalaccel"),
106 QStringLiteral(
"/component/kwin"),
107 QStringLiteral(
"org.kde.kglobalaccel.Component"),
108 QStringLiteral(
"invokeShortcut"));
109 msg.setArguments(QList<QVariant>{shortcut});
110 QDBusConnection::sessionBus().asyncCall(msg);
112 invokeShortcut(QStringLiteral(
"Switch Window Up"));
113 QTRY_COMPARE(
workspace()->activeWindow(), c1);
114 invokeShortcut(QStringLiteral(
"Switch Window Right"));
115 QTRY_COMPARE(
workspace()->activeWindow(), c2);
116 invokeShortcut(QStringLiteral(
"Switch Window Down"));
117 QTRY_COMPARE(
workspace()->activeWindow(), c3);
118 invokeShortcut(QStringLiteral(
"Switch Window Left"));
119 QTRY_COMPARE(
workspace()->activeWindow(), c4);
121 invokeShortcut(QStringLiteral(
"Switch Window Left"));
122 QTRY_COMPARE(
workspace()->activeWindow(), c3);
123 invokeShortcut(QStringLiteral(
"Switch Window Down"));
124 QTRY_COMPARE(
workspace()->activeWindow(), c2);
125 invokeShortcut(QStringLiteral(
"Switch Window Right"));
126 QTRY_COMPARE(
workspace()->activeWindow(), c1);
127 invokeShortcut(QStringLiteral(
"Switch Window Up"));
128 QTRY_COMPARE(
workspace()->activeWindow(), c4);
131void KWinBindingsTest::testSwitchWindowScript()
149 QVERIFY(c4->isActive());
155 c1->move(QPoint(0, 0));
156 c2->move(QPoint(200, 0));
157 c3->move(QPoint(200, 200));
158 c4->move(QPoint(0, 200));
160 auto runScript = [](
const QString &slot) {
161 QTemporaryFile tmpFile;
162 QVERIFY(tmpFile.open());
163 QTextStream out(&tmpFile);
164 out <<
"workspace." << slot <<
"()";
174 QTRY_COMPARE(runningChangedSpy.count(), 1);
177 runScript(QStringLiteral(
"slotSwitchWindowUp"));
178 QTRY_COMPARE(
workspace()->activeWindow(), c1);
179 runScript(QStringLiteral(
"slotSwitchWindowRight"));
180 QTRY_COMPARE(
workspace()->activeWindow(), c2);
181 runScript(QStringLiteral(
"slotSwitchWindowDown"));
182 QTRY_COMPARE(
workspace()->activeWindow(), c3);
183 runScript(QStringLiteral(
"slotSwitchWindowLeft"));
184 QTRY_COMPARE(
workspace()->activeWindow(), c4);
187void KWinBindingsTest::testWindowToDesktop_data()
189 QTest::addColumn<int>(
"desktop");
191 QTest::newRow(
"2") << 2;
192 QTest::newRow(
"3") << 3;
193 QTest::newRow(
"4") << 4;
194 QTest::newRow(
"5") << 5;
195 QTest::newRow(
"6") << 6;
196 QTest::newRow(
"7") << 7;
197 QTest::newRow(
"8") << 8;
198 QTest::newRow(
"9") << 9;
199 QTest::newRow(
"10") << 10;
200 QTest::newRow(
"11") << 11;
201 QTest::newRow(
"12") << 12;
202 QTest::newRow(
"13") << 13;
203 QTest::newRow(
"14") << 14;
204 QTest::newRow(
"15") << 15;
205 QTest::newRow(
"16") << 16;
206 QTest::newRow(
"17") << 17;
207 QTest::newRow(
"18") << 18;
208 QTest::newRow(
"19") << 19;
209 QTest::newRow(
"20") << 20;
212void KWinBindingsTest::testWindowToDesktop()
215 VirtualDesktopManager::self()->setCurrent(VirtualDesktopManager::self()->desktops().first());
221 QSignalSpy desktopsChangedSpy(window, &Window::desktopsChanged);
222 QCOMPARE(
workspace()->activeWindow(), window);
224 QFETCH(
int, desktop);
225 VirtualDesktopManager::self()->setCount(desktop);
226 const auto desktops = VirtualDesktopManager::self()->desktops();
229 auto invokeShortcut = [](
int desktop) {
230 auto msg = QDBusMessage::createMethodCall(
231 QStringLiteral(
"org.kde.kglobalaccel"),
232 QStringLiteral(
"/component/kwin"),
233 QStringLiteral(
"org.kde.kglobalaccel.Component"),
234 QStringLiteral(
"invokeShortcut"));
235 msg.setArguments(QList<QVariant>{QStringLiteral(
"Window to Desktop %1").arg(desktop)});
236 QDBusConnection::sessionBus().asyncCall(msg);
238 invokeShortcut(desktop);
239 QVERIFY(desktopsChangedSpy.wait());
240 QCOMPARE(window->desktops(), QList<VirtualDesktop *>{desktops.at(desktop - 1)});
243 QVERIFY(desktopsChangedSpy.wait());
244 QCOMPARE(window->desktops(), QList<VirtualDesktop *>{desktops.at(0)});
246 invokeShortcut(desktop + 1);
248 QVERIFY(!desktopsChangedSpy.wait(100));
252#include "kwinbindings_test.moc"
void runningChanged(bool)
AbstractScript * findScript(const QString &pluginName) const
Q_SCRIPTABLE Q_INVOKABLE int loadScript(const QString &filePath, const QString &pluginName=QString())
static Scripting * self()
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())
std::unique_ptr< KWayland::Client::Surface > createSurface()
XdgToplevel * createXdgToplevelSurface(KWayland::Client::Surface *surface, QObject *parent=nullptr)
WaylandServer * waylandServer()
InputRedirection * input()