KWin
Loading...
Searching...
No Matches
test_keyboard_shortcuts_inhibitor_interface.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2020 Benjamin Port <benjamin.port@enioka.com>
3
4 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5*/
6
7// Qt
8#include <QHash>
9#include <QSignalSpy>
10#include <QTest>
11#include <QThread>
12// WaylandServer
13#include "wayland/compositor.h"
14#include "wayland/display.h"
16#include "wayland/seat.h"
17
18#include "KWayland/Client/compositor.h"
19#include "KWayland/Client/connection_thread.h"
20#include "KWayland/Client/event_queue.h"
21#include "KWayland/Client/registry.h"
22#include "KWayland/Client/seat.h"
23#include "KWayland/Client/surface.h"
24
25#include "qwayland-keyboard-shortcuts-inhibit-unstable-v1.h"
26
27using namespace KWin;
28
29class KeyboardShortcutsInhibitManager : public QObject, public QtWayland::zwp_keyboard_shortcuts_inhibit_manager_v1
30{
31 Q_OBJECT
32public:
33 KeyboardShortcutsInhibitManager(wl_registry *registry, quint32 id, quint32 version)
34 : QtWayland::zwp_keyboard_shortcuts_inhibit_manager_v1(registry, id, version)
35 {
36 }
37};
38
39class KeyboardShortcutsInhibitor : public QObject, public QtWayland::zwp_keyboard_shortcuts_inhibitor_v1
40{
41 Q_OBJECT
42public:
43 KeyboardShortcutsInhibitor(::zwp_keyboard_shortcuts_inhibitor_v1 *inhibitorV1)
44 : QtWayland::zwp_keyboard_shortcuts_inhibitor_v1(inhibitorV1)
45 {
46 }
47
49 {
50 Q_EMIT inhibitorActive();
51 }
52
57
58Q_SIGNALS:
61};
62
64{
65 Q_OBJECT
66public:
71
72private Q_SLOTS:
73 void initTestCase();
74 void testKeyboardShortcuts();
75
76private:
77 KWayland::Client::ConnectionThread *m_connection;
78 KWayland::Client::EventQueue *m_queue;
79 KWayland::Client::Compositor *m_clientCompositor;
80 KWayland::Client::Seat *m_clientSeat = nullptr;
81
82 QThread *m_thread;
83 KWin::Display m_display;
84 SeatInterface *m_seat;
85 CompositorInterface *m_serverCompositor;
86
88 QList<SurfaceInterface *> m_surfaces;
89 QList<wl_surface *> m_clientSurfaces;
90 KeyboardShortcutsInhibitManager *m_inhibitManagerClient = nullptr;
91};
92
93static const QString s_socketName = QStringLiteral("kwin-wayland-server-keyboard-shortcuts-inhibitor-test-0");
94
95void TestKeyboardShortcutsInhibitorInterface::initTestCase()
96{
97 m_display.addSocketName(s_socketName);
98 m_display.start();
99 QVERIFY(m_display.isRunning());
100
101 m_seat = new SeatInterface(&m_display, this);
102 m_serverCompositor = new CompositorInterface(&m_display, this);
103 m_manager = new KeyboardShortcutsInhibitManagerV1Interface(&m_display, this);
104
105 connect(m_serverCompositor, &CompositorInterface::surfaceCreated, this, [this](SurfaceInterface *surface) {
106 m_surfaces += surface;
107 });
108
109 // setup connection
110 m_connection = new KWayland::Client::ConnectionThread;
111 QSignalSpy connectedSpy(m_connection, &KWayland::Client::ConnectionThread::connected);
112 m_connection->setSocketName(s_socketName);
113
114 m_thread = new QThread(this);
115 m_connection->moveToThread(m_thread);
116 m_thread->start();
117
118 m_connection->initConnection();
119 QVERIFY(connectedSpy.wait());
120 QVERIFY(!m_connection->connections().isEmpty());
121
122 m_queue = new KWayland::Client::EventQueue(this);
123 QVERIFY(!m_queue->isValid());
124 m_queue->setup(m_connection);
125 QVERIFY(m_queue->isValid());
126
127 auto registry = new KWayland::Client::Registry(this);
128 connect(registry, &KWayland::Client::Registry::interfaceAnnounced, this, [this, registry](const QByteArray &interface, quint32 id, quint32 version) {
129 if (interface == "zwp_keyboard_shortcuts_inhibit_manager_v1") {
130 m_inhibitManagerClient = new KeyboardShortcutsInhibitManager(registry->registry(), id, version);
131 }
132 });
133 connect(registry, &KWayland::Client::Registry::seatAnnounced, this, [this, registry](quint32 name, quint32 version) {
134 m_clientSeat = registry->createSeat(name, version);
135 });
136 registry->setEventQueue(m_queue);
137 QSignalSpy compositorSpy(registry, &KWayland::Client::Registry::compositorAnnounced);
138 registry->create(m_connection->display());
139 QVERIFY(registry->isValid());
140 registry->setup();
141 wl_display_flush(m_connection->display());
142
143 QVERIFY(compositorSpy.wait());
144 m_clientCompositor = registry->createCompositor(compositorSpy.first().first().value<quint32>(), compositorSpy.first().last().value<quint32>(), this);
145 QVERIFY(m_clientCompositor->isValid());
146
147 QSignalSpy surfaceSpy(m_serverCompositor, &CompositorInterface::surfaceCreated);
148 for (int i = 0; i < 3; ++i) {
149 KWayland::Client::Surface *s = m_clientCompositor->createSurface(this);
150 m_clientSurfaces += s->operator wl_surface *();
151 }
152 QVERIFY(surfaceSpy.count() < 3 && surfaceSpy.wait(200));
153 QVERIFY(m_surfaces.count() == 3);
154 QVERIFY(m_inhibitManagerClient);
155}
156
158{
159 if (m_queue) {
160 delete m_queue;
161 m_queue = nullptr;
162 }
163 if (m_thread) {
164 m_thread->quit();
165 m_thread->wait();
166 delete m_thread;
167 m_thread = nullptr;
168 }
169 m_connection->deleteLater();
170 m_connection = nullptr;
171}
172
173void TestKeyboardShortcutsInhibitorInterface::testKeyboardShortcuts()
174{
175 auto clientSurface = m_clientSurfaces[0];
176 auto surface = m_surfaces[0];
177
178 // Test creation
179 auto inhibitorClientV1 = m_inhibitManagerClient->inhibit_shortcuts(clientSurface, m_clientSeat->operator wl_seat *());
180 auto inhibitorClient = new KeyboardShortcutsInhibitor(inhibitorClientV1);
181 QSignalSpy inhibitorActiveSpy(inhibitorClient, &KeyboardShortcutsInhibitor::inhibitorActive);
182 QSignalSpy inhibitorInactiveSpy(inhibitorClient, &KeyboardShortcutsInhibitor::inhibitorInactive);
183 QSignalSpy inhibitorCreatedSpy(m_manager, &KeyboardShortcutsInhibitManagerV1Interface::inhibitorCreated);
184 QVERIFY(inhibitorCreatedSpy.wait() || inhibitorCreatedSpy.count() == 1);
185 auto inhibitorServer = m_manager->findInhibitor(surface, m_seat);
186
187 // Test deactivate
188 inhibitorServer->setActive(false);
189 QVERIFY(inhibitorInactiveSpy.wait() || inhibitorInactiveSpy.count() == 1);
190
191 // Test activate
192 inhibitorServer->setActive(true);
193 QVERIFY(inhibitorActiveSpy.wait() || inhibitorActiveSpy.count() == 1);
194
195 // Test creating for another surface
196 m_inhibitManagerClient->inhibit_shortcuts(m_clientSurfaces[1], m_clientSeat->operator wl_seat *());
197 QVERIFY(inhibitorCreatedSpy.wait() || inhibitorCreatedSpy.count() == 2);
198
199 // Test destroy is working
200 inhibitorClient->destroy();
201 m_inhibitManagerClient->inhibit_shortcuts(clientSurface, m_clientSeat->operator wl_seat *());
202 QVERIFY(inhibitorCreatedSpy.wait() || inhibitorCreatedSpy.count() == 3);
203
204 // Test creating with same surface / seat (expect error)
205 QSignalSpy errorOccured(m_connection, &KWayland::Client::ConnectionThread::errorOccurred);
206 m_inhibitManagerClient->inhibit_shortcuts(m_clientSurfaces[0], m_clientSeat->operator wl_seat *());
207 QVERIFY(errorOccured.wait() || errorOccured.count() == 1);
208}
209
211
212#include "test_keyboard_shortcuts_inhibitor_interface.moc"
void surfaceCreated(KWin::SurfaceInterface *surface)
Class holding the Wayland server display loop.
Definition display.h:34
bool addSocketName(const QString &name=QString())
Definition display.cpp:68
bool isRunning() const
Definition display.cpp:144
bool start()
Definition display.cpp:92
KeyboardShortcutsInhibitorV1Interface * findInhibitor(SurfaceInterface *surface, SeatInterface *seat) const
void inhibitorCreated(KeyboardShortcutsInhibitorV1Interface *inhibitor)
Represents a Seat on the Wayland Display.
Definition seat.h:134
Resource representing a wl_surface.
Definition surface.h:80
KeyboardShortcutsInhibitManager(wl_registry *registry, quint32 id, quint32 version)
KeyboardShortcutsInhibitor(::zwp_keyboard_shortcuts_inhibitor_v1 *inhibitorV1)
KWayland::Client::Registry * registry
constexpr int version