KWin
Loading...
Searching...
No Matches
plasmavirtualdesktop.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2018 Marco Martin <notmart@gmail.com>
3
4 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5*/
7#include "display.h"
8#include "wayland/quirks.h"
9
10#include <QDebug>
11#include <QTimer>
12
13#include <qwayland-server-org-kde-plasma-virtual-desktop.h>
14#include <wayland-server.h>
15
16namespace KWin
17{
18static const quint32 s_version = 2;
19
20class PlasmaVirtualDesktopInterfacePrivate : public QtWaylandServer::org_kde_plasma_virtual_desktop
21{
22public:
25
27 QString id;
28 QString name;
29 bool active = false;
30
31protected:
32 void org_kde_plasma_virtual_desktop_bind_resource(Resource *resource) override;
33 void org_kde_plasma_virtual_desktop_request_activate(Resource *resource) override;
34};
35
36class PlasmaVirtualDesktopManagementInterfacePrivate : public QtWaylandServer::org_kde_plasma_virtual_desktop_management
37{
38public:
40
41 QList<PlasmaVirtualDesktopInterface *> desktops;
42 quint32 rows = 0;
43 quint32 columns = 0;
45
46 inline QList<PlasmaVirtualDesktopInterface *>::const_iterator constFindDesktop(const QString &id);
47 inline QList<PlasmaVirtualDesktopInterface *>::iterator findDesktop(const QString &id);
48
49protected:
50 void org_kde_plasma_virtual_desktop_management_get_virtual_desktop(Resource *resource, uint32_t id, const QString &desktop_id) override;
51 void org_kde_plasma_virtual_desktop_management_request_create_virtual_desktop(Resource *resource, const QString &name, uint32_t position) override;
52 void org_kde_plasma_virtual_desktop_management_request_remove_virtual_desktop(Resource *resource, const QString &desktop_id) override;
53 void org_kde_plasma_virtual_desktop_management_bind_resource(Resource *resource) override;
54};
55
56inline QList<PlasmaVirtualDesktopInterface *>::const_iterator PlasmaVirtualDesktopManagementInterfacePrivate::constFindDesktop(const QString &id)
57{
58 return std::find_if(desktops.constBegin(), desktops.constEnd(), [id](const PlasmaVirtualDesktopInterface *desk) {
59 return desk->id() == id;
60 });
61}
62
63inline QList<PlasmaVirtualDesktopInterface *>::iterator PlasmaVirtualDesktopManagementInterfacePrivate::findDesktop(const QString &id)
64{
65 return std::find_if(desktops.begin(), desktops.end(), [id](const PlasmaVirtualDesktopInterface *desk) {
66 return desk->id() == id;
67 });
68}
69
71 uint32_t id,
72 const QString &desktop_id)
73{
74 auto i = constFindDesktop(desktop_id);
75 if (i == desktops.constEnd()) {
76 return;
77 }
78
79 (*i)->d->add(resource->client(), id, resource->version());
80}
81
83 const QString &name,
84 uint32_t position)
85{
86 Q_EMIT q->desktopCreateRequested(name, std::clamp<quint32>(position, 0, desktops.size()));
87}
88
94
96 : QtWaylandServer::org_kde_plasma_virtual_desktop_management(*display, s_version)
97 , q(_q)
98{
99}
100
102{
103 quint32 i = 0;
104 for (auto it = desktops.constBegin(); it != desktops.constEnd(); ++it) {
105 send_desktop_created(resource->handle, (*it)->id(), i++);
106 }
107
108 if (resource->version() >= ORG_KDE_PLASMA_VIRTUAL_DESKTOP_MANAGEMENT_ROWS_SINCE_VERSION) {
109 send_rows(resource->handle, rows);
110 }
111
112 send_done(resource->handle);
113}
114
120
122{
123 while (!d->desktops.isEmpty()) {
124 const QString id = d->desktops[0]->id();
125 removeDesktop(id);
126 }
127}
128
130{
131 if (rows == 0 || d->rows == rows) {
132 return;
133 }
134
135 d->rows = rows;
136
137 const auto clientResources = d->resourceMap();
138 for (auto resource : clientResources) {
139 if (resource->version() < ORG_KDE_PLASMA_VIRTUAL_DESKTOP_MANAGEMENT_ROWS_SINCE_VERSION) {
140 continue;
141 }
142 d->send_rows(resource->handle, rows);
143 }
144}
145
147{
148 auto i = d->constFindDesktop(id);
149 if (i != d->desktops.constEnd()) {
150 return *i;
151 }
152 return nullptr;
153}
154
156{
157 auto i = d->constFindDesktop(id);
158 if (i != d->desktops.constEnd()) {
159 return *i;
160 }
161
162 const quint32 actualPosition = std::min(position, (quint32)d->desktops.count());
163
165 desktop->d->id = id;
166
167 const auto desktopClientResources = desktop->d->resourceMap();
168 for (auto resource : desktopClientResources) {
169 desktop->d->send_desktop_id(resource->handle, id);
170 }
171
172 // activate the first desktop TODO: to be done here?
173 if (d->desktops.isEmpty()) {
174 desktop->d->active = true;
175 }
176
177 d->desktops.insert(actualPosition, desktop);
178
179 const auto clientResources = d->resourceMap();
180 for (auto resource : clientResources) {
181 d->send_desktop_created(resource->handle, id, actualPosition);
182 }
183
184 return desktop;
185}
186
188{
189 auto deskIt = d->findDesktop(id);
190 if (deskIt == d->desktops.end()) {
191 return;
192 }
193
195 d->desktops.erase(deskIt);
196 delete desktop;
197
198 const auto clientResources = d->resourceMap();
199 for (auto resource : clientResources) {
200 d->send_desktop_removed(resource->handle, id);
201 }
202}
203
204QList<PlasmaVirtualDesktopInterface *> PlasmaVirtualDesktopManagementInterface::desktops() const
205{
206 return d->desktops;
207}
208
210{
211 const auto clientResources = d->resourceMap();
212 for (auto resource : clientResources) {
213 d->send_done(resource->handle);
214 }
215}
216
218
223
225 : QtWaylandServer::org_kde_plasma_virtual_desktop()
226 , q(q)
227{
228}
229
231{
232 const auto clientResources = resourceMap();
233 for (Resource *resource : clientResources) {
234 send_removed(resource->handle);
235 wl_resource_destroy(resource->handle);
236 }
237}
238
240{
241 send_desktop_id(resource->handle, id);
242
243 if (!name.isEmpty()) {
244 send_name(resource->handle, truncate(name));
245 }
246
247 if (active) {
248 send_activated(resource->handle);
249 }
250}
251
252PlasmaVirtualDesktopInterface::PlasmaVirtualDesktopInterface()
254{
255}
256
260
262{
263 return d->id;
264}
265
267{
268 if (d->name == name) {
269 return;
270 }
271
272 d->name = name;
273
274 const auto clientResources = d->resourceMap();
275 for (auto resource : clientResources) {
276 d->send_name(resource->handle, truncate(name));
277 }
278}
279
281{
282 return d->name;
283}
284
286{
287 if (d->active == active) {
288 return;
289 }
290
291 d->active = active;
292 const auto clientResources = d->resourceMap();
293
294 if (active) {
295 for (auto resource : clientResources) {
296 d->send_activated(resource->handle);
297 }
298 } else {
299 for (auto resource : clientResources) {
300 d->send_deactivated(resource->handle);
301 }
302 }
303}
304
306{
307 return d->active;
308}
309
311{
312 const auto clientResources = d->resourceMap();
313 for (auto resource : clientResources) {
314 d->send_done(resource->handle);
315 }
316}
317
318}
319
320#include "moc_plasmavirtualdesktop.cpp"
Class holding the Wayland server display loop.
Definition display.h:34
PlasmaVirtualDesktopInterfacePrivate(PlasmaVirtualDesktopInterface *q)
void org_kde_plasma_virtual_desktop_request_activate(Resource *resource) override
void org_kde_plasma_virtual_desktop_bind_resource(Resource *resource) override
Wrapper for the org_kde_plasma_virtual_desktop_management interface.
QList< PlasmaVirtualDesktopInterface * > desktops() const
PlasmaVirtualDesktopInterface * createDesktop(const QString &id, quint32 position=std::numeric_limits< uint32_t >::max())
void desktopCreateRequested(const QString &name, quint32 position)
void desktopRemoveRequested(const QString &id)
PlasmaVirtualDesktopManagementInterface(Display *display, QObject *parent=nullptr)
PlasmaVirtualDesktopInterface * desktop(const QString &id)
QList< PlasmaVirtualDesktopInterface * >::const_iterator constFindDesktop(const QString &id)
void org_kde_plasma_virtual_desktop_management_request_create_virtual_desktop(Resource *resource, const QString &name, uint32_t position) override
QList< PlasmaVirtualDesktopInterface * >::iterator findDesktop(const QString &id)
QList< PlasmaVirtualDesktopInterface * > desktops
void org_kde_plasma_virtual_desktop_management_bind_resource(Resource *resource) override
void org_kde_plasma_virtual_desktop_management_request_remove_virtual_desktop(Resource *resource, const QString &desktop_id) override
void org_kde_plasma_virtual_desktop_management_get_virtual_desktop(Resource *resource, uint32_t id, const QString &desktop_id) override
PlasmaVirtualDesktopManagementInterfacePrivate(PlasmaVirtualDesktopManagementInterface *_q, Display *display)