20#include <QProcessEnvironment>
25static const QString s_socketName = QStringLiteral(
"wayland_test_kwin_xwayland_selections-0");
47void XwaylandSelectionsTest::initTestCase()
50 qRegisterMetaType<KWin::Window *>();
51 qRegisterMetaType<QProcess::ExitStatus>();
57 QRect(0, 0, 1280, 1024),
58 QRect(1280, 0, 1280, 1024),
62 QVERIFY(applicationStartedSpy.wait());
65 QCOMPARE(outputs[0]->geometry(), QRect(0, 0, 1280, 1024));
66 QCOMPARE(outputs[1]->geometry(), QRect(1280, 0, 1280, 1024));
73void XwaylandSelectionsTest::testSync_data()
75 QTest::addColumn<QString>(
"copyPlatform");
76 QTest::addColumn<QString>(
"pastePlatform");
78 QTest::newRow(
"x11->wayland") << QStringLiteral(
"xcb") << QStringLiteral(
"wayland");
79 QTest::newRow(
"wayland->x11") << QStringLiteral(
"wayland") << QStringLiteral(
"xcb");
82void XwaylandSelectionsTest::testSync()
85 const QString copy = QFINDTESTDATA(QStringLiteral(
"copy"));
86 QVERIFY(!copy.isEmpty());
87 const QString paste = QFINDTESTDATA(QStringLiteral(
"paste"));
88 QVERIFY(!paste.isEmpty());
93 QProcessEnvironment environment = QProcessEnvironment::systemEnvironment();
96 QFETCH(QString, copyPlatform);
97 environment.insert(QStringLiteral(
"QT_QPA_PLATFORM"), copyPlatform);
98 environment.insert(QStringLiteral(
"WAYLAND_DISPLAY"), s_socketName);
99 std::unique_ptr<QProcess, ProcessKillBeforeDeleter> copyProcess(
new QProcess());
100 copyProcess->setProcessEnvironment(environment);
101 copyProcess->setProcessChannelMode(QProcess::ForwardedChannels);
102 copyProcess->setProgram(copy);
103 copyProcess->start();
104 QVERIFY(copyProcess->waitForStarted());
106 Window *copyWindow =
nullptr;
107 QVERIFY(windowAddedSpy.wait());
108 copyWindow = windowAddedSpy.first().first().value<
Window *>();
110 if (
workspace()->activeWindow() != copyWindow) {
113 QCOMPARE(
workspace()->activeWindow(), copyWindow);
114 clipboardChangedSpy.wait();
117 std::unique_ptr<QProcess, ProcessKillBeforeDeleter> pasteProcess(
new QProcess());
118 QSignalSpy finishedSpy(pasteProcess.get(),
static_cast<void (QProcess::*)(
int, QProcess::ExitStatus)
>(&QProcess::finished));
119 QFETCH(QString, pastePlatform);
120 environment.insert(QStringLiteral(
"QT_QPA_PLATFORM"), pastePlatform);
121 pasteProcess->setProcessEnvironment(environment);
122 pasteProcess->setProcessChannelMode(QProcess::ForwardedChannels);
123 pasteProcess->setProgram(paste);
124 pasteProcess->start();
125 QVERIFY(pasteProcess->waitForStarted());
127 windowAddedSpy.clear();
128 Window *pasteWindow =
nullptr;
129 QVERIFY(windowAddedSpy.wait());
130 pasteWindow = windowAddedSpy.last().first().value<
Window *>();
131 QCOMPARE(windowAddedSpy.count(), 1);
132 QVERIFY(pasteWindow);
134 if (
workspace()->activeWindow() != pasteWindow) {
137 QVERIFY(windowActivatedSpy.wait());
139 QTRY_COMPARE(
workspace()->activeWindow(), pasteWindow);
140 QVERIFY(finishedSpy.wait());
141 QCOMPARE(finishedSpy.first().first().toInt(), 0);
145#include "xwayland_selections_test.moc"
void selectionChanged(KWin::AbstractDataSource *)
void activateWindow(Window *window, bool force=false)
void windowActivated(KWin::Window *)
void windowAdded(KWin::Window *)
QList< Output * > outputs() const
#define WAYLANDTEST_MAIN(TestObject)
void setOutputConfig(const QList< QRect > &geometries)
KWayland::Client::Seat * seat
QList< KWayland::Client::Output * > outputs
WaylandServer * waylandServer()
void operator()(QProcess *pointer)