KWin
Loading...
Searching...
No Matches
server_decoration.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5*/
6#include "server_decoration.h"
7#include "display.h"
8#include "surface.h"
9#include "utils/common.h"
10
11#include <QList>
12
13#include <optional>
14
15#include <qwayland-server-server-decoration.h>
16
17namespace KWin
18{
19static const quint32 s_version = 1;
20
34
35static uint32_t modeWayland(ServerSideDecorationManagerInterface::Mode mode)
36{
37 switch (mode) {
39 return ServerSideDecorationManagerInterfacePrivate::mode_None;
41 return ServerSideDecorationManagerInterfacePrivate::mode_Client;
43 return ServerSideDecorationManagerInterfacePrivate::mode_Server;
44 default:
45 Q_UNREACHABLE();
46 }
47}
48
50{
52 if (!s) {
53 wl_resource_post_error(resource->handle, 0, "Invalid surface");
54 return;
55 }
56
57 wl_resource *decorationResource = wl_resource_create(resource->client(), &org_kde_kwin_server_decoration_interface, resource->version(), id);
58 if (!decorationResource) {
59 wl_client_post_no_memory(resource->client());
60 return;
61 }
62 auto decoration = new ServerSideDecorationInterface(q, s, decorationResource);
63 decoration->setMode(defaultMode);
64 Q_EMIT q->decorationCreated(decoration);
65}
66
68{
69 defaultMode = mode;
70 const uint32_t wlMode = modeWayland(mode);
71
72 const auto clientResources = resourceMap();
73 for (Resource *resource : clientResources) {
74 send_default_mode(resource->handle, wlMode);
75 }
76}
77
79 : QtWaylandServer::org_kde_kwin_server_decoration_manager(*display, s_version)
80 , q(_q)
81{
82}
83
85{
86 send_default_mode(resource->handle, modeWayland(defaultMode));
87}
88
90 : QObject(parent)
92{
93}
94
96
98{
99 d->setDefaultMode(mode);
100}
101
106
107class ServerSideDecorationInterfacePrivate : public QtWaylandServer::org_kde_kwin_server_decoration
108{
109public:
113 wl_resource *resource);
115
118
121 std::optional<ServerSideDecorationManagerInterface::Mode> preferredMode;
123
124private:
126 static QList<ServerSideDecorationInterfacePrivate *> s_all;
127
128protected:
129 void org_kde_kwin_server_decoration_destroy_resource(Resource *resource) override;
130 void org_kde_kwin_server_decoration_release(Resource *resource) override;
131 void org_kde_kwin_server_decoration_request_mode(Resource *resource, uint32_t mode) override;
132};
133
134QList<ServerSideDecorationInterfacePrivate *> ServerSideDecorationInterfacePrivate::s_all;
135
137{
139 switch (mode) {
140 case ServerSideDecorationManagerInterfacePrivate::mode_None:
142 break;
143 case ServerSideDecorationManagerInterfacePrivate::mode_Client:
145 break;
146 case ServerSideDecorationManagerInterfacePrivate::mode_Server:
148 break;
149 default:
150 // invalid mode
151 qCWarning(KWIN_CORE) << "Invalid mode:" << mode;
152 return;
153 }
154 preferredMode = m;
155 Q_EMIT q->preferredModeChanged();
156}
157
159{
160 wl_resource_destroy(resource->handle);
161}
162
167
169{
170 for (ServerSideDecorationInterfacePrivate *decoration : std::as_const(s_all)) {
171 if (decoration->surface == surface) {
172 return decoration->q;
173 }
174 }
175 return nullptr;
176}
177
180 SurfaceInterface *surface,
181 wl_resource *resource)
182 : QtWaylandServer::org_kde_kwin_server_decoration(resource)
183 , manager(manager)
184 , surface(surface)
185 , q(_q)
186{
187 s_all << this;
188}
189
194
196{
197 this->mode = mode;
198 send_mode(modeWayland(mode));
199}
200
201ServerSideDecorationInterface::ServerSideDecorationInterface(ServerSideDecorationManagerInterface *manager, SurfaceInterface *surface, wl_resource *resource)
202 : QObject()
203 , d(new ServerSideDecorationInterfacePrivate(manager, this, surface, resource))
204{
205}
206
208
213
218
220{
221 return d->preferredMode.value_or(d->manager->defaultMode());
222}
223
225{
226 return d->surface;
227}
228
233
234}
235
236#include "moc_server_decoration.cpp"
Class holding the Wayland server display loop.
Definition display.h:34
Representing how a SurfaceInterface should be decorated.
static ServerSideDecorationInterface * get(SurfaceInterface *surface)
ServerSideDecorationManagerInterface::Mode mode() const
void setMode(ServerSideDecorationManagerInterface::Mode mode)
ServerSideDecorationManagerInterface::Mode preferredMode() const
std::optional< ServerSideDecorationManagerInterface::Mode > preferredMode
void org_kde_kwin_server_decoration_destroy_resource(Resource *resource) override
static ServerSideDecorationInterface * get(SurfaceInterface *surface)
ServerSideDecorationManagerInterface::Mode mode
void org_kde_kwin_server_decoration_request_mode(Resource *resource, uint32_t mode) override
void setMode(ServerSideDecorationManagerInterface::Mode mode)
ServerSideDecorationInterfacePrivate(ServerSideDecorationManagerInterface *manager, ServerSideDecorationInterface *_q, SurfaceInterface *surface, wl_resource *resource)
void org_kde_kwin_server_decoration_release(Resource *resource) override
ServerSideDecorationManagerInterface * manager
Manager to create ServerSideDecorationInterface.
void decorationCreated(KWin::ServerSideDecorationInterface *)
ServerSideDecorationManagerInterface(Display *display, QObject *parent=nullptr)
ServerSideDecorationManagerInterface * q
ServerSideDecorationManagerInterface::Mode defaultMode
void setDefaultMode(ServerSideDecorationManagerInterface::Mode mode)
void org_kde_kwin_server_decoration_manager_create(Resource *resource, uint32_t id, wl_resource *surface) override
void org_kde_kwin_server_decoration_manager_bind_resource(Resource *resource) override
ServerSideDecorationManagerInterfacePrivate(ServerSideDecorationManagerInterface *_q, Display *display)
Resource representing a wl_surface.
Definition surface.h:80
static SurfaceInterface * get(wl_resource *native)
Definition surface.cpp:819