KWin
Loading...
Searching...
No Matches
activities_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: 2016 Martin Gräßlin <mgraesslin@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9#include "kwin_wayland_test.h"
10
11#include "activities.h"
12#include "core/output.h"
13#include "pointer_input.h"
14#include "utils/xcbutils.h"
15#include "wayland_server.h"
16#include "workspace.h"
17#include "x11window.h"
18
19#include <QDBusConnection>
20#include <QDBusMessage>
21#include <QDBusPendingCall>
22
23#include <netwm.h>
24#include <xcb/xcb_icccm.h>
25
26namespace KWin
27{
28
29static const QString s_socketName = QStringLiteral("wayland_test_kwin_activities-0");
30
31class ActivitiesTest : public QObject
32{
33 Q_OBJECT
34private Q_SLOTS:
35 void initTestCase();
36 void cleanupTestCase();
37 void init();
38 void cleanup();
39 void testSetOnActivitiesValidates();
40
41private:
42};
43
44void ActivitiesTest::initTestCase()
45{
46 qRegisterMetaType<KWin::Window *>();
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()->setUseKActivities(true);
55 kwinApp()->start();
56 QVERIFY(applicationStartedSpy.wait());
57 const auto outputs = workspace()->outputs();
58 QCOMPARE(outputs.count(), 2);
59 QCOMPARE(outputs[0]->geometry(), QRect(0, 0, 1280, 1024));
60 QCOMPARE(outputs[1]->geometry(), QRect(1280, 0, 1280, 1024));
61 setenv("QT_QPA_PLATFORM", "wayland", true);
62}
63
64void ActivitiesTest::cleanupTestCase()
65{
66 // terminate any still running kactivitymanagerd
67 QDBusConnection::sessionBus().asyncCall(QDBusMessage::createMethodCall(
68 QStringLiteral("org.kde.ActivityManager"),
69 QStringLiteral("/ActivityManager"),
70 QStringLiteral("org.qtproject.Qt.QCoreApplication"),
71 QStringLiteral("quit")));
72}
73
74void ActivitiesTest::init()
75{
76 workspace()->setActiveOutput(QPoint(640, 512));
77 input()->pointer()->warp(QPoint(640, 512));
78}
79
80void ActivitiesTest::cleanup()
81{
82}
83
84void ActivitiesTest::testSetOnActivitiesValidates()
85{
86 // this test verifies that windows can't be placed on activities that don't exist
87 // create an xcb window
89 QVERIFY(!xcb_connection_has_error(c.get()));
90
91 xcb_window_t windowId = xcb_generate_id(c.get());
92 const QRect windowGeometry(0, 0, 100, 200);
93
94 auto cookie = xcb_create_window_checked(c.get(), 0, windowId, rootWindow(),
95 windowGeometry.x(),
96 windowGeometry.y(),
97 windowGeometry.width(),
98 windowGeometry.height(),
99 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, 0, 0, nullptr);
100 QVERIFY(!xcb_request_check(c.get(), cookie));
101 xcb_size_hints_t hints;
102 memset(&hints, 0, sizeof(hints));
103 xcb_icccm_size_hints_set_position(&hints, 1, windowGeometry.x(), windowGeometry.y());
104 xcb_icccm_size_hints_set_size(&hints, 1, windowGeometry.width(), windowGeometry.height());
105 xcb_icccm_set_wm_normal_hints(c.get(), windowId, &hints);
106 xcb_map_window(c.get(), windowId);
107 xcb_flush(c.get());
108
109 // we should get a window for it
110 QSignalSpy windowCreatedSpy(workspace(), &Workspace::windowAdded);
111 QVERIFY(windowCreatedSpy.wait());
112 X11Window *window = windowCreatedSpy.first().first().value<X11Window *>();
113 QVERIFY(window);
114 QCOMPARE(window->window(), windowId);
115 QVERIFY(window->isDecorated());
116
117 // verify the test machine doesn't have the following activities used
118 QVERIFY(!Workspace::self()->activities()->all().contains(QStringLiteral("foo")));
119 QVERIFY(!Workspace::self()->activities()->all().contains(QStringLiteral("bar")));
120
121 window->setOnActivities(QStringList{QStringLiteral("foo"), QStringLiteral("bar")});
122 QVERIFY(!window->activities().contains(QLatin1String("foo")));
123 QVERIFY(!window->activities().contains(QLatin1String("bar")));
124
125 // and destroy the window again
126 xcb_unmap_window(c.get(), windowId);
127 xcb_destroy_window(c.get(), windowId);
128 xcb_flush(c.get());
129 c.reset();
130
131 QSignalSpy windowClosedSpy(window, &X11Window::closed);
132 QVERIFY(windowClosedSpy.wait());
133}
134
135}
136
138#include "activities_test.moc"
PointerInputRedirection * pointer() const
Definition input.h:220
void warp(const QPointF &pos)
static Workspace * self()
Definition workspace.h:91
void windowAdded(KWin::Window *)
QList< Output * > outputs() const
Definition workspace.h:762
void setActiveOutput(Output *output)
#define WAYLANDTEST_MAIN(TestObject)
void setOutputConfig(const QList< QRect > &geometries)
XcbConnectionPtr createX11Connection()
std::unique_ptr< xcb_connection_t, XcbConnectionDeleter > XcbConnectionPtr
KWIN_EXPORT xcb_window_t rootWindow()
Definition xcb.h:24
WaylandServer * waylandServer()
Workspace * workspace()
Definition workspace.h:830
InputRedirection * input()
Definition input.h:549