KWin
Loading...
Searching...
No Matches
shadow.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 "shadow.h"
8#include "display.h"
9#include "surface_p.h"
10
11#include <qwayland-server-shadow.h>
12
13namespace KWin
14{
15static const quint32 s_version = 2;
16
17class ShadowManagerInterfacePrivate : public QtWaylandServer::org_kde_kwin_shadow_manager
18{
19public:
21
23
24protected:
25 void org_kde_kwin_shadow_manager_create(Resource *resource, uint32_t id, wl_resource *surface) override;
26 void org_kde_kwin_shadow_manager_unset(Resource *resource, wl_resource *surface) override;
27 void org_kde_kwin_shadow_manager_destroy(Resource *resource) override;
28};
29
31 : QtWaylandServer::org_kde_kwin_shadow_manager(*display, s_version)
32 , q(_q)
33{
34}
35
37{
38 wl_resource_destroy(resource->handle);
39}
40
41void ShadowManagerInterfacePrivate::org_kde_kwin_shadow_manager_create(Resource *resource, uint32_t id, wl_resource *surface)
42{
44 if (!s) {
45 wl_resource_post_error(resource->handle, 0, "Invalid surface");
46 return;
47 }
48
49 wl_resource *shadow_resource = wl_resource_create(resource->client(), &org_kde_kwin_shadow_interface, resource->version(), id);
50 if (!shadow_resource) {
51 wl_client_post_no_memory(resource->client());
52 return;
53 }
54
55 auto shadow = new ShadowInterface(q, shadow_resource);
56
58 surfacePrivate->setShadow(QPointer<ShadowInterface>(shadow));
59}
60
61void ShadowManagerInterfacePrivate::org_kde_kwin_shadow_manager_unset(Resource *resource, wl_resource *surface)
62{
64 if (!s) {
65 wl_resource_post_error(resource->handle, 0, "Invalid surface");
66 return;
67 }
69 surfacePrivate->setShadow(QPointer<ShadowInterface>());
70}
71
73 : QObject(parent)
74 , d(new ShadowManagerInterfacePrivate(this, display))
75{
76}
77
79
80class ShadowInterfacePrivate : public QtWaylandServer::org_kde_kwin_shadow
81{
82public:
83 ShadowInterfacePrivate(ShadowInterface *_q, wl_resource *resource);
85
86 struct State
87 {
88 enum Flags {
89 None = 0,
90 LeftBuffer = 1 << 0,
91 TopLeftBuffer = 1 << 1,
92 TopBuffer = 1 << 2,
94 RightBuffer = 1 << 4,
96 BottomBuffer = 1 << 6,
98 Offset = 1 << 8,
99 };
100 QPointer<GraphicsBuffer> left;
101 QPointer<GraphicsBuffer> topLeft;
102 QPointer<GraphicsBuffer> top;
103 QPointer<GraphicsBuffer> topRight;
104 QPointer<GraphicsBuffer> right;
105 QPointer<GraphicsBuffer> bottomRight;
106 QPointer<GraphicsBuffer> bottom;
107 QPointer<GraphicsBuffer> bottomLeft;
108 QMarginsF offset;
110 };
111
112 void commit();
113 void attach(State::Flags flag, wl_resource *buffer);
114
119
120protected:
121 void org_kde_kwin_shadow_destroy_resource(Resource *resource) override;
122 void org_kde_kwin_shadow_commit(Resource *resource) override;
123 void org_kde_kwin_shadow_attach_left(Resource *resource, wl_resource *buffer) override;
124 void org_kde_kwin_shadow_attach_top_left(Resource *resource, wl_resource *buffer) override;
125 void org_kde_kwin_shadow_attach_top(Resource *resource, wl_resource *buffer) override;
126 void org_kde_kwin_shadow_attach_top_right(Resource *resource, wl_resource *buffer) override;
127 void org_kde_kwin_shadow_attach_right(Resource *resource, wl_resource *buffer) override;
128 void org_kde_kwin_shadow_attach_bottom_right(Resource *resource, wl_resource *buffer) override;
129 void org_kde_kwin_shadow_attach_bottom(Resource *resource, wl_resource *buffer) override;
130 void org_kde_kwin_shadow_attach_bottom_left(Resource *resource, wl_resource *buffer) override;
131 void org_kde_kwin_shadow_set_left_offset(Resource *resource, wl_fixed_t offset) override;
132 void org_kde_kwin_shadow_set_top_offset(Resource *resource, wl_fixed_t offset) override;
133 void org_kde_kwin_shadow_set_right_offset(Resource *resource, wl_fixed_t offset) override;
134 void org_kde_kwin_shadow_set_bottom_offset(Resource *resource, wl_fixed_t offset) override;
135 void org_kde_kwin_shadow_destroy(Resource *resource) override;
136};
137
139{
140#define BUFFER(__FLAG__, __PART__) \
141 if (pending.flags & State::Flags::__FLAG__##Buffer) { \
142 if (current.__PART__) { \
143 current.__PART__->unref(); \
144 } \
145 if (pending.__PART__) { \
146 pending.__PART__->ref(); \
147 } \
148 current.__PART__ = pending.__PART__; \
149 }
150 BUFFER(Left, left)
151 BUFFER(TopLeft, topLeft)
152 BUFFER(Top, top)
153 BUFFER(TopRight, topRight)
154 BUFFER(Right, right)
155 BUFFER(BottomRight, bottomRight)
156 BUFFER(Bottom, bottom)
157 BUFFER(BottomLeft, bottomLeft)
158#undef BUFFER
159
162 }
163 pending = State();
164}
165
167{
168 GraphicsBuffer *b = Display::bufferForResource(buffer);
169 switch (flag) {
171 pending.left = b;
172 break;
174 pending.topLeft = b;
175 break;
176 case State::TopBuffer:
177 pending.top = b;
178 break;
180 pending.topRight = b;
181 break;
183 pending.right = b;
184 break;
187 break;
189 pending.bottom = b;
190 break;
193 break;
194 default:
195 Q_UNREACHABLE();
196 break;
197 }
199}
200
202{
203 wl_resource_destroy(resource->handle);
204}
205
207{
208 delete q;
209}
210
211void ShadowInterfacePrivate::org_kde_kwin_shadow_attach_left(Resource *resource, wl_resource *buffer)
212{
213 attach(State::LeftBuffer, buffer);
214}
215
216void ShadowInterfacePrivate::org_kde_kwin_shadow_attach_top_left(Resource *resource, wl_resource *buffer)
217{
219}
220
221void ShadowInterfacePrivate::org_kde_kwin_shadow_attach_top(Resource *resource, wl_resource *buffer)
222{
223 attach(State::TopBuffer, buffer);
224}
225
226void ShadowInterfacePrivate::org_kde_kwin_shadow_attach_top_right(Resource *resource, wl_resource *buffer)
227{
229}
230
231void ShadowInterfacePrivate::org_kde_kwin_shadow_attach_right(Resource *resource, wl_resource *buffer)
232{
233 attach(State::RightBuffer, buffer);
234}
235
236void ShadowInterfacePrivate::org_kde_kwin_shadow_attach_bottom_right(Resource *resource, wl_resource *buffer)
237{
239}
240
241void ShadowInterfacePrivate::org_kde_kwin_shadow_attach_bottom(Resource *resource, wl_resource *buffer)
242{
244}
245
246void ShadowInterfacePrivate::org_kde_kwin_shadow_attach_bottom_left(Resource *resource, wl_resource *buffer)
247{
249}
250
251void ShadowInterfacePrivate::org_kde_kwin_shadow_set_left_offset(Resource *resource, wl_fixed_t offset)
252{
254 pending.offset.setLeft(wl_fixed_to_double(offset));
255}
256
257void ShadowInterfacePrivate::org_kde_kwin_shadow_set_top_offset(Resource *resource, wl_fixed_t offset)
258{
260 pending.offset.setTop(wl_fixed_to_double(offset));
261}
262
263void ShadowInterfacePrivate::org_kde_kwin_shadow_set_right_offset(Resource *resource, wl_fixed_t offset)
264{
266 pending.offset.setRight(wl_fixed_to_double(offset));
267}
268
269void ShadowInterfacePrivate::org_kde_kwin_shadow_set_bottom_offset(Resource *resource, wl_fixed_t offset)
270{
272 pending.offset.setBottom(wl_fixed_to_double(offset));
273}
274
276 : QtWaylandServer::org_kde_kwin_shadow(resource)
277 , q(_q)
278{
279}
280
282{
283#define CURRENT(__PART__) \
284 if (current.__PART__) { \
285 current.__PART__->unref(); \
286 }
287 CURRENT(left)
288 CURRENT(topLeft)
289 CURRENT(top)
290 CURRENT(topRight)
291 CURRENT(right)
292 CURRENT(bottomRight)
293 CURRENT(bottom)
294 CURRENT(bottomLeft)
295#undef CURRENT
296}
297
298ShadowInterface::ShadowInterface(ShadowManagerInterface *manager, wl_resource *resource)
299 : QObject()
300 , d(new ShadowInterfacePrivate(this, resource))
301{
302 d->manager = manager;
303}
304
306
307QMarginsF ShadowInterface::offset() const
308{
309 return d->current.offset;
310}
311
312#define BUFFER(__PART__) \
313 GraphicsBuffer *ShadowInterface::__PART__() const \
314 { \
315 return d->current.__PART__; \
316 }
317
318BUFFER(left)
319BUFFER(topLeft)
320BUFFER(top)
321BUFFER(topRight)
322BUFFER(right)
323BUFFER(bottomRight)
324BUFFER(bottom)
325BUFFER(bottomLeft)
326
327}
328
329#include "wayland/moc_shadow.cpp"
Class holding the Wayland server display loop.
Definition display.h:34
QMarginsF offset() const
Definition shadow.cpp:307
~ShadowInterface() override
void org_kde_kwin_shadow_attach_bottom_right(Resource *resource, wl_resource *buffer) override
Definition shadow.cpp:236
void org_kde_kwin_shadow_set_bottom_offset(Resource *resource, wl_fixed_t offset) override
Definition shadow.cpp:269
void org_kde_kwin_shadow_set_left_offset(Resource *resource, wl_fixed_t offset) override
Definition shadow.cpp:251
void org_kde_kwin_shadow_attach_top_left(Resource *resource, wl_resource *buffer) override
Definition shadow.cpp:216
void org_kde_kwin_shadow_attach_left(Resource *resource, wl_resource *buffer) override
Definition shadow.cpp:211
ShadowInterface * q
Definition shadow.cpp:118
ShadowInterfacePrivate(ShadowInterface *_q, wl_resource *resource)
Definition shadow.cpp:275
void org_kde_kwin_shadow_destroy_resource(Resource *resource) override
Definition shadow.cpp:206
void org_kde_kwin_shadow_set_top_offset(Resource *resource, wl_fixed_t offset) override
Definition shadow.cpp:257
void org_kde_kwin_shadow_attach_bottom_left(Resource *resource, wl_resource *buffer) override
Definition shadow.cpp:246
void org_kde_kwin_shadow_attach_bottom(Resource *resource, wl_resource *buffer) override
Definition shadow.cpp:241
void org_kde_kwin_shadow_attach_right(Resource *resource, wl_resource *buffer) override
Definition shadow.cpp:231
void org_kde_kwin_shadow_commit(Resource *resource) override
Definition shadow.cpp:138
void org_kde_kwin_shadow_set_right_offset(Resource *resource, wl_fixed_t offset) override
Definition shadow.cpp:263
void org_kde_kwin_shadow_destroy(Resource *resource) override
Definition shadow.cpp:201
void org_kde_kwin_shadow_attach_top_right(Resource *resource, wl_resource *buffer) override
Definition shadow.cpp:226
void attach(State::Flags flag, wl_resource *buffer)
Definition shadow.cpp:166
ShadowManagerInterface * manager
Definition shadow.cpp:115
void org_kde_kwin_shadow_attach_top(Resource *resource, wl_resource *buffer) override
Definition shadow.cpp:221
ShadowManagerInterface(Display *display, QObject *parent=nullptr)
Definition shadow.cpp:72
void org_kde_kwin_shadow_manager_create(Resource *resource, uint32_t id, wl_resource *surface) override
Definition shadow.cpp:41
ShadowManagerInterface * q
Definition shadow.cpp:22
void org_kde_kwin_shadow_manager_unset(Resource *resource, wl_resource *surface) override
Definition shadow.cpp:61
ShadowManagerInterfacePrivate(ShadowManagerInterface *_q, Display *display)
Definition shadow.cpp:30
void org_kde_kwin_shadow_manager_destroy(Resource *resource) override
Definition shadow.cpp:36
Resource representing a wl_surface.
Definition surface.h:80
static SurfaceInterface * get(wl_resource *native)
Definition surface.cpp:819
void setShadow(const QPointer< ShadowInterface > &shadow)
Definition surface.cpp:177
static SurfaceInterfacePrivate * get(SurfaceInterface *surface)
Definition surface_p.h:99
QPointer< GraphicsBuffer > left
Definition shadow.cpp:100
QPointer< GraphicsBuffer > right
Definition shadow.cpp:104
QPointer< GraphicsBuffer > bottomLeft
Definition shadow.cpp:107
QPointer< GraphicsBuffer > bottomRight
Definition shadow.cpp:105
QPointer< GraphicsBuffer > top
Definition shadow.cpp:102
QPointer< GraphicsBuffer > topLeft
Definition shadow.cpp:101
QPointer< GraphicsBuffer > topRight
Definition shadow.cpp:103
QPointer< GraphicsBuffer > bottom
Definition shadow.cpp:106
#define BUFFER(__FLAG__, __PART__)
Definition shadow.cpp:312
#define CURRENT(__PART__)